1
0
mirror of https://github.com/laurent22/joplin.git synced 2026-01-05 00:12:33 +02:00

Compare commits

..

36 Commits

Author SHA1 Message Date
Laurent Cozic
54f4b41de8 CLI v1.4.3 2020-11-06 21:21:17 +00:00
Laurent Cozic
b33aeeecc5 remove postinstall 2020-11-06 21:19:07 +00:00
Laurent Cozic
7eefac0b54 CLI v1.4.2 2020-11-06 21:10:07 +00:00
Laurent Cozic
3fbec21c2e fix script 2020-11-06 20:59:25 +00:00
Laurent Cozic
d3b2f23983 fix script 2020-11-06 20:54:19 +00:00
Laurent Cozic
9956b6612d Added release script 2020-11-06 20:53:40 +00:00
Laurent Cozic
bc3f6dd51a fix cli release script 2020-11-06 20:50:32 +00:00
Laurent Cozic
7b0122a8db Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-11-06 20:41:37 +00:00
Laurent Cozic
7ea4f570cb Tools: Refactor Android release script 2020-11-06 18:45:45 +00:00
Laurent Cozic
1e1f2582c5 Tools: minor tweak 2020-11-06 12:31:30 +00:00
Laurent Cozic
7e2d512fde Merge branch 'release-1.3' into dev 2020-11-06 12:05:15 +00:00
Laurent Cozic
6b75485a1e Electron release v1.3.18 2020-11-06 11:52:20 +00:00
Laurent Cozic
0cfcc00912 Desktop: Fixes #4049: Keymap editor crash when an invalid command is used 2020-11-06 11:51:36 +00:00
Laurent Cozic
496b19b3f1 Electron release v1.3.17 2020-11-06 10:52:06 +00:00
Laurent Cozic
9618591158 Electron release v1.3.16 2020-11-06 10:51:08 +00:00
Laurent Cozic
55b6394bf3 Desktop: Fixes #4051: Random crash when syncing due to undefined tags 2020-11-06 10:50:44 +00:00
Laurent Cozic
4a1dc2c80e Tools: Need to remove spellfix.dll otherwise it gets signed by CI 2020-11-05 21:12:55 +00:00
Laurent Cozic
cb66158b2d Electron release v1.4.6 2020-11-05 21:06:03 +00:00
Laurent Cozic
da04d3ce51 Tools: trying a different timestamp server 2020-11-05 21:05:52 +00:00
Laurent Cozic
bcbce682d5 Electron release v1.4.5 2020-11-05 20:55:01 +00:00
Laurent Cozic
08f7521e1e Tools: Fixing desktop build 2020-11-05 20:54:51 +00:00
Laurent Cozic
3579e7eab5 Electron release v1.4.4 2020-11-05 19:54:13 +00:00
Laurent Cozic
5922c6b216 Tools: Fix Linux build 2020-11-05 19:53:53 +00:00
Laurent Cozic
c558e729bd Electron release v1.4.3 2020-11-05 18:58:12 +00:00
Laurent Cozic
ca80101174 Tools: Fixed desktop app name 2020-11-05 18:56:35 +00:00
Laurent Cozic
6124f483dc Electron release v1.4.2 2020-11-05 18:24:07 +00:00
Laurent Cozic
90d58e4e2b Tools: Fixing Windows CI build 2020-11-05 18:23:54 +00:00
Laurent Cozic
8cd37d602c Tools: Running tests from root does not work well 2020-11-05 17:53:43 +00:00
Laurent Cozic
e4ed26a961 Electron release v1.4.1 2020-11-05 17:44:29 +00:00
Laurent Cozic
bc57d229fa Tools: Fix desktop build 2020-11-05 17:44:19 +00:00
Laurent Cozic
c53cd52b4d Tools: Set version to 1.4 2020-11-05 17:41:25 +00:00
Laurent Cozic
0d7ca97556 Tools: Add way to get credential files 2020-11-05 17:40:13 +00:00
Laurent Cozic
c1e2fd125c Fix paths 2020-11-05 17:18:38 +00:00
Laurent Cozic
6856f84faa Doc: Update doc 2020-11-05 17:15:53 +00:00
Laurent Cozic
de091dfd64 Doc: Fixed gettext file url 2020-11-05 17:02:49 +00:00
Laurent Cozic
cc07016b07 All: Use Lerna to manage monorepo 2020-11-05 16:58:23 +00:00
30 changed files with 206 additions and 68 deletions

