From patchwork Mon Jul 17 18:29:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D59: sparse: override dirstate.walk() instead of dirstate._ignore From: phabricator X-Patchwork-Id: 22448 Message-Id: <856a46b871bf26cb8844765c857b98b0@localhost.localdomain> To: mercurial-devel@mercurial-scm.org Date: Mon, 17 Jul 2017 18:29:58 +0000 This revision was automatically updated to reflect the committed changes. Closed by commit rHG258298f4712b: sparse: override dirstate.walk() instead of dirstate._ignore (authored by martinvonz). REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D59?vs=77&id=206 REVISION DETAIL https://phab.mercurial-scm.org/D59 AFFECTED FILES hgext/sparse.py tests/test-sparse.t CHANGE DETAILS EMAIL PREFERENCES https://phab.mercurial-scm.org/settings/panel/emailpreferences/ To: martinvonz, #hg, durham Cc: durham, dsp, mercurial-devel diff --git a/tests/test-sparse.t b/tests/test-sparse.t --- a/tests/test-sparse.t +++ b/tests/test-sparse.t @@ -144,10 +144,15 @@ M show $ hg up -qC . +TODO: add an option to purge to also purge files outside the sparse config? $ hg purge --all --config extensions.purge= $ ls + hide + hide3 show show2 +For now, manually remove the files + $ rm hide hide3 Verify rebase temporarily includes excluded files diff --git a/hgext/sparse.py b/hgext/sparse.py --- a/hgext/sparse.py +++ b/hgext/sparse.py @@ -192,36 +192,11 @@ and to prevent modifications to files outside the checkout. """ - # The atrocity below is needed to wrap dirstate._ignore. It is a cached - # property, which means normal function wrapping doesn't work. - class ignorewrapper(object): - def __init__(self, orig): - self.orig = orig - self.origignore = None - self.func = None - self.sparsematch = None - - def __get__(self, obj, type=None): - origignore = self.orig.__get__(obj) + def walk(orig, self, match, subrepos, unknown, ignored, full=True): + match = matchmod.intersectmatchers(match, self._sparsematcher) + return orig(self, match, subrepos, unknown, ignored, full) - sparsematch = obj._sparsematcher - if sparsematch.always(): - return origignore - - if self.sparsematch != sparsematch or self.origignore != origignore: - self.func = matchmod.unionmatcher([ - origignore, matchmod.negatematcher(sparsematch)]) - self.sparsematch = sparsematch - self.origignore = origignore - return self.func - - def __set__(self, obj, value): - return self.orig.__set__(obj, value) - - def __delete__(self, obj): - return self.orig.__delete__(obj) - - replacefilecache(dirstate.dirstate, '_ignore', ignorewrapper) + extensions.wrapfunction(dirstate.dirstate, 'walk', walk) # dirstate.rebuild should not add non-matching files def _rebuild(orig, self, parent, allfiles, changedfiles=None):