Is that some thing you want to see? Maybe clean up the error printing.

Chris

--- /dev/null   2003-01-30 05:24:37.000000000 -0500
+++ merge.py    2005-04-14 16:34:39.000000000 -0400
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+import re
+import sys
+import os
+from pprint import pprint
+
+def get_tree(commit):
+    data = os.popen("cat-file commit %s"%commit).read()
+    return re.findall(r"(?m)^tree (\w+)", data)[0]
+
+PREFIX = 0
+PATH = -1
+SHA = -2
+ORIGSHA = -3
+
+def get_difftree(old, new):
+    lines = os.popen("diff-tree %s %s"%(old, new)).read().split("\x00")
+    patterns = (r"(\*)(\d+)->(\d+)\s(\w+)\s(\w+)->(\w+)\s(.*)",
+               r"([+-])(\d+)\s(\w+)\s(\w+)\s(.*)")
+    res = {}
+    for l in lines:
+       if not l: continue
+       for p in patterns:
+           m = re.findall(p, l)
+           if m:
+               m = m[0]
+               res[m[-1]] = m
+               break
+       else:
+           raise "difftree: unknow line", l
+    return res
+
+def analyze(diff1, diff2):
+    diff1only = [ diff1[k] for k in diff1 if k not in diff2 ]
+    diff2only = [ diff2[k] for k in diff2 if k not in diff1 ]
+    both = [ (diff1[k],diff2[k]) for k in diff2 if k in diff1 ]
+
+    action(diff1only)
+    action(diff2only)
+    action_two(both)
+
+def action(diffs):
+    for act in diffs:
+       if act[PREFIX] == "*":
+           print "modify", act[PATH], act[SHA]
+       elif act[PREFIX] == '-':
+           print "remove", act[PATH], act[SHA]
+       elif act[PREFIX] == '+':
+           print "add", act[PATH], act[SHA]
+       else:
+           raise "unknow action"
+
+def action_two(diffs):
+    for act1, act2 in diffs:
+       if len(act1) == len(act2):      # same kind type
+           if act1[PREFIX] == act2[PREFIX]:
+               if act1[SHA] == act2[SHA] or act1[PREFIX] == '-': 
+                   return action(act1)
+               if act1[PREFIX]=='*':
+                   print "do_merge", act1[PATH], act1[ORIGSHA], act1[SHA], 
act2[SHA]
+                   return
+       print "unable to handle", act[PATH]
+       print "one side wants", act1[PREFIX]
+       print "the other side wants", act2[PREFIX]
+       
+
+args = sys.argv[1:]
+if len(args)!=3:
+    print "Usage merge.py <common> <rev1> <rev2>"
+trees = map(get_tree, args)
+print "checkout-tree", trees[0]
+diff1 = get_difftree(trees[0], trees[1])
+diff2 = get_difftree(trees[0], trees[2])
+analyze(diff1, diff2)
+
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to