[PATCH] convert: fix syncing deletes from p2 merge commit
Augie Fackler
raf at durin42.com
Thu Aug 27 10:19:01 CDT 2015
On Tue, Aug 25, 2015 at 04:51:19PM -0700, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1440543273 25200
> # Tue Aug 25 15:54:33 2015 -0700
> # Node ID 1dbd7cfe255e4b26c4633685e28d0a13ab1d04b5
> # Parent 05e7f57c74ac5b556b49870af86f61aa0c54babb
> convert: fix syncing deletes from p2 merge commit
Queued. I only mostly understand it, but the fix seems clearly-right
enough I'll just take it. Thanks!
>
> Recently we fixed converting merges to correctly sync changes from p2. We missed
> the case of deletes though (so p2 deleted a file that p1 had not yet deleted,
> and the file does not belong to the source).
>
> The fix is to detect when p2 doesn't have the file, so we just sync it as a
> delete to p1 in the merge.
>
> Updated the test, and verified it failed before the fix.
>
> diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py
> --- a/hgext/convert/hg.py
> +++ b/hgext/convert/hg.py
> @@ -223,7 +223,12 @@ class mercurial_sink(converter_sink):
> def getfilectx(repo, memctx, f):
> if p2ctx and f in p2files and f not in copies:
> self.ui.debug('reusing %s from p2\n' % f)
> - return p2ctx[f]
> + try:
> + return p2ctx[f]
> + except error.ManifestLookupError:
> + # If the file doesn't exist in p2, then we're syncing a
> + # delete, so just return None.
> + return None
> try:
> v = files[f]
> except KeyError:
> diff --git a/tests/test-convert-filemap.t b/tests/test-convert-filemap.t
> --- a/tests/test-convert-filemap.t
> +++ b/tests/test-convert-filemap.t
> @@ -677,34 +677,39 @@ test converting merges into a repo that
>
> $ hg init merge-test1
> $ cd merge-test1
> - $ touch a && hg commit -Aqm a
> - $ hg up -q null
> - $ touch b && hg commit -Aqm b
> - $ hg merge -q 0 && hg commit -qm merge
> + $ touch a && hg commit -Aqm 'add a'
> + $ echo a > a && hg commit -Aqm 'edit a'
> + $ hg up -q 0
> + $ touch b && hg commit -Aqm 'add b'
> + $ hg merge -q 1 && hg commit -qm 'merge a & b'
> +
> $ cd ..
> $ hg init merge-test2
> $ cd merge-test2
> $ mkdir converted
> - $ touch converted/a && hg commit -Aqm 'a'
> - $ touch x && hg commit -Aqm 'x'
> + $ touch converted/a toberemoved && hg commit -Aqm 'add converted/a & toberemoved'
> + $ touch x && rm toberemoved && hg commit -Aqm 'add x & remove tobremoved'
> $ cd ..
> - $ hg log -G -T '{node}' -R merge-test1
> - @ ea7c1a7ae9588677a715ce4f204cd89c28d5471f
> + $ hg log -G -T '{shortest(node)} {desc}' -R merge-test1
> + @ 1191 merge a & b
> |\
> - | o d7486e00c6f1b633dcadc0582f78006d805c7a0f
> + | o 9077 add b
> + | |
> + o | d19f edit a
> + |/
> + o ac82 add a
> +
> + $ hg log -G -T '{shortest(node)} {desc}' -R merge-test2
> + @ 150e add x & remove tobremoved
> |
> - o 3903775176ed42b1458a6281db4a0ccf4d9f287a
> -
> - $ hg log -G -T '{node}' -R merge-test2
> - @ 34f1aa7da42559bae87920880b522d47b3ddbc0d
> - |
> - o e01a12b07b4fdfd61ff90a2a1b4560a7a776f323
> + o bbac add converted/a & toberemoved
>
> - Build a shamap where the target converted/a is in on top of an unrelated
> - change to 'x'. This simulates using convert to merge several repositories
> - together.
> $ cat >> merge-test2/.hg/shamap <<EOF
> - > 3903775176ed42b1458a6281db4a0ccf4d9f287a 34f1aa7da42559bae87920880b522d47b3ddbc0d
> + > $(hg -R merge-test1 log -r 0 -T '{node}') $(hg -R merge-test2 log -r 0 -T '{node}')
> + > $(hg -R merge-test1 log -r 1 -T '{node}') $(hg -R merge-test2 log -r 1 -T '{node}')
> > EOF
> $ cat >> merge-test-filemap <<EOF
> > rename . converted/
> @@ -713,19 +718,26 @@ test converting merges into a repo that
> scanning source...
> sorting...
> converting...
> - 1 b
> - 0 merge
> + 1 add b
> + 0 merge a & b
> $ hg -R merge-test2 manifest -r tip
> converted/a
> converted/b
> x
> - $ hg -R merge-test2 log -G -T '{node}\n{files % "{file}\n"}'
> - o 4b5e2f0218d3442a0c14892b18685bf9c8059c4a
> - |\
> - | o 214325dd2e4cff981dcf00cb120cd39e1ea36dcc
> - | converted/b
> - @ 34f1aa7da42559bae87920880b522d47b3ddbc0d
> - | x
> - o e01a12b07b4fdfd61ff90a2a1b4560a7a776f323
> - converted/a
> + $ hg -R merge-test2 log -G -T '{shortest(node)} {desc}\n{files % "- {file}\n"}\n'
> + o 6eaa merge a & b
> + |\ - converted/a
> + | | - toberemoved
> + | |
> + | o 2995 add b
> + | | - converted/b
> + | |
> + @ | 150e add x & remove tobremoved
> + |/ - toberemoved
> + | - x
> + |
> + o bbac add converted/a & toberemoved
> + - converted/a
> + - toberemoved
> +
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list