From patchwork Tue Dec 23 20:56:18 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [6, of, 8] largefiles: pass a matcher instead of a raw file list to removelargefiles() From: Matt Harbison X-Patchwork-Id: 7217 Message-Id: To: mercurial-devel@selenic.com Cc: matt_harbison@yahoo.com Date: Tue, 23 Dec 2014 15:56:18 -0500 # 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/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 @@ -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