Skip to content

Instantly share code, notes, and snippets.

@patspam
Last active August 29, 2015 14:00
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save patspam/11089180 to your computer and use it in GitHub Desktop.
Save patspam/11089180 to your computer and use it in GitHub Desktop.
clang_compilation_db_merger.js
var path = require('path');
var fs = require('fs');
var args = processArgs();
var merged = merge(args);
writeOutput(args, merged);
function die(message) {
console.error(message);
process.exit();
}
function processArgs() {
var usage = "Usage: source.json destination.json";
if (process.argv.length != 4) {
die(usage);
}
var srcPath = process.argv[2];
var dstPath = process.argv[3];
if (!srcPath.match(/\.json$/) || !dstPath.match(/\.json$/)) {
die(usage);
}
var src = readDatabase(srcPath);
var dst = readDatabase(dstPath);
if (!src.length) {
die("Source compilation database is empty: " + srcPath);
}
return { src: src, dst: dst, srcPath: srcPath, dstPath: dstPath };
}
function merge(args) {
var src = args.src;
var dst = args.dst;
var files = {};
for (var i in dst) {
var item = dst[i];
files[item.file] = item;
}
var stats = { entries: 0, added: 0, updated: 0 };
for (var i in src) {
var item = src[i];
var file = item.file;
var target = files[file];
if (!target) {
target = { file: file };
dst.push(target);
stats.added++;
}
if (target.command != item.command || target.directory != item.directory) {
target.command = item.command;
target.directory = item.directory;
stats.updated++;
}
stats.entries++;
}
return { dst: dst, stats: stats };
}
function writeOutput(args, merged) {
var stats = merged.stats;
fs.writeFile(absPath(args.dstPath), JSON.stringify(merged.dst, null, 2), function(error) {
if (error) {
die(error);
} else {
console.log('Successfully merged (' +
stats.entries + ' entries, ' +
stats.added + ' new, ' +
stats.updated + ' updated).');
}
});
}
function readDatabase(p) {
var result;
try {
result = require(absPath(p));
} finally {
return Array.isArray(result) ? result : [];
}
}
function absPath(p) {
return path.resolve(process.cwd(), p);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment