summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
ccfd3e9)
If there are non-mergeable changes leave the head contents in the
cache and update the working directory with the output from merge(1).
In the add/add and delete/modify conflict cases leave unmerged cache
entries in the index.
Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
sys.path.append('@@GIT_PYTHON_PATH@@')
from gitMergeCommon import *
sys.path.append('@@GIT_PYTHON_PATH@@')
from gitMergeCommon import *
-alwaysWriteTree = False
-
# The actual merge code
# ---------------------
# The actual merge code
# ---------------------
runProgram(['git-update-cache', '-q', '--refresh'])
# Use the original index if we only have one common ancestor
runProgram(['git-update-cache', '-q', '--refresh'])
# Use the original index if we only have one common ancestor
- updateWd = True
- if alwaysWriteTree:
- cleanCache = True
- else:
- cleanCache = False
else:
runProgram(['git-read-tree', h1.tree()])
else:
runProgram(['git-read-tree', h1.tree()])
cleanCache = True
[shaRes, clean] = mergeTrees(h1.tree(), h2.tree(), Ms.tree(),
branch1Name, branch2Name,
cleanCache = True
[shaRes, clean] = mergeTrees(h1.tree(), h2.tree(), Ms.tree(),
branch1Name, branch2Name,
if clean or cleanCache:
res = Commit(None, [h1, h2], tree=shaRes)
if clean or cleanCache:
res = Commit(None, [h1, h2], tree=shaRes)
return res
def mergeTrees(head, merge, common, branch1Name, branch2Name,
return res
def mergeTrees(head, merge, common, branch1Name, branch2Name,
'''Merge the trees 'head' and 'merge' with the common ancestor
'common'. The name of the head branch is 'branch1Name' and the name of
the merge branch is 'branch2Name'. Return a tuple (tree, cleanMerge)
'''Merge the trees 'head' and 'merge' with the common ancestor
'common'. The name of the head branch is 'branch1Name' and the name of
the merge branch is 'branch2Name'. Return a tuple (tree, cleanMerge)
print 'Already uptodate!'
return [head, True]
print 'Already uptodate!'
return [head, True]
- if updateWd:
- updateArg = '-u'
- else:
+ else:
+ updateArg = '-u'
+
runProgram(['git-read-tree', updateArg, '-m', common, head, merge])
cleanMerge = True
runProgram(['git-read-tree', updateArg, '-m', common, head, merge])
cleanMerge = True
entries = unmergedCacheEntries()
for name in entries:
if not processEntry(entries[name], branch1Name, branch2Name,
entries = unmergedCacheEntries()
for name in entries:
if not processEntry(entries[name], branch1Name, branch2Name,
- files, dirs, cleanCache, updateWd):
+ files, dirs, cleanCache):
cleanMerge = False
if cleanMerge or cleanCache:
cleanMerge = False
if cleanMerge or cleanCache:
return [tree, cleanMerge]
return [tree, cleanMerge]
-def processEntry(entry, branch1Name, branch2Name, files, dirs,
- cleanCache, updateWd):
+def processEntry(entry, branch1Name, branch2Name, files, dirs, cleanCache):
'''Merge one cache entry. 'files' is a Set with the files in both of
the heads that we are going to merge. 'dirs' contains the
corresponding data for directories. If 'cleanCache' is True no
non-zero stages will be left in the cache for the path
corresponding to the entry 'entry'.'''
'''Merge one cache entry. 'files' is a Set with the files in both of
the heads that we are going to merge. 'dirs' contains the
corresponding data for directories. If 'cleanCache' is True no
non-zero stages will be left in the cache for the path
corresponding to the entry 'entry'.'''
-# cleanCache == True => Don't leave any non-stage 0 entries in the cache.
-# False => Leave unmerged entries
-
-# updateWd == True => Update the working directory to correspond to the cache
-# False => Leave the working directory unchanged
+# cleanCache == True => Don't leave any non-stage 0 entries in the cache and
+# don't update the working directory
+# False => Leave unmerged entries and update the working directory
# clean == True => non-conflict case
# False => conflict case
# If cleanCache == False then the cache shouldn't be updated if clean == False
# clean == True => non-conflict case
# False => conflict case
# If cleanCache == False then the cache shouldn't be updated if clean == False
- def updateFile(clean, sha, mode, path):
- if cleanCache or (not cleanCache and clean):
- runProgram(['git-update-cache', '--add', '--cacheinfo',
- '0%o' % mode, sha, path])
+ def updateFile(clean, sha, mode, path, 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 updateWd:
prog = ['git-cat-file', 'blob', sha]
os.symlink(linkTarget, path)
else:
assert(False)
os.symlink(linkTarget, path)
else:
assert(False)
- runProgram(['git-update-cache', '--', path])
+
+ if updateWd and updateCache:
+ runProgram(['git-update-cache', '--add', '--', path])
+ elif updateCache:
+ runProgram(['git-update-cache', '--add', '--cacheinfo',
+ '0%o' % mode, sha, path])
def removeFile(clean, path):
if cleanCache or (not cleanCache and clean):
runProgram(['git-update-cache', '--force-remove', '--', path])
def removeFile(clean, path):
if cleanCache or (not cleanCache and clean):
runProgram(['git-update-cache', '--force-remove', '--', path])
+ if not cleanCache and clean:
try:
os.unlink(path)
except OSError, e:
try:
os.unlink(path)
except OSError, e:
files.add(newPath)
return newPath
files.add(newPath)
return newPath
- debug('processing', entry.path, 'clean cache:', cleanCache,
- 'wd:', updateWd)
+ debug('processing', entry.path, 'clean cache:', cleanCache)
if aMode != bMode:
cleanMerge = False
print 'CONFLICT: File "' + path + \
if aMode != bMode:
cleanMerge = False
print 'CONFLICT: File "' + path + \
- '" added identically in both branches,'
- print 'CONFLICT: but permissions conflict', '0%o' % aMode, \
- '->', '0%o' % bMode
+ '" added identically in both branches,', \
+ 'but permissions conflict', '0%o' % aMode, '->', \
+ '0%o' % bMode
print 'CONFLICT: adding with permission:', '0%o' % aMode
updateFile(False, aSha, aMode, path)
print 'CONFLICT: adding with permission:', '0%o' % aMode
updateFile(False, aSha, aMode, path)
newPath1 = uniquePath(path, branch1Name)
newPath2 = uniquePath(path, branch2Name)
print 'CONFLICT (add/add): File "' + path + \
newPath1 = uniquePath(path, branch1Name)
newPath2 = uniquePath(path, branch2Name)
print 'CONFLICT (add/add): File "' + path + \
- '" added non-identically in both branches.', \
- 'Adding "' + newPath1 + '" and "' + newPath2 + '" instead.'
+ '" added non-identically in both branches.'
removeFile(False, path)
updateFile(False, aSha, aMode, newPath1)
updateFile(False, bSha, bMode, newPath2)
removeFile(False, path)
updateFile(False, aSha, aMode, newPath1)
updateFile(False, bSha, bMode, newPath2)
if ret != 0:
cleanMerge = False
print 'CONFLICT (content): Merge conflict in "' + path + '".'
if ret != 0:
cleanMerge = False
print 'CONFLICT (content): Merge conflict in "' + path + '".'
- updateFile(False, sha, mode, path)
+
+ if cleanCache:
+ updateFile(False, sha, mode, path)
+ else:
+ updateFile(True, aSha, aMode, path)
+ updateFile(False, sha, mode, path, True)
else:
updateFile(True, sha, mode, path)
else:
updateFile(True, sha, mode, path)