merge-recursive: Make use of provided bases
This makes some cases faster as we don't have to build the commit graph. Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
985cb9cc58
commit
008bb6ea69
@ -45,11 +45,10 @@ cacheOnly = False
|
|||||||
# The entry point to the merge code
|
# The entry point to the merge code
|
||||||
# ---------------------------------
|
# ---------------------------------
|
||||||
|
|
||||||
def merge(h1, h2, branch1Name, branch2Name, graph, callDepth=0):
|
def merge(h1, h2, branch1Name, branch2Name, graph, callDepth=0, ancestor=None):
|
||||||
'''Merge the commits h1 and h2, return the resulting virtual
|
'''Merge the commits h1 and h2, return the resulting virtual
|
||||||
commit object and a flag indicating the cleaness of the merge.'''
|
commit object and a flag indicating the cleaness of the merge.'''
|
||||||
assert(isinstance(h1, Commit) and isinstance(h2, Commit))
|
assert(isinstance(h1, Commit) and isinstance(h2, Commit))
|
||||||
assert(isinstance(graph, Graph))
|
|
||||||
|
|
||||||
global outputIndent
|
global outputIndent
|
||||||
|
|
||||||
@ -58,7 +57,11 @@ def merge(h1, h2, branch1Name, branch2Name, graph, callDepth=0):
|
|||||||
output(h2)
|
output(h2)
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
|
||||||
ca = getCommonAncestors(graph, h1, h2)
|
if ancestor:
|
||||||
|
ca = [ancestor]
|
||||||
|
else:
|
||||||
|
assert(isinstance(graph, Graph))
|
||||||
|
ca = getCommonAncestors(graph, h1, h2)
|
||||||
output('found', len(ca), 'common ancestor(s):')
|
output('found', len(ca), 'common ancestor(s):')
|
||||||
for x in ca:
|
for x in ca:
|
||||||
output(x)
|
output(x)
|
||||||
@ -86,7 +89,7 @@ def merge(h1, h2, branch1Name, branch2Name, graph, callDepth=0):
|
|||||||
[shaRes, clean] = mergeTrees(h1.tree(), h2.tree(), mergedCA.tree(),
|
[shaRes, clean] = mergeTrees(h1.tree(), h2.tree(), mergedCA.tree(),
|
||||||
branch1Name, branch2Name)
|
branch1Name, branch2Name)
|
||||||
|
|
||||||
if clean or cacheOnly:
|
if graph and (clean or cacheOnly):
|
||||||
res = Commit(None, [h1, h2], tree=shaRes)
|
res = Commit(None, [h1, h2], tree=shaRes)
|
||||||
graph.addNode(res)
|
graph.addNode(res)
|
||||||
else:
|
else:
|
||||||
@ -891,12 +894,11 @@ def usage():
|
|||||||
|
|
||||||
# main entry point as merge strategy module
|
# main entry point as merge strategy module
|
||||||
# The first parameters up to -- are merge bases, and the rest are heads.
|
# The first parameters up to -- are merge bases, and the rest are heads.
|
||||||
# This strategy module figures out merge bases itself, so we only
|
|
||||||
# get heads.
|
|
||||||
|
|
||||||
if len(sys.argv) < 4:
|
if len(sys.argv) < 4:
|
||||||
usage()
|
usage()
|
||||||
|
|
||||||
|
bases = []
|
||||||
for nextArg in xrange(1, len(sys.argv)):
|
for nextArg in xrange(1, len(sys.argv)):
|
||||||
if sys.argv[nextArg] == '--':
|
if sys.argv[nextArg] == '--':
|
||||||
if len(sys.argv) != nextArg + 3:
|
if len(sys.argv) != nextArg + 3:
|
||||||
@ -907,6 +909,8 @@ for nextArg in xrange(1, len(sys.argv)):
|
|||||||
except IndexError:
|
except IndexError:
|
||||||
usage()
|
usage()
|
||||||
break
|
break
|
||||||
|
else:
|
||||||
|
bases.append(sys.argv[nextArg])
|
||||||
|
|
||||||
print 'Merging', h1, 'with', h2
|
print 'Merging', h1, 'with', h2
|
||||||
|
|
||||||
@ -914,10 +918,17 @@ try:
|
|||||||
h1 = runProgram(['git-rev-parse', '--verify', h1 + '^0']).rstrip()
|
h1 = runProgram(['git-rev-parse', '--verify', h1 + '^0']).rstrip()
|
||||||
h2 = runProgram(['git-rev-parse', '--verify', h2 + '^0']).rstrip()
|
h2 = runProgram(['git-rev-parse', '--verify', h2 + '^0']).rstrip()
|
||||||
|
|
||||||
graph = buildGraph([h1, h2])
|
if len(bases) == 1:
|
||||||
|
base = runProgram(['git-rev-parse', '--verify',
|
||||||
[dummy, clean] = merge(graph.shaMap[h1], graph.shaMap[h2],
|
bases[0] + '^0']).rstrip()
|
||||||
firstBranch, secondBranch, graph)
|
ancestor = Commit(base, None)
|
||||||
|
[dummy, clean] = merge(Commit(h1, None), Commit(h2, None),
|
||||||
|
firstBranch, secondBranch, None, 0,
|
||||||
|
ancestor)
|
||||||
|
else:
|
||||||
|
graph = buildGraph([h1, h2])
|
||||||
|
[dummy, clean] = merge(graph.shaMap[h1], graph.shaMap[h2],
|
||||||
|
firstBranch, secondBranch, graph)
|
||||||
|
|
||||||
print ''
|
print ''
|
||||||
except:
|
except:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user