Mercurial > hg
changeset 23712:bfce25d25c96
context: override _dirstatestatus in workingcommitctx for correct matching
Before this patch, the result of "status()" on "workingcommitctx" may
incorrectly contain files other than ones to be committed, because
"workingctx._dirstatestatus()" returns the result of
"dirstate.status()" directly.
For correct matching, this patch overrides "_dirstatestatus" in
"workingcommitctx" and makes it return matched files only in
"self._status".
This patch uses empty list for "deleted", "unknown" and "ignored" of
status, because status between "changectx"s also makes them empty.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Wed, 31 Dec 2014 17:55:43 +0900 |
parents | 1e6fb8db666e |
children | 5f84695734f1 |
files | mercurial/context.py tests/test-commit.t tests/test-context.py tests/test-context.py.out |
diffstat | 4 files changed, 113 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/context.py Wed Dec 31 17:55:43 2014 +0900 +++ b/mercurial/context.py Wed Dec 31 17:55:43 2014 +0900 @@ -1646,6 +1646,32 @@ listignored, listclean, listunknown) return s + def _dirstatestatus(self, match=None, ignored=False, clean=False, + unknown=False): + """Return matched files only in ``self._status`` + + Uncommitted files appear "clean" via this context, even if + they aren't actually so in the working directory. + """ + match = match or matchmod.always(self._repo.root, self._repo.getcwd()) + if clean: + clean = [f for f in self._manifest if f not in self._changedset] + else: + clean = [] + return scmutil.status([f for f in self._status.modified if match(f)], + [f for f in self._status.added if match(f)], + [f for f in self._status.removed if match(f)], + [], [], [], clean) + + @propertycache + def _changedset(self): + """Return the set of files changed in this context + """ + changed = set(self._status.modified) + changed.update(self._status.added) + changed.update(self._status.removed) + return changed + class memctx(committablectx): """Use memctx to perform in-memory commits via localrepo.commitctx().
--- a/tests/test-commit.t Wed Dec 31 17:55:43 2014 +0900 +++ b/tests/test-commit.t Wed Dec 31 17:55:43 2014 +0900 @@ -434,7 +434,7 @@ > changeset = {desc} > HG: files={files} > HG: - > {splitlines(diff()) % '' + > {splitlines(diff()) % 'HG: {line}\n' > }HG: > HG: files={files}\n > EOF @@ -446,6 +446,11 @@ foo bar HG: files=changed HG: + HG: --- a/changed Thu Jan 01 00:00:00 1970 +0000 + HG: +++ b/changed Thu Jan 01 00:00:00 1970 +0000 + HG: @@ -1,1 +1,2 @@ + HG: changed + HG: +changed HG: HG: files=changed $ hg status -amr @@ -458,6 +463,51 @@ $ hg rollback -q $ cat >> .hg/hgrc <<EOF + > [committemplate] + > changeset = {desc} + > HG: files={files} + > HG: + > {splitlines(diff("changed")) % 'HG: {line}\n' + > }HG: + > HG: files={files} + > HG: + > {splitlines(diff("added")) % 'HG: {line}\n' + > }HG: + > HG: files={files} + > HG: + > {splitlines(diff("removed")) % 'HG: {line}\n' + > }HG: + > HG: files={files}\n + > EOF + $ HGEDITOR=cat hg commit -q -e -m "foo bar" added removed + foo bar + HG: files=added removed + HG: + HG: + HG: files=added removed + HG: + HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + HG: +++ b/added Thu Jan 01 00:00:00 1970 +0000 + HG: @@ -0,0 +1,1 @@ + HG: +added + HG: + HG: files=added removed + HG: + HG: --- a/removed Thu Jan 01 00:00:00 1970 +0000 + HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + HG: @@ -1,1 +0,0 @@ + HG: -removed + HG: + HG: files=added removed + $ hg status -amr + M changed + $ hg parents --template "M {file_mods}\nA {file_adds}\nR {file_dels}\n" + M + A added + R removed + $ hg rollback -q + + $ cat >> .hg/hgrc <<EOF > # disable customizing for subsequent tests > [committemplate] > changeset =
--- a/tests/test-context.py Wed Dec 31 17:55:43 2014 +0900 +++ b/tests/test-context.py Wed Dec 31 17:55:43 2014 +0900 @@ -108,13 +108,31 @@ print 'wcctx._status=%s' % (str(wcctx._status)) print '=== with "always match":' -actx1.status(other=wcctx) +print actx1.status(other=wcctx) print 'wcctx._status=%s' % (str(wcctx._status)) -actx2.status(other=wcctx) +print actx2.status(other=wcctx) print 'wcctx._status=%s' % (str(wcctx._status)) print '=== with "always match" and "listclean=True":' -actx1.status(other=wcctx, listclean=True) +print actx1.status(other=wcctx, listclean=True) +print 'wcctx._status=%s' % (str(wcctx._status)) +print actx2.status(other=wcctx, listclean=True) +print 'wcctx._status=%s' % (str(wcctx._status)) + +print '=== with "pattern match":' +print actx1.status(other=wcctx, + match=scmutil.matchfiles(repo, ['bar-m', 'foo'])) print 'wcctx._status=%s' % (str(wcctx._status)) -actx2.status(other=wcctx, listclean=True) +print actx2.status(other=wcctx, + match=scmutil.matchfiles(repo, ['bar-m', 'foo'])) print 'wcctx._status=%s' % (str(wcctx._status)) + +print '=== with "pattern match" and "listclean=True":' +print actx1.status(other=wcctx, + match=scmutil.matchfiles(repo, ['bar-r', 'foo']), + listclean=True) +print 'wcctx._status=%s' % (str(wcctx._status)) +print actx2.status(other=wcctx, + match=scmutil.matchfiles(repo, ['bar-r', 'foo']), + listclean=True) +print 'wcctx._status=%s' % (str(wcctx._status))
--- a/tests/test-context.py.out Wed Dec 31 17:55:43 2014 +0900 +++ b/tests/test-context.py.out Wed Dec 31 17:55:43 2014 +0900 @@ -27,8 +27,22 @@ == checking workingcommitctx.status: wcctx._status=<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> === with "always match": +<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> wcctx._status=<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> +<status modified=[], added=['bar-a', 'bar-m', 'bar-r'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> wcctx._status=<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> === with "always match" and "listclean=True": +<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=['bar-r', 'foo']> wcctx._status=<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> +<status modified=[], added=['bar-a', 'bar-m', 'bar-r'], removed=[], deleted=[], unknown=[], ignored=[], clean=['foo']> wcctx._status=<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> +=== with "pattern match": +<status modified=['bar-m'], added=[], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> +wcctx._status=<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> +<status modified=[], added=['bar-m'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> +wcctx._status=<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> +=== with "pattern match" and "listclean=True": +<status modified=[], added=[], removed=[], deleted=[], unknown=[], ignored=[], clean=['bar-r', 'foo']> +wcctx._status=<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]> +<status modified=[], added=['bar-r'], removed=[], deleted=[], unknown=[], ignored=[], clean=['foo']> +wcctx._status=<status modified=['bar-m'], added=['bar-a'], removed=[], deleted=[], unknown=[], ignored=[], clean=[]>