1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
-- gall.object
--
-- Git Abstraction Layer for Lua -- Generic object interface
--
-- Copyright 2012 Daniel Silverstone <dsilvers@digital-scurf.org>
--
--
local ll = require "gall.ll"
local commit = require "gall.commit"
local tree = require "gall.tree"
local tag = require "gall.tag"
local repos = setmetatable({}, {__mode="k"})
local function _objectindex(obj, field)
local ok, ret
if field == "type" then
ok, ret = repos[obj]:gather("cat-file", "-t", obj.sha)
elseif field == "size" then
ok, ret = repos[obj]:gather("cat-file", "-s", obj.sha)
elseif field == "raw" then
ok, ret = repos[obj]:rawgather("cat-file", (obj.type == "tag" and "tag" or "-p"), obj.sha)
elseif field == "content" then
if obj.type == "blob" then
ok, ret = 0, obj.raw
elseif obj.type == "commit" then
ok, ret = 0, commit.new(repos[obj], obj)
elseif obj.type == "tree" then
ok, ret = 0, tree.new(repos[obj], obj)
elseif obj.type == "tag" then
ok, ret = 0, tag.new(repos[obj], obj)
else
error("Unknown type <" .. obj.type .. "> for content parse")
end
else
error("Unknown field <" .. tostring(field) .. ">")
end
assert(ok == 0, "Unable to retrieve " .. field)
if field == "size" then ret = tonumber(ret) end
rawset(obj, field, ret)
return ret
end
function _objecttostring(obj)
return "<GitObject(" .. tostring(obj.sha)..") in " .. tostring(repos[obj]) .. ">"
end
local objectmeta = {
__index = _objectindex,
__tostring = _objecttostring
}
local function _new(repo, sha)
local ret = setmetatable({sha=sha}, objectmeta)
repos[ret] = repo
return ret
end
local function _create(repo, type, content)
local why, sha =
repo:_run_with_input(content, ll.chomp,
"hash-object", "-t", type, "-w", "--stdin")
if why ~= 0 then
return nil, "hash-object returned " .. tostring(why)
end
return _new(repo, sha)
end
return {
new = _new,
create = _create,
}
|