Re: Yet another set of merge test cases from the kernel tree.
- From
Junio C Hamano <junkio@cox.net>
- Date
- Sep 20, 2005, 01:53 UTC
- Message-ID
- <7vek7kfqs2.fsf@assigned-by-dhcp.cox.net>
- In-Reply-To
- <20050919161312.GB1782@c165.ib.student.liu.se>
Fredrik Kuivinen <freku045@student.liu.se> writes:
Show 6 quoted lines
> ... The support for > renames is currently interleaved with other unrelated changes and > this patch should not yet be considered for inclusion. With the rename > patch we get clean merges that matches the actual commit for all of > those except for 46f5.... git-merge-recursive.py do not merge > 46f5... cleanly with the rename patch applied.
That is very interesting.
Show 10 quoted lines
> +getFilesRE = re.compile('([0-9]+) ([a-z0-9]+) ([0-9a-f]{40})\t(.*)')
> +def mergeTrees(head, merge, common, branch1Name, branch2Name,
> + cleanCache):
> ...
> + if cleanCache:
> + updateArg = '-i'
> + else:
> + updateArg = '-u'
> +
> + runProgram(['git-read-tree', updateArg, '-m', common, head, merge])It _might_ make sense if we make '-i' and '-u' imply instead of require '-m' in read-tree, but that will be an independent patch.
Show 7 quoted lines
> +def mergeFile(path, oSha, oMode, aSha, aMode, bSha, bMode, > + branch1Name, branch2Name): >... > + if aMode == oMode: > + mode = bMode > + else: > + mode = aMode
Note: preferring "our" mode if there is a conflict instead of barfing. I do not know which is more useful in practice.
Show 27 quoted lines
> + > + return [sha, mode, clean, merge] > + > +def updateFile(clean, sha, mode, path, cleanCache, onlyWd=False): > + updateCache = not onlyWd and (cleanCache or (not cleanCache and clean)) > + updateWd = onlyWd or (not cleanCache and clean) > + > + if updateWd: > + prog = ['git-cat-file', 'blob', sha] > + if stat.S_ISREG(mode): > + try: > + os.unlink(path) > + except OSError: > + pass > + if mode & 0100: > + mode = 0777 > + else: > + mode = 0666 > + fd = os.open(path, os.O_WRONLY | os.O_TRUNC | os.O_CREAT, mode) > + proc = subprocess.Popen(prog, stdout=fd) > + proc.wait() > + os.close(fd) > + elif stat.S_ISLNK(mode): > + linkTarget = runProgram(prog) > + os.symlink(linkTarget, path) > + else: > + assert(False)
Could it happen trying to update a file 'foo' when the working tree has 'foo/bar' file (i.e. D/F conflict)?
> +def getRenames(treeOrig, tree): >... > +def processRenames(entries, renamesA,... >...
These are indeed very interesting.