[PATCH stable] dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk
martinvonz at google.com
Mon Apr 6 04:21:51 UTC 2015
On Apr 5, 2015 6:07 PM, "Matt Harbison" <mharbison72 at gmail.com> wrote:
> On Sun, 05 Apr 2015 17:38:16 -0400, Martin von Zweigbergk <
> martinvonz at google.com> wrote:
>
> # HG changeset patch
>> # User Martin von Zweigbergk <martinvonz at google.com>
>> # Date 1428209652 25200
>> # Sat Apr 04 21:54:12 2015 -0700
>> # Branch stable
>> # Node ID df4b2a1b51a30bd4b021b479d871864cce4886e9
>> # Parent 2e2e9a0750f91a6fe0ad88e4de34f8efefdcab08
>> dirstate.walk: don't report same file stat multiple times
>>
>> dirstate.walk() generates pairs of filename and a stat-like
>> object. After "hg mv foo Foo", it generates one pair for "foo" and one
>> for "Foo", as it should. However, on case-insensitive file systems,
>> when it tries to stat to get the disk state as well, it gets the same
>> stat result for both names. This confuses at least
>> scmutil._interestingfiles(), making it think that "foo" was forgotten
>> rather than removed. That, in turn, makes "hg addremove" add "foo"
>> back, resulting in both cases in the dirstate, as reported in
>> issue4590.
>>
>> This change only takes care of the "if unknown" branch. A similar fix
>> should perhaps be applied to the other branch.
>>
>> diff -r 2e2e9a0750f9 -r df4b2a1b51a3 mercurial/dirstate.py
>> --- a/mercurial/dirstate.py Tue Mar 31 20:20:17 2015 -0300
>> +++ b/mercurial/dirstate.py Sat Apr 04 21:54:12 2015 -0700
>> @@ -793,9 +793,15 @@
>> audit_path = pathutil.pathauditor(self._root)
>> for nf in iter(visit):
>> + # If a stat for the same file was already added with
>> a
>> + # different case, don't add one for this, since that
>> would
>> + # make it appear as if the file exists under both
>> names
>> + # on disk.
>> + if normalize and normalize(nf, True, True) in
>> results:
>> + results[nf] = None
>> # Report ignored items in the dmap as long as they
>> are not
>> # under a symlink directory.
>> - if audit_path.check(nf):
>> + elif audit_path.check(nf):
>> try:
>> results[nf] = lstat(join(nf))
>> # file was just ignored, no links, and exists
>> diff -r 2e2e9a0750f9 -r df4b2a1b51a3 tests/test-casefolding.t
>> --- a/tests/test-casefolding.t Tue Mar 31 20:20:17 2015 -0300
>> +++ b/tests/test-casefolding.t Sat Apr 04 21:54:12 2015 -0700
>> @@ -37,6 +37,15 @@
>> $ hg mv A a
>> $ hg st
>> +addremove after case-changing rename has no effect (issue4590)
>> +
>> + $ hg mv a A
>> + $ hg addremove
>> + recording removal of a as rename to A (100% similar)
>>
>
> Any idea why this is printing out? I would understand if the test did a
> plain mv, but shouldn't 'hg mv' be what definitively records the
> removal/rename of 'a'?
>
Sorry, I forgot to mention that part, so thanks for asking. I agree that
it's a little surprising, but it's actually unrelated to case. We should
probably add a test (outside of this patch) with "hg mv foo bar; hg
addremove" that shows this behavior.
> + $ hg revert --all
>> + forgetting A
>> + undeleting a
>> +
>> test changing case of path components
>> $ mkdir D
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at selenic.com
>> http://selenic.com/mailman/listinfo/mercurial-devel
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-devel/attachments/20150406/5ac9da7f/attachment-0002.html>
More information about the Mercurial-devel
mailing list