changeset 30191:328545c7d8a1 stable

largefiles: fix 'deleted' files sometimes persistently appearing with R status A code snippet that has been around since largefiles was introduced was wrong: Standins no longer found in lfdirstate has *not* been removed - they have probably just been deleted ... or not created. This wrong reporting did that 'up -C' didn't undo the change and didn't sync the two dirstates. Instead of reporting such files as removed, propagate the deletion to the standin file and report the file as deleted.
author Mads Kiilerich <madski@unity3d.com>
date Mon, 17 Oct 2016 17:12:24 +0200
parents 56b930238036
children fc11bb10425f
files hgext/largefiles/reposetup.py tests/test-largefiles-update.t
diffstat 2 files changed, 15 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/largefiles/reposetup.py	Sun Oct 16 02:29:45 2016 +0200
+++ b/hgext/largefiles/reposetup.py	Mon Oct 17 17:12:24 2016 +0200
@@ -164,8 +164,8 @@
                     # files from lfdirstate
                     unsure, s = lfdirstate.status(match, [], False, listclean,
                                                   False)
-                    (modified, added, removed, clean) = (s.modified, s.added,
-                                                         s.removed, s.clean)
+                    (modified, added, removed, deleted, clean) = (
+                        s.modified, s.added, s.removed, s.deleted, s.clean)
                     if parentworking:
                         for lfile in unsure:
                             standin = lfutil.standin(lfile)
@@ -206,14 +206,18 @@
                         removed = [lfile for lfile in removed
                                    if lfutil.standin(lfile) in ctx1]
 
-                    # Standins no longer found in lfdirstate has been
-                    # removed
+                    # Standins no longer found in lfdirstate have been deleted
                     for standin in ctx1.walk(lfutil.getstandinmatcher(self)):
                         lfile = lfutil.splitstandin(standin)
                         if not match(lfile):
                             continue
                         if lfile not in lfdirstate:
-                            removed.append(lfile)
+                            deleted.append(lfile)
+                            # Sync "largefile has been removed" back to the
+                            # standin. Removing a file as a side effect of
+                            # running status is gross, but the alternatives (if
+                            # any) are worse.
+                            self.wvfs.unlink(standin)
 
                     # Filter result lists
                     result = list(result)
@@ -237,7 +241,7 @@
                     normals = [[fn for fn in filelist
                                 if not lfutil.isstandin(fn)]
                                for filelist in result]
-                    lfstatus = (modified, added, removed, s.deleted, [], [],
+                    lfstatus = (modified, added, removed, deleted, [], [],
                                 clean)
                     result = [sorted(list1 + list2)
                               for (list1, list2) in zip(normals, lfstatus)]
--- a/tests/test-largefiles-update.t	Sun Oct 16 02:29:45 2016 +0200
+++ b/tests/test-largefiles-update.t	Mon Oct 17 17:12:24 2016 +0200
@@ -751,30 +751,22 @@
   $ hg up -Cr "8" --config extensions.crashupdatelfiles=../crashupdatelfiles.py
   [7]
 Check large1 content and status ... and that update will undo modifications:
-BUG: large is R
   $ cat large1
   large1 in #3
   $ hg st
   M large1
-  R largeX
+  ! largeX
   $ hg up -Cr .
   getting changed largefiles
-  1 largefiles updated, 0 removed
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  2 largefiles updated, 0 removed
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ cat large1
   manually modified before 'hg transplant --continue'
   $ hg st
-  R largeX
-Force largefiles rehashing and check again - which makes it realize that largeX
-not has been removed but just doesn't exist:
+Force largefiles rehashing and check that all changes have been caught by
+status and update:
   $ rm .hg/largefiles/dirstate
   $ hg st
-  ! largeX
-  $ hg up -Cr .
-  getting changed largefiles
-  1 largefiles updated, 0 removed
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg st
 
   $ cd ..