node-hooks
Advanced tools
| var main = function(args){ | ||
| } | ||
| module.exports = main; |
+143
-159
| var fs = require("fs"); | ||
| var exec = require("child_process").exec; | ||
| var colors = require("colors"); | ||
@@ -10,63 +9,57 @@ var install = require("../lib/install-module"); | ||
| var hooksJsonPath = process.cwd()+"/hooks.json"; | ||
| var hooksJsonPath = process.cwd() + "/hooks.json"; | ||
| /** ================================================================================ **/ | ||
| var main = function(args){ | ||
| var main = function(args) { | ||
| var opts = setupOptions(args); | ||
| if(opts.valid){ | ||
| if(hasHooksJson() && !opts.global){ | ||
| install(opts.hook_module, function(success, node_module, module_version){ | ||
| if(success){ | ||
| var data = require("../lib/hook-module-package")(node_module); | ||
| opts.name = node_module; | ||
| opts.version = module_version; | ||
| var localFile = process.cwd()+"/"+opts.hook_module; | ||
| if(fs.existsSync(localFile)){ | ||
| opts.version = opts.hook_module; | ||
| } | ||
| if(!opts.force){ | ||
| isValidHookModule(data.json, function(err, success){ | ||
| if(err){ | ||
| console.log(err.red); | ||
| console.log(("`"+opts.hook_module+"`").red+" could not be added as it does not match the hook-module specification. If you want to override this be use the `-f` option."); | ||
| } | ||
| else if(opts.hook=="default"){ | ||
| var valids = []; | ||
| var opts = setupOptions(args); | ||
| if (opts.valid) { | ||
| if (hasHooksJson() && !opts.global) { | ||
| install(opts.hook_module, function(success, node_module, module_version) { | ||
| if (success) { | ||
| var data = require("../lib/hook-module-package")(node_module); | ||
| opts.name = node_module; | ||
| opts.version = module_version; | ||
| var localFile = process.cwd() + "/" + opts.hook_module; | ||
| if (fs.existsSync(localFile)) { | ||
| opts.version = opts.hook_module; | ||
| } | ||
| if (!opts.force) { | ||
| isValidHookModule(data.json, function(err, success) { | ||
| if (err) { | ||
| console.log(err.red); | ||
| console.log(("`" + opts.hook_module + "`").red + " could not be added as it does not match the hook-module specification. If you want to override this be use the `-f` option."); | ||
| } else if (opts.hook == "default") { | ||
| var valids = []; | ||
| if(typeof data.json["hook-module"]["valid-for"]=="string"){ | ||
| valids.push(data.json["hook-module"]["valid-for"]); | ||
| } | ||
| else{ | ||
| valids = data.json["hook-module"]["valid-for"]; | ||
| } | ||
| for(var i=0; i<valids.length; i++){ | ||
| opts.hook = valids[i]; | ||
| addToFiles(opts); | ||
| } | ||
| } | ||
| else{ | ||
| addToFiles(opts); | ||
| } | ||
| }); | ||
| } | ||
| else{ | ||
| addToFiles(opts); | ||
| } | ||
| } | ||
| }); | ||
| } | ||
| else if(opts.global){ | ||
| console.log("This needs to be thought out better".yellow+" Look for it in a future release"); | ||
| //addToFiles(opts); | ||
| } | ||
| else{ | ||
| console.log("No `hooks.json` file was found!".red); | ||
| console.log("\tRun `hooks install` to add hooks to this folder".yellow); | ||
| } | ||
| } | ||
| if (typeof data.json["hook-module"]["valid-for"] == "string") { | ||
| valids.push(data.json["hook-module"]["valid-for"]); | ||
| } else { | ||
| valids = data.json["hook-module"]["valid-for"]; | ||
| } | ||
| for (var i = 0; i < valids.length; i++) { | ||
| opts.hook = valids[i]; | ||
| addToFiles(opts); | ||
| } | ||
| } else { | ||
| addToFiles(opts); | ||
| } | ||
| }); | ||
| } else { | ||
| addToFiles(opts); | ||
| } | ||
| } | ||
| }); | ||
| } else if (opts.global) { | ||
| console.log("This needs to be thought out better".yellow + " Look for it in a future release"); | ||
| //addToFiles(opts); | ||
| } else { | ||
| console.log("No `hooks.json` file was found!".red); | ||
| console.log("\tRun `hooks install` to add hooks to this folder".yellow); | ||
| } | ||
| } | ||
| } | ||
@@ -76,121 +69,112 @@ | ||
| var hasHooksJson = function(){ | ||
| return fs.existsSync(hooksJsonPath); | ||
| var hasHooksJson = function() { | ||
| return fs.existsSync(hooksJsonPath); | ||
| } | ||
| var setupOptions = function(args){ | ||
| var opts = { | ||
| name: undefined, | ||
| version: undefined, | ||
| force: false, | ||
| global: false, | ||
| hook: "default", | ||
| depend: true, | ||
| hook_module: args[args.length-1], | ||
| valid: true | ||
| } | ||
| var setupOptions = function(args) { | ||
| var opts = { | ||
| name: undefined, | ||
| version: undefined, | ||
| force: false, | ||
| global: false, | ||
| hook: "default", | ||
| depend: true, | ||
| hook_module: args[args.length - 1], | ||
| valid: true | ||
| } | ||
| for(var i=0; i<args.length-1; i++){ | ||
| var arg = args[i]; | ||
| if(arg=="--default" || arg=="-d" || arg=="--global" || arg=="-g"){ | ||
| opts.global = true; | ||
| } | ||
| else if(arg=="--hook"){ | ||
| opts.hook = args[i+1]; | ||
| i++; | ||
| } | ||
| else if(arg == "-f" || arg == "--force"){ | ||
| opts.force = true; | ||
| } | ||
| else if(arg=="--soft"){ | ||
| opts.depend = false; | ||
| } | ||
| else{ | ||
| console.log(arg.red+ " is not a valid argument on `hooks add`".yellow); | ||
| opts.valid = false; | ||
| } | ||
| } | ||
| for (var i = 0; i < args.length - 1; i++) { | ||
| var arg = args[i]; | ||
| if(opts.hook == "default" && opts.force){ | ||
| console.log("-f, -force requires -hook".red); | ||
| opts.valid = false; | ||
| } | ||
| if (arg == "--default" || arg == "-d" || arg == "--global" || arg == "-g") { | ||
| opts.global = true; | ||
| } else if (arg == "--hook") { | ||
| opts.hook = args[i + 1]; | ||
| i++; | ||
| } else if (arg == "-f" || arg == "--force") { | ||
| opts.force = true; | ||
| } else if (arg == "--soft") { | ||
| opts.depend = false; | ||
| } else { | ||
| console.log(arg.red + " is not a valid argument on `hooks add`".yellow); | ||
| opts.valid = false; | ||
| } | ||
| } | ||
| if(opts.hook == undefined){ | ||
| console.log("--hook must be followed by <HOOK_NAME>".red); | ||
| opts.valid = false; | ||
| } | ||
| else if(opts.hook != "default"){ | ||
| var possible_hooks = require("../lib/possible-hooks"); | ||
| if(possible_hooks.indexOf(opts.hook)==-1){ | ||
| console.log(opts.hook.red+" is not a valid hook".yellow); | ||
| opts.valid = false; | ||
| } | ||
| } | ||
| else if(opts.global && opts.depend){ | ||
| console.log("--default and --depend cannot be used together".red); | ||
| opts.valid = false; | ||
| } | ||
| if (opts.hook == "default" && opts.force) { | ||
| console.log("-f, -force requires -hook".red); | ||
| opts.valid = false; | ||
| } | ||
| return opts; | ||
| if (opts.hook == undefined) { | ||
| console.log("--hook must be followed by <HOOK_NAME>".red); | ||
| opts.valid = false; | ||
| } else if (opts.hook != "default") { | ||
| var possible_hooks = require("../lib/possible-hooks"); | ||
| if (possible_hooks.indexOf(opts.hook) == -1) { | ||
| console.log(opts.hook.red + " is not a valid hook".yellow); | ||
| opts.valid = false; | ||
| } | ||
| } else if (opts.global && opts.depend) { | ||
| console.log("--default and --depend cannot be used together".red); | ||
| opts.valid = false; | ||
| } | ||
| return opts; | ||
| } | ||
| var addToFiles = function(opts){ | ||
| var addToFiles = function(opts) { | ||
| if(opts.version==undefined || opts.version.match(/\d\.\d\.\d/)==null){ | ||
| opts.version = opts.hook_module.split("@")[1]; | ||
| } | ||
| if (opts.version == undefined || opts.version.match(/\d\.\d\.\d/) == null) { | ||
| opts.version = opts.hook_module.split("@")[1]; | ||
| } | ||
| if(opts.version==undefined){ | ||
| //fall back is url | ||
| opts.version = opts.hook_module; | ||
| } | ||
| if (opts.version == undefined) { | ||
| //fall back is url | ||
| opts.version = opts.hook_module; | ||
| } | ||
| if(opts.global){ | ||
| // var defaults = require("../lib/default-modules"); | ||
| // defaults.json.hooks[opts.hook][opts.name] = opts.version; | ||
| // defaults.save(function(err){ | ||
| // if(err){ | ||
| // console.log("hooks add failed".yellow); | ||
| // } | ||
| // }); | ||
| } | ||
| else{ | ||
| if (opts.global) { | ||
| // var defaults = require("../lib/default-modules"); | ||
| // defaults.json.hooks[opts.hook][opts.name] = opts.version; | ||
| // defaults.save(function(err){ | ||
| // if(err){ | ||
| // console.log("hooks add failed".yellow); | ||
| // } | ||
| // }); | ||
| } else { | ||
| if(opts.depend){ | ||
| var packageJsonFile = process.cwd()+"/package.json"; | ||
| var packageJson = require(packageJsonFile); | ||
| packageJson.devDependencies = packageJson.devDependencies == undefined ? {} : packageJson.devDependencies; | ||
| packageJson.devDependencies[opts.name] = opts.version; | ||
| saveJson(packageJsonFile, packageJson, false); | ||
| } | ||
| if (opts.depend) { | ||
| var packageJsonFile = process.cwd() + "/package.json"; | ||
| var packageJson = require(packageJsonFile); | ||
| packageJson.devDependencies = packageJson.devDependencies == undefined ? {} : packageJson.devDependencies; | ||
| packageJson.devDependencies[opts.name] = opts.version; | ||
| saveJson(packageJsonFile, packageJson, false); | ||
| } | ||
| var hooksJsonFile = process.cwd()+"/hooks.json"; | ||
| var hooksJson = require(hooksJsonFile); | ||
| if(hooksJson[opts.hook]==undefined){ | ||
| hooksJson[opts.hook] = {}; | ||
| } | ||
| hooksJson[opts.hook][opts.name] = opts.version; | ||
| saveJson(hooksJsonFile, hooksJson, false); | ||
| } | ||
| var hooksJsonFile = process.cwd() + "/hooks.json"; | ||
| var hooksJson = require(hooksJsonFile); | ||
| if (hooksJson[opts.hook] == undefined) { | ||
| hooksJson[opts.hook] = {}; | ||
| } | ||
| hooksJson[opts.hook][opts.name] = opts.version; | ||
| saveJson(hooksJsonFile, hooksJson, false); | ||
| } | ||
| } | ||
| var saveJson = function(file, json, global){ | ||
| var content = JSON.stringify(json, null, 2) + '\n'; | ||
| try{ | ||
| fs.writeFileSync(file, content); | ||
| } | ||
| catch(err){ | ||
| if(err && err.code=="EACCES"){ | ||
| console.log("FILE PERMISSION ERROR".red+" The current user does not have access to write to "+file); | ||
| if(global){ | ||
| console.log("Default hook setup often requires admin access".yellow); | ||
| } | ||
| } | ||
| else if(err){ | ||
| console.log("ERROR: ".red+"saveing "+file); | ||
| } | ||
| } | ||
| var saveJson = function(file, json, global) { | ||
| var content = JSON.stringify(json, null, 2) + '\n'; | ||
| try { | ||
| fs.writeFileSync(file, content); | ||
| } catch (err) { | ||
| if (err && err.code == "EACCES") { | ||
| console.log("FILE PERMISSION ERROR".red + " The current user does not have access to write to " + file); | ||
| if (global) { | ||
| console.log("Default hook setup often requires admin access".yellow); | ||
| } | ||
| } else if (err) { | ||
| console.log("ERROR: ".red + "saveing " + file); | ||
| } | ||
| } | ||
| } | ||
@@ -197,0 +181,0 @@ |
+188
-195
@@ -8,47 +8,42 @@ var fs = require("fs"); | ||
| var packageJsonPath = process.cwd()+"/package.json"; | ||
| var hooksJsonPath = process.cwd()+"/hooks.json"; | ||
| var packageJsonPath = process.cwd() + "/package.json"; | ||
| var hooksJsonPath = process.cwd() + "/hooks.json"; | ||
| /** ================================================================================ **/ | ||
| var main = function(args) { | ||
| var main = function(args){ | ||
| //TODO: Add defaults to hooks.json | ||
| var options = {}; | ||
| options.soft = args.indexOf("--soft") == -1 ? false : true; | ||
| options.bare = args.indexOf("--bare") == -1 ? false : true; | ||
| options.hasHooksJson = hasHooksJson(); | ||
| options.hasPackageJson = hasPackageJson(); | ||
| //TODO: Add defaults to hooks.json | ||
| var git = hasGit(options.bare); | ||
| if (git) { | ||
| create(options); | ||
| var options = {}; | ||
| //options.addDefaults = args.indexOf("--add-defaults") == -1 ? false : true; | ||
| options.soft = args.indexOf("--soft") == -1 ? false : true; | ||
| options.bare = args.indexOf("--bare") == -1 ? false : true; | ||
| options.hasHooksJson = hasHooksJson(); | ||
| options.hasPackageJson = hasPackageJson(); | ||
| if (!options.soft && process.env.npm_package_name != "node-hooks") { | ||
| exec("NODE_HOOKS=DO_NOT_INSTALL npm install node-hooks --save-dev", function(err, stdout, stderr) { | ||
| if (stdout) { | ||
| console.log(stdout); | ||
| } | ||
| var git = hasGit(options.bare); | ||
| if (stderr) { | ||
| console.error(stderr); | ||
| } | ||
| if(git){ | ||
| create(options); | ||
| if(!options.soft && process.env.npm_package_name != "node-hooks"){ | ||
| exec("NODE_HOOKS=DO_NOT_INSTALL npm install node-hooks --save-dev", function(err, stdout, stderr){ | ||
| if(stdout){ | ||
| console.log(stdout); | ||
| } | ||
| if(stderr){ | ||
| console.error(stderr); | ||
| } | ||
| if(err){ | ||
| process.exit(err.code); | ||
| } | ||
| }); | ||
| } | ||
| } | ||
| else{ | ||
| console.log("ERROR:".red+" hooks depends on "+ "git".yellow); | ||
| var bare = options.bare ? " --bare" : ""; | ||
| console.log(" Please run "+("`git init"+bare+"`").yellow+" before "+"`hooks install`".yellow); | ||
| process.exit(1); | ||
| } | ||
| if (err) { | ||
| process.exit(err.code); | ||
| } | ||
| }); | ||
| } | ||
| } else { | ||
| console.log("ERROR:".red + " hooks depends on " + "git".yellow); | ||
| var bare = options.bare ? " --bare" : ""; | ||
| console.log(" Please run " + ("`git init" + bare + "`").yellow + " before " + "`hooks install`".yellow); | ||
| process.exit(1); | ||
| } | ||
| } | ||
@@ -58,92 +53,96 @@ | ||
| var create = function(options){ | ||
| if(!options.hasPackageJson){ | ||
| createPackageJson(options); | ||
| } | ||
| else if(!options.hasHooksJson){ | ||
| createHooksJson(options); | ||
| } | ||
| else{ | ||
| createHooks(options); | ||
| installHooks(options); | ||
| } | ||
| var create = function(options) { | ||
| if (!options.hasPackageJson) { | ||
| createPackageJson(options); | ||
| } else if (!options.hasHooksJson) { | ||
| createHooksJson(options); | ||
| } else { | ||
| createHooks(options); | ||
| installHooks(options); | ||
| } | ||
| } | ||
| var createPackageJson = function(options){ | ||
| var packageJson = {name:"default"}; | ||
| var jsonString = JSON.stringify(packageJson, null, 2) + '\n'; | ||
| createFile(packageJsonPath, jsonString, false, function(){ | ||
| options.hasPackageJson = true; | ||
| create(options); | ||
| }); | ||
| var createPackageJson = function(options) { | ||
| var packageJson = { | ||
| name: "default" | ||
| }; | ||
| var jsonString = JSON.stringify(packageJson, null, 2) + '\n'; | ||
| createFile(packageJsonPath, jsonString, false, function() { | ||
| options.hasPackageJson = true; | ||
| create(options); | ||
| }); | ||
| } | ||
| var createHooksJson = function(options){ | ||
| var defaultHooksJson = {}; | ||
| var jsonString = JSON.stringify(defaultHooksJson, null, 2) + '\n'; | ||
| createFile(hooksJsonPath, jsonString, false, function(){ | ||
| options.hasHooksJson = true; | ||
| create(options); | ||
| }); | ||
| var createHooksJson = function(options) { | ||
| var defaultHooksJson = {}; | ||
| var jsonString = JSON.stringify(defaultHooksJson, null, 2) + '\n'; | ||
| createFile(hooksJsonPath, jsonString, false, function() { | ||
| options.hasHooksJson = true; | ||
| create(options); | ||
| }); | ||
| } | ||
| var createHooks = function(options){ | ||
| var createHooks = function(options) { | ||
| var baseContent = fs.readFileSync(__dirname+"/../lib/hook-runner.sh", {encoding: "utf8"}); | ||
| var hooks = require("../lib/possible-hooks"); | ||
| var numHooks = hooks.length; | ||
| var baseContent = fs.readFileSync(__dirname + "/../lib/hook-runner.sh", { | ||
| encoding: "utf8" | ||
| }); | ||
| var hooks = require("../lib/possible-hooks"); | ||
| var numHooks = hooks.length; | ||
| var baseFileName = options.bare == true ? "./hooks/" : "./.git/hooks/"; | ||
| var baseFileName = options.bare == true ? "./hooks/" : "./.git/hooks/"; | ||
| while(numHooks--){ | ||
| var hook = hooks[numHooks]; | ||
| while (numHooks--) { | ||
| var hook = hooks[numHooks]; | ||
| var fileName = baseFileName+hook; | ||
| var fileName = baseFileName + hook; | ||
| if(fs.existsSync(fileName)){ | ||
| fs.renameSync(fileName, fileName+".old"); | ||
| } | ||
| if (fs.existsSync(fileName)) { | ||
| fs.renameSync(fileName, fileName + ".old"); | ||
| } | ||
| var content = baseContent.replace("{hook-to-run}", hook); | ||
| var content = baseContent.replace("{hook-to-run}", hook); | ||
| createFile(fileName, content, true); | ||
| } | ||
| createFile(fileName, content, true); | ||
| } | ||
| } | ||
| var installHooks = function(options){ | ||
| var hooksJson = require(hooksJsonPath); | ||
| var installHooks = function(options) { | ||
| var hooksJson = require(hooksJsonPath); | ||
| var hooks = []; | ||
| var hooks = []; | ||
| var hookTypes = require("../lib/possible-hooks"); | ||
| var hookTypes = require("../lib/possible-hooks"); | ||
| for(var i=0; i<hookTypes.length; i++){ | ||
| if(hooksJson[hookTypes[i]]!=undefined){ | ||
| var hookNames = Object.keys(hooksJson[hookTypes[i]]); | ||
| for(var j=0; j<hookNames.length; j++){ | ||
| hooks.push({name:hookNames[j], version:hooksJson[hookTypes[i]][hookNames[j]]}); | ||
| } | ||
| } | ||
| } | ||
| var installHook = function(i, hooks, callback){ | ||
| if(i<hooks.length){ | ||
| var hook = hooks[i].name+"@"+hooks[i].version; | ||
| install(hook, function(success, node_module){ | ||
| installHook(i+1, hooks, callback); | ||
| }); | ||
| } | ||
| else{ | ||
| callback(); | ||
| } | ||
| } | ||
| for (var i = 0; i < hookTypes.length; i++) { | ||
| if (hooksJson[hookTypes[i]] != undefined) { | ||
| var hookNames = Object.keys(hooksJson[hookTypes[i]]); | ||
| for (var j = 0; j < hookNames.length; j++) { | ||
| hooks.push({ | ||
| name: hookNames[j], | ||
| version: hooksJson[hookTypes[i]][hookNames[j]] | ||
| }); | ||
| } | ||
| } | ||
| } | ||
| var whenFinsihed = function(){ | ||
| console.log("hooks".blue+" has been added to this project"); | ||
| } | ||
| var installHook = function(i, hooks, callback) { | ||
| if (i < hooks.length) { | ||
| var hook = hooks[i].name + "@" + hooks[i].version; | ||
| install(hook, function(success, node_module) { | ||
| installHook(i + 1, hooks, callback); | ||
| }); | ||
| } else { | ||
| callback(); | ||
| } | ||
| } | ||
| installHook(0, hooks, whenFinsihed); | ||
| var whenFinsihed = function() { | ||
| console.log("hooks".blue + " has been added to this project"); | ||
| } | ||
| installHook(0, hooks, whenFinsihed); | ||
| } | ||
@@ -154,26 +153,24 @@ | ||
| var hasGit = function(bare){ | ||
| if(!bare){ | ||
| return fs.existsSync(".git") && hasHooksFolder(bare); | ||
| } | ||
| else{ | ||
| return hasHooksFolder(bare); | ||
| } | ||
| var hasGit = function(bare) { | ||
| if (!bare) { | ||
| return fs.existsSync(".git") && hasHooksFolder(bare); | ||
| } else { | ||
| return hasHooksFolder(bare); | ||
| } | ||
| } | ||
| var hasHooksFolder = function(bare){ | ||
| if(bare){ | ||
| return fs.existsSync("hooks"); | ||
| } | ||
| else{ | ||
| return fs.existsSync(".git/hooks"); | ||
| } | ||
| var hasHooksFolder = function(bare) { | ||
| if (bare) { | ||
| return fs.existsSync("hooks"); | ||
| } else { | ||
| return fs.existsSync(".git/hooks"); | ||
| } | ||
| } | ||
| var hasHooksJson = function(){ | ||
| return fs.existsSync(hooksJsonPath); | ||
| var hasHooksJson = function() { | ||
| return fs.existsSync(hooksJsonPath); | ||
| } | ||
| var hasPackageJson = function(){ | ||
| return fs.existsSync(packageJsonPath); | ||
| var hasPackageJson = function() { | ||
| return fs.existsSync(packageJsonPath); | ||
| } | ||
@@ -184,27 +181,24 @@ | ||
| var createFile = function(fileName, content, chmodX, callback){ | ||
| var fileMade = function(err){ | ||
| if(err){ | ||
| console.error("`"+fileName+"` could not be created", err); | ||
| process.exit(1); | ||
| } | ||
| else if(chmodX===true){ | ||
| exec("chmod a+x "+fileName, chmodDone); | ||
| } | ||
| else{ | ||
| callback(); | ||
| } | ||
| } | ||
| var createFile = function(fileName, content, chmodX, callback) { | ||
| var fileMade = function(err) { | ||
| if (err) { | ||
| console.error("`" + fileName + "` could not be created", err); | ||
| process.exit(1); | ||
| } else if (chmodX === true) { | ||
| exec("chmod a+x " + fileName, chmodDone); | ||
| } else { | ||
| callback(); | ||
| } | ||
| } | ||
| var chmodDone = function(err, stdout, stderr){ | ||
| if(err){ | ||
| console.error("`"+fileName+"` could not be created", err, stderr); | ||
| process.exit(1); | ||
| } | ||
| else if(callback!=undefined){ | ||
| callback(); | ||
| } | ||
| } | ||
| var chmodDone = function(err, stdout, stderr) { | ||
| if (err) { | ||
| console.error("`" + fileName + "` could not be created", err, stderr); | ||
| process.exit(1); | ||
| } else if (callback != undefined) { | ||
| callback(); | ||
| } | ||
| } | ||
| fs.writeFile(fileName, content, fileMade); | ||
| fs.writeFile(fileName, content, fileMade); | ||
| } | ||
@@ -219,58 +213,57 @@ | ||
| var forTheGlobalFile = function(){ | ||
| var version = "0.0.0"; | ||
| var forTheGlobalFile = function() { | ||
| var version = "0.0.0"; | ||
| var start = function(){ | ||
| var defaults = require("./lib/default-modules"); | ||
| if(defaults.json==undefined){ | ||
| defaults.json = {}; | ||
| } | ||
| var start = function() { | ||
| var defaults = require("./lib/default-modules"); | ||
| if(defaults.json.version!=version){ | ||
| var old_version = defaults.json.version; | ||
| upgrade(defaults.json, function(data){ | ||
| defaults.json = data; | ||
| defaults.save(function(){ | ||
| if(old_version){ | ||
| console.log("UPGRADE SUCCESSFULL"); | ||
| } | ||
| else{ | ||
| console.log("INSTALLATION SUCCESSFULL"); | ||
| } | ||
| }); | ||
| }); | ||
| } | ||
| } | ||
| if (defaults.json == undefined) { | ||
| defaults.json = {}; | ||
| } | ||
| if (defaults.json.version != version) { | ||
| var old_version = defaults.json.version; | ||
| upgrade(defaults.json, function(data) { | ||
| defaults.json = data; | ||
| defaults.save(function() { | ||
| if (old_version) { | ||
| console.log("UPGRADE SUCCESSFULL"); | ||
| } else { | ||
| console.log("INSTALLATION SUCCESSFULL"); | ||
| } | ||
| }); | ||
| }); | ||
| } | ||
| } | ||
| var upgrade = function(data, callback){ | ||
| switch(data.version){ | ||
| case undefined: | ||
| data.version = "0.0.0"; | ||
| data.hooks = { | ||
| "applypatch-msg": {}, | ||
| "pre-applypatch": {}, | ||
| "post-applypatch": {}, | ||
| "pre-commit": {}, | ||
| "prepare-commit-msg": {}, | ||
| "commit-msg": {}, | ||
| "post-commit": {}, | ||
| "pre-rebase": {}, | ||
| "post-checkout": {}, | ||
| "post-merge": {}, | ||
| "pre-receive": {}, | ||
| "update": {}, | ||
| "post-receive": {}, | ||
| "post-update": {}, | ||
| "pre-auto-gc": {}, | ||
| "post-rewrite": {} | ||
| } | ||
| } | ||
| var upgrade = function(data, callback) { | ||
| callback(data); | ||
| } | ||
| switch (data.version) { | ||
| case undefined: | ||
| data.version = "0.0.0"; | ||
| data.hooks = { | ||
| "applypatch-msg": {}, | ||
| "pre-applypatch": {}, | ||
| "post-applypatch": {}, | ||
| "pre-commit": {}, | ||
| "prepare-commit-msg": {}, | ||
| "commit-msg": {}, | ||
| "post-commit": {}, | ||
| "pre-rebase": {}, | ||
| "post-checkout": {}, | ||
| "post-merge": {}, | ||
| "pre-receive": {}, | ||
| "update": {}, | ||
| "post-receive": {}, | ||
| "post-update": {}, | ||
| "pre-auto-gc": {}, | ||
| "post-rewrite": {} | ||
| } | ||
| } | ||
| start(); | ||
| callback(data); | ||
| } | ||
| start(); | ||
| } |
+111
-116
| var fs = require("fs"); | ||
| var exec = require("child_process").exec; | ||
| var colors = require("colors"); | ||
@@ -7,145 +6,141 @@ | ||
| var hooksJsonPath = process.cwd()+"/hooks.json"; | ||
| var hooksJsonPath = process.cwd() + "/hooks.json"; | ||
| /** ================================================================================ **/ | ||
| var main = function(args){ | ||
| var main = function(args) { | ||
| var opts = { | ||
| hard: false, | ||
| global: false, | ||
| module: args[args.length-1], | ||
| hook: "default", | ||
| valid: true | ||
| } | ||
| var opts = { | ||
| hard: false, | ||
| global: false, | ||
| module: args[args.length - 1], | ||
| hook: "default", | ||
| valid: true | ||
| } | ||
| for(var i=0; i<args.length-1; i++){ | ||
| if(args[i]=="--hard"){ | ||
| opts.hard = true; | ||
| } | ||
| else if(args[i]=="--hook"){ | ||
| if(opts.hook!="default"){ opts.valid = false; console.log("You cannot use --hook after --all-hooks".red)}; | ||
| opts.hook = args[i+1]; | ||
| i++; | ||
| } | ||
| else if(args[i]=="--all-hooks"){ | ||
| if(opts.hook!="default"){ opts.valid = false; console.log("You cannot use --all-hooks after --hook".red)}; | ||
| opts.hook = "all"; | ||
| } | ||
| else{ | ||
| console.log(args[i].red+ " is not a valid argument on `hooks remove`".yellow); | ||
| opts.valid = false; | ||
| } | ||
| } | ||
| for (var i = 0; i < args.length - 1; i++) { | ||
| if (args[i] == "--hard") { | ||
| opts.hard = true; | ||
| } else if (args[i] == "--hook") { | ||
| if (opts.hook != "default") { | ||
| opts.valid = false; | ||
| console.log("You cannot use --hook after --all-hooks".red) | ||
| }; | ||
| opts.hook = args[i + 1]; | ||
| i++; | ||
| } else if (args[i] == "--all-hooks") { | ||
| if (opts.hook != "default") { | ||
| opts.valid = false; | ||
| console.log("You cannot use --all-hooks after --hook".red) | ||
| }; | ||
| opts.hook = "all"; | ||
| } else { | ||
| console.log(args[i].red + " is not a valid argument on `hooks remove`".yellow); | ||
| opts.valid = false; | ||
| } | ||
| } | ||
| if(opts.hard && opts.global){ | ||
| console.log("Error".red+" --hard and --default cannot be combined"); | ||
| opts.valid = false; | ||
| } | ||
| if (opts.hard && opts.global) { | ||
| console.log("Error".red + " --hard and --default cannot be combined"); | ||
| opts.valid = false; | ||
| } | ||
| if(opts.module == undefined){ | ||
| opts.valid = false; | ||
| console.log("You must supply a module to be removed".red); | ||
| } | ||
| if (opts.module == undefined) { | ||
| opts.valid = false; | ||
| console.log("You must supply a module to be removed".red); | ||
| } | ||
| if(opts.valid){ | ||
| if (opts.valid) { | ||
| removeFromHooks(opts); | ||
| removeFromHooks(opts); | ||
| if(opts.hard){ | ||
| removeFromPackage(opts); | ||
| } | ||
| } | ||
| if (opts.hard) { | ||
| removeFromPackage(opts); | ||
| } | ||
| } | ||
| } | ||
| var removeFromHooks = function(opts){ | ||
| var hooksJsonFile = process.cwd()+"/hooks.json"; | ||
| var hooksJson = require(hooksJsonFile); | ||
| var removeFromHooks = function(opts) { | ||
| var hooksJsonFile = process.cwd() + "/hooks.json"; | ||
| var hooksJson = require(hooksJsonFile); | ||
| var needsSave = false; | ||
| var needsSave = false; | ||
| var processRemove = function(hook, strict){ | ||
| opts.hook = hook; | ||
| if(opts.hook!="default" && hooksJson[opts.hook] != undefined && hooksJson[opts.hook][opts.module] != undefined){ | ||
| delete hooksJson[opts.hook][opts.module]; | ||
| needsSave = true; | ||
| removeMessage(opts.module, opts.hook, " hooks.json"); | ||
| } | ||
| else if(strict){ | ||
| console.log("Unable to remove ".red+("`"+opts.module+"`").cyan+" from ".red+("`"+opts.hook+"`").yellow); | ||
| } | ||
| } | ||
| var processRemove = function(hook, strict) { | ||
| opts.hook = hook; | ||
| if (opts.hook != "default" && hooksJson[opts.hook] != undefined && hooksJson[opts.hook][opts.module] != undefined) { | ||
| delete hooksJson[opts.hook][opts.module]; | ||
| needsSave = true; | ||
| removeMessage(opts.module, opts.hook, " hooks.json"); | ||
| } else if (strict) { | ||
| console.log("Unable to remove ".red + ("`" + opts.module + "`").cyan + " from ".red + ("`" + opts.hook + "`").yellow); | ||
| } | ||
| } | ||
| if(opts.hook=="all"){ | ||
| var allHooks = Object.keys(hooksJson); | ||
| for(var i=0; i<allHooks.length; i++){ | ||
| processRemove(allHooks[i], false); | ||
| } | ||
| } | ||
| else{ | ||
| if (opts.hook == "all") { | ||
| var allHooks = Object.keys(hooksJson); | ||
| for (var i = 0; i < allHooks.length; i++) { | ||
| processRemove(allHooks[i], false); | ||
| } | ||
| } else { | ||
| if(opts.hook=="default"){ | ||
| var moduleJson = require("../lib/hook-module-package")(opts.module); | ||
| if(moduleJson["valid-for"]==undefined || moduleJson["valid-for"].length==0){ | ||
| console.log(("`"+opts.module+"` does not have a default hook. Use --hook to specify one").red); | ||
| } | ||
| else{ | ||
| for(var i=0; i<moduleJson["valid-for"].length; i++){ | ||
| var hook = moduleJson["valid-for"][i] | ||
| if(hooksJson[hook] && hooksJson[hook][opts.module]){ | ||
| processRemove(moduleJson["valid-for"][i], true); | ||
| } | ||
| } | ||
| if (opts.hook == "default") { | ||
| var moduleJson = require("../lib/hook-module-package")(opts.module); | ||
| if (moduleJson["valid-for"] == undefined || moduleJson["valid-for"].length == 0) { | ||
| console.log(("`" + opts.module + "` does not have a default hook. Use --hook to specify one").red); | ||
| } else { | ||
| for (var i = 0; i < moduleJson["valid-for"].length; i++) { | ||
| var hook = moduleJson["valid-for"][i] | ||
| if (hooksJson[hook] && hooksJson[hook][opts.module]) { | ||
| processRemove(moduleJson["valid-for"][i], true); | ||
| } | ||
| } | ||
| if(!needsSave){ | ||
| console.log(("`"+opts.module+"` has not been installed on its default hook.").red); | ||
| } | ||
| } | ||
| } | ||
| else{ | ||
| processRemove(opts.hook, true); | ||
| } | ||
| } | ||
| if (!needsSave) { | ||
| console.log(("`" + opts.module + "` has not been installed on its default hook.").red); | ||
| } | ||
| } | ||
| } else { | ||
| processRemove(opts.hook, true); | ||
| } | ||
| } | ||
| if(needsSave){ | ||
| saveJson(hooksJsonFile, hooksJson, false); | ||
| } | ||
| if (needsSave) { | ||
| saveJson(hooksJsonFile, hooksJson, false); | ||
| } | ||
| } | ||
| var removeFromPackage = function(opts){ | ||
| var packageJsonFile = process.cwd()+"/package.json"; | ||
| var packageJson = require(packageJsonFile); | ||
| var removeFromPackage = function(opts) { | ||
| var packageJsonFile = process.cwd() + "/package.json"; | ||
| var packageJson = require(packageJsonFile); | ||
| if(packageJson.devDependencies!=undefined && packageJson.devDependencies[opts.module] != undefined){ | ||
| delete packageJson.devDependencies[opts.module]; | ||
| removeMessage(opts.module, "devDependencies", "package.json"); | ||
| saveJson(packageJsonFile, packageJson, false); | ||
| } | ||
| else{ | ||
| console.log(("Unable to remove `"+opts.module+"` from package.json devDependencies.").red, opts); | ||
| } | ||
| if (packageJson.devDependencies != undefined && packageJson.devDependencies[opts.module] != undefined) { | ||
| delete packageJson.devDependencies[opts.module]; | ||
| removeMessage(opts.module, "devDependencies", "package.json"); | ||
| saveJson(packageJsonFile, packageJson, false); | ||
| } else { | ||
| console.log(("Unable to remove `" + opts.module + "` from package.json devDependencies.").red, opts); | ||
| } | ||
| } | ||
| var removeMessage = function(module, hook, file){ | ||
| console.log("Removeing "+("`"+module+"`").cyan+" from "+hook.yellow+" in "+file.cyan) | ||
| var removeMessage = function(module, hook, file) { | ||
| console.log("Removeing " + ("`" + module + "`").cyan + " from " + hook.yellow + " in " + file.cyan) | ||
| } | ||
| var saveJson = function(file, json, global){ | ||
| var content = JSON.stringify(json, null, 2) + '\n'; | ||
| fs.writeFile(file, content, function(err){ | ||
| if(err && err.code=="EACCES"){ | ||
| console.log("FILE PERMISSION ERROR".red+" The current user does not have access to write to "+file); | ||
| if(global){ | ||
| console.log("Default hook setup often requires admin access".yellow); | ||
| } | ||
| } | ||
| else if(err){ | ||
| console.log("ERROR: ".red+"saveing "+file); | ||
| } | ||
| }); | ||
| var saveJson = function(file, json, global) { | ||
| var content = JSON.stringify(json, null, 2) + '\n'; | ||
| fs.writeFile(file, content, function(err) { | ||
| if (err && err.code == "EACCES") { | ||
| console.log("FILE PERMISSION ERROR".red + " The current user does not have access to write to " + file); | ||
| if (global) { | ||
| console.log("Default hook setup often requires admin access".yellow); | ||
| } | ||
| } else if (err) { | ||
| console.log("ERROR: ".red + "saveing " + file); | ||
| } | ||
| }); | ||
| } | ||
| module.exports = main; | ||
| module.exports = main; |
+2
-3
| var fs = require("fs"); | ||
| var exec = require('child_process').exec; | ||
| var spawn = require("child_process").spawn; | ||
@@ -22,3 +21,3 @@ var colors = require("colors"); | ||
| if (err) { | ||
| console.error("ERROR READING `hook.json`".red); | ||
| console.error("ERROR READING `hooks.json`".red); | ||
| console.log(">> " + "Has hooks been merged into this branch?".blue); | ||
@@ -32,3 +31,3 @@ process.exit(0); | ||
| } catch (err) { | ||
| console.error("ERROR PARSING `hook.json`".red, err); | ||
| console.error("ERROR PARSING `hooks.json`".red, err); | ||
| process.exit(1); | ||
@@ -35,0 +34,0 @@ } |
+42
-19
| //stops install/uninstall command if on a global run | ||
| if(process.env.npm_config_global!=="true" && process.env.NODE_HOOKS != "DO_NOT_INSTALL"){ | ||
| if (process.env.npm_config_global !== "true" && process.env.NODE_HOOKS != "DO_NOT_INSTALL") { | ||
| var fs = require("fs"); | ||
| var fs = require("fs"); | ||
| var colors = require("colors"); | ||
| var spawn = require("child_process").spawn; | ||
| if(fs.existsSync(process.cwd()+"/../.bin/hooks")){ | ||
| //being installed a project folder | ||
| var exec = require("child_process").exec; | ||
| var command = "cd ../.. && "+process.cwd()+"/../.bin/hooks "+process.argv[2]; | ||
| exec(command, function(err, stdout, stderr){ | ||
| console.log(stdout); | ||
| console.log(stderr); | ||
| if(err){ | ||
| process.exit(err.code); | ||
| } | ||
| }); | ||
| } | ||
| else{ | ||
| //being installed itself | ||
| require(process.cwd()+"/commands/"+process.argv[2])([]); | ||
| } | ||
| var cwd, file; | ||
| if (fs.existsSync(process.cwd() + "/../.bin/hooks")) { | ||
| //being installed a project folder | ||
| cwd = process.cwd() + "/../.."; | ||
| file = process.cwd() + "/../.bin/hooks"; | ||
| } else { | ||
| //being installed inside itself | ||
| cwd = process.cwd(); | ||
| file = process.cwd() + "/.bin/hooks"; | ||
| } | ||
| if (fs.existsSync(file)) { | ||
| var child = spawn("node", [file, process.argv[2]], { | ||
| cwd: cwd | ||
| }); | ||
| child.stderr.on("data", function(data) { | ||
| process.stderr.write(data); | ||
| }); | ||
| child.stdout.on("data", function(data) { | ||
| process.stdout.write(data); | ||
| }); | ||
| child.on("error", function(err) { | ||
| console.error("HOOKS:", err.message); | ||
| }) | ||
| child.on("close", function(code) { | ||
| process.exit(code); | ||
| }); | ||
| } else { | ||
| console.log("Can't seem to find hook"); | ||
| console.log("\tCWD: " + cwd.red); | ||
| console.log("\tFILE: " + file.red); | ||
| process.exit(1); | ||
| } | ||
| } |
+2
-1
| { | ||
| "pre-commit": { | ||
| "beautify.hks": "0.0.1" | ||
| "beautify.hks": "0.0.1", | ||
| "esprima.hks": "0.0.0" | ||
| } | ||
| } |
+8
-0
@@ -21,3 +21,11 @@ { | ||
| "author": "Matthew Chase Whittemore <mcwhittemore@gmail.com>" | ||
| }, | ||
| "esprima.hks": { | ||
| "desc": "Validate your javascript with each commit", | ||
| "valid-for": ["pre-commit"], | ||
| "sources": { | ||
| "npm": "esprima.hks" | ||
| }, | ||
| "author": "Matthew Chase Whittemore <mcwhittemore@gmail.com>" | ||
| } | ||
| } |
+3
-3
| { | ||
| "name": "node-hooks", | ||
| "version": "0.0.10", | ||
| "preferGlobal": true, | ||
| "version": "0.0.11", | ||
| "description": "An NPM for git hooks.", | ||
@@ -17,3 +16,4 @@ "main": "./bin/hooks.js", | ||
| "should": "1.2.2", | ||
| "beautify.hks": "0.0.1" | ||
| "beautify.hks": "0.0.1", | ||
| "esprima.hks": "0.0.0" | ||
| }, | ||
@@ -20,0 +20,0 @@ "scripts": { |
+6
-1
@@ -29,3 +29,3 @@ # Hooks | ||
| ## Available Hooks on NPM | ||
| ## View Available Hooks on NPM | ||
@@ -142,1 +142,6 @@ `hooks list` | ||
| * Bug fix concerning multiple hook-modules running from the same hook | ||
| ### 0.0.11 | ||
| * Moving all child_process not related to npm away from child_process.exec to child_process.spawn and directing child_process stdout to console. | ||
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
59356
8.29%37
2.78%1460
0.21%146
3.55%24
-4%5
-37.5%4
33.33%