summaryrefslogtreecommitdiff
path: root/node_modules/dir-compare/src/symlink/loopDetector.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/dir-compare/src/symlink/loopDetector.js')
-rw-r--r--node_modules/dir-compare/src/symlink/loopDetector.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/node_modules/dir-compare/src/symlink/loopDetector.js b/node_modules/dir-compare/src/symlink/loopDetector.js
new file mode 100644
index 0000000..0376ebb
--- /dev/null
+++ b/node_modules/dir-compare/src/symlink/loopDetector.js
@@ -0,0 +1,51 @@
+var fs = require('fs')
+
+/**
+ * Provides symlink loop detection to directory traversal algorithm.
+ */
+module.exports = {
+ detectLoop: function (entry, symlinkCache) {
+ if (entry && entry.isSymlink) {
+ var realPath = fs.realpathSync(entry.absolutePath)
+ if (symlinkCache[realPath]) {
+ return true
+ }
+ }
+ return false
+ },
+
+ initSymlinkCache: function() {
+ return {
+ dir1: {},
+ dir2: {}
+ }
+ },
+
+ updateSymlinkCache: function(symlinkCache, rootEntry1, rootEntry2, loopDetected1, loopDetected2) {
+ var symlinkCachePath1, symlinkCachePath2
+ if (rootEntry1 && !loopDetected1) {
+ symlinkCachePath1 = rootEntry1.isSymlink ? fs.realpathSync(rootEntry1.absolutePath) : rootEntry1.absolutePath
+ symlinkCache.dir1[symlinkCachePath1] = true
+ }
+ if (rootEntry2 && !loopDetected2) {
+ symlinkCachePath2 = rootEntry2.isSymlink ? fs.realpathSync(rootEntry2.absolutePath) : rootEntry2.absolutePath
+ symlinkCache.dir2[symlinkCachePath2] = true
+ }
+ },
+
+ cloneSymlinkCache: function (symlinkCache) {
+ return {
+ dir1: shallowClone(symlinkCache.dir1),
+ dir2: shallowClone(symlinkCache.dir2)
+ }
+ },
+}
+
+function shallowClone(obj) {
+ var cloned = {}
+ Object.keys(obj).forEach(function (key) {
+ cloned[key] = obj[key]
+ })
+ return cloned
+}
+