largefiles: fix an explicit largefile commit after a remove (issue4969) stable
authorMatt Harbison <matt_harbison@yahoo.com>
Sat, 23 Jan 2016 20:51:17 -0500
branchstable
changeset 27942 eb1135d5e688
parent 27941 75fa75d31495
child 27943 02c5f8ad00ac
largefiles: fix an explicit largefile commit after a remove (issue4969) The change in b68797f244e4 to handle a normal -> largefile switch was too aggressive in preserving the original matcher names. If a largefile is explicitly provided by the user, but only the standin exists in dirstate, then only the standin can be committed. There's still maybe an issue when the largefile is deleted outside of Mercurial: $ rm large $ hg ci -m "oops" large large: The system cannot find the file specified nothing changed [1]
hgext/largefiles/lfutil.py
tests/test-largefiles-cache.t
--- a/hgext/largefiles/lfutil.py	Mon Jan 25 15:48:35 2016 -0800
+++ b/hgext/largefiles/lfutil.py	Sat Jan 23 20:51:17 2016 -0500
@@ -575,11 +575,15 @@
         fstandin = standin(f)
 
         # For largefiles, only one of the normal and standin should be
-        # committed (except if one of them is a remove).
+        # committed (except if one of them is a remove).  In the case of a
+        # standin removal, drop the normal file if it is unknown to dirstate.
         # Thus, skip plain largefile names but keep the standin.
-        if (f in lfiles or fstandin in standins) and \
-            repo.dirstate[f] != 'r' and repo.dirstate[fstandin] != 'r':
-            continue
+        if f in lfiles or fstandin in standins:
+            if repo.dirstate[fstandin] != 'r':
+                if repo.dirstate[f] != 'r':
+                    continue
+            elif repo.dirstate[f] == '?':
+                continue
 
         actualfiles.append(f)
     match._files = actualfiles
--- a/tests/test-largefiles-cache.t	Mon Jan 25 15:48:35 2016 -0800
+++ b/tests/test-largefiles-cache.t	Sat Jan 23 20:51:17 2016 -0500
@@ -17,7 +17,7 @@
   $ hg add --large large
   $ hg commit -m 'add largefile'
   $ hg rm large
-  $ hg commit -m 'branchhead without largefile'
+  $ hg commit -m 'branchhead without largefile' large
   $ hg up -qr 0
   $ cd ..