changeset 18337:557c8522aec0

tests: better test coverage of merges of flags This makes existing problems with merges of symlinks and files more obvious and add test coverage for tricky merges without real common ancestors.
author Mads Kiilerich <mads@kiilerich.com>
date Tue, 15 Jan 2013 01:05:12 +0100
parents 77973b6a7b0b
children 384df4db6520
files tests/test-flags.t tests/test-merge-types.t
diffstat 2 files changed, 255 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/tests/test-flags.t	Thu Jan 10 03:40:45 2013 +0100
+++ b/tests/test-flags.t	Tue Jan 15 01:05:12 2013 +0100
@@ -81,6 +81,9 @@
   resolving manifests
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
+  $ cat a
+  123
+  $ [ -x a ]
 
   $ cd ../test3
   $ echo 123 >>b
--- a/tests/test-merge-types.t	Thu Jan 10 03:40:45 2013 +0100
+++ b/tests/test-merge-types.t	Tue Jan 15 01:05:12 2013 +0100
@@ -1,21 +1,34 @@
   $ "$TESTDIR/hghave" symlink execbit || exit 80
 
-  $ hg init
+  $ tellmeabout() {
+  > if [ -h $1 ]; then
+  >     echo $1 is a symlink:
+  >     $TESTDIR/readlink.py $1
+  > elif [ -x $1 ]; then
+  >     echo $1 is an executable file with content:
+  >     cat $1
+  > else
+  >     echo $1 is a plain file with content:
+  >     cat $1
+  > fi
+  > }
+
+  $ hg init test1
+  $ cd test1
 
   $ echo a > a
-  $ hg ci -Amadd
-  adding a
-
+  $ hg ci -Aqmadd
   $ chmod +x a
   $ hg ci -mexecutable
 
-  $ hg up 0
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg up -q 0
   $ rm a
   $ ln -s symlink a
   $ hg ci -msymlink
   created new head
 
+Symlink is local parent, executable is other:
+
   $ hg merge --debug
     searching for copies back to rev 1
   resolving manifests
@@ -28,18 +41,11 @@
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
 
-
-Symlink is local parent, executable is other:
+  $ tellmeabout a
+  a is a plain file with content:
+  symlink (no-eol)
 
-  $ if [ -h a ]; then
-  >     echo a is a symlink
-  >     $TESTDIR/readlink.py a
-  > elif [ -x a ]; then
-  >     echo a is executable
-  > else
-  >     echo "a has no flags (default for conflicts)"
-  > fi
-  a has no flags (default for conflicts)
+Symlink is other parent, executable is local:
 
   $ hg update -C 1
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -57,18 +63,9 @@
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
 
-
-Symlink is other parent, executable is local:
-
-  $ if [ -h a ]; then
-  >    echo a is a symlink
-  >    $TESTDIR/readlink.py a
-  > elif [ -x a ]; then
-  >     echo a is executable
-  > else
-  >     echo "a has no flags (default for conflicts)"
-  > fi
-  a has no flags (default for conflicts)
+  $ tellmeabout a
+  a is a plain file with content:
+  symlink (no-eol)
 
 Update to link without local change should get us a symlink (issue3316):
 
@@ -80,8 +77,7 @@
 
 Update to link with local change should cause a merge prompt (issue3200):
 
-  $ hg up -C 0
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg up -Cq 0
   $ echo data > a
   $ HGMERGE= hg up -y --debug
     searching for copies back to rev 2
@@ -108,3 +104,228 @@
   +data
 
 
