Skip to content

Commit

Permalink
merge-recursive: Indent the output properly
Browse files Browse the repository at this point in the history
If we have multiple common ancestors and have to recursively merge
them then the output will be much more readable with this commit.

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Fredrik Kuivinen authored and Junio C Hamano committed Nov 12, 2005
1 parent 5f3aa19 commit 46e6517
Showing 1 changed file with 69 additions and 61 deletions.
130 changes: 69 additions & 61 deletions git-merge-recursive.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@
sys.path.append('''@@GIT_PYTHON_PATH@@''')
from gitMergeCommon import *

outputIndent = 0
def output(*args):
sys.stdout.write(' '*outputIndent)
printList(args)

originalIndexFile = os.environ.get('GIT_INDEX_FILE',
os.environ.get('GIT_DIR', '.git') + '/index')
temporaryIndexFile = os.environ.get('GIT_DIR', '.git') + \
Expand Down Expand Up @@ -41,27 +46,27 @@ def merge(h1, h2, branch1Name, branch2Name, graph, callDepth=0):
assert(isinstance(h1, Commit) and isinstance(h2, Commit))
assert(isinstance(graph, Graph))

def infoMsg(*args):
sys.stdout.write(' '*callDepth)
printList(args)
global outputIndent

infoMsg('Merging:')
infoMsg(h1)
infoMsg(h2)
output('Merging:')
output(h1)
output(h2)
sys.stdout.flush()

ca = getCommonAncestors(graph, h1, h2)
infoMsg('found', len(ca), 'common ancestor(s):')
output('found', len(ca), 'common ancestor(s):')
for x in ca:
infoMsg(x)
output(x)
sys.stdout.flush()

mergedCA = ca[0]
for h in ca[1:]:
outputIndent = callDepth+1
[mergedCA, dummy] = merge(mergedCA, h,
'Temporary shared merge branch 1',
'Temporary shared merge branch 2',
'Temporary merge branch 1',
'Temporary merge branch 2',
graph, callDepth+1)
outputIndent = callDepth
assert(isinstance(mergedCA, Commit))

global cacheOnly
Expand Down Expand Up @@ -116,7 +121,7 @@ def mergeTrees(head, merge, common, branch1Name, branch2Name):
assert(isSha(head) and isSha(merge) and isSha(common))

if common == merge:
print 'Already uptodate!'
output('Already uptodate!')
return [head, True]

if cacheOnly:
Expand Down Expand Up @@ -554,23 +559,24 @@ def processRenames(renamesA, renamesB, branchNameA, branchNameB):
ren2.processed = True

if ren1.dstName != ren2.dstName:
print 'CONFLICT (rename/rename): Rename', \
fmtRename(path, ren1.dstName), 'in branch', branchName1, \
'rename', fmtRename(path, ren2.dstName), 'in', branchName2
output('CONFLICT (rename/rename): Rename',
fmtRename(path, ren1.dstName), 'in branch', branchName1,
'rename', fmtRename(path, ren2.dstName), 'in',
branchName2)
cleanMerge = False

if ren1.dstName in currentDirectorySet:
dstName1 = uniquePath(ren1.dstName, branchName1)
print ren1.dstName, 'is a directory in', branchName2, \
'adding as', dstName1, 'instead.'
output(ren1.dstName, 'is a directory in', branchName2,
'adding as', dstName1, 'instead.')
removeFile(False, ren1.dstName)
else:
dstName1 = ren1.dstName

if ren2.dstName in currentDirectorySet:
dstName2 = uniquePath(ren2.dstName, branchName2)
print ren2.dstName, 'is a directory in', branchName1, \
'adding as', dstName2, 'instead.'
output(ren2.dstName, 'is a directory in', branchName1,
'adding as', dstName2, 'instead.')
removeFile(False, ren2.dstName)
else:
dstName2 = ren1.dstName
Expand All @@ -585,13 +591,14 @@ def processRenames(renamesA, renamesB, branchNameA, branchNameB):
branchName1, branchName2)

if merge or not clean:
print 'Renaming', fmtRename(path, ren1.dstName)
output('Renaming', fmtRename(path, ren1.dstName))

