[PATCH 1 of 1 STABLE] merge: execute all removing before updating to avoid case-folding collision

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Mon Apr 29 00:53:58 CDT 2013


At Mon, 29 Apr 2013 00:34:54 +0900,
FUJIWARA Katsunori wrote:
> 
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> # Date 1367161582 -32400
> #      Mon Apr 29 00:06:22 2013 +0900
> # Branch stable
> # Node ID 5468fa345cc465c8ff2fa35fbde61dca21495e1d
> # Parent  f01a351db79106ba96ac6d527cf69944fd98e665
> merge: execute all removing before updating to avoid case-folding collision
> 
> Before this patch, merge process may update the file in target context
> before removing the existing file which causes case-folding collision
> against the former.
>
> Case-folding collision check ensures only that there is no collision
> between files in the merged manifest, not that merging/updating
> process is collision free.

Oops, I overlooked "actions.sort(key=actionkey)" sorting, sorry.

Please discard this post. I'll resend with description rewriting.

 
> Sorting "actions" in removal first order is not safe enough, because
> parallel execution by "worker" may execute updating before removing on
> posix environment.
>
> This patch divides "workeractions" into removing and updating, and
> executes the former first.
>
> This patch still scans "actions"/"workeractions" some times for ease
> in patch review, even though large list may cost much in this way.
> (total cost should be as same as before)
> 
> Dividing "workeractions" affects progress indication, so this also
> changes some tests.
> 
> diff --git a/mercurial/merge.py b/mercurial/merge.py
> --- a/mercurial/merge.py
> +++ b/mercurial/merge.py
> @@ -455,8 +455,10 @@
>  
>      numupdates = len(actions)
>      workeractions = [a for a in actions if a[1] in 'gr']
> -    updated = len([a for a in workeractions if a[1] == 'g'])
> -    removed = len([a for a in workeractions if a[1] == 'r'])
> +    updateactions = [a for a in workeractions if a[1] == 'g']
> +    updated = len(updateactions)
> +    removeactions = [a for a in workeractions if a[1] == 'r']
> +    removed = len(removeactions)
>      actions = [a for a in actions if a[1] not in 'gr']
>  
>      hgsub = [a[1] for a in workeractions if a[0] == '.hgsubstate']
> @@ -465,7 +467,13 @@
>  
>      z = 0
>      prog = worker.worker(repo.ui, 0.001, getremove, (repo, mctx, overwrite),
> -                         workeractions)
> +                         removeactions)
> +    for i, item in prog:
> +        z += i
> +        repo.ui.progress(_('updating'), z, item=item, total=numupdates,
> +                         unit=_('files'))
> +    prog = worker.worker(repo.ui, 0.001, getremove, (repo, mctx, overwrite),
> +                         updateactions)
>      for i, item in prog:
>          z += i
>          repo.ui.progress(_('updating'), z, item=item, total=numupdates,
> diff --git a/tests/test-issue672.t b/tests/test-issue672.t
> --- a/tests/test-issue672.t
> +++ b/tests/test-issue672.t
> @@ -37,6 +37,7 @@
>     1: other deleted -> r
>     1a: remote created -> g
>    removing 1
> +  updating: 1 1/2 files (50.00%)
>    getting 1a
>    updating: 1a 2/2 files (100.00%)
>    1 files updated, 0 files merged, 1 files removed, 0 files unresolved
> diff --git a/tests/test-rename-dir-merge.t b/tests/test-rename-dir-merge.t
> --- a/tests/test-rename-dir-merge.t
> +++ b/tests/test-rename-dir-merge.t
> @@ -46,6 +46,7 @@
>     b/b: remote created -> g
>    removing a/a
>    removing a/b
> +  updating: a/b 2/5 files (40.00%)
>    getting b/a
>    getting b/b
>    updating: b/b 4/5 files (80.00%)
> diff --git a/tests/test-rename-merge2.t b/tests/test-rename-merge2.t
> --- a/tests/test-rename-merge2.t
> +++ b/tests/test-rename-merge2.t
> @@ -290,6 +290,7 @@
>     rev: versions differ -> m
>      preserving rev for resolve of rev
>    removing a
> +  updating: a 1/3 files (33.33%)
>    getting b
>    updating: b 2/3 files (66.67%)
>    updating: rev 3/3 files (100.00%)
> diff --git a/tests/test-update-reverse.t b/tests/test-update-reverse.t
> --- a/tests/test-update-reverse.t
> +++ b/tests/test-update-reverse.t
> @@ -73,6 +73,7 @@
>     main: remote created -> g
>    removing side1
>    removing side2
> +  updating: side2 2/3 files (66.67%)
>    getting main
>    updating: main 3/3 files (100.00%)
>    1 files updated, 0 files merged, 2 files removed, 0 files unresolved
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
> 

----------------------------------------------------------------------
[FUJIWARA Katsunori]                             foozy at lares.dti.ne.jp


More information about the Mercurial-devel mailing list