Browse Source

Fix situation when symlinking loops can occur.

Herby Vojčík 5 years ago
parent
commit
68579c3770
1 changed files with 21 additions and 4 deletions
  1. 21 4
      lib/config-builder.js

+ 21 - 4
lib/config-builder.js

@@ -5,18 +5,35 @@ var path = require('path'),
     fs = require('fs');
 
 function eachConfigFile(root, callback) {
-    var result = {files: [], dirs: []};
+    var files = {};
+    var dirs = {};
+    var dirNames = {};
     var find = findit(root, {followSymlinks: true});
+    var loopingOn = null;
     find.on('file', function (file, stat, linkPath) {
         if (file.match(/\.amd\.json$/)) {
-            result.files[linkPath || file] = stat;
+            files[linkPath || file] = stat;
+        }
+    });
+    find.on('error', function (err) {
+        if (err.code === 'ELOOP') loopingOn = err.path;
+        else {
+            console.log(err);
+            find.stop();
         }
     });
     find.on('directory', function (dir, stat, stop, linkPath) {
-        result.dirs[linkPath || dir] = stat;
+        var name = linkPath || dir;
+        if (dir === loopingOn && !isLessDeep(name, dirNames[dir])) {
+            stop();
+            name = dirNames[dir];
+        }
+        loopingOn = null;
+        dirNames[dir] = name;
+        dirs[name] = stat;
     });
     find.on('end', function () {
-        callback(null, result);
+        callback(null, {files: files, dirs: dirs});
     });
 }