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