--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-merge-no-file-change.t Sun Aug 12 18:44:42 2018 +0900
@@ -0,0 +1,386 @@
+ $ cat <<'EOF' >> "$HGRCPATH"
+ > [extensions]
+ > convert =
+ > [templates]
+ > l = '{rev}:{node|short} p={p1rev},{p2rev} m={manifest} f={files|json}'
+ > EOF
+
+ $ check_convert_identity () {
+ > hg convert -q "$1" "$1.converted"
+ > hg outgoing -q -R "$1.converted" "$1"
+ > if [ "$?" != 1 ]; then
+ > echo '*** BUG: hash changes on convert ***'
+ > hg log -R "$1.converted" -GTl
+ > fi
+ > }
+
+Files added at both parents:
+
+ $ hg init added-both
+ $ cd added-both
+ $ touch a b c
+ $ hg ci -qAm0 a
+ $ hg ci -qAm1 b
+ $ hg up -q 0
+ $ hg ci -qAm2 c
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci --debug -m merge
+ committing files:
+ b
+ committing manifest
+ committing changelog
+ updating the branch cache
+ committed changeset 3:7aa8a293f5d97377037afc21e871e036e718d659
+ $ hg log -GTl
+ @ 3:7aa8a293f5d9 p=2,1 m=3:8667461869a1 f=[]
+ |\
+ | o 2:e0ea47086fce p=0,-1 m=2:b2e5b07f9374 f=["c"]
+ | |
+ o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
+
+
+ $ cd ..
+ $ check_convert_identity added-both
+
+Files added at both parents, but the other removed at the merge:
+(In this case, ctx.files() after the commit contains the removed file "b", but
+its manifest does not differ from p1.)
+
+ $ hg init added-both-removed-at-merge
+ $ cd added-both-removed-at-merge
+ $ touch a b c
+ $ hg ci -qAm0 a
+ $ hg ci -qAm1 b
+ $ hg up -q 0
+ $ hg ci -qAm2 c
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg rm -f b
+ $ hg ci --debug -m merge
+ committing files:
+ committing manifest
+ committing changelog
+ updating the branch cache
+ committed changeset 3:915745f3ca3d9d699925269474c2d0a9526e8dfa
+ $ hg log -GTl
+ @ 3:915745f3ca3d p=2,1 m=3:8e9cf3456921 f=["b"]
+ |\
+ | o 2:e0ea47086fce p=0,-1 m=2:b2e5b07f9374 f=["c"]
+ | |
+ o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
+
+
+ $ cd ..
+ $ check_convert_identity added-both
+
+An identical file added at both parents:
+
+ $ hg init added-identical
+ $ cd added-identical
+ $ touch a b
+ $ hg ci -qAm0 a
+ $ hg ci -qAm1 b
+ $ hg up -q 0
+ $ touch b
+ $ hg ci -qAm2 b
+
+ $ hg merge
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci --debug -m merge
+ reusing manifest from p1 (no file change)
+ committing changelog
+ updating the branch cache
+ committed changeset 3:de26182cd210f0c3fb175ca7616704ab963d3024
+ $ hg log -GTl
+ @ 3:de26182cd210 p=2,1 m=1:686dbf0aeca4 f=[]
+ |\
+ | o 2:f00991f11eca p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ | |
+ o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
+
+
+ $ cd ..
+ $ check_convert_identity added-identical
+
+#if execbit
+
+An identical file added at both parents, but the flag differs. Take local:
+
+ $ hg init flag-change-take-p1
+ $ cd flag-change-take-p1
+ $ touch a b
+ $ hg ci -qAm0 a
+ $ hg ci -qAm1 b
+ $ hg up -q 0
+ $ touch b
+ $ chmod +x b
+ $ hg ci -qAm2 b
+
+ $ hg merge
+ warning: cannot merge flags for b without common ancestor - keeping local flags
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ chmod +x b
+ $ hg ci --debug -m merge
+ committing files:
+ b
+ committing manifest
+ committing changelog
+ updating the branch cache
+ committed changeset 3:4bfaad7f925b7f17f60524dc5d4e605f7bfbba3f
+ $ hg log -GTl
+ @ 3:4bfaad7f925b p=2,1 m=3:a3a9fe23a5b8 f=[]
+ |\
+ | o 2:99451f16b3f5 p=0,-1 m=2:36b69ba4b24b f=["b"]
+ | |
+ o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
+
+ $ hg files -vr3
+ 0 a
+ 0 x b
+
+ $ cd ..
+ $ check_convert_identity flag-change-take-p1
+ 3:c8d50407916e
+ *** BUG: hash changes on convert ***
+ o 3:c8d50407916e p=2,1 m=2:36b69ba4b24b f=[]
+ |\
+ | o 2:99451f16b3f5 p=0,-1 m=2:36b69ba4b24b f=["b"]
+ | |
+ o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
+
+
+An identical file added at both parents, but the flag differs. Take other:
+
+ $ hg init flag-change-take-p2
+ $ cd flag-change-take-p2
+ $ touch a b
+ $ hg ci -qAm0 a
+ $ hg ci -qAm1 b
+ $ hg up -q 0
+ $ touch b
+ $ chmod +x b
+ $ hg ci -qAm2 b
+
+ $ hg merge
+ warning: cannot merge flags for b without common ancestor - keeping local flags
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ chmod -x b
+ $ hg ci --debug -m merge
+ committing files:
+ b
+ committing manifest
+ committing changelog
+ updating the branch cache
+ committed changeset 3:06a62a687d87c7d8944743dee1ee9d8c66b3f6e3
+ $ hg log -GTl
+ @ 3:06a62a687d87 p=2,1 m=3:2a315ba1aa45 f=["b"]
+ |\
+ | o 2:99451f16b3f5 p=0,-1 m=2:36b69ba4b24b f=["b"]
+ | |
+ o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
+
+ $ hg files -vr3
+ 0 a
+ 0 b
+
+ $ cd ..
+ $ check_convert_identity flag-change-take-p2
+
+#endif
+
+An identical file added at both parents, one more file added at p2:
+
+ $ hg init added-some-p2
+ $ cd added-some-p2
+ $ touch a b c
+ $ hg ci -qAm0 a
+ $ hg ci -qAm1 b
+ $ hg ci -qAm2 c
+ $ hg up -q 0
+ $ touch b
+ $ hg ci -qAm3 b
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci --debug -m merge
+ committing files:
+ c
+ committing manifest
+ committing changelog
+ updating the branch cache
+ committed changeset 4:f7fbc4e4d9a8fde03ba475adad675578c8bf472d
+ $ hg log -GTl
+ @ 4:f7fbc4e4d9a8 p=3,2 m=3:92acd5bfd716 f=[]
+ |\
+ | o 3:e9d9f3cc981f p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ | |
+ o | 2:93c5529a4ec7 p=1,-1 m=2:ae25a31b30b3 f=["c"]
+ | |
+ o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
+
+
+ $ cd ..
+ $ check_convert_identity added-some-p2
+
+An identical file added at both parents, one more file added at p1:
+(In this case, p1 manifest is reused at the merge commit, which means the
+manifest DAG does not have the same shape as the changelog.)
+
+ $ hg init added-some-p1
+ $ cd added-some-p1
+ $ touch a b
+ $ hg ci -qAm0 a
+ $ hg ci -qAm1 b
+ $ hg up -q 0
+ $ touch b c
+ $ hg ci -qAm2 b
+ $ hg ci -qAm3 c
+
+ $ hg merge
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci --debug -m merge
+ reusing manifest from p1 (no file change)
+ committing changelog
+ updating the branch cache
+ committed changeset 4:a9f0f589a913f5a149dc10dfbd5af726977c36c4
+ $ hg log -GTl
+ @ 4:a9f0f589a913 p=3,1 m=2:ae25a31b30b3 f=[]
+ |\
+ | o 3:b8dc385241b5 p=2,-1 m=2:ae25a31b30b3 f=["c"]
+ | |
+ | o 2:f00991f11eca p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ | |
+ o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
+
+
+ $ cd ..
+ $ check_convert_identity added-some-p1
+
+A file added at p2, a named branch created at p1:
+
+ $ hg init named-branch-p1
+ $ cd named-branch-p1
+ $ touch a b
+ $ hg ci -qAm0 a
+ $ hg ci -qAm1 b
+ $ hg up -q 0
+ $ hg branch -q foo
+ $ hg ci -m2
+
+ $ hg merge default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci --debug -m merge
+ committing files:
+ b
+ committing manifest
+ committing changelog
+ updating the branch cache
+ committed changeset 3:fb97d83b02fd072295cfc2171f21b7d38509bfd7
+ $ hg log -GT'{l} branch={branch}'
+ @ 3:fb97d83b02fd p=2,1 m=2:9091c64f4ea1 f=[] branch=foo
+ |\
+ | o 2:a3a9fa6587e5 p=0,-1 m=0:8515d4bfda76 f=[] branch=foo
+ | |
+ o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"] branch=default
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"] branch=default
+
+
+ $ cd ..
+ $ check_convert_identity named-branch-p1
+
+A file added at p1, a named branch created at p2:
+(In this case, p1 manifest is reused at the merge commit, which means the
+manifest DAG does not have the same shape as the changelog.)
+
+ $ hg init named-branch-p2
+ $ cd named-branch-p2
+ $ touch a b
+ $ hg ci -qAm0 a
+ $ hg branch -q foo
+ $ hg ci -m1
+ $ hg up -q 0
+ $ hg ci -qAm1 b
+
+ $ hg merge foo
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci --debug -m merge
+ reusing manifest from p1 (no file change)
+ committing changelog
+ updating the branch cache
+ committed changeset 3:036823e24692218324d4af43b07ff89f8a000096
+ $ hg log -GT'{l} branch={branch}'
+ @ 3:036823e24692 p=2,1 m=1:686dbf0aeca4 f=[] branch=default
+ |\
+ | o 2:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"] branch=default
+ | |
+ o | 1:da38c8e00727 p=0,-1 m=0:8515d4bfda76 f=[] branch=foo
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"] branch=default
+
+
+ $ cd ..
+ $ check_convert_identity named-branch-p2
+
+A file changed once at both parents, but amended to have identical content:
+
+ $ hg init amend-p1
+ $ cd amend-p1
+ $ touch a
+ $ hg ci -qAm0 a
+ $ echo foo > a
+ $ hg ci -m1
+ $ hg up -q 0
+ $ echo bar > a
+ $ hg ci -qm2
+ $ echo foo > a
+ $ hg ci -qm3 --amend
+
+ $ hg merge
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci --debug -m merge
+ reusing manifest from p1 (no file change)
+ committing changelog
+ updating the branch cache
+ committed changeset 3:314e5bc5adf5c58ea571efabe33eedba20a201aa
+ $ hg log -GT'{l} branch={branch}'
+ @ 3:314e5bc5adf5 p=2,1 m=1:d33ea248bd73 f=[] branch=default
+ |\
+ | o 2:de9c64f226a3 p=0,-1 m=1:d33ea248bd73 f=["a"] branch=default
+ | |
+ o | 1:6a74aec01b3c p=0,-1 m=1:d33ea248bd73 f=["a"] branch=default
+ |/
+ o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"] branch=default
+
+
+ $ cd ..
+ $ check_convert_identity amend-p1