[PATCH 06 of 11] copies: update _checkcopies to work in a rotated DAG (issue4028)
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Tue Oct 4 13:28:24 EDT 2016
On 10/04/2016 04:39 PM, Gábor Stefanik wrote:
> # HG changeset patch
> # User Gábor Stefanik <gabor.stefanik at nng.com>
> # Date 1475588213 -7200
> # Tue Oct 04 15:36:53 2016 +0200
> # Node ID a1b8ff5837d36693338b51966dd92249e728cba2
> # Parent bc8729a69d10d61498712d5dab773918f1edcde0
> copies: update _checkcopies to work in a rotated DAG (issue4028)
This change is an important step in your fixes, can you elaborate a bit
more in the description about what is happening?
> diff -r bc8729a69d10 -r a1b8ff5837d3 mercurial/copies.py
> --- a/mercurial/copies.py Mon Oct 03 13:29:59 2016 +0200
> +++ b/mercurial/copies.py Tue Oct 04 15:36:53 2016 +0200
> @@ -345,10 +345,12 @@
> bothnew = sorted(addedinm1 & addedinm2)
>
> for f in u1u:
> - _checkcopies(c1, f, m1, m2, ca, limit, diverge, copy1, fullcopy1)
> + _checkcopies(c1, f, m1, m2, ca, ca, False, limit, diverge, copy1,
> + fullcopy1)
>
> for f in u2u:
> - _checkcopies(c2, f, m2, m1, ca, limit, diverge, copy2, fullcopy2)
> + _checkcopies(c2, f, m2, m1, ca, ca, False, limit, diverge, copy2,
> + fullcopy2)
>
> copy = dict(copy1.items() + copy2.items())
> movewithdir = dict(movewithdir1.items() + movewithdir2.items())
> @@ -373,8 +375,10 @@
> % "\n ".join(bothnew))
> bothdiverge, _copy, _fullcopy = {}, {}, {}
> for f in bothnew:
> - _checkcopies(c1, f, m1, m2, ca, limit, bothdiverge, _copy, _fullcopy)
> - _checkcopies(c2, f, m2, m1, ca, limit, bothdiverge, _copy, _fullcopy)
> + _checkcopies(c1, f, m1, m2, ca, ca, False, limit, bothdiverge, _copy,
> + _fullcopy)
> + _checkcopies(c2, f, m2, m1, ca, ca, False, limit, bothdiverge, _copy,
> + _fullcopy)
> for of, fl in bothdiverge.items():
> if len(fl) == 2 and fl[0] == fl[1]:
> copy[fl[0]] = of # not actually divergent, just matching renames
> @@ -454,7 +458,8 @@
>
> return copy, movewithdir, diverge, renamedelete
>
> -def _checkcopies(ctx, f, m1, m2, ca, limit, diverge, copy, fullcopy):
> +def _checkcopies(ctx, f, m1, m2, ca, tca, remoteca, limit, diverge, copy,
> + fullcopy):
> """
> check possible copies of f from m1 to m2
>
> @@ -462,7 +467,9 @@
> f = the filename to check
> m1 = the source manifest
> m2 = the destination manifest
> - ca = the changectx of the common ancestor
> + ca = the changectx of the common ancestor, overridden on graft
> + tca = topological common ancestor for graft-like scenarios
> + remoteca = True if ca is outside tca::ctx, False otherwise
> limit = the rev number to not search beyond
> diverge = record all diverges in this dict
> copy = record all non-divergent copies in this dict
> @@ -475,6 +482,8 @@
> """
>
> ma = ca.manifest()
> + mta = tca.manifest()
> + backwards = ca != tca and not remoteca and f in ma
> getfctx = _makegetfctx(ctx)
>
> def _related(f1, f2, limit):
> @@ -520,15 +529,26 @@
> continue
> seen.add(of)
>
> - fullcopy[f] = of # remember for dir rename detection
> + # remember for dir rename detection
> + if backwards:
> + fullcopy[of] = f # grafting backwards through renames
> + else:
> + fullcopy[f] = of
> if of not in m2:
> continue # no match, keep looking
> if m2[of] == ma.get(of):
> return # no merge needed, quit early
> c2 = getfctx(of, m2[of])
> - cr = _related(oc, c2, ca.rev())
> + cr = _related(oc, c2, tca.rev())
> if cr and (of == f or of == c2.path()): # non-divergent
> - copy[f] = of
> + if backwards:
> + copy[of] = f
> + elif of in ma:
> + copy[f] = of
> + elif remoteca: # special case: a <- b <- a -> b "ping-pong" rename
> + copy[of] = f
> + del fullcopy[f]
> + fullcopy[of] = f
> return
>
> if of in ma:
> diff -r bc8729a69d10 -r a1b8ff5837d3 tests/test-graft.t
> --- a/tests/test-graft.t Mon Oct 03 13:29:59 2016 +0200
> +++ b/tests/test-graft.t Tue Oct 04 15:36:53 2016 +0200
> @@ -427,8 +427,8 @@
> $ hg graft 3 --log -u foo
> grafting 3:4c60f11aa304 "3"
> warning: can't find ancestor for 'c' copied from 'b'!
> - $ hg log --template '{rev} {parents} {desc}\n' -r tip
> - 14 1:5d205f8b35b6 3
> + $ hg log --template '{rev}:{node|short} {parents} {desc}\n' -r tip
> + 14:0c921c65ef1e 1:5d205f8b35b6 3
> (grafted from 4c60f11aa304a54ae1c199feb94e7fc771e51ed8)
>
> Resolve conflicted graft
> @@ -620,7 +620,7 @@
> date: Thu Jan 01 00:00:00 1970 +0000
> summary: 2
>
> - changeset: 14:f64defefacee
> + changeset: 14:0c921c65ef1e
> parent: 1:5d205f8b35b6
> user: foo
> date: Thu Jan 01 00:00:00 1970 +0000
>
>
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>
--
Pierre-Yves David
More information about the Mercurial-devel
mailing list