138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | var path = require('canonical-path'); | ||
|  | var fs = require('fs'); | ||
|  | var minimatch = require("minimatch"); | ||
|  | 
 | ||
|  | 
 | ||
|  | // Utility wrappers over fs functions
 | ||
|  | 
 | ||
|  | module.exports = { | ||
|  |   addSymlink: addSymlink, | ||
|  |   removeSymlink: removeSymlink, | ||
|  |   removeDirSync: removeDirSync, | ||
|  |   lstatSyncExt: lstatSyncExt, | ||
|  | }; | ||
|  | 
 | ||
|  | // create a new link (linkPath) that points
 | ||
|  | // to realPath - will also delete the linkPath
 | ||
|  | // if it is a preexisting folder and not itself a symbolic link before it
 | ||
|  | // starts.
 | ||
|  | function addSymlink(realPath, linkPath) { | ||
|  | 
 | ||
|  |   // check if the linkPath is a folder
 | ||
|  |   // and if so delete it
 | ||
|  |   var stat = lstatSyncExt(linkPath); | ||
|  | 
 | ||
|  |   if (stat && stat.isSymbolicLink()) { | ||
|  |     // todo: check if it points to realPath
 | ||
|  |     return; | ||
|  |   } | ||
|  |   if (stat && stat.isDirectory()) { | ||
|  |     removeDirSync(linkPath); | ||
|  |   } | ||
|  |   symLinkSyncExt(realPath, linkPath, 'dir'); | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | function removeSymlink(linkPath) { | ||
|  |   var stat = lstatSyncExt(linkPath); | ||
|  |   if (!stat || !stat.isSymbolicLink()) return; | ||
|  | 
 | ||
|  |   fs.unlinkSync(linkPath); | ||
|  | } | ||
|  | 
 | ||
|  | // remove a dir and all of its files - sync
 | ||
|  | function removeDirSync(dirPath) { | ||
|  |   var files; | ||
|  |   try { | ||
|  |     files = fs.readdirSync(dirPath); | ||
|  |   } | ||
|  |   catch(e) { return; } | ||
|  |   if (files.length > 0) { | ||
|  |     for (var i = 0; i < files.length; i++) { | ||
|  |       var filePath = path.join(dirPath, files[i]); | ||
|  |       var stat = fs.lstatSync(filePath); | ||
|  |       if (stat.isFile() || stat.isSymbolicLink()) { | ||
|  |         fs.unlinkSync(filePath); | ||
|  |       } else { | ||
|  |         removeDirSync(filePath); | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  |   fs.rmdirSync(dirPath); | ||
|  | } | ||
|  | 
 | ||
|  | // same as lstatSync except returns a null for nonExistent file instead of throwing
 | ||
|  | function lstatSyncExt(filePath) { | ||
|  |   try { | ||
|  |     var stat = fs.lstatSync(filePath); | ||
|  |   } catch (e) { | ||
|  |     if(e.code == 'ENOENT') return null; | ||
|  |     throw e; | ||
|  |   } | ||
|  |   return stat; | ||
|  | } | ||
|  | 
 | ||
|  | function symLinkSyncExt(realPath, linkPath, type) { | ||
|  |   // fs.symlink requires the real path to be fully resolved.
 | ||
|  |   realPath = path.resolve(realPath); | ||
|  |   try { | ||
|  |     fs.symlinkSync(realPath, linkPath, type); | ||
|  |   } catch (e) { | ||
|  |     var msg = "Unable to create symlink: " + linkPath; | ||
|  |     if (e.code == "EPERM") { | ||
|  |       msg += "\nPermissions issue, on windows this function must be run as an administrator." | ||
|  |     } | ||
|  |     console.log(msg + "\n" + e); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | // Talk to Jay - not currently needed.
 | ||
|  | //
 | ||
|  | //function globWithIgnore(basePath, globs, ignoreGlobs, options) {
 | ||
|  | //  options = options || {};
 | ||
|  | //  options.filters = globs.map(function (glob) {
 | ||
|  | //    return minimatch.filter(glob);
 | ||
|  | //  });
 | ||
|  | //  options.ignoreFilters = ignoreGlobs && ignoreGlobs.map(function(glob) {
 | ||
|  | //      return minimatch.filter(glob);
 | ||
|  | //    });
 | ||
|  | //  options.ignoreSymlink = options.ignoreSymlink == null ? true : false;
 | ||
|  | //  return globSyncCore(basePath, options);
 | ||
|  | //}
 | ||
|  | //
 | ||
|  | //function globSyncCore(basePath, options) {
 | ||
|  | //  var results = [];
 | ||
|  | //  var files;
 | ||
|  | //  try {
 | ||
|  | //    files = fs.readdirSync(basePath);
 | ||
|  | //  }
 | ||
|  | //  catch(e) { return results; }
 | ||
|  | //
 | ||
|  | //  files.forEach(function(file) {
 | ||
|  | //    var filePath = path.join(basePath, file);
 | ||
|  | //    var shouldIgnore = options.ignoreFilters && options.ignoreFilters.some(function(filter) {
 | ||
|  | //        return filter(filePath);
 | ||
|  | //      });
 | ||
|  | //    if (shouldIgnore) return;
 | ||
|  | //
 | ||
|  | //    var stat = fs.lstatSync(filePath);
 | ||
|  | //
 | ||
|  | //    if (stat.isDirectory()) {
 | ||
|  | //      if (stat.isSymbolicLink() && options.ignoreSymlink) {
 | ||
|  | //        // do nothing
 | ||
|  | //      } else {
 | ||
|  | //        var partialResults = globSyncCore(filePath, options);
 | ||
|  | //        Array.prototype.push.apply(results, partialResults);
 | ||
|  | //      }
 | ||
|  | //    } else {
 | ||
|  | //      var ok = options.filters.every(function(filter) {
 | ||
|  | //        return filter(filePath);
 | ||
|  | //      });
 | ||
|  | //      if (ok) {
 | ||
|  | //        results.push(filePath);
 | ||
|  | //      }
 | ||
|  | //    }
 | ||
|  | //  });
 | ||
|  | //  return results;
 | ||
|  | //}
 |