1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-06-12 22:57:38 +02:00

Handle resource conflicts

This commit is contained in:
Laurent Cozic
2020-05-31 16:57:16 +01:00
parent 1852d9291d
commit 36776cd615
7 changed files with 153 additions and 18 deletions

View File

@ -372,6 +372,12 @@ class Synchronizer {
let reason = '';
let remoteContent = null;
const getConflictType = (conflictedItem) => {
if (conflictedItem.type_ === BaseModel.TYPE_NOTE) return 'noteConflict';
if (conflictedItem.type_ === BaseModel.TYPE_RESOURCE) return 'resourceConflict';
return 'itemConflict';
};
if (!remote) {
if (!local.sync_time) {
action = 'createRemote';
@ -379,7 +385,7 @@ class Synchronizer {
} else {
// Note or item was modified after having been deleted remotely
// "itemConflict" is for all the items except the notes, which are dealt with in a special way
action = local.type_ == BaseModel.TYPE_NOTE ? 'noteConflict' : 'itemConflict';
action = getConflictType(local);
reason = 'remote has been deleted, but local has changes';
}
} else {
@ -416,7 +422,7 @@ class Synchronizer {
// Since, in this loop, we are only dealing with items that require sync, if the
// remote has been modified after the sync time, it means both items have been
// modified and so there's a conflict.
action = local.type_ == BaseModel.TYPE_NOTE ? 'noteConflict' : 'itemConflict';
action = getConflictType(local);
reason = 'both remote and local have changes';
} else {
action = 'updateRemote';
@ -528,8 +534,29 @@ class Synchronizer {
conflictedNote.is_conflict = 1;
await Note.save(conflictedNote, { autoTimestamp: false, changeSource: ItemChange.SOURCE_SYNC });
}
} else if (action == 'resourceConflict') {
// ------------------------------------------------------------------------------
// Unlike notes we always handle the conflict for resources
// ------------------------------------------------------------------------------
const conflictResource = await shim.duplicateResource(local.id);
await Note.save({
title: _('Attachment conflict: "%s"', local.title),
body: _('There was a [conflict](%s) on the attachment below.\n\n%s', 'https://joplinapp.org/conflict', Resource.markdownTag(conflictResource)),
is_conflict: 1,
}, { changeSource: ItemChange.SOURCE_SYNC });
// The local content we have is no longer valid and should be re-downloaded
await Resource.setLocalState(local.id, {
fetch_status: Resource.FETCH_STATUS_IDLE,
});
}
if (['noteConflict', 'resourceConflict'].includes(action)) {
// ------------------------------------------------------------------------------
// For note and resource conflicts, the creation of the conflict item is done
// differently. However the way the local content is handled is the same.
// Either copy the remote content to local or, if the remote content has
// been deleted, delete the local content.
// ------------------------------------------------------------------------------