tests/test-merge-types.t
changeset 18337 557c8522aec0
parent 18334 44bda93df90e
child 18338 384df4db6520
--- 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 ..