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
|
}
|