diff --git a/src/backupformat/rsync.js b/src/backupformat/rsync.js index c8e20c352..699b73880 100644 --- a/src/backupformat/rsync.js +++ b/src/backupformat/rsync.js @@ -68,29 +68,6 @@ async function addFile(sourceFile, encryption, uploader, progressCallback) { await uploader.finish(); } -async function processSyncerChange(change, backupTarget, remotePath, dataLayout, progressCallback) { - debug('sync: processing task: %j', change); - // the empty task.path is special to signify the directory - const destPath = change.path && backupTarget.encryption?.encryptedFilenames ? hush.encryptFilePath(change.path, backupTarget.encryption) : change.path; - const fullPath = path.join(remotePath, destPath); - - if (change.operation === 'removedir') { - debug(`Removing directory ${fullPath}`); - await backupTargets.storageApi(backupTarget).removeDir(backupTarget.config, fullPath, progressCallback); - } else if (change.operation === 'remove') { - debug(`Removing ${fullPath}`); - await backupTargets.storageApi(backupTarget).remove(backupTarget.config, fullPath); - } else if (change.operation === 'add') { - await promiseRetry({ times: 5, interval: 20000, debug }, async (retryCount) => { - progressCallback({ message: `Adding ${change.path}` + (retryCount > 1 ? ` (Try ${retryCount})` : '') }); - debug(`Adding ${change.path} position ${change.position} try ${retryCount}`); - - const uploader = await backupTargets.storageApi(backupTarget).upload(backupTarget.config, fullPath); - await addFile(dataLayout.toLocalPath('./' + change.path), backupTarget.encryption, uploader, progressCallback); - }); - } -} - async function sync(backupTarget, remotePath, dataLayout, progressCallback) { assert.strictEqual(typeof backupTarget, 'object'); assert.strictEqual(typeof remotePath, 'string'); @@ -104,6 +81,29 @@ async function sync(backupTarget, remotePath, dataLayout, progressCallback) { const changes = await syncer.sync(dataLayout, { cacheFile }); debug(`sync: processing ${changes.delQueue.length} deletes and ${changes.addQueue.length} additions`); + async function processSyncerChange(change) { + debug('sync: processing task: %j', change); + // the empty task.path is special to signify the directory + const destPath = change.path && backupTarget.encryption?.encryptedFilenames ? hush.encryptFilePath(change.path, backupTarget.encryption) : change.path; + const fullPath = path.join(remotePath, destPath); + + if (change.operation === 'removedir') { + debug(`Removing directory ${fullPath}`); + await backupTargets.storageApi(backupTarget).removeDir(backupTarget.config, fullPath, progressCallback); + } else if (change.operation === 'remove') { + debug(`Removing ${fullPath}`); + await backupTargets.storageApi(backupTarget).remove(backupTarget.config, fullPath); + } else if (change.operation === 'add') { + await promiseRetry({ times: 5, interval: 20000, debug }, async (retryCount) => { + progressCallback({ message: `Adding ${change.path}` + (retryCount > 1 ? ` (Try ${retryCount})` : '') }); + debug(`Adding ${change.path} position ${change.position} try ${retryCount}`); + + const uploader = await backupTargets.storageApi(backupTarget).upload(backupTarget.config, fullPath); + await addFile(dataLayout.toLocalPath('./' + change.path), backupTarget.encryption, uploader, progressCallback); + }); + } + } + const [delError] = await safe(async.eachLimit(changes.delQueue, concurrency, async (change) => await processSyncerChange(change, backupTarget, remotePath, dataLayout, progressCallback))); debug('sync: done processing deletes. error: %o', delError); if (delError) throw delError;