[PATCH] Merging identical changes from another branch
authormpm@selenic.com
Tue, 21 Jun 2005 18:41:57 -0800
changeset 407 0e0d0670b2bc
parent 406 d8abb687d501
child 408 3695fbd2c33b
[PATCH] Merging identical changes from another branch -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 [PATCH] Merging identical changes from another branch From: Michael A Fetterman <Michael.Fetterman@cl.cam.ac.uk> 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-----
mercurial/hg.py
tests/test-merge1
tests/test-merge1.out
--- 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)
--- /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
--- /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