[PATCH stable] dirstate.walk: don't report same file stat multiple times
Matt Harbison
mharbison72 at gmail.com
Sun Apr 5 20:06:56 CDT 2015
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'?
> + $ 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
More information about the Mercurial-devel
mailing list