summaryrefslogtreecommitdiff
path: root/desktop/node_modules/dir-compare/build/src/compareAsync.js
diff options
context:
space:
mode:
authorRaindropsSys <raindrops@equestria.dev>2023-10-24 17:43:37 +0200
committerRaindropsSys <raindrops@equestria.dev>2023-10-24 17:43:37 +0200
commitae187b6d75c8079da0be1dc288613bad8466fe61 (patch)
tree5ea0d34185a2270f29ffaa65e1f5258028d7d5d0 /desktop/node_modules/dir-compare/build/src/compareAsync.js
downloadmist-ae187b6d75c8079da0be1dc288613bad8466fe61.tar.gz
mist-ae187b6d75c8079da0be1dc288613bad8466fe61.tar.bz2
mist-ae187b6d75c8079da0be1dc288613bad8466fe61.zip
Initial commit
Diffstat (limited to 'desktop/node_modules/dir-compare/build/src/compareAsync.js')
-rw-r--r--desktop/node_modules/dir-compare/build/src/compareAsync.js142
1 files changed, 142 insertions, 0 deletions
diff --git a/desktop/node_modules/dir-compare/build/src/compareAsync.js b/desktop/node_modules/dir-compare/build/src/compareAsync.js
new file mode 100644
index 0000000..8f3151b
--- /dev/null
+++ b/desktop/node_modules/dir-compare/build/src/compareAsync.js
@@ -0,0 +1,142 @@
+const entryBuilder = require('./entry/entryBuilder');
+const entryEquality = require('./entry/entryEquality');
+const stats = require('./statistics/statisticsUpdate');
+const pathUtils = require('path');
+const fsPromise = require('./fs/fsPromise');
+const loopDetector = require('./symlink/loopDetector');
+const entryComparator = require('./entry/entryComparator');
+const entryType = require('./entry/entryType');
+const { getPrmissionDenieStateWhenLeftMissing, getPrmissionDenieStateWhenRightMissing, getPermissionDeniedState } = require('./permissions/permissionDeniedState');
+/**
+ * Returns the sorted list of entries in a directory.
+ */
+function getEntries(rootEntry, relativePath, loopDetected, options) {
+ if (!rootEntry || loopDetected) {
+ return Promise.resolve([]);
+ }
+ if (rootEntry.isDirectory) {
+ if (rootEntry.isPermissionDenied) {
+ return [];
+ }
+ return fsPromise.readdir(rootEntry.absolutePath)
+ .then(entries => entryBuilder.buildDirEntries(rootEntry, entries, relativePath, options));
+ }
+ return Promise.resolve([rootEntry]);
+}
+/**
+ * Compares two directories asynchronously.
+ */
+function compare(rootEntry1, rootEntry2, level, relativePath, options, statistics, diffSet, symlinkCache) {
+ const loopDetected1 = loopDetector.detectLoop(rootEntry1, symlinkCache.dir1);
+ const loopDetected2 = loopDetector.detectLoop(rootEntry2, symlinkCache.dir2);
+ loopDetector.updateSymlinkCache(symlinkCache, rootEntry1, rootEntry2, loopDetected1, loopDetected2);
+ return Promise.all([getEntries(rootEntry1, relativePath, loopDetected1, options), getEntries(rootEntry2, relativePath, loopDetected2, options)])
+ .then(entriesResult => {
+ const entries1 = entriesResult[0];
+ const entries2 = entriesResult[1];
+ let i1 = 0, i2 = 0;
+ const comparePromises = [];
+ const compareFilePromises = [];
+ let subDiffSet;
+ while (i1 < entries1.length || i2 < entries2.length) {
+ const entry1 = entries1[i1];
+ const entry2 = entries2[i2];
+ let type1, type2;
+ // compare entry name (-1, 0, 1)
+ let cmp;
+ if (i1 < entries1.length && i2 < entries2.length) {
+ cmp = entryComparator.compareEntry(entry1, entry2, options);
+ type1 = entryType.getType(entry1);
+ type2 = entryType.getType(entry2);
+ }
+ else if (i1 < entries1.length) {
+ type1 = entryType.getType(entry1);
+ type2 = entryType.getType(undefined);
+ cmp = -1;
+ }
+ else {
+ type1 = entryType.getType(undefined);
+ type2 = entryType.getType(entry2);
+ cmp = 1;
+ }
+ // process entry
+ if (cmp === 0) {
+ // Both left/right exist and have the same name and type
+ const permissionDeniedState = getPermissionDeniedState(entry1, entry2);
+ if (permissionDeniedState === "access-ok") {
+ const compareEntryRes = entryEquality.isEntryEqualAsync(entry1, entry2, type1, diffSet, options);
+ const samePromise = compareEntryRes.samePromise;
+ const same = compareEntryRes.same;
+ if (same !== undefined) {
+ options.resultBuilder(entry1, entry2, same ? 'equal' : 'distinct', level, relativePath, options, statistics, diffSet, compareEntryRes.reason, permissionDeniedState);
+ stats.updateStatisticsBoth(entry1, entry2, compareEntryRes.same, compareEntryRes.reason, type1, permissionDeniedState, statistics, options);
+ }
+ else {
+ compareFilePromises.push(samePromise);
+ }
+ }
+ else {
+ const state = 'distinct';
+ const reason = "permission-denied";
+ const same = false;
+ options.resultBuilder(entry1, entry2, state, level, relativePath, options, statistics, diffSet, reason, permissionDeniedState);
+ stats.updateStatisticsBoth(entry1, entry2, same, reason, type1, permissionDeniedState, statistics, options);
+ }
+ i1++;
+ i2++;
+ if (!options.skipSubdirs && type1 === 'directory') {
+ if (!options.noDiffSet) {
+ subDiffSet = [];
+ diffSet.push(subDiffSet);
+ }
+ comparePromises.push(compare(entry1, entry2, level + 1, pathUtils.join(relativePath, entry1.name), options, statistics, subDiffSet, loopDetector.cloneSymlinkCache(symlinkCache)));
+ }
+ }
+ else if (cmp < 0) {
+ // Right missing
+ const permissionDeniedState = getPrmissionDenieStateWhenRightMissing(entry1);
+ options.resultBuilder(entry1, undefined, 'left', level, relativePath, options, statistics, diffSet, undefined, permissionDeniedState);
+ stats.updateStatisticsLeft(entry1, type1, permissionDeniedState, statistics, options);
+ i1++;
+ if (type1 === 'directory' && !options.skipSubdirs) {
+ if (!options.noDiffSet) {
+ subDiffSet = [];
+ diffSet.push(subDiffSet);
+ }
+ comparePromises.push(compare(entry1, undefined, level + 1, pathUtils.join(relativePath, entry1.name), options, statistics, subDiffSet, loopDetector.cloneSymlinkCache(symlinkCache)));
+ }
+ }
+ else {
+ // Left missing
+ let permissionDeniedState = getPrmissionDenieStateWhenLeftMissing(entry2);
+ options.resultBuilder(undefined, entry2, 'right', level, relativePath, options, statistics, diffSet, undefined, permissionDeniedState);
+ stats.updateStatisticsRight(entry2, type2, permissionDeniedState, statistics, options);
+ i2++;
+ if (type2 === 'directory' && !options.skipSubdirs) {
+ if (!options.noDiffSet) {
+ subDiffSet = [];
+ diffSet.push(subDiffSet);
+ }
+ comparePromises.push(compare(undefined, entry2, level + 1, pathUtils.join(relativePath, entry2.name), options, statistics, subDiffSet, loopDetector.cloneSymlinkCache(symlinkCache)));
+ }
+ }
+ }
+ return Promise.all(comparePromises)
+ .then(() => Promise.all(compareFilePromises)
+ .then(sameResults => {
+ for (let i = 0; i < sameResults.length; i++) {
+ const sameResult = sameResults[i];
+ if (sameResult.error) {
+ return Promise.reject(sameResult.error);
+ }
+ else {
+ const permissionDeniedState = "access-ok";
+ options.resultBuilder(sameResult.entry1, sameResult.entry2, sameResult.same ? 'equal' : 'distinct', level, relativePath, options, statistics, sameResult.diffSet, sameResult.reason, permissionDeniedState);
+ stats.updateStatisticsBoth(sameResult.entries1, sameResult.entries2, sameResult.same, sameResult.reason, sameResult.type1, permissionDeniedState, statistics, options);
+ }
+ }
+ }));
+ });
+}
+module.exports = compare;
+//# sourceMappingURL=compareAsync.js.map \ No newline at end of file