if merge:
print 'Auto-merging', ren1.dstName
output('Auto-merging', ren1.dstName)

if not clean:
print 'CONFLICT (content): merge conflict in', ren1.dstName
output('CONFLICT (content): merge conflict in',
ren1.dstName)
cleanMerge = False

if not cacheOnly:
Expand All @@ -615,38 +622,38 @@ def processRenames(renamesA, renamesB, branchNameA, branchNameB):

if ren1.dstName in currentDirectorySet:
newPath = uniquePath(ren1.dstName, branchName1)
print 'CONFLICT (rename/directory): Rename', \
fmtRename(ren1.srcName, ren1.dstName), 'in', branchName1,\
'directory', ren1.dstName, 'added in', branchName2
print 'Renaming', ren1.srcName, 'to', newPath, 'instead'
output('CONFLICT (rename/directory): Rename',
fmtRename(ren1.srcName, ren1.dstName), 'in', branchName1,
'directory', ren1.dstName, 'added in', branchName2)
output('Renaming', ren1.srcName, 'to', newPath, 'instead')
cleanMerge = False
removeFile(False, ren1.dstName)
updateFile(False, ren1.dstSha, ren1.dstMode, newPath)
elif srcShaOtherBranch == None:
print 'CONFLICT (rename/delete): Rename', \
fmtRename(ren1.srcName, ren1.dstName), 'in', \
branchName1, 'and deleted in', branchName2
output('CONFLICT (rename/delete): Rename',
fmtRename(ren1.srcName, ren1.dstName), 'in',
branchName1, 'and deleted in', branchName2)
cleanMerge = False
updateFile(False, ren1.dstSha, ren1.dstMode, ren1.dstName)
elif dstShaOtherBranch:
newPath = uniquePath(ren1.dstName, branchName2)
print 'CONFLICT (rename/add): Rename', \
fmtRename(ren1.srcName, ren1.dstName), 'in', \
branchName1 + '.', ren1.dstName, 'added in', branchName2
print 'Adding as', newPath, 'instead'
output('CONFLICT (rename/add): Rename',
fmtRename(ren1.srcName, ren1.dstName), 'in',
branchName1 + '.', ren1.dstName, 'added in', branchName2)
output('Adding as', newPath, 'instead')
updateFile(False, dstShaOtherBranch, dstModeOtherBranch, newPath)
cleanMerge = False
tryMerge = True
elif renames2.getDst(ren1.dstName):
dst2 = renames2.getDst(ren1.dstName)
newPath1 = uniquePath(ren1.dstName, branchName1)
newPath2 = uniquePath(dst2.dstName, branchName2)
print 'CONFLICT (rename/rename): Rename', \
fmtRename(ren1.srcName, ren1.dstName), 'in', \
branchName1+'. Rename', \
fmtRename(dst2.srcName, dst2.dstName), 'in', branchName2
print 'Renaming', ren1.srcName, 'to', newPath1, 'and', \
dst2.srcName, 'to', newPath2, 'instead'
output('CONFLICT (rename/rename): Rename',
fmtRename(ren1.srcName, ren1.dstName), 'in',
branchName1+'. Rename',
fmtRename(dst2.srcName, dst2.dstName), 'in', branchName2)
output('Renaming', ren1.srcName, 'to', newPath1, 'and',
dst2.srcName, 'to', newPath2, 'instead')
removeFile(False, ren1.dstName)
updateFile(False, ren1.dstSha, ren1.dstMode, newPath1)
updateFile(False, dst2.dstSha, dst2.dstMode, newPath2)
Expand All @@ -663,13 +670,14 @@ def processRenames(renamesA, renamesB, branchNameA, branchNameB):
branchName1, branchName2)

if merge or not clean:
print 'Renaming', fmtRename(ren1.srcName, ren1.dstName)
output('Renaming', fmtRename(ren1.srcName, ren1.dstName))

if merge:
print 'Auto-merging', ren1.dstName
output('Auto-merging', ren1.dstName)

if not clean:
print 'CONFLICT (rename/modify): Merge conflict in', ren1.dstName
output('CONFLICT (rename/modify): Merge conflict in',
ren1.dstName)
cleanMerge = False

