Mercurial > hg
changeset 23709:33e5431684c0
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.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Wed, 31 Dec 2014 17:55:43 +0900 |
parents | a9f826c3eaf9 |
children | 745e3b485632 |
files | mercurial/context.py tests/test-context.py tests/test-context.py.out |
diffstat | 3 files changed, 19 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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=[]>