+Test only 'l' change - happens rarely, except when recovering from situations
+where that was what happened.
+
+  $ hg init test2
+  $ cd test2
+  $ printf base > f
+  $ hg ci -Aqm0
+  $ echo file > f
+  $ echo content >> f
+  $ hg ci -qm1
+  $ hg up -qr0
+  $ rm f
+  $ ln -s base f
+  $ hg ci -qm2
+  $ hg merge
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ tellmeabout f
+  f is a symlink:
+  f -> file
+  content
+  
+
+  $ hg up -Cqr1
+  $ hg merge
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ tellmeabout f
+  f is a plain file with content:
+  file
+  content
+
+  $ cd ..
+
+Test removed 'x' flag merged with change to symlink
+
+  $ hg init test3
+  $ cd test3
+  $ echo f > f
+  $ chmod +x f
+  $ hg ci -Aqm0
+  $ chmod -x f
+  $ hg ci -qm1
+  $ hg up -qr0
+  $ rm f
+  $ ln -s dangling f
+  $ hg ci -qm2
+  $ hg merge
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ tellmeabout f
+  f is a symlink:
+  f -> dangling
+
+  $ hg up -Cqr1
+  $ hg merge
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ tellmeabout f
+  f is a symlink:
+  f -> dangling
+
+  $ cd ..
+
+Test merge with no common ancestor:
+a: just different
+b: x vs -, different (cannot calculate x, cannot ask merge tool)
+c: x vs -, same (cannot calculate x, merge tool is no good)
+d: x vs l, different
+e: x vs l, same
+f: - vs l, different
+g: - vs l, same
+h: l vs l, different
+(where same means the filelog entry is shared and there thus is an ancestor!)
+
+  $ hg init test4
+  $ cd test4
+  $ echo 0 > 0
+  $ hg ci -Aqm0
+
+  $ echo 1 > a
+  $ echo 1 > b
+  $ chmod +x b
+  $ echo x > c
+  $ chmod +x c
+  $ echo 1 > d
+  $ chmod +x d
+  $ printf x > e
+  $ chmod +x e
+  $ echo 1 > f
+  $ printf x > g
+  $ ln -s 1 h
+  $ hg ci -qAm1
+
+  $ hg up -qr0
+  $ echo 2 > a
+  $ echo 2 > b
+  $ echo x > c
+  $ ln -s 2 d
+  $ ln -s x e
+  $ ln -s 2 f
+  $ ln -s x g
+  $ ln -s 2 h
+  $ hg ci -Aqm2
+
+  $ hg merge
+   conflicting flags for e
+  (n)one, e(x)ec or sym(l)ink? n
+   conflicting flags for d
+  (n)one, e(x)ec or sym(l)ink? n
+  merging a
+  warning: conflicts during merge.
+  merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+  merging b
+  warning: conflicts during merge.
+  merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
+  merging d
+  warning: internal:merge cannot merge symlinks for d
+  merging d incomplete! (edit conflicts, then use 'hg resolve --mark')
+  merging f
+  warning: internal:merge cannot merge symlinks for f
+  merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
+  merging h
+  warning: internal:merge cannot merge symlinks for h
+  merging h incomplete! (edit conflicts, then use 'hg resolve --mark')
+  2 files updated, 0 files merged, 0 files removed, 5 files unresolved
+  use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+  [1]
+  $ hg resolve -l
+  U a
+  U b
+  U d
+  U f
+  U h
+  $ tellmeabout a
+  a is a plain file with content:
+  <<<<<<< local
+  2
+  =======
+  1
+  >>>>>>> other
+  $ tellmeabout b
+  b is an executable file with content:
+  <<<<<<< local
+  2
+  =======
+  1
+  >>>>>>> other
+  $ tellmeabout c
+  c is an executable file with content:
+  x
+  $ tellmeabout d
+  d is a plain file with content:
+  2 (no-eol)
+  $ tellmeabout e
+  e is a plain file with content:
+  x (no-eol)
+  $ tellmeabout f
+  f is a symlink:
+  f -> 2
+  $ tellmeabout g
+  g is a symlink:
+  g -> x
+  $ tellmeabout h
+  h is a symlink:
+  h -> 2
+
+  $ hg up -Cqr1
+  $ hg merge
+   conflicting flags for e
+  (n)one, e(x)ec or sym(l)ink? n
+   conflicting flags for d
+  (n)one, e(x)ec or sym(l)ink? n
+  merging a
+  warning: conflicts during merge.
+  merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+  merging b
+  warning: conflicts during merge.
+  merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
+  merging d
+  warning: internal:merge cannot merge symlinks for d
+  merging d incomplete! (edit conflicts, then use 'hg resolve --mark')
+  merging f
+  warning: internal:merge cannot merge symlinks for f
+  merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
+  merging h
+  warning: internal:merge cannot merge symlinks for h
+  merging h incomplete! (edit conflicts, then use 'hg resolve --mark')
+  1 files updated, 0 files merged, 0 files removed, 5 files unresolved
+  use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+  [1]
+  $ tellmeabout a
+  a is a plain file with content:
+  <<<<<<< local
+  1
+  =======
+  2
+  >>>>>>> other
+  $ tellmeabout b
+  b is an executable file with content:
+  <<<<<<< local
+  1
+  =======
+  2
+  >>>>>>> other
+  $ tellmeabout c
+  c is an executable file with content:
+  x
+  $ tellmeabout d
+  d is a plain file with content:
+  1
+  $ tellmeabout e
+  e is a plain file with content:
+  x (no-eol)
+  $ tellmeabout f
+  f is a plain file with content:
+  1
+  $ tellmeabout g
+  g is a plain file with content:
+  x (no-eol)
+  $ tellmeabout h
+  h is a symlink:
+  h -> 1
+
+  $ cd ..