@@ -430,6 +430,7 @@
removes = set(a[0] for a in actions['r'])
newglist = []
+ lfmr = [] # LargeFiles: Mark as Removed
for action in actions['g']:
f, args, msg = action
splitstandin = f and lfutil.splitstandin(f)
@@ -456,7 +457,16 @@
'keep (l)argefile or use (n)ormal file?'
'$$ &Largefile $$ &Normal file') % lfile
if repo.ui.promptchoice(msg, 0) == 0:
- actions['r'].append((lfile, None, msg))
+ if branchmerge:
+ # largefile can be restored from standin safely
+ actions['r'].append((lfile, None, msg))
+ else:
+ # "lfile" should be marked as "removed" without
+ # removal of itself
+ lfmr.append((lfile, None, msg))
+
+ # linear-merge should treat this largefile as 're-added'
+ actions['a'].append((standin, None, msg))
else:
actions['r'].append((standin, None, msg))
newglist.append((lfile, (p2.flags(lfile),), msg))
@@ -465,9 +475,22 @@
newglist.sort()
actions['g'] = newglist
+ if lfmr:
+ lfmr.sort()
+ actions['lfmr'] = lfmr
return actions
+def mergerecordupdates(orig, repo, actions, branchmerge):
+ if 'lfmr' in actions:
+ # this should be executed before 'orig', to execute 'remove'
+ # before all other actions
+ for lfile, args, msg in actions['lfmr']:
+ repo.dirstate.remove(lfile)
+
+ return orig(repo, actions, branchmerge)
+
+
# Override filemerge to prompt the user about how they wish to merge
# largefiles. This will handle identical edits without prompting the user.
def overridefilemerge(origfn, repo, mynode, orig, fcd, fco, fca, labels=None):
@@ -99,6 +99,8 @@
overrides.overridecheckunknownfile)
entry = extensions.wrapfunction(merge, 'calculateupdates',
overrides.overridecalculateupdates)
+ entry = extensions.wrapfunction(merge, 'recordupdates',
+ overrides.mergerecordupdates)
entry = extensions.wrapfunction(filemerge, 'filemerge',
overrides.overridefilemerge)
entry = extensions.wrapfunction(cmdutil, 'copy',
@@ -220,4 +220,48 @@
$ cat .hglf/large1
ba94c2efe5b7c5e0af8d189295ce00553b0612b7
+Test the linear merge to the revision containing same name normal file
+
+ $ hg update -q -C 3
+ $ hg remove large2
+ $ echo 'large2 as normal file' > large2
+ $ hg add large2
+ $ echo 'large3 as normal file' > large3
+ $ hg add large3
+ $ hg commit -m '#5'
+ $ hg manifest
+ .hglf/large1
+ large2
+ large3
+ normal1
+
+(modified largefile is already switched to normal)
+
+ $ hg update -q -C 2
+ $ echo 'modified large2 for linear merge' > large2
+ $ hg update -q 5
+ local changed .hglf/large2 which remote deleted
+ use (c)hanged version or (d)elete? c
+ remote turned local largefile large2 into a normal file
+ keep (l)argefile or use (n)ormal file? l
+ $ hg debugdirstate --nodates | grep large2
+ a 0 -1 .hglf/large2
+ r 0 0 large2
+ $ cat large2
+ modified large2 for linear merge
+
+(added largefile is already committed as normal)
+
+ $ hg update -q -C 2
+ $ echo 'large3 as large file for linear merge' > large3
+ $ hg add --large large3
+ $ hg update -q 5
+ remote turned local largefile large3 into a normal file
+ keep (l)argefile or use (n)ormal file? l
+ $ hg debugdirstate --nodates | grep large3
+ a 0 -1 .hglf/large3
+ r 0 0 large3
+ $ cat large3
+ large3 as large file for linear merge
+
$ cd ..