Skip to content

Instantly share code, notes, and snippets.

@ploxiln
Last active August 29, 2015 13:57
Show Gist options
  • Save ploxiln/9416585 to your computer and use it in GitHub Desktop.
Save ploxiln/9416585 to your computer and use it in GitHub Desktop.
// 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);
@ploxiln
Copy link
Author

ploxiln commented Apr 20, 2014

latest version properly supports any name for the top-level module

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment