summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2012-05-02 17:02:14 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2012-05-02 17:02:14 +0100
commitf54e6136216932546b043af37ec3978e197fbe76 (patch)
treea51ec23d1762be0923006e7264af6264433a45a9 /bin
parent041db83948dae5b58257c07a33f680d06d4703a0 (diff)
downloadgitano-f54e6136216932546b043af37ec3978e197fbe76.tar.gz
BIN: Support tree deltas in gitano-update-hook
Diffstat (limited to 'bin')
-rw-r--r--bin/gitano-update-hook46
1 files changed, 42 insertions, 4 deletions
diff --git a/bin/gitano-update-hook b/bin/gitano-update-hook
index 149c85e..fd9980c 100644
--- a/bin/gitano-update-hook
+++ b/bin/gitano-update-hook
@@ -119,24 +119,62 @@ end
-- First, populate gitano/starttree and gitano/targettree
+local function set_list(tag, entries)
+ table.sort(entries)
+ entries[#entries+1] = ""
+ tags[tag] = table.concat({"", unpack(entries)}, "\0")
+end
+
local function populate_tree(tag, tree)
local flat_tree = gitano.git.tree.flatten(tree)
local names = {}
for fn in pairs(flat_tree) do
names[#names+1] = fn
end
- table.sort(names)
- names[#names+1] = ""
- tags[tag] = table.concat({"", unpack(names)}, "\0")
+ set_list(tag, names)
end
populate_tree("gitano/starttree", oldtree)
populate_tree("gitano/targettree", newtree)
--- TODO: Now gitano/treedelta
+-- Now gitano/treedelta
local delta = oldtree:diff_to(newtree)
+local targets, added, deleted, modified, renamed, renamedto =
+ {}, {}, {}, {}, {}, {}
+
+for i = 1, #delta do
+ local details = delta[i]
+ local fname = details.filename
+ targets[#targets+1] = fname
+ if details.action == "A" then
+ added[#added+1] = fname
+ end
+ if details.action == "C" and details.score == "100" then
+ added[#added+1] = fname
+ end
+ if details.action == "D" then
+ deleted[#deleted+1] = fname
+ end
+ if details.action == "M" or
+ ((details.action == "R" or details.action == "C") and
+ (tonumber(details.score) < 100)) then
+ modified[#modified+1] = fname
+ end
+ if details.action == "R" then
+ renamed[#renamed+1] = details.src_name
+ renamedto[#renamedto+1] = fname
+ end
+ tags["gitano/treediff/kind/" .. fname] = details.endkind
+ tags["gitano/treediff/oldkind/" .. fname] = details.startkind
+end
+set_list("gitano/treediff/targets", targets)
+set_list("gitano/treediff/added", added)
+set_list("gitano/treediff/deleted", deleted)
+set_list("gitano/treediff/modified", modified)
+set_list("gitano/treediff/renamed", renamed)
+set_list("gitano/treediff/renamedto", renamedto)
-- Run the ruleset given the tagset