4
.gitignore vendored
View File

@@ -45,8 +45,8 @@ QtClient/data/
sparse_test.php
sync_staging.sh
TODO.md
Tools/commit_hook.txt
Tools/github_oauth_token.txt
packages/tools/commit_hook.txt
packages/tools/github_oauth_token.txt
lerna-debug.log
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD

View File

@@ -44,9 +44,9 @@ Building the apps is relatively easy - please [see the build instructions](https
Coding style is enforced by a pre-commit hook that runs eslint. This hook is installed whenever running `npm install` on any of the application directory. If for some reason the pre-commit hook didn't get installed, you can manually install it by running `npm install` at the root of the repository.
For new React components, please use [React Hooks](https://reactjs.org/docs/hooks-intro.html). For new code in general, please use TypeScript (unless you are modifying a file that was originally in JavaScript).
For new React components, please use [React Hooks](https://reactjs.org/docs/hooks-intro.html). For new code in general, please use TypeScript. Even if you are modifying a file that was originally in JavaScript you should ideally convert it first to TypeScript before modifying it. Doing so is relatively easy and it helps maintain code quality.
For changes made to the Desktop client that affect the user interface, refer to `packages/app-desktop/app/theme.js` for all styling information. The goal is to create a consistent user interface to allow for easy navigation of Joplin's various features and improve the overall user experience.
For changes made to the Desktop client that affect the user interface, refer to `packages/app-desktop/theme.ts` for all styling information. The goal is to create a consistent user interface to allow for easy navigation of Joplin's various features and improve the overall user experience.
## Automated tests

View File

@@ -404,7 +404,7 @@ Please see the [donation page](https://github.com/laurent22/joplin/blob/dev/read
# Contributing
Please see the guide for information on how to contribute to the development of Joplin: https://github.com/laurent22/joplin/blob/master/CONTRIBUTING.md
Please see the guide for information on how to contribute to the development of Joplin: https://github.com/laurent22/joplin/blob/dev/CONTRIBUTING.md
# Localisation

View File

@@ -10,7 +10,6 @@ platform:
install:
- ps: Install-Product node 10 x64
- yarn
build_script:
- npm install

View File

@@ -7,11 +7,10 @@
},
"license": "MIT",
"scripts": {
"test": "lerna run test --stream",
"linter": "./node_modules/.bin/eslint --resolve-plugins-relative-to . --fix --quiet --ext .js --ext .jsx --ext .ts --ext .tsx",
"linter-precommit": "./node_modules/.bin/eslint --resolve-plugins-relative-to . --fix --ext .js --ext .jsx --ext .ts --ext .tsx",
"linter-ci": "./node_modules/.bin/eslint --resolve-plugins-relative-to . --quiet --ext .js --ext .jsx --ext .ts --ext .tsx",
"postinstall": "lerna bootstrap && npm run tsc",
"postinstall": "lerna bootstrap --no-ci && npm run tsc",
"tsc": "lerna run tsc --stream --parallel",
"watch": "lerna run watch --stream --parallel",
"updateIgnored": "gulp updateIgnoredTypeScriptBuild",
@@ -22,6 +21,9 @@
"setupNewRelease": "node ./packages/tools/setupNewRelease",
"clean": "lerna clean -y && lerna run clean",
"linkChecker": "linkchecker https://joplinapp.org",
"releaseDesktop": "node packages/tools/release-electron.js",
"releaseAndroid": "node packages/tools/release-android.js",
"releaseCli": "node packages/tools/release-cli.js",
"publishAll": "git pull && lerna version --no-git-tag-version && gulp completePublishAll"
},
"husky": {

View File

@@ -10,15 +10,23 @@ const tasks = {
// updateIgnoredTypeScriptBuild: require('../Tools/gulp/tasks/updateIgnoredTypeScriptBuild'),
};
async function makePackagePublic(filePath) {
const text = await fs.readFile(filePath, 'utf8');
const obj = JSON.parse(text);
delete obj.private;
await fs.writeFile(filePath, JSON.stringify(obj), 'utf8');
}
tasks.prepareBuild = {
fn: async () => {
const buildDir = `${__dirname}/build`;
await utils.copyDir(`${__dirname}/app`, buildDir, {
excluded: ['node_modules'],
});
// await utils.copyDir(`${__dirname}/locales-build`, `${buildDir}/locales`);
// await tasks.copyLib.fn();
await utils.copyFile(`${__dirname}/package.json`, `${buildDir}/package.json`);
await makePackagePublic(`${buildDir}/package.json`);
await utils.copyFile(`${__dirname}/package-lock.json`, `${buildDir}/package-lock.json`);
await utils.copyFile(`${__dirname}/gulpfile.js`, `${buildDir}/gulpfile.js`);

View File

@@ -1,6 +1,6 @@
{
"name": "@joplinapp/app-cli",
"version": "1.3.13",
"version": "1.4.3",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@@ -1,5 +1,5 @@
{
"name": "@joplinapp/app-cli",
"name": "joplin",
"description": "Joplin CLI Client",
"license": "MIT",
"author": "Laurent Cozic",
@@ -7,7 +7,6 @@
"scripts": {
"test": "node node_modules/jasmine/bin/jasmine.js --fail-fast=true --config=tests/support/jasmine.json",
"test-ci": "node node_modules/jasmine/bin/jasmine.js --config=tests/support/jasmine.json",
"postinstall": "npm run build",
"build": "gulp build",
"start": "gulp build -L && node \"build/main.js\" --stack-trace-enabled --log-level debug --env dev",
"tsc": "node node_modules/typescript/bin/tsc --project tsconfig.json",
@@ -31,7 +30,7 @@
],
"owner": "Laurent Cozic"
},
"version": "1.3.13",
"version": "1.4.3",
"bin": {
"joplin": "./main.js"
},

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "Joplin Web Clipper [DEV]",
"version": "1.3.1",
"version": "1.4.0",
"description": "Capture and save web pages and screenshots from your browser to Joplin.",
"homepage_url": "https://joplinapp.org",
"content_security_policy": "script-src 'self'; object-src 'self'",

View File

@@ -30,9 +30,14 @@ const getLabel = (commandName: string):string => {
return _('Command palette');
case 'config':
return shim.isMac() ? _('Preferences') : _('Options');
default:
throw new Error(`Command: ${commandName} is unknown`);
}
// We don't throw an error if a command is not found because if for
// example a command is removed from one version to the next, or a
// command is renamed, we still want the keymap editor to work. So in
// that case, we simply display the command name and it is up to the
// user to fix the shortcut if needed.
return `${commandName} (${_('Invalid')})`;
};
export default getLabel;

View File

@@ -1,6 +1,6 @@
{
"name": "@joplinapp/app-desktop",
"version": "1.3.20",
"version": "1.4.6",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@@ -1,13 +1,12 @@
{
"name": "@joplinapp/app-desktop",
"version": "1.3.20",
"version": "1.4.6",
"description": "Joplin for Desktop",
"main": "main.js",
"private": true,
"scripts": {
"dist": "node_modules/.bin/electron-builder",
"build": "gulp build",
"preinstall": "node tools/unlinkReact",
"postinstall": "npm run build && gulp electronRebuild",
"tsc": "node node_modules/typescript/bin/tsc --project tsconfig.json",
"watch": "node node_modules/typescript/bin/tsc --watch --project tsconfig.json",
@@ -34,7 +33,7 @@
"asar": true,
"asarUnpack": "./node_modules/node-notifier/vendor/**",
"win": {
"rfc3161TimeStampServer": "http://sha256timestamp.ws.symantec.com/sha256/timestamp",
"rfc3161TimeStampServer": "http://timestamp.comodoca.com/rfc3161",
"icon": "../../Assets/ImageSources/Joplin.ico",
"target": [
{
@@ -74,7 +73,7 @@
"icon": "../../Assets/macOs.icns"
},
"linux": {
"icon": "../Assets/LinuxIcons",
"icon": "../../Assets/LinuxIcons",
"category": "Office",
"desktop": {
"Icon": "joplin"
@@ -91,6 +90,7 @@
"@types/node": "^14.14.6",
"@types/react": "16.9.55",
"@types/react-redux": "^7.1.9",
"@joplinapp/tools": "^1.0.9",
"ajv": "^6.5.0",
"app-builder-bin": "^1.9.11",
"babel-cli": "^6.26.0",
@@ -112,7 +112,6 @@
"@fortawesome/fontawesome-free": "^5.13.0",
"@joplinapp/lib": "^1.0.9",
"@joplinapp/renderer": "^1.0.17",
"@joplinapp/tools": "^1.0.9",
"async-mutex": "^0.1.3",
"codemirror": "^5.56.0",
"color": "^3.1.2",

View File

@@ -14,9 +14,12 @@ module.exports = async function() {
}
const appId = packageInfo.build.appId;
const productName = packageInfo.build.productName;
delete packageInfo.build;
packageInfo.build = { appId: appId };
packageInfo.name = productName;
let branch;
let hash;

View File

@@ -61,3 +61,4 @@ buck-out/
# Custom
lib/csstojs/
lib/rnInjectedJs/
dist/

View File

@@ -138,8 +138,8 @@ android {
applicationId "net.cozic.joplin"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 2097602
versionName "1.3.13"
versionCode 2097608
versionName "1.4.6"
ndk {
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}

View File

@@ -11,6 +11,7 @@
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit

View File

@@ -12,6 +12,9 @@ const tasks = {
podInstall: {
fn: require('./tools/podInstall'),
},
prepareRelease: {
fn: require('./tools/prepareRelease'),
},
// clean: {
// fn: require('./tools/clean'),
// },

View File

@@ -344,7 +344,7 @@
INFOPLIST_FILE = Joplin/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 10.3.1;
MARKETING_VERSION = 10.4.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -370,7 +370,7 @@
INFOPLIST_FILE = Joplin/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 10.3.1;
MARKETING_VERSION = 10.4.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",

View File

@@ -9,14 +9,12 @@
"build": "gulp build",
"tsc": "node node_modules/typescript/bin/tsc --project tsconfig.json",
"watch": "node node_modules/typescript/bin/tsc --watch --project tsconfig.json",
"preinstall": "node tools/unlinkReact.js",
"clean": "node tools/clean.js",
"postinstall": "jetify && npm run build"
},
"dependencies": {
"@joplinapp/lib": "^1.0.9",
"@joplinapp/renderer": "^1.0.17",
"@joplinapp/tools": "^1.0.9",
"@react-native-community/clipboard": "^1.5.0",
"@react-native-community/datetimepicker": "^3.0.3",
"@react-native-community/geolocation": "^2.0.2",
@@ -60,6 +58,7 @@
"valid-url": "^1.0.9"
},
"devDependencies": {
"@joplinapp/tools": "^1.0.9",
"@babel/core": "^7.11.6",
"@babel/runtime": "^7.11.2",
"@types/node": "^14.14.6",

View File

@@ -0,0 +1,32 @@
// This is to replace the symlinks inside node_modules with the actual packages
// as I assumed it was needed to build the final release. However it seems
// Android `assembleRelease` handles symlinks properly so maybe this is not
// needed after all ¯\_(ツ)_/¯
const { copyDir } = require('@joplinapp/tools/gulp/utils');
const { rootDir, deleteLink, toSystemSlashes } = require('@joplinapp/tools/tool-utils');
const mobileDir = `${rootDir}/packages/app-mobile`;
module.exports = async function() {
const dirsToCopy = [
'fork-htmlparser2',
'fork-sax',
'lib',
'renderer',
];
const destDir = `${mobileDir}/node_modules/@joplinapp`;
for (const dir of dirsToCopy) {
const destPath = toSystemSlashes(`${destDir}/${dir}`);
const sourcePath = toSystemSlashes(`${rootDir}/packages/${dir}`);
console.info(`Copying ${sourcePath} => ${destPath}`);
// TODO: copy symlink so that it can be restored
await deleteLink(destPath);
await copyDir(sourcePath, destPath, {
excluded: ['node_modules'],
});
}
};

View File

@@ -51,6 +51,13 @@ shared.renderFolders = function(props, renderItem) {
shared.renderTags = function(props, renderItem) {
const tags = props.tags.slice();
tags.sort((a, b) => {
// It seems title can sometimes be undefined (perhaps when syncing
// and before tag has been decrypted?). It would be best to find
// the root cause but for now that will do.
//
// Fixes https://github.com/laurent22/joplin/issues/4051
if (!a || !a.title || !b || !b.title) return 0;
// Note: while newly created tags are normalized and lowercase
// imported tags might be any case, so we need to do case-insensitive
// sort.

View File

@@ -261,7 +261,7 @@ function flagImageUrl(locale) {
}
function poFileUrl(locale) {
return `https://github.com/laurent22/joplin/blob/dev/packages/app-cli/locales/${locale}.po`;
return `https://github.com/laurent22/joplin/blob/dev/packages/lib/locales/${locale}.po`;
}
function translationStatusToMdTable(status) {

View File

@@ -228,33 +228,33 @@ const operations = [
{
source: 5,
dest: 'Tools/PortableAppsLauncher/App/AppInfo/appicon.ico',
dest: 'packages/tools/PortableAppsLauncher/App/AppInfo/appicon.ico',
},
{
source: 2,
dest: 'Tools/PortableAppsLauncher/App/AppInfo/appicon_16.png',
dest: 'packages/tools/PortableAppsLauncher/App/AppInfo/appicon_16.png',
},
{
source: 3,
dest: 'Tools/PortableAppsLauncher/App/AppInfo/appicon_32.png',
dest: 'packages/tools/PortableAppsLauncher/App/AppInfo/appicon_32.png',
width: 32,
height: 32,
},
{
source: 4,
dest: 'Tools/PortableAppsLauncher/App/AppInfo/appicon_75.png',
dest: 'packages/tools/PortableAppsLauncher/App/AppInfo/appicon_75.png',
width: 75,
height: 75,
},
{
source: 4,
dest: 'Tools/PortableAppsLauncher/App/AppInfo/appicon_128.png',
dest: 'packages/tools/PortableAppsLauncher/App/AppInfo/appicon_128.png',
width: 128,
height: 128,
},
{
source: 4,
dest: 'Tools/PortableAppsLauncher/App/AppInfo/Launcher/splash.jpg',
dest: 'packages/tools/PortableAppsLauncher/App/AppInfo/Launcher/splash.jpg',
width: 144,
height: 144,
},

View File

@@ -1,13 +1,13 @@
const fs = require('fs-extra');
const { execCommand, execCommandWithPipes, githubRelease, githubOauthToken, fileExists } = require('./tool-utils.js');
const { execCommandVerbose, execCommandWithPipes, githubRelease, githubOauthToken, fileExists } = require('./tool-utils.js');
const path = require('path');
const fetch = require('node-fetch');
const uriTemplate = require('uri-template');
const projectName = 'joplin-android';
const rnDir = `${__dirname}/../packages/app-mobile`;
const rnDir = `${__dirname}/../../packages/app-mobile`;
const rootDir = path.dirname(__dirname);
const releaseDir = `${rootDir}/_releases`;
const releaseDir = `${rnDir}/dist`;
// function wslToWinPath(wslPath) {
// const s = wslPath.split('/');
@@ -84,7 +84,8 @@ async function createRelease(name, tagName, version) {
console.info(`Building APK file v${suffix}...`);
let restoreDir = null;
let apkBuildCmd = 'assembleRelease -PbuildDir=build';
let apkBuildCmd = '';
const apkBuildCmdArgs = ['assembleRelease', '-PbuildDir=build'];
if (await fileExists('/mnt/c/Windows/System32/cmd.exe')) {
// In recent versions (of Gradle? React Native?), running gradlew.bat from WSL throws the following error:
@@ -114,14 +115,12 @@ async function createRelease(name, tagName, version) {
apkBuildCmd = '';
} else {
process.chdir(`${rnDir}/android`);
apkBuildCmd = `./gradlew ${apkBuildCmd}`;
apkBuildCmd = './gradlew';
restoreDir = rootDir;
}
if (apkBuildCmd) {
console.info(apkBuildCmd);
const output = await execCommand(apkBuildCmd);
console.info(output);
await execCommandVerbose(apkBuildCmd, apkBuildCmdArgs);
}
if (restoreDir) process.chdir(restoreDir);
@@ -129,11 +128,11 @@ async function createRelease(name, tagName, version) {
await fs.mkdirp(releaseDir);
console.info(`Copying APK to ${apkFilePath}`);
await fs.copy('packages/app-mobile/android/app/build/outputs/apk/release/app-release.apk', apkFilePath);
await fs.copy('app-mobile/android/app/build/outputs/apk/release/app-release.apk', apkFilePath);
if (name === 'main') {
console.info(`Copying APK to ${releaseDir}/joplin-latest.apk`);
await fs.copy('packages/app-mobile/android/app/build/outputs/apk/release/app-release.apk', `${releaseDir}/joplin-latest.apk`);
await fs.copy('app-mobile/android/app/build/outputs/apk/release/app-release.apk', `${releaseDir}/joplin-latest.apk`);
}
for (const filename in originalContents) {
@@ -177,12 +176,12 @@ async function main() {
await fs.writeFile('README.md', readmeContent);
}
console.info(await execCommand('git pull'));
console.info(await execCommand('git add -A'));
console.info(await execCommand(`git commit -m "Android release v${version}"`));
console.info(await execCommand(`git tag ${tagName}`));
console.info(await execCommand('git push'));
console.info(await execCommand('git push --tags'));
await execCommandVerbose('git', ['pull']);
await execCommandVerbose('git', ['add', '-A']);
await execCommandVerbose('git', ['commit', '-m', `Android release v${version}`]);
await execCommandVerbose('git', ['tag', tagName]);
await execCommandVerbose('git', ['push']);
await execCommandVerbose('git', ['push', '--tags']);
console.info(`Creating GitHub release ${tagName}...`);

View File

@@ -1,9 +1,7 @@
const { execCommand } = require('./tool-utils.js');
const path = require('path');
const { execCommand, rootDir } = require('./tool-utils.js');
const fs = require('fs-extra');
const moment = require('moment');
const rootDir = path.dirname(__dirname);
const appDir = `${rootDir}/packages/app-cli`;
const changelogPath = `${rootDir}/readme/changelog_cli.md`;
@@ -59,8 +57,7 @@ async function main() {
await execCommand('git pull');
await execCommand('touch app/main.js');
await execCommand('npm run build');
// await execCommand('cp package.json build/');
await execCommand('cp ../README.md build/');
await execCommand('cp ../../README.md build/');
process.chdir(`${appDir}/build`);

View File

@@ -1,7 +1,5 @@
const { execCommand, githubRelease } = require('./tool-utils.js');
const path = require('path');
const { execCommand, githubRelease, rootDir } = require('./tool-utils.js');
const rootDir = path.dirname(__dirname);
const appDir = `${rootDir}/packages/app-desktop`;
async function main() {
@@ -29,7 +27,7 @@ async function main() {
console.info(`Created GitHub release: ${release.html_url}`);
console.info('GitHub release page: https://github.com/laurent22/joplin/releases');
console.info(`To create changelog: node Tools/git-changelog.js ${version}`);
console.info(`To create changelog: node packages/tools/git-changelog.js ${version}`);
}
main().catch((error) => {

View File

@@ -1,7 +1,7 @@
const fs = require('fs-extra');
const path = require('path');
const rootDir = path.dirname(__dirname);
const rootDir = path.dirname(path.dirname(__dirname));
async function updatePackageVersion(packageFilePath, majorMinorVersion) {
const contentText = await fs.readFile(packageFilePath, 'utf8');

View File

@@ -1,5 +1,7 @@
const fetch = require('node-fetch');
const fs = require('fs-extra');
const execa = require('execa');
const { execSync } = require('child_process');
const toolUtils = {};
@@ -21,6 +23,30 @@ toolUtils.execCommand = function(command) {
});
};
function quotePath(path) {
if (!path) return '';
if (path.indexOf('"') < 0 && path.indexOf(' ') < 0) return path;
path = path.replace(/"/, '\\"');
return `"${path}"`;
}
function commandToString(commandName, args = []) {
const output = [quotePath(commandName)];
for (const arg of args) {
output.push(quotePath(arg));
}
return output.join(' ');
}
toolUtils.execCommandVerbose = function(commandName, args = []) {
console.info(`> ${commandToString(commandName, args)}`);
const promise = execa(commandName, args);
promise.stdout.pipe(process.stdout);
return promise;
};
toolUtils.execCommandWithPipes = function(executable, args) {
const spawn = require('child_process').spawn;
@@ -41,6 +67,61 @@ toolUtils.execCommandWithPipes = function(executable, args) {
});
};
toolUtils.toSystemSlashes = function(path) {
const os = process.platform;
if (os === 'win32') return path.replace(/\//g, '\\');
return path.replace(/\\/g, '/');
};
toolUtils.deleteLink = async function(path) {
if (toolUtils.isWindows()) {
try {
execSync(`rmdir "${toolUtils.toSystemSlashes(path)}"`, { stdio: 'pipe' });
} catch (error) {
// console.info('Error: ' + error.message);
}
} else {
try {
fs.unlinkSync(toolUtils.toSystemSlashes(path));
} catch (error) {
// ignore
}
}
};
toolUtils.credentialDir = async function() {
const username = require('os').userInfo().username;
const toTry = [
`c:/Users/${username}/joplin-credentials`,
`/mnt/c/Users/${username}/joplin-credentials`,
`/home/${username}/joplin-credentials`,
`/Users/${username}/joplin-credentials`,
];
for (const dirPath of toTry) {
if (await fs.exists(dirPath)) return dirPath;
}
throw new Error(`Could not find credential directory in any of these paths: ${JSON.stringify(toTry)}`);
};
// Returns the project root dir
toolUtils.rootDir = require('path').dirname(require('path').dirname(__dirname));
toolUtils.credentialFile = async function(filename) {
const rootDir = await toolUtils.credentialDir();
const output = `${rootDir}/${filename}`;
if (!(await fs.exists(output))) throw new Error(`No such file: ${output}`);
return output;
};
toolUtils.readCredentialFile = async function(filename) {
const filePath = await toolUtils.credentialFile(filename);
const r = await fs.readFile(filePath);
return r.toString();
};
toolUtils.downloadFile = function(url, targetPath) {
const https = require('https');
const fs = require('fs');
@@ -163,15 +244,11 @@ toolUtils.githubUsername = async function(email, name) {
};
toolUtils.patreonOauthToken = async function() {
const fs = require('fs-extra');
const r = await fs.readFile(`${__dirname}/patreon_oauth_token.txt`);
return r.toString();
return toolUtils.readCredentialFile('patreon_oauth_token.txt');
};
toolUtils.githubOauthToken = async function() {
const fs = require('fs-extra');
const r = await fs.readFile(`${__dirname}/github_oauth_token.txt`);
return r.toString();
return toolUtils.readCredentialFile('github_oauth_token.txt');
};
toolUtils.githubRelease = async function(project, tagName, options = null) {

View File

@@ -1,5 +1,14 @@
# Joplin terminal app changelog
## [cli-v1.4.3](https://github.com/laurent22/joplin/releases/tag/cli-v1.4.3) - 2020-11-06T21:19:29Z
IMPORTANT: If you use the web API, please note that there are a few breaking changes in this release. See here for more information: https://github.com/laurent22/joplin/pull/3983#issue-509624899
- New: API: Adds ability to paginate data (#3983)
- Fixed: Display proper error message when decryption worker cannot be started (#4000)
- Fixed: Fixed OneDrive authentication
- Fixed: Fixed sync issue when importing ENEX files that contain new line characters in the source URL attribute (#3955)
## [cli-v1.3.3](https://github.com/laurent22/joplin/releases/tag/cli-v1.3.3) - 2020-10-23T16:00:38Z
- Improved: Added support for a custom S3 URL (#3921) (#3691 by [@aaron](https://github.com/aaron))