largefiles: update standins only at the 1st commit of "transplant --continue"
authorFUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Sat, 08 Nov 2014 00:48:41 +0900
changeset 23274 0ec2e124fcc0
parent 23273 236c978bceca
child 23275 fae708cb32d1
largefiles: update standins only at the 1st commit of "transplant --continue" Before this patch, "hg transplant --continue" may record incorrect standins, because largefiles extension always avoid updating standins while transplanting, even though largefiles in the working directory may be modified manually at the 1st commit of "hg transplant --continue". But, on the other hand, updating standins should be avoided at subsequent commits for efficiency reason. To update standins only at the 1st commit of "hg transplant --continue", this patch uses "automatedcommithook", which updates standins by "lfutil.updatestandinsbymatch()" only at the 1st commit of resuming. Even after this patch, "repo._istransplanting = True" is still needed to avoid some status report while updating largefiles in "lfcommands.updatelfiles()". This is reason why this patch omits not "repo._istransplanting = True" in "overriderebase" but examination of "getattr(repo, "_istransplanting", False)" in "updatestandinsbymatch".
hgext/largefiles/lfutil.py
hgext/largefiles/overrides.py
tests/test-largefiles-update.t
--- a/hgext/largefiles/lfutil.py	Sat Nov 08 00:48:38 2014 +0900
+++ b/hgext/largefiles/lfutil.py	Sat Nov 08 00:48:41 2014 +0900
@@ -447,18 +447,6 @@
 
     ui = repo.ui
 
-    # Case 0: Automated committing
-    #
-    # While automated committing (like rebase, transplant
-    # and so on), this code path is used to avoid:
-    # (1) updating standins, because standins should
-    #     be already updated at this point
-    # (2) aborting when standins are matched by "match",
-    #     because automated committing may specify them directly
-    #
-    if getattr(repo, "_istransplanting", False):
-        return match
-
     # Case 1: user calls commit with no specific files or
     # include/exclude patterns: refresh and commit all files that
     # are "dirty".
--- a/hgext/largefiles/overrides.py	Sat Nov 08 00:48:38 2014 +0900
+++ b/hgext/largefiles/overrides.py	Sat Nov 08 00:48:41 2014 +0900
@@ -1168,11 +1168,14 @@
     return result
 
 def overridetransplant(orig, ui, repo, *revs, **opts):
+    resuming = opts.get('continue')
+    repo._lfcommithooks.append(lfutil.automatedcommithook(resuming))
     try:
         repo._istransplanting = True
         result = orig(ui, repo, *revs, **opts)
     finally:
         repo._istransplanting = False
+        repo._lfcommithooks.pop()
     return result
 
 def overridecat(orig, ui, repo, file1, *pats, **opts):
--- a/tests/test-largefiles-update.t	Sat Nov 08 00:48:38 2014 +0900
+++ b/tests/test-largefiles-update.t	Sat Nov 08 00:48:41 2014 +0900
@@ -560,6 +560,20 @@
   $ cat largeX
   largeX
 
+Test that transplant updates standins for manually modified largefiles
+at the 1st commit of resuming.
+
+  $ echo "manually modified before 'hg transplant --continue'" > large1
+  $ hg transplant --continue
+  07d6153b5c04 transplanted as f1bf30eb88cc
+  $ hg diff -c tip .hglf/large1 | grep '^[+-][0-9a-z]'
+  -e5bb990443d6a92aaf7223813720f7566c9dd05b
+  +6a4f36d4075fbe0f30ec1d26ca44e63c05903671
+  $ rm -f large1
+  $ hg update -q -C tip
+  $ cat large1
+  manually modified before 'hg transplant --continue'
+
 Test that "hg status" doesn't show removal of largefiles not managed
 in the target context.