Last active
August 29, 2015 13:57
-
-
Save ploxiln/9416585 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// nodejs script to compare npm-shrinkwrap files | |
// TODO check errors with files and report nicely | |
var fs = require('fs'); | |
var path = require('path'); | |
function usage() { | |
console.log("USAGE: %s %s (--needs-delete|--compare)" | |
+ " <actual-shrinkwrap-file> <target-shrinkwrap-file>", | |
path.basename(process.argv[0]), path.basename(process.argv[1]) ); | |
process.exit(1); | |
} | |
var mode_needs_delete = false; | |
var mode_compare = false; | |
var actual_shrinkwrap_file = null; | |
var target_shrinkwrap_file = null; | |
for (var i in process.argv) { | |
if (i < 2) { | |
// node binary, script file | |
continue; | |
} | |
var arg = process.argv[i]; | |
if (arg == '--needs-delete') { mode_needs_delete = true; } | |
else if (arg == '--compare' ) { mode_compare = true; } | |
else if (actual_shrinkwrap_file == null) { actual_shrinkwrap_file = arg; } | |
else if (target_shrinkwrap_file == null) { target_shrinkwrap_file = arg; } | |
else { usage(); } | |
} | |
// exactly one mode should be enabled | |
if (mode_needs_delete == mode_compare) { | |
usage(); | |
} | |
function read_json_file(filename) { | |
var file_string = fs.readFileSync(filename, {'encoding': 'utf8'}); | |
return JSON.parse(file_string); | |
} | |
// compare_nodes returns 0 if matching, 1 if different | |
function compare_nodes(top_lvl, name, node_actual, node_target) { | |
var version_target = node_target['version']; | |
var version_actual = node_actual ? node_actual['version'] : 'missing'; | |
if (version_actual != version_target) { | |
if (mode_compare) { | |
console.log("%s %s (target %s)", name, version_actual, version_target); | |
} | |
return 1 | |
} | |
var ret = 0; | |
var deps_target = node_target['dependencies'] ? node_target['dependencies'] : []; | |
var deps_actual = node_actual['dependencies'] ? node_actual['dependencies'] : []; | |
for (var dep in deps_target) { | |
var dep_path = name + '/' + dep; | |
if (compare_nodes(false, dep_path, deps_actual[dep], deps_target[dep]) != 0) { | |
ret = 1; | |
if (mode_needs_delete && top_lvl) { | |
console.log(dep); | |
} | |
} | |
} | |
if (top_lvl) { | |
for (var dep in deps_actual) { | |
if(!deps_target[dep]) { | |
ret = 1; | |
if (mode_compare) { | |
console.log('%s/%s extraneous', name, dep); | |
} | |
} | |
} | |
} | |
return ret; | |
} | |
var shrinkwrap_actual = read_json_file(actual_shrinkwrap_file); | |
var shrinkwrap_target = read_json_file(target_shrinkwrap_file); | |
var top_name = shrinkwrap_target['name']; | |
var proc_status = compare_nodes(true, top_name, shrinkwrap_actual, shrinkwrap_target); | |
process.exit(proc_status); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
latest version properly supports any name for the top-level module