context: make unknown/ignored/clean of cached status empty for equivalence
authorFUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Wed, 31 Dec 2014 17:55:43 +0900
changeset 23709 33e5431684c0
parent 23708 a9f826c3eaf9
child 23710 745e3b485632
context: make unknown/ignored/clean of cached status empty for equivalence Before this patch, "workingctx.status" caches the result of "dirstate.status" directly into "self._status". But "dirstate.status" is invoked with False "list*" arguments in normal "self._status" accessing route, and this makes "unknown"/"ignored"/"clean" of status empty. This may cause unexpected result of code paths internally accessing to them (accessors for external usage are already removed by previous patch). This patch makes "unknown"/"ignored"/"clean" of cached status empty for equivalence. Making them empty is executed only when at least one of "unknown", "ignored" or "clean" has files, for efficiency.
mercurial/context.py
tests/test-context.py
tests/test-context.py.out
--- a/mercurial/context.py	Wed Dec 31 13:48:55 2014 -0800
+++ b/mercurial/context.py	Wed Dec 31 17:55:43 2014 +0900
@@ -1505,7 +1505,12 @@
                                                      listunknown)
         elif match.always():
             # cache for performance
-            self._status = s
+            if s.unknown or s.ignored or s.clean:
+                # "_status" is cached with list*=False in the normal route
+                self._status = scmutil.status(s.modified, s.added, s.removed,
+                                              s.deleted, [], [], [])
+            else:
+                self._status = s
         return s
 
     def _matchstatus(self, other, match):
--- a/tests/test-context.py	Wed Dec 31 13:48:55 2014 -0800
+++ b/tests/test-context.py	Wed Dec 31 17:55:43 2014 +0900
@@ -83,9 +83,16 @@
 wctx = repo[None]
 print 'wctx._status=%s' % (str(wctx._status))
 
+print '=== with "pattern match":'
 print actx1.status(other=wctx,
                    match=scmutil.matchfiles(repo, ['bar-m', 'foo']))
 print 'wctx._status=%s' % (str(wctx._status))
 print actx2.status(other=wctx,
                    match=scmutil.matchfiles(repo, ['bar-m', 'foo']))
 print 'wctx._status=%s' % (str(wctx._status))
+
+print '=== with "always match" and "listclean=True":'
+print actx1.status(other=wctx, listclean=True)
+print 'wctx._status=%s' % (str(wctx._status))
+print actx2.status(other=wctx, listclean=True)
+print 'wctx._status=%s' % (str(wctx._status))
--- a/tests/test-context.py.out	Wed Dec 31 13:48:55 2014 -0800
+++ b/tests/test-context.py.out	Wed Dec 31 17:55:43 2014 +0900
@@ -14,7 +14,13 @@
 = checking context.status():
 == checking workingctx.status:
 wctx._status=<status modified=['bar-m'], added=['bar-a'], removed=['bar-r'], deleted=[], unknown=[], ignored=[], clean=[]>
+=== with "pattern match":
 <status modified=['bar-m'], added=[], removed=[], deleted=[], unknown=[], ignored=[], clean=[]>
 wctx._status=<status modified=['bar-m'], added=['bar-a'], removed=['bar-r'], deleted=[], unknown=[], ignored=[], clean=[]>
 <status modified=[], added=['bar-m'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]>
 wctx._status=<status modified=['bar-m'], added=['bar-a'], removed=['bar-r'], deleted=[], unknown=[], ignored=[], clean=[]>
+=== with "always match" and "listclean=True":
+<status modified=['bar-m'], added=['bar-a'], removed=['bar-r'], deleted=[], unknown=[], ignored=[], clean=['foo']>
+wctx._status=<status modified=['bar-m'], added=['bar-a'], removed=['bar-r'], deleted=[], unknown=[], ignored=[], clean=[]>
+<status modified=[], added=['bar-a', 'bar-m'], removed=[], deleted=[], unknown=[], ignored=[], clean=['foo']>
+wctx._status=<status modified=['bar-m'], added=['bar-a'], removed=['bar-r'], deleted=[], unknown=[], ignored=[], clean=[]>