[PATCH 2 of 4 V2] largefiles: pass a matcher instead of a raw file list to removelargefiles()

Matt Harbison mharbison72 at gmail.com
Tue Dec 30 18:55:46 CST 2014


# HG changeset patch
# User Matt Harbison <matt_harbison at yahoo.com>
# Date 1417222252 18000
#      Fri Nov 28 19:50:52 2014 -0500
# Node ID fd07d758b7d15cc77d169b687bc11f76d9daf9c9
# Parent  e8d4bf9e91698f57bd8485a093b0c9ae6a7f0271
largefiles: pass a matcher instead of a raw file list to removelargefiles()

This is consistent with addlargefiles(), and will make it easier to get the
paths that are printed correct when recursing into subrepos or invoking from
outside the repository.  It also now restricts the path that the addremove is
performed on if a path is given, as is done with normal files.

The repo.status() call needs to exclude clean files when performing an
addremove, because the addremove override method calling this used to pass the
list of files to delete, which caused the matcher to only consider those files
in building the status list.  Now the matcher is restricted only to the extent
that the caller requested- usually directories if at all.  There's no reason for
addremove to care about clean files anyway- we don't want them deleted.

diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
--- a/hgext/largefiles/overrides.py
+++ b/hgext/largefiles/overrides.py
@@ -154,13 +154,12 @@
         wlock.release()
     return bad
 
-def removelargefiles(ui, repo, isaddremove, *pats, **opts):
+def removelargefiles(ui, repo, isaddremove, matcher, **opts):
     after = opts.get('after')
-    m = composelargefilematcher(scmutil.match(repo[None], pats, opts),
-                                repo[None].manifest())
+    m = composelargefilematcher(matcher, repo[None].manifest())
     try:
         repo.lfstatus = True
-        s = repo.status(match=m, clean=True)
+        s = repo.status(match=m, clean=not isaddremove)
     finally:
         repo.lfstatus = False
     manifest = repo[None].manifest()
@@ -248,7 +247,8 @@
     installnormalfilesmatchfn(repo[None].manifest())
     result = orig(ui, repo, *pats, **opts)
     restorematchfn()
-    return removelargefiles(ui, repo, False, *pats, **opts) or result
+    matcher = scmutil.match(repo[None], pats, opts)
+    return removelargefiles(ui, repo, False, matcher, **opts) or result
 
 def overridestatusfn(orig, repo, rev2, **opts):
     try:
@@ -1103,8 +1103,16 @@
     # we don't remove the standin in the largefiles code, preventing a very
     # confused state later.
     if s.deleted:
-        m = [repo.wjoin(f) for f in s.deleted]
-        removelargefiles(repo.ui, repo, True, *m, **opts)
+        m = copy.copy(matcher)
+
+        # The m._files and m._map attributes are unchanged here, because that
+        # affects the m.exact() test, which in turn governs whether or not the
+        # file name is printed, and how.  Simply limit the original matches to
+        # those in the deleted status list.
+        matchfn = m.matchfn
+        m.matchfn = lambda f: f in s.deleted and matchfn(f)
+
+        removelargefiles(repo.ui, repo, True, m, **opts)
     # Call into the normal add code, and any files that *should* be added as
     # largefiles will be
     addlargefiles(repo.ui, repo, matcher, **opts)
diff --git a/tests/test-largefiles-misc.t b/tests/test-largefiles-misc.t
--- a/tests/test-largefiles-misc.t
+++ b/tests/test-largefiles-misc.t
@@ -255,6 +255,7 @@
 Add a normal file to the subrepo, then test archiving
 
   $ echo 'normal file' > subrepo/normal.txt
+  $ touch large.dat
   $ mv subrepo/large.txt subrepo/renamed-large.txt
   $ hg -R subrepo addremove --dry-run
   removing large.txt
@@ -262,11 +263,21 @@
   adding renamed-large.txt
   $ hg status -S
   ! subrepo/large.txt
+  ? large.dat
   ? subrepo/normal.txt
   ? subrepo/renamed-large.txt
   $ mv subrepo/renamed-large.txt subrepo/large.txt
   $ hg -R subrepo add subrepo/normal.txt
 
+  $ hg addremove subrepo
+  $ hg addremove -S
+  adding large.dat as a largefile
+  $ rm large.dat
+
+  $ hg addremove subrepo
+  $ hg addremove -S
+  removing large.dat
+
 Lock in subrepo, otherwise the change isn't archived
 
   $ hg ci -S -m "add normal file to top level"
@@ -276,6 +287,7 @@
   A normal.txt
   Invoking status precommit hook
   M .hgsubstate
+  R large.dat
   $ hg archive -S ../lf_subrepo_archive
   $ find ../lf_subrepo_archive | sort
   ../lf_subrepo_archive


More information about the Mercurial-devel mailing list