if not cacheOnly:
Expand Down Expand Up @@ -714,21 +722,21 @@ def processEntry(entry, branch1Name, branch2Name):
(not aSha and bSha == oSha):
# Deleted in both or deleted in one and unchanged in the other
if aSha:
print 'Removing', path
output('Removing', path)
removeFile(True, path)
else:
# Deleted in one and changed in the other
cleanMerge = False
if not aSha:
print 'CONFLICT (delete/modify):', path, 'deleted in', \
branch1Name, 'and modified in', branch2Name + '.', \
'Version', branch2Name, 'of', path, 'left in tree.'
output('CONFLICT (delete/modify):', path, 'deleted in',
branch1Name, 'and modified in', branch2Name + '.',
'Version', branch2Name, 'of', path, 'left in tree.')
mode = bMode
sha = bSha
else:
print 'CONFLICT (modify/delete):', path, 'deleted in', \
branch2Name, 'and modified in', branch1Name + '.', \
'Version', branch1Name, 'of', path, 'left in tree.'
output('CONFLICT (modify/delete):', path, 'deleted in',
branch2Name, 'and modified in', branch1Name + '.',
'Version', branch1Name, 'of', path, 'left in tree.')
mode = aMode
sha = aSha

Expand All @@ -755,14 +763,14 @@ def processEntry(entry, branch1Name, branch2Name):
if path in currentDirectorySet:
cleanMerge = False
newPath = uniquePath(path, addBranch)
print 'CONFLICT (' + conf + '):', \
'There is a directory with name', path, 'in', \
otherBranch + '. Adding', path, 'as', newPath
output('CONFLICT (' + conf + '):',
'There is a directory with name', path, 'in',
otherBranch + '. Adding', path, 'as', newPath)

removeFile(False, path)
updateFile(False, sha, mode, newPath)
else:
print 'Adding', path
output('Adding', path)
updateFile(True, sha, mode, path)

elif not oSha and aSha and bSha:
Expand All @@ -772,10 +780,10 @@ def processEntry(entry, branch1Name, branch2Name):
if aSha == bSha:
if aMode != bMode:
cleanMerge = False
print 'CONFLICT: File', path, \
'added identically in both branches, but permissions', \
'conflict', '0%o' % aMode, '->', '0%o' % bMode
print 'CONFLICT: adding with permission:', '0%o' % aMode
output('CONFLICT: File', path,
'added identically in both branches, but permissions',
'conflict', '0%o' % aMode, '->', '0%o' % bMode)
output('CONFLICT: adding with permission:', '0%o' % aMode)

updateFile(False, aSha, aMode, path)
else:
Expand All @@ -785,9 +793,9 @@ def processEntry(entry, branch1Name, branch2Name):
cleanMerge = False
newPath1 = uniquePath(path, branch1Name)
newPath2 = uniquePath(path, branch2Name)
print 'CONFLICT (add/add): File', path, \
'added non-identically in both branches. Adding as', \
newPath1, 'and', newPath2, 'instead.'
output('CONFLICT (add/add): File', path,
'added non-identically in both branches. Adding as',
newPath1, 'and', newPath2, 'instead.')
removeFile(False, path)
updateFile(False, aSha, aMode, newPath1)
updateFile(False, bSha, bMode, newPath2)
Expand All @@ -796,7 +804,7 @@ def processEntry(entry, branch1Name, branch2Name):
#
# case D: Modified in both, but differently.
#
print 'Auto-merging', path
output('Auto-merging', path)
[sha, mode, clean, dummy] = \
mergeFile(path, oSha, oMode,
path, aSha, aMode,
Expand All @@ -806,7 +814,7 @@ def processEntry(entry, branch1Name, branch2Name):
updateFile(True, sha, mode, path)
else:
cleanMerge = False
print 'CONFLICT (content): Merge conflict in', path
output('CONFLICT (content): Merge conflict in', path)

if cacheOnly:
updateFile(False, sha, mode, path)
Expand Down

0 comments on commit 46e6517

Please sign in to comment.