mirror of
https://github.com/laurent22/joplin.git
synced 2025-01-11 18:24:43 +02:00
All: Added concept of sync version and client ID to allow upgrading sync targets
This commit is contained in:
parent
f71e7f4fd3
commit
8a097fb79c
File diff suppressed because it is too large
Load Diff
@ -24,6 +24,7 @@ const BaseService = require('lib/services/BaseService.js');
|
||||
const { FsDriverNode } = require('lib/fs-driver-node.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { shimInit } = require('lib/shim-init-node.js');
|
||||
const { uuid } = require('lib/uuid.js');
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry.js');
|
||||
const SyncTargetMemory = require('lib/SyncTargetMemory.js');
|
||||
const SyncTargetFilesystem = require('lib/SyncTargetFilesystem.js');
|
||||
@ -137,6 +138,7 @@ async function switchClient(id) {
|
||||
|
||||
await Setting.load();
|
||||
|
||||
if (!Setting.value('clientId')) Setting.setValue('clientId', uuid.create());
|
||||
Setting.setValue('sync.wipeOutFailSafe', false); // To keep things simple, always disable fail-safe unless explicitely set in the test itself
|
||||
}
|
||||
|
||||
@ -180,6 +182,7 @@ async function setupDatabase(id = null) {
|
||||
if (databases_[id]) {
|
||||
await clearDatabase(id);
|
||||
await Setting.load();
|
||||
if (!Setting.value('clientId')) Setting.setValue('clientId', uuid.create());
|
||||
return;
|
||||
}
|
||||
|
||||
@ -197,6 +200,7 @@ async function setupDatabase(id = null) {
|
||||
|
||||
BaseModel.db_ = databases_[id];
|
||||
await Setting.load();
|
||||
if (!Setting.value('clientId')) Setting.setValue('clientId', uuid.create());
|
||||
}
|
||||
|
||||
function resourceDir(id = null) {
|
||||
|
@ -569,6 +569,9 @@ class Application extends BaseApplication {
|
||||
'',
|
||||
'Copyright © 2016-2019 Laurent Cozic',
|
||||
_('%s %s (%s, %s)', p.name, p.version, Setting.value('env'), process.platform),
|
||||
'',
|
||||
_('Client ID: %s', Setting.value('clientId')),
|
||||
_('Sync Version: %s', Setting.value('syncVersion')),
|
||||
];
|
||||
if (gitInfo) {
|
||||
message.push(`\n${gitInfo}`);
|
||||
|
@ -15,6 +15,7 @@ const { reg } = require('lib/registry.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const BaseSyncTarget = require('lib/BaseSyncTarget.js');
|
||||
const { shim } = require('lib/shim.js');
|
||||
const { uuid } = require('lib/uuid.js');
|
||||
const { _, setLocale } = require('lib/locale.js');
|
||||
const reduxSharedMiddleware = require('lib/components/shared/reduxSharedMiddleware');
|
||||
const os = require('os');
|
||||
@ -598,6 +599,8 @@ class BaseApplication {
|
||||
|
||||
await Setting.load();
|
||||
|
||||
if (!Setting.value('clientId')) Setting.setValue('clientId', uuid.create());
|
||||
|
||||
if (Setting.value('firstStart')) {
|
||||
const locale = shim.detectAndSetLocale(Setting);
|
||||
reg.logger().info(`First start: detected locale as ${locale}`);
|
||||
|
@ -31,6 +31,12 @@ class Setting extends BaseModel {
|
||||
// public for the mobile and desktop apps because they are handled separately in menus.
|
||||
|
||||
this.metadata_ = {
|
||||
'clientId': {
|
||||
value: '',
|
||||
type: Setting.TYPE_STRING,
|
||||
public: false,
|
||||
},
|
||||
|
||||
'sync.target': {
|
||||
value: SyncTargetRegistry.nameToId('dropbox'),
|
||||
type: Setting.TYPE_INT,
|
||||
@ -917,6 +923,7 @@ Setting.constants_ = {
|
||||
templateDir: '',
|
||||
tempDir: '',
|
||||
openDevTools: false,
|
||||
syncVersion: 1,
|
||||
};
|
||||
|
||||
Setting.autoSaveEnabled = true;
|
||||
|
@ -213,6 +213,9 @@ class Synchronizer {
|
||||
|
||||
const syncSteps = options.syncSteps ? options.syncSteps : ['update_remote', 'delete_remote', 'delta'];
|
||||
|
||||
// The default is to log errors, but when testing it's convenient to be able to catch and verify errors
|
||||
const throwOnError = options.throwOnError === true;
|
||||
|
||||
const syncTargetId = this.api().syncTargetId();
|
||||
|
||||
this.cancelling_ = false;
|
||||
@ -237,11 +240,27 @@ class Synchronizer {
|
||||
return `${this.resourceDirName_}/${resourceId}`;
|
||||
};
|
||||
|
||||
let errorToThrow = null;
|
||||
|
||||
try {
|
||||
await this.api().mkdir(this.syncDirName_);
|
||||
this.api().setTempDirName(this.syncDirName_);
|
||||
await this.api().mkdir(this.resourceDirName_);
|
||||
|
||||
const supportedSyncTargetVersion = Setting.value('syncVersion');
|
||||
const syncTargetVersion = await this.api().get('.sync/version.txt');
|
||||
|
||||
if (!syncTargetVersion) {
|
||||
await this.api().put('.sync/version.txt', `${supportedSyncTargetVersion}`);
|
||||
} else {
|
||||
if (Number(syncTargetVersion) > supportedSyncTargetVersion) {
|
||||
throw new Error(sprintf('Sync version of the target (%d) does not match sync version supported by client (%d). Please upgrade your client.', Number(syncTargetVersion), supportedSyncTargetVersion));
|
||||
} else {
|
||||
await this.api().put('.sync/version.txt', `${supportedSyncTargetVersion}`);
|
||||
// TODO: do upgrade job
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================================================
|
||||
// 1. UPLOAD
|
||||
// ------------------------------------------------------------------------
|
||||
@ -709,7 +728,9 @@ class Synchronizer {
|
||||
}
|
||||
} // DELTA STEP
|
||||
} catch (error) {
|
||||
if (error && ['cannotEncryptEncrypted', 'noActiveMasterKey', 'processingPathTwice', 'failSafe'].indexOf(error.code) >= 0) {
|
||||
if (throwOnError) {
|
||||
errorToThrow = error;
|
||||
} else if (error && ['cannotEncryptEncrypted', 'noActiveMasterKey', 'processingPathTwice', 'failSafe'].indexOf(error.code) >= 0) {
|
||||
// Only log an info statement for this since this is a common condition that is reported
|
||||
// in the application, and needs to be resolved by the user.
|
||||
// Or it's a temporary issue that will be resolved on next sync.
|
||||
@ -752,6 +773,8 @@ class Synchronizer {
|
||||
|
||||
this.state_ = 'idle';
|
||||
|
||||
if (errorToThrow) throw errorToThrow;
|
||||
|
||||
return outputContext;
|
||||
}
|
||||
}
|
||||
|
@ -59,6 +59,7 @@ const ResourceFetcher = require('lib/services/ResourceFetcher');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const WelcomeUtils = require('lib/WelcomeUtils');
|
||||
const { themeStyle } = require('lib/components/global-style.js');
|
||||
const { uuid } = require('lib/uuid.js');
|
||||
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry.js');
|
||||
const SyncTargetOneDrive = require('lib/SyncTargetOneDrive.js');
|
||||
@ -440,6 +441,8 @@ async function initialize(dispatch) {
|
||||
reg.logger().info('Loading settings...');
|
||||
await Setting.load();
|
||||
|
||||
if (!Setting.value('clientId')) Setting.setValue('clientId', uuid.create());
|
||||
|
||||
if (Setting.value('firstStart')) {
|
||||
let locale = NativeModules.I18nManager.localeIdentifier;
|
||||
if (!locale) locale = defaultLocale();
|
||||
|
Loading…
Reference in New Issue
Block a user