# HG changeset patch # User mpm@selenic.com # Date 1119408117 28800 # Node ID 0e0d0670b2bc09ee721d4432a28a9123b98b91b8 # Parent d8abb687d501d5f12c7e56412c0d7c3b85418a83 [PATCH] Merging identical changes from another branch -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 [PATCH] Merging identical changes from another branch From: Michael A Fetterman The issue comes up when a local uncommitted *new* file (i.e. not in the current manifest) is being merged with an identical file from a branch. Since the file is not in the current manifest (it's either in the current "to-be-added" list, or in the "unknown" state), there's no (local) node from which to create a mergepoint. manifest hash: 4e64ce654a6473524789a97bbaf8bff61b4343af -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCuM/1ywK+sNU5EO8RAn7xAKCJoH/CgzVK4h4xPJDrd2lY9XOINACgmt01 92uuMswZXcoCchQAaxew7C0= =qRsk -----END PGP SIGNATURE----- diff -r d8abb687d501 -r 0e0d0670b2bc mercurial/hg.py --- a/mercurial/hg.py Tue Jun 21 18:35:32 2005 -0800 +++ b/mercurial/hg.py Tue Jun 21 18:41:57 2005 -0800 @@ -1035,6 +1035,15 @@ if f in m2: s = 0 + # is the wfile new since m1, and match m2? + if n not in m1: + t1 = self.wfile(f).read() + t2 = self.file(f).revision(m2[f]) + if cmp(t1, t2) == 0: + mark[f] = 1 + n = m2[f] + del t1, t2 + # are files different? if n != m2[f]: a = ma.get(f, nullid) diff -r d8abb687d501 -r 0e0d0670b2bc tests/test-merge1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-merge1 Tue Jun 21 18:41:57 2005 -0800 @@ -0,0 +1,85 @@ +#!/bin/sh -x + +cat <<'EOF' > merge +#!/bin/sh +echo merging for `basename $1` +EOF +chmod +x merge + +mkdir t +cd t +hg init +echo This is file a1 > a +hg add a +hg commit -t "commit #0" -d "0 0" -u user +echo This is file b1 > b +hg add b +hg commit -t "commit #1" -d "0 0" -u user + +hg update 0 +echo This is file c1 > c +hg add c +hg commit -t "commit #2" -d "0 0" -u user +echo This is file b1 > b +env HGMERGE=../merge hg update -m 1 +# no merges expected +cd ..; /bin/rm -rf t + +mkdir t +cd t +hg init +echo This is file a1 > a +hg add a +hg commit -t "commit #0" -d "0 0" -u user +echo This is file b1 > b +hg add b +hg commit -t "commit #1" -d "0 0" -u user + +hg update 0 +echo This is file c1 > c +hg add c +hg commit -t "commit #2" -d "0 0" -u user +echo This is file b2 > b +env HGMERGE=../merge hg update -m 1 +# merge of b expected +cd ..; /bin/rm -rf t + +mkdir t +cd t +hg init +echo This is file a1 > a +hg add a +hg commit -t "commit #0" -d "0 0" -u user +echo This is file b1 > b +hg add b +hg commit -t "commit #1" -d "0 0" -u user +echo This is file b22 > b +hg commit -t "commit #2" -d "0 0" -u user +hg update 1 +echo This is file c1 > c +hg add c +hg commit -t "commit #3" -d "0 0" -u user +echo This is file b22 > b +env HGMERGE=../merge hg update -m 2 +# no merges expected +cd ..; /bin/rm -rf t + +mkdir t +cd t +hg init +echo This is file a1 > a +hg add a +hg commit -t "commit #0" -d "0 0" -u user +echo This is file b1 > b +hg add b +hg commit -t "commit #1" -d "0 0" -u user +echo This is file b22 > b +hg commit -t "commit #2" -d "0 0" -u user +hg update 1 +echo This is file c1 > c +hg add c +hg commit -t "commit #3" -d "0 0" -u user +echo This is file b33 > b +env HGMERGE=../merge hg update -m 2 +# merge of b expected +cd ..; /bin/rm -rf t diff -r d8abb687d501 -r 0e0d0670b2bc tests/test-merge1.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-merge1.out Tue Jun 21 18:41:57 2005 -0800 @@ -0,0 +1,78 @@ ++ cat ++ chmod +x merge ++ mkdir t ++ cd t ++ hg init ++ echo This is file a1 ++ hg add a ++ hg commit -t 'commit #0' -d '0 0' -u user ++ echo This is file b1 ++ hg add b ++ hg commit -t 'commit #1' -d '0 0' -u user ++ hg update 0 ++ echo This is file c1 ++ hg add c ++ hg commit -t 'commit #2' -d '0 0' -u user ++ echo This is file b1 ++ env HGMERGE=../merge hg update -m 1 ++ cd .. ++ /bin/rm -rf t ++ mkdir t ++ cd t ++ hg init ++ echo This is file a1 ++ hg add a ++ hg commit -t 'commit #0' -d '0 0' -u user ++ echo This is file b1 ++ hg add b ++ hg commit -t 'commit #1' -d '0 0' -u user ++ hg update 0 ++ echo This is file c1 ++ hg add c ++ hg commit -t 'commit #2' -d '0 0' -u user ++ echo This is file b2 ++ env HGMERGE=../merge hg update -m 1 +merging for b +merging b ++ cd .. ++ /bin/rm -rf t ++ mkdir t ++ cd t ++ hg init ++ echo This is file a1 ++ hg add a ++ hg commit -t 'commit #0' -d '0 0' -u user ++ echo This is file b1 ++ hg add b ++ hg commit -t 'commit #1' -d '0 0' -u user ++ echo This is file b22 ++ hg commit -t 'commit #2' -d '0 0' -u user ++ hg update 1 ++ echo This is file c1 ++ hg add c ++ hg commit -t 'commit #3' -d '0 0' -u user ++ echo This is file b22 ++ env HGMERGE=../merge hg update -m 2 ++ cd .. ++ /bin/rm -rf t ++ mkdir t ++ cd t ++ hg init ++ echo This is file a1 ++ hg add a ++ hg commit -t 'commit #0' -d '0 0' -u user ++ echo This is file b1 ++ hg add b ++ hg commit -t 'commit #1' -d '0 0' -u user ++ echo This is file b22 ++ hg commit -t 'commit #2' -d '0 0' -u user ++ hg update 1 ++ echo This is file c1 ++ hg add c ++ hg commit -t 'commit #3' -d '0 0' -u user ++ echo This is file b33 ++ env HGMERGE=../merge hg update -m 2 +merging for b +merging b ++ cd .. ++ /bin/rm -rf t