[PATCH 3 of 6 V2] context: make unknown/ignored/clean of cached status empty for equivalence
FUJIWARA Katsunori
foozy at lares.dti.ne.jp
Wed Dec 31 02:58:08 CST 2014
# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1420016143 -32400
# Wed Dec 31 17:55:43 2014 +0900
# Node ID a16fd7cabd7e8934c45a83f4dd81d820c7217816
# Parent 096d94e1da4c704dbda74d9da247f04dad3f3541
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.
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -1440,7 +1440,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):
diff --git a/tests/test-context.py b/tests/test-context.py
--- a/tests/test-context.py
+++ b/tests/test-context.py
@@ -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))
diff --git a/tests/test-context.py.out b/tests/test-context.py.out
--- a/tests/test-context.py.out
+++ b/tests/test-context.py.out
@@ -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=[]>
More information about the Mercurial-devel
mailing list