commit 5f122d32ca5e0bb331ca74ce8a164e3c456d79da Author: Jan Lehnardt Date: Thu Jul 1 22:04:57 2010 +0200 init diff --git a/erlccache b/erlccache new file mode 100755 index 0000000..77bd83c --- /dev/null +++ b/erlccache @@ -0,0 +1,99 @@ +#!/usr/bin/env node +/* + erlccache — (c) 2010 Jan Lehnardt + use instead of erlc and your builds will magically speed up + somebody needs to turn this into proper node code, or sh or whatever + MIT License +*/ + +// CUSTOMIZE HERE +var erlc = "/Users/jan/.local/bin/erlc"; +var dir = "/Users/jan/.erlccache/"; +// STOP CUSTOMIZING + + +var sys = require("sys"); +var child_process = require("child_process"); +var crypto = require("crypto"); +var fs = require("fs"); + + +var args = process.argv.slice(2).toString(); +var cmd = erlc + " " + args; + +// execute a shell command +function exec(cmd, fun) { + fun = fun || function (error, stdout, stderr) { + sys.print("stdout: " + stdout); + sys.print("stderr: " + stderr); + if (error !== null) { + sys.puts("exec error: " + error); + } + }; + child_process.exec(cmd, fun); +} + +// get the .erl file out of cmd +function erl_parse_file(cmd) { + var file = cmd.match(/[\w]+\.erl\s*/).toString(); + return file; +} + +// find location of .beam file given the cmd +function erl_beamfile(cmd) { + return process.cwd() + "/" + erl_parse_file(cmd).replace(/.erl/, ".beam"); +} + +// create a sha1 hex digest from the cmd .erl file +function cache_hash(cmd) { + var hash = crypto.createHash("sha1"); + var file = erl_parse_file(cmd); + hash.update(fs.readFileSync(file, "binary")); + return hash.digest("hex"); +} + +// copy(from, to); -- synchronous +function cache_file_copy(from, to) { + fs.writeFileSync(to, fs.readFileSync(from, "binary"), "binary"); + +} + +// see if the filename in cmd is cached, if not compile and cache +function cache_hit(cmd) { + // make cache dir if it doesn't exist + try { + fs.statSync(dir); + } catch(e) { + fs.mkdirSync(dir, 0700); + } + + // hash cmd + var hash = cache_hash(cmd); + try { + fs.statSync(dir + hash); + } catch(e) { + // compile + exec(cmd, function(error, stdout, stderr) { + if(!error) { + var beamfile = erl_beamfile(cmd); + // add beam file to dir + hash(cmd) + cache_file_copy(beamfile, dir + hash); + } + }); + return false; + } + return true +} + +// copy the cached beamfile to the final destination as if erlc did it +function cache_copy(cmd) { + var beamfile = erl_beamfile(cmd); + var cachefile = dir + cache_hash(cmd); + cache_file_copy(cachefile, beamfile); +} + +if(cache_hit(cmd)) { + cache_copy(cmd); +} + +//done