summaryrefslogtreecommitdiff
path: root/lib/gall/ll.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gall/ll.lua')
-rw-r--r--lib/gall/ll.lua98
1 files changed, 98 insertions, 0 deletions
diff --git a/lib/gall/ll.lua b/lib/gall/ll.lua
new file mode 100644
index 0000000..7f20683
--- /dev/null
+++ b/lib/gall/ll.lua
@@ -0,0 +1,98 @@
+-- gall.ll
+--
+-- Git Abstraction Layer for Lua -- Low level interface
+--
+-- Copyright 2012 Daniel Silverstone <dsilvers@digital-scurf.org>
+--
+--
+
+local sp = require "luxio.subprocess"
+local util = require "gall.util"
+
+local assert = assert
+
+local git_exe = "git"
+
+local function _rungit(t)
+ assert(t.repo, "No repository?")
+
+ local proc_args = {
+ env = {},
+ git_exe, unpack(t)
+ }
+
+ for k, v in pairs(t.env or {}) do
+ proc_args.env[k] = v
+ end
+
+ proc_args.env.GIT_DIR = t.repo
+
+ if t.stdin then
+ proc_args.stdin = t.stdin
+ end
+
+ if t.stdout then
+ proc_args.stdout = sp.PIPE
+ end
+
+ if t.stderr then
+ proc_args.stderr = sp.PIPE
+ end
+
+ local proc = sp.spawn_simple(proc_args)
+ local stdout, stderr
+
+ if t.stdout then
+ stdout = proc.stdout:read("*a")
+ proc.stdout:close()
+ if type(t.stdout) == "function" then
+ stdout = t.stdout(stdout)
+ end
+ end
+
+ if t.stderr then
+ stderr = proc.stderr:read("*a")
+ proc.stderr:close()
+ if type(t.stderr) == "function" then
+ stderr = t.stderr(stderr)
+ end
+ end
+
+ local how, why = proc:wait()
+
+ assert(how == "exit", "Not cleanly exited")
+
+ return why, stdout, stderr
+end
+
+local function _setgit(e)
+ git_exe = e
+end
+
+local function _chomp(s)
+ local rest = s:match("^(.*)\n$")
+ return rest or s
+end
+
+local mod_ret = {
+ rungit = _rungit,
+ setgit = _setgit,
+ chomp = _chomp
+}
+
+local simple_cmds = {
+ "cat-file", "symbolic-ref", "show-ref",
+ "hash-object", "ls-tree", "init", "merge-base", "rev-list", "config"
+}
+
+for _, s in pairs(simple_cmds) do
+ local ss = s:gsub("%-", "_")
+ mod_ret[ss] = function(_t)
+ local t = util.deep_copy(_t)
+ table.insert(t, 1, s)
+ t.stdout = _chomp
+ return _rungit(t)
+ end
+end
+
+return mod_ret