Patchwork [6,of,8] largefiles: pass a matcher instead of a raw file list to removelargefiles()

mail settings
Submitter Matt Harbison
Date Dec. 23, 2014, 8:56 p.m.
Message ID <eadacee126bd65a612e3.1419368178@Envy>
Download mbox | patch
Permalink /patch/7217/
State Superseded
Headers show


Matt Harbison - Dec. 23, 2014, 8:56 p.m.
# HG changeset patch
# User Matt Harbison <>
# Date 1417222252 18000
#      Fri Nov 28 19:50:52 2014 -0500
# Node ID eadacee126bd65a612e3a5a8240c42b45a3fc073
# Parent  abd1bd4b9c59959bf649d8690576b25babee71ba
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, as is done with normal files.

The 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.  There's no reason for addremove to care about clean
files anyway- we don't want them deleted.


diff --git a/hgext/largefiles/ b/hgext/largefiles/
--- a/hgext/largefiles/
+++ b/hgext/largefiles/
@@ -154,13 +154,12 @@ 
     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())
         repo.lfstatus = True
-        s = repo.status(match=m, clean=True)
+        s = repo.status(match=m, clean=not isaddremove)
         repo.lfstatus = False
     manifest = repo[None].manifest()
@@ -248,7 +247,8 @@ 
     result = orig(ui, repo, *pats, **opts)
-    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):
@@ -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
@@ -309,8 +309,8 @@ 
   $ rm large.dat
   $ hg addremove subrepo
+  $ hg addremove -S
   removing large.dat
-  $ hg addremove -S
 Lock in subrepo, otherwise the change isn't archived