Patchwork D59: sparse: override dirstate.walk() instead of dirstate._ignore

login
register
mail settings
Submitter phabricator
Date July 17, 2017, 6:29 p.m.
Message ID <856a46b871bf26cb8844765c857b98b0@localhost.localdomain>
Download mbox | patch
Permalink /patch/22448/
State Not Applicable
Headers show

Comments

phabricator - July 17, 2017, 6:29 p.m.
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

Patch

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):