On Thu, Apr 14, 2005 at 11:12:35AM -0700, Junio C Hamano wrote: > >>>>> "PB" == Petr Baudis <[EMAIL PROTECTED]> writes: > > At this moment in the script, we have run "read-tree" the > ancestor so the dircache has the original. %tree0 and %tree1 > both did not touch the path ($_ here) so it is the same as > ancestor. When '-f' is specified we are populating the output > working tree with the merge result so that is what that > 'checkout-cache' is about. "O - $path" means "we took the > original". > > The idea is to populate the dircache of merge-temp with the > merge result and leave uncertain stuff as in the common ancestor > state, so that the user can fix them starting from there. > > Maybe it is a good time for me to summarize the output somewhere > in a document. > > O - $path Tree-A and tree-B did not touch this; the result > is taken from the ancestor (O for original). > > A D $path Only tree-A (or tree-B) deleted this and the other > B D $path branch did not touch this; the result is to delete. > > A M $path Only tree-A (or tree-B) modified this and the other > B M $path branch did not touch this; the result is to use one > from tree-A (or tree-B). This includes file > creation case. > > *DD $path Both tree-A and tree-B deleted this; the result > is to delete. > > *DM $path Tree-A deleted while tree-B modified this (or > *MD $path vice versa), and manual conflict resolution is > needed; dircache is left as in the ancestor, and > the modified file is saved as $path~A~ in the > working directory. The user can rename it to $path > and run show-diff to see what Tree-A wanted to do > and decide before running update-cache. > > *MM $path Tree-A and tree-B did the exact same > modification; the result is to use that. > > MRG $path Tree-A and tree-B have different modifications; > run "merge" and the merge result is left as > $path in the working directory. > > In cases other than *DM, *MD, and MRG, the result is trivial and
I believe there is simpler way to do it as in my demo python script. I start it easier but you bits me in time. It is a demo script, it only print the action instead of actually going out to do it. change that to corresponding os.system("") call leaves to the reader. Again, this is a demo how it can be done. Not python vs perl thing I did not chose perl only because I am not good at it. #!/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", "remove", 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 "3way-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:] trees = map(get_tree, args) print "check out 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