| | |
| | | return callback(new Error("Syncing Disabled")); |
| | | } |
| | | |
| | | // re-use IDBFS.getLocalSet for now |
| | | CLOUDFS.getLocalSet(mount, function(err, local) { |
| | | if (err) return callback(err); |
| | | |
| | |
| | | CLOUDFS.reconcile(mount, src, dst, callback); |
| | | }); |
| | | }); |
| | | }, |
| | | // handling the diffing of "haves" and "have nots" |
| | | reconcile: function(mount, src, dst, callback) { |
| | | var total = 0; |
| | | |
| | | var create = []; |
| | | Object.keys(src.entries).forEach(function (key) { |
| | | var e = src.entries[key]; |
| | | var e2 = dst.entries[key]; |
| | | if (!e2 || e.timestamp > e2.timestamp) { |
| | | create.push(key); |
| | | total++; |
| | | } |
| | | }); |
| | | /* |
| | | var remove = []; |
| | | Object.keys(dst.entries).forEach(function (key) { |
| | | var e = dst.entries[key]; |
| | | var e2 = src.entries[key]; |
| | | if (!e2) { |
| | | remove.push(key); |
| | | total++; |
| | | } |
| | | }); |
| | | */ |
| | | if (!total) { |
| | | return callback(null); |
| | | } |
| | | |
| | | var completed = 0; |
| | | |
| | | function done(err) { |
| | | if (err) { |
| | | if (!done.errored) { |
| | | done.errored = true; |
| | | return callback(err); |
| | | } |
| | | return; |
| | | } |
| | | if (++completed >= total) { |
| | | return callback(null); |
| | | } |
| | | }; |
| | | |
| | | // sort paths in ascending order so directory entries are created |
| | | // before the files inside them |
| | | create.sort().forEach(function (path) { |
| | | var pathinfo = src.entries[path]; |
| | | if (dst.type === 'local') { |
| | | CLOUDFS.loadRemoteEntry(mount, pathinfo, function (err, entry) { |
| | | if (err) return done(err); |
| | | CLOUDFS.storeLocalEntry(path, entry, done); |
| | | }); |
| | | } else { |
| | | CLOUDFS.loadLocalEntry(path, function (err, entry) { |
| | | if (err) return done(err); |
| | | CLOUDFS.storeRemoteEntry(mount, pathinfo, entry, done); |
| | | }); |
| | | } |
| | | }); |
| | | |
| | | return; |
| | | |
| | | // sort paths in descending order so files are deleted before their |
| | | // parent directories |
| | | remove.sort().reverse().forEach(function(path) { |
| | | var info = dst.entries[path]; |
| | | if (dst.type === 'local') { |
| | | CLOUDFS.removeLocalEntry(path, info, done); |
| | | } else { |
| | | CLOUDFS.removeRemoteEntry(path, info, done); |
| | | } |
| | | }); |
| | | }, |
| | | // Utility functions |
| | | validateProvider: function(provider_name) { |
| | |
| | | callback(e); |
| | | }) |
| | | } |
| | | }, |
| | | // handling the diffing of "haves" and "have nots" |
| | | reconcile: function(mount, src, dst, callback) { |
| | | var total = 0; |
| | | |
| | | var create = []; |
| | | Object.keys(src.entries).forEach(function (key) { |
| | | var e = src.entries[key]; |
| | | var e2 = dst.entries[key]; |
| | | if (!e2 || e.timestamp > e2.timestamp) { |
| | | create.push(key); |
| | | total++; |
| | | } |
| | | }); |
| | | /* |
| | | var remove = []; |
| | | Object.keys(dst.entries).forEach(function (key) { |
| | | var e = dst.entries[key]; |
| | | var e2 = src.entries[key]; |
| | | if (!e2) { |
| | | remove.push(key); |
| | | total++; |
| | | } |
| | | }); |
| | | */ |
| | | if (!total) { |
| | | return callback(null); |
| | | } |
| | | |
| | | var completed = 0; |
| | | |
| | | function done(err) { |
| | | if (err) { |
| | | if (!done.errored) { |
| | | done.errored = true; |
| | | return callback(err); |
| | | } |
| | | return; |
| | | } |
| | | if (++completed >= total) { |
| | | return callback(null); |
| | | } |
| | | }; |
| | | |
| | | // sort paths in ascending order so directory entries are created |
| | | // before the files inside them |
| | | create.sort().forEach(function (path) { |
| | | var pathinfo = src.entries[path]; |
| | | if (dst.type === 'local') { |
| | | CLOUDFS.loadRemoteEntry(mount, pathinfo, function (err, entry) { |
| | | if (err) return done(err); |
| | | CLOUDFS.storeLocalEntry(path, entry, done); |
| | | }); |
| | | } else { |
| | | CLOUDFS.loadLocalEntry(path, function (err, entry) { |
| | | if (err) return done(err); |
| | | CLOUDFS.storeRemoteEntry(mount, pathinfo, entry, done); |
| | | }); |
| | | } |
| | | }); |
| | | |
| | | return; |
| | | |
| | | // sort paths in descending order so files are deleted before their |
| | | // parent directories |
| | | remove.sort().reverse().forEach(function(path) { |
| | | var info = dst.entries[path]; |
| | | if (dst.type === 'local') { |
| | | CLOUDFS.removeLocalEntry(path, info, done); |
| | | } else { |
| | | CLOUDFS.removeRemoteEntry(path, info, done); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | }; |