Merge branch 'js/test-ln-s-add' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 19 Jul 2013 17:41:22 +0000 (10:41 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 19 Jul 2013 17:41:23 +0000 (10:41 -0700)
* js/test-ln-s-add:
t4011: remove SYMLINKS prerequisite
t6035: use test_ln_s_add to remove SYMLINKS prerequisite
t3509, t4023, t4114: use test_ln_s_add to remove SYMLINKS prerequisite
t3100: use test_ln_s_add to remove SYMLINKS prerequisite
t3030: use test_ln_s_add to remove SYMLINKS prerequisite
t0000: use test_ln_s_add to remove SYMLINKS prerequisite
tests: use test_ln_s_add to remove SYMLINKS prerequisite (trivial cases)
tests: introduce test_ln_s_add
t3010: modernize style
test-chmtime: Fix exit code on Windows

30 files changed:
t/README
t/t0000-basic.sh
t/t1004-read-tree-m-u-wf.sh
t/t2001-checkout-cache-clash.sh
t/t2004-checkout-cache-temp.sh
t/t2007-checkout-symlink.sh
t/t2021-checkout-overwrite.sh
t/t2200-add-update.sh
t/t3010-ls-files-killed-modified.sh
t/t3030-merge-recursive.sh
t/t3100-ls-tree-restrict.sh
t/t3509-cherry-pick-merge-df.sh
t/t3700-add.sh
t/t3903-stash.sh
t/t4008-diff-break-rewrite.sh
t/t4011-diff-symlink.sh
t/t4023-diff-rename-typechange.sh
t/t4030-diff-textconv.sh
t/t4114-apply-typechange.sh
t/t4115-apply-symlink.sh
t/t4122-apply-symlink-inside.sh
t/t6035-merge-dir-to-symlink.sh
t/t7001-mv.sh
t/t7607-merge-overwrite.sh
t/t8006-blame-textconv.sh
t/t8007-cat-file-textconv.sh
t/t9350-fast-export.sh
t/t9500-gitweb-standalone-no-errors.sh
t/test-lib-functions.sh
test-chmtime.c
index 35b3c5c2faec0ed543dde460a30de63c48e5f1e7..ec5246886132f919ec4b6b05bfedd65eb2011690 100644 (file)
--- a/t/README
+++ b/t/README
@@ -595,6 +595,20 @@ library for your script to use.
                test_cmp expected actual
        '
 
+ - test_ln_s_add <path1> <path2>
+
+   This function helps systems whose filesystem does not support symbolic
+   links. Use it to add a symbolic link entry to the index when it is not
+   important that the file system entry is a symbolic link, i.e., instead
+   of the sequence
+
+       ln -s foo bar &&
+       git add bar
+
+   Sometimes it is possible to split a test in a part that does not need
+   the symbolic link in the file system and a part that does; then only
+   the latter part need be protected by a SYMLINKS prerequisite (see below).
+
 Prerequisites
 -------------
 
index cefe33d6d1976e4017569507a6f76ad89c83e4ff..0f1318056cd06d8bcae615be5e573149ac5971d1 100755 (executable)
@@ -367,22 +367,6 @@ test_expect_success 'validate object ID of a known tree' '
 
 # Various types of objects
 
-# Some filesystems do not support symblic links; on such systems
-# some expected values are different
-if test_have_prereq SYMLINKS
-then
-       expectfilter=cat
-       expectedtree=087704a96baf1c2d1c869a8b084481e121c88b5b
-       expectedptree1=21ae8269cacbe57ae09138dcc3a2887f904d02b3
-       expectedptree2=3c5e5399f3a333eddecce7a9b9465b63f65f51e2
-else
-       expectfilter='grep -v sym'
-       expectedtree=8e18edf7d7edcf4371a3ac6ae5f07c2641db7c46
-       expectedptree1=cfb8591b2f65de8b8cc1020cd7d9e67e7793b325
-       expectedptree2=ce580448f0148b985a513b693fdf7d802cacb44f
-fi
-
-
 test_expect_success 'adding various types of objects with git update-index --add' '
        mkdir path2 path3 path3/subp3 &&
        paths="path0 path2/file2 path3/file3 path3/subp3/file3" &&
@@ -390,10 +374,7 @@ test_expect_success 'adding various types of objects with git update-index --add
                for p in $paths
                do
                        echo "hello $p" >$p || exit 1
-                       if test_have_prereq SYMLINKS
-                       then
-                               ln -s "hello $p" ${p}sym || exit 1
-                       fi
+                       test_ln_s_add "hello $p" ${p}sym || exit 1
                done
        ) &&
        find path* ! -type d -print | xargs git update-index --add
@@ -405,7 +386,7 @@ test_expect_success 'showing stage with git ls-files --stage' '
 '
 
 test_expect_success 'validate git ls-files output for a known tree' '
-       $expectfilter >expected <<-\EOF &&
+       cat >expected <<-\EOF &&
        100644 f87290f8eb2cbbea7857214459a0739927eab154 0       path0
        120000 15a98433ae33114b085f3eb3bb03b832b3180a01 0       path0sym
        100644 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 0       path2/file2
@@ -423,14 +404,14 @@ test_expect_success 'writing tree out with git write-tree' '
 '
 
 test_expect_success 'validate object ID for a known tree' '
-       test "$tree" = "$expectedtree"
+       test "$tree" = 087704a96baf1c2d1c869a8b084481e121c88b5b
 '
 
 test_expect_success 'showing tree with git ls-tree' '
     git ls-tree $tree >current
 '
 
-test_expect_success SYMLINKS 'git ls-tree output for a known tree' '
+test_expect_success 'git ls-tree output for a known tree' '
        cat >expected <<-\EOF &&
        100644 blob f87290f8eb2cbbea7857214459a0739927eab154    path0
        120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01    path0sym
@@ -447,7 +428,7 @@ test_expect_success 'showing tree with git ls-tree -r' '
 '
 
 test_expect_success 'git ls-tree -r output for a known tree' '
-       $expectfilter >expected <<-\EOF &&
+       cat >expected <<-\EOF &&
        100644 blob f87290f8eb2cbbea7857214459a0739927eab154    path0
        120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01    path0sym
        100644 blob 3feff949ed00a62d9f7af97c15cd8a30595e7ac7    path2/file2
@@ -465,7 +446,7 @@ test_expect_success 'showing tree with git ls-tree -r -t' '
        git ls-tree -r -t $tree >current
 '
 
-test_expect_success SYMLINKS 'git ls-tree -r output for a known tree' '
+test_expect_success 'git ls-tree -r output for a known tree' '
        cat >expected <<-\EOF &&
        100644 blob f87290f8eb2cbbea7857214459a0739927eab154    path0
        120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01    path0sym
@@ -487,7 +468,7 @@ test_expect_success 'writing partial tree out with git write-tree --prefix' '
 '
 
 test_expect_success 'validate object ID for a known tree' '
-       test "$ptree" = "$expectedptree1"
+       test "$ptree" = 21ae8269cacbe57ae09138dcc3a2887f904d02b3
 '
 
 test_expect_success 'writing partial tree out with git write-tree --prefix' '
@@ -495,7 +476,7 @@ test_expect_success 'writing partial tree out with git write-tree --prefix' '
 '
 
 test_expect_success 'validate object ID for a known tree' '
-       test "$ptree" = "$expectedptree2"
+       test "$ptree" = 3c5e5399f3a333eddecce7a9b9465b63f65f51e2
 '
 
 test_expect_success 'put invalid objects into the index' '
@@ -529,7 +510,7 @@ test_expect_success 'git read-tree followed by write-tree should be idempotent'
 '
 
 test_expect_success 'validate git diff-files output for a know cache/work tree state' '
-       $expectfilter >expected <<\EOF &&
+       cat >expected <<\EOF &&
 :100644 100644 f87290f8eb2cbbea7857214459a0739927eab154 0000000000000000000000000000000000000000 M     path0
 :120000 120000 15a98433ae33114b085f3eb3bb03b832b3180a01 0000000000000000000000000000000000000000 M     path0sym
 :100644 100644 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 0000000000000000000000000000000000000000 M     path2/file2
@@ -553,7 +534,7 @@ test_expect_success 'no diff after checkout and git update-index --refresh' '
 '
 
 ################################################################
-P=$expectedtree
+P=087704a96baf1c2d1c869a8b084481e121c88b5b
 
 test_expect_success 'git commit-tree records the correct tree in a commit' '
        commit0=$(echo NO | git commit-tree $P) &&
index b3ae7d52c6c76895434c1d2e8dfb9a31b12ebc62..3e72aff470f8d9e5e79689de459904d1f3271d0d 100755 (executable)
@@ -158,7 +158,7 @@ test_expect_success '3-way not overwriting local changes (their side)' '
 
 '
 
-test_expect_success SYMLINKS 'funny symlink in work tree' '
+test_expect_success 'funny symlink in work tree' '
 
        git reset --hard &&
        git checkout -b sym-b side-b &&
@@ -170,15 +170,14 @@ test_expect_success SYMLINKS 'funny symlink in work tree' '
        rm -fr a &&
        git checkout -b sym-a side-a &&
        mkdir -p a &&
-       ln -s ../b a/b &&
-       git add a/b &&
+       test_ln_s_add ../b a/b &&
        git commit -m "we add a/b" &&
 
        read_tree_u_must_succeed -m -u sym-a sym-a sym-b
 
 '
 
-test_expect_success SYMLINKS,SANITY 'funny symlink in work tree, un-unlink-able' '
+test_expect_success SANITY 'funny symlink in work tree, un-unlink-able' '
 
        rm -fr a b &&
        git reset --hard &&
index 98aa73e8239355eba098253edfd156d4ea254be2..1fc8e634b737db766dcaf195af9cb8a5d14ef04f 100755 (executable)
@@ -59,10 +59,9 @@ test_expect_success \
     'git read-tree -m $tree1 && git checkout-index -f -a'
 test_debug 'show_files $tree1'
 
-test_expect_success SYMLINKS \
-    'git update-index --add a symlink.' \
-    'ln -s path0 path1 &&
-     git update-index --add path1'
+test_expect_success \
+    'add a symlink' \
+    'test_ln_s_add path0 path1'
 test_expect_success \
     'writing tree out with git write-tree' \
     'tree3=$(git write-tree)'
index 0f4b2896af8b73edcd5bd60631405a430803a40f..f171a5578b6b81e4d7cb03ef0b6b9272ef610ffc 100755 (executable)
@@ -194,11 +194,10 @@ test_expect_success \
  test $(cat ../$s1) = tree1asubdir/path5)
 )'
 
-test_expect_success SYMLINKS \
+test_expect_success \
 'checkout --temp symlink' '
 rm -f path* .merge_* out .git/index &&
-ln -s b a &&
-git update-index --add a &&
+test_ln_s_add b a &&
 t4=$(git write-tree) &&
 rm -f .git/index &&
 git read-tree $t4 &&
index e6f59f1914667f0001fe990656a66bb76e14a41d..fc9aad530e9f9078e95d99da5c1d0849e489d4cf 100755 (executable)
@@ -6,7 +6,7 @@ test_description='git checkout to switch between branches with symlink<->dir'
 
 . ./test-lib.sh
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
        mkdir frotz &&
        echo hello >frotz/filfre &&
@@ -25,25 +25,25 @@ test_expect_success SYMLINKS setup '
 
        git rm --cached frotz/filfre &&
        mv frotz xyzzy &&
-       ln -s xyzzy frotz &&
-       git add xyzzy/filfre frotz &&
+       test_ln_s_add xyzzy frotz &&
+       git add xyzzy/filfre &&
        test_tick &&
        git commit -m "side moves frotz/ to xyzzy/ and adds frotz->xyzzy/"
 
 '
 
-test_expect_success SYMLINKS 'switch from symlink to dir' '
+test_expect_success 'switch from symlink to dir' '
 
        git checkout master
 
 '
 
-test_expect_success SYMLINKS 'Remove temporary directories & switch to master' '
+test_expect_success 'Remove temporary directories & switch to master' '
        rm -fr frotz xyzzy nitfol &&
        git checkout -f master
 '
 
-test_expect_success SYMLINKS 'switch from dir to symlink' '
+test_expect_success 'switch from dir to symlink' '
 
        git checkout side
 
index 5da63e9fa267af4517024307f4bdeef73caeccf2..c2ada7de37312bffd4b05ff7ac7a9c9e0c4da395 100755 (executable)
@@ -29,21 +29,25 @@ test_expect_success 'checkout commit with dir must not remove untracked a/b' '
        test -f a/b
 '
 
-test_expect_success SYMLINKS 'create a commit where dir a/b changed to symlink' '
+test_expect_success 'create a commit where dir a/b changed to symlink' '
 
        rm -rf a/b &&   # cleanup if previous test failed
        git checkout -f -b symlink start &&
        rm -rf a/b &&
-       ln -s foo a/b &&
        git add -A &&
+       test_ln_s_add foo a/b &&
        git commit -m "dir to symlink"
 '
 
-test_expect_success SYMLINKS 'checkout commit with dir must not remove untracked a/b' '
+test_expect_success 'checkout commit with dir must not remove untracked a/b' '
 
        git rm --cached a/b &&
        git commit -m "un-track the symlink" &&
-       test_must_fail git checkout start &&
+       test_must_fail git checkout start
+'
+
+test_expect_success SYMLINKS 'the symlink remained' '
+
        test -h a/b
 '
 
index b2bd41918ee7f8b19e3ef906f27796f331ed9ea5..9bf2bdffd24b773a2eec636efdd534269f45e74b 100755 (executable)
@@ -96,11 +96,10 @@ test_expect_success 'non-limited update in subdir leaves root alone' '
        test_cmp expect actual
 '
 
-test_expect_success SYMLINKS 'replace a file with a symlink' '
+test_expect_success 'replace a file with a symlink' '
 
        rm foo &&
-       ln -s top foo &&
-       git add -u -- foo
+       test_ln_s_add top foo
 
 '
 
index 95671c205364a12bea02173b33d0d427d5c546fe..262e61744563b2ce4eb14df0e54f71d56c157007 100755 (executable)
@@ -37,71 +37,65 @@ modified without reporting path9 and path10.
 '
 . ./test-lib.sh
 
-date >path0
-if test_have_prereq SYMLINKS
-then
-       ln -s xyzzy path1
-else
-       date > path1
-fi
-mkdir path2 path3
-date >path2/file2
-date >path3/file3
-: >path7
-date >path8
-: >path9
-date >path10
-test_expect_success \
-    'git update-index --add to add various paths.' \
-    "git update-index --add -- path0 path1 path?/file? path7 path8 path9 path10"
-
-rm -fr path? ;# leave path10 alone
-date >path2
-if test_have_prereq SYMLINKS
-then
-       ln -s frotz path3
-       ln -s nitfol path5
-else
-       date > path3
-       date > path5
-fi
-mkdir path0 path1 path6
-date >path0/file0
-date >path1/file1
-date >path6/file6
-date >path7
-: >path8
-: >path9
-touch path10
+test_expect_success 'git update-index --add to add various paths.' '
+       date >path0 &&
+       test_ln_s_add xyzzy path1 &&
+       mkdir path2 path3 &&
+       date >path2/file2 &&
+       date >path3/file3 &&
+       : >path7 &&
+       date >path8 &&
+       : >path9 &&
+       date >path10 &&
+       git update-index --add -- path0 path?/file? path7 path8 path9 path10 &&
+       rm -fr path?    # leave path10 alone
+'
 
-test_expect_success \
-    'git ls-files -k to show killed files.' \
-    'git ls-files -k >.output'
-cat >.expected <<EOF
-path0/file0
-path1/file1
-path2
-path3
-EOF
+test_expect_success 'git ls-files -k to show killed files.' '
+       date >path2 &&
+       if test_have_prereq SYMLINKS
+       then
+               ln -s frotz path3 &&
+               ln -s nitfol path5
+       else
+               date >path3 &&
+               date >path5
+       fi &&
+       mkdir path0 path1 path6 &&
+       date >path0/file0 &&
+       date >path1/file1 &&
+       date >path6/file6 &&
+       date >path7 &&
+       : >path8 &&
+       : >path9 &&
+       touch path10 &&
+       git ls-files -k >.output
+'
 
-test_expect_success \
-    'validate git ls-files -k output.' \
-    'test_cmp .expected .output'
+test_expect_success 'validate git ls-files -k output.' '
+       cat >.expected <<-\EOF &&
+       path0/file0
+       path1/file1
+       path2
+       path3
+       EOF
+       test_cmp .expected .output
+'
 
-test_expect_success \
-    'git ls-files -m to show modified files.' \
-    'git ls-files -m >.output'
-cat >.expected <<EOF
-path0
-path1
-path2/file2
-path3/file3
-path7
-path8
-EOF
+test_expect_success 'git ls-files -m to show modified files.' '
+       git ls-files -m >.output
+'
 
-test_expect_success \
-    'validate git ls-files -m output.' \
-    'test_cmp .expected .output'
+test_expect_success 'validate git ls-files -m output.' '
+       cat >.expected <<-\EOF &&
+       path0
+       path1
+       path2/file2
+       path3/file3
+       path7
+       path8
+       EOF
+       test_cmp .expected .output
+'
 
 test_done
index a5e3da7e419e6f13ea0960722b4c1c712a995112..2f96100a5f655bbea859bf596ff9835c9abb11a2 100755 (executable)
@@ -25,10 +25,7 @@ test_expect_success 'setup 1' '
        git branch submod &&
        git branch copy &&
        git branch rename &&
-       if test_have_prereq SYMLINKS
-       then
-               git branch rename-ln
-       fi &&
+       git branch rename-ln &&
 
        echo hello >>a &&
        cp a d/e &&
@@ -260,16 +257,12 @@ test_expect_success 'setup 8' '
        git add e &&
        test_tick &&
        git commit -m "rename a->e" &&
-       if test_have_prereq SYMLINKS
-       then
-               git checkout rename-ln &&
-               git mv a e &&
-               ln -s e a &&
-               git add a e &&
-               test_tick &&
-               git commit -m "rename a->e, symlink a->e" &&
-               oln=`printf e | git hash-object --stdin`
-       fi
+       git checkout rename-ln &&
+       git mv a e &&
+       test_ln_s_add e a &&
+       test_tick &&
+       git commit -m "rename a->e, symlink a->e" &&
+       oln=`printf e | git hash-object --stdin`
 '
 
 test_expect_success 'setup 9' '
@@ -569,28 +562,25 @@ test_expect_success 'merge-recursive copy vs. rename' '
        test_cmp expected actual
 '
 
-if test_have_prereq SYMLINKS
-then
-       test_expect_failure 'merge-recursive rename vs. rename/symlink' '
-
-               git checkout -f rename &&
-               git merge rename-ln &&
-               ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
-               (
-                       echo "120000 blob $oln  a"
-                       echo "100644 blob $o0   b"
-                       echo "100644 blob $o0   c"
-                       echo "100644 blob $o0   d/e"
-                       echo "100644 blob $o0   e"
-                       echo "120000 $oln 0     a"
-                       echo "100644 $o0 0      b"
-                       echo "100644 $o0 0      c"
-                       echo "100644 $o0 0      d/e"
-                       echo "100644 $o0 0      e"
-               ) >expected &&
-               test_cmp expected actual
-       '
-fi
+test_expect_failure 'merge-recursive rename vs. rename/symlink' '
+
+       git checkout -f rename &&
+       git merge rename-ln &&
+       ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
+       (
+               echo "120000 blob $oln  a"
+               echo "100644 blob $o0   b"
+               echo "100644 blob $o0   c"
+               echo "100644 blob $o0   d/e"
+               echo "100644 blob $o0   e"
+               echo "120000 $oln 0     a"
+               echo "100644 $o0 0      b"
+               echo "100644 $o0 0      c"
+               echo "100644 $o0 0      d/e"
+               echo "100644 $o0 0      e"
+       ) >expected &&
+       test_cmp expected actual
+'
 
 
 test_done
index 81d90b66c50e75323a44aaf5e2e067d5a3569e6a..eb73c06a4e1ee826684ee84efa134ee5517023a6 100755 (executable)
@@ -22,20 +22,8 @@ test_expect_success \
     'setup' \
     'mkdir path2 path2/baz &&
      echo Hi >path0 &&
-     if test_have_prereq SYMLINKS
-     then
-       ln -s path0 path1 &&
-       ln -s ../path1 path2/bazbo
-       make_expected () {
-               cat >expected
-       }
-     else
-       printf path0 > path1 &&
-       printf ../path1 > path2/bazbo
-       make_expected () {
-               sed -e "s/120000 /100644 /" >expected
-       }
-     fi &&
+     test_ln_s_add path0 path1 &&
+     test_ln_s_add ../path1 path2/bazbo &&
      echo Lo >path2/foo &&
      echo Mi >path2/baz/b &&
      find path? \( -type f -o -type l \) -print |
@@ -51,7 +39,7 @@ test_output () {
 test_expect_success \
     'ls-tree plain' \
     'git ls-tree $tree >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 100644 blob X  path0
 120000 blob X  path1
 040000 tree X  path2
@@ -61,7 +49,7 @@ EOF
 test_expect_success \
     'ls-tree recursive' \
     'git ls-tree -r $tree >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 100644 blob X  path0
 120000 blob X  path1
 100644 blob X  path2/baz/b
@@ -73,7 +61,7 @@ EOF
 test_expect_success \
     'ls-tree recursive with -t' \
     'git ls-tree -r -t $tree >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 100644 blob X  path0
 120000 blob X  path1
 040000 tree X  path2
@@ -87,7 +75,7 @@ EOF
 test_expect_success \
     'ls-tree recursive with -d' \
     'git ls-tree -r -d $tree >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 040000 tree X  path2
 040000 tree X  path2/baz
 EOF
@@ -96,7 +84,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path' \
     'git ls-tree $tree path >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 EOF
      test_output'
 
@@ -106,7 +94,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path1 path0' \
     'git ls-tree $tree path1 path0 >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 100644 blob X  path0
 120000 blob X  path1
 EOF
@@ -115,7 +103,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path0/' \
     'git ls-tree $tree path0/ >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 EOF
      test_output'
 
@@ -124,7 +112,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path2' \
     'git ls-tree $tree path2 >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 040000 tree X  path2
 EOF
      test_output'
@@ -133,7 +121,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path2/' \
     'git ls-tree $tree path2/ >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 040000 tree X  path2/baz
 120000 blob X  path2/bazbo
 100644 blob X  path2/foo
@@ -145,7 +133,7 @@ EOF
 test_expect_success \
     'ls-tree filtered with path2/baz' \
     'git ls-tree $tree path2/baz >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 040000 tree X  path2/baz
 EOF
      test_output'
@@ -153,14 +141,14 @@ EOF
 test_expect_success \
     'ls-tree filtered with path2/bak' \
     'git ls-tree $tree path2/bak >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 EOF
      test_output'
 
 test_expect_success \
     'ls-tree -t filtered with path2/bak' \
     'git ls-tree -t $tree path2/bak >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 040000 tree X  path2
 EOF
      test_output'
@@ -168,7 +156,7 @@ EOF
 test_expect_success \
     'ls-tree with one path a prefix of the other' \
     'git ls-tree $tree path2/baz path2/bazbo >current &&
-     make_expected <<\EOF &&
+     cat >expected <<\EOF &&
 040000 tree X  path2/baz
 120000 blob X  path2/bazbo
 EOF
index df921d1f33df34dd2b2631580f8d53b18270662a..a5b6a5f3310316d289aee0961fcb6a2ae26fca99 100755 (executable)
@@ -10,17 +10,15 @@ test_expect_success 'Initialize repository' '
        git commit -m a
 '
 
-test_expect_success SYMLINKS 'Setup rename across paths each below D/F conflicts' '
+test_expect_success 'Setup rename across paths each below D/F conflicts' '
        mkdir b &&
-       ln -s ../a b/a &&
-       git add b &&
+       test_ln_s_add ../a b/a &&
        git commit -m b &&
 
        git checkout -b branch &&
        rm b/a &&
-       mv a b/a &&
-       ln -s b/a a &&
-       git add . &&
+       git mv a b/a &&
+       test_ln_s_add b/a a &&
        git commit -m swap &&
 
        >f1 &&
@@ -28,7 +26,7 @@ test_expect_success SYMLINKS 'Setup rename across paths each below D/F conflicts
        git commit -m f1
 '
 
-test_expect_success SYMLINKS 'Cherry-pick succeeds with rename across D/F conflicts' '
+test_expect_success 'Cherry-pick succeeds with rename across D/F conflicts' '
        git reset --hard &&
        git checkout master^0 &&
        git cherry-pick branch
index 874b3a6444ac64182eecf2b6aca4411fc90097e2..aab86e838b806f9bb2289f536f4ba9324d75da0a 100755 (executable)
@@ -30,10 +30,9 @@ test_expect_success \
         *) echo fail; git ls-files --stage xfoo1; (exit 1);;
         esac'
 
-test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by symlink' '
+test_expect_success 'git add: filemode=0 should not get confused by symlink' '
        rm -f xfoo1 &&
-       ln -s foo xfoo1 &&
-       git add xfoo1 &&
+       test_ln_s_add foo xfoo1 &&
        case "`git ls-files --stage xfoo1`" in
        120000" "*xfoo1) echo pass;;
        *) echo fail; git ls-files --stage xfoo1; (exit 1);;
@@ -51,21 +50,19 @@ test_expect_success \
         *) echo fail; git ls-files --stage xfoo2; (exit 1);;
         esac'
 
-test_expect_success SYMLINKS 'git add: filemode=0 should not get confused by symlink' '
+test_expect_success 'git add: filemode=0 should not get confused by symlink' '
        rm -f xfoo2 &&
-       ln -s foo xfoo2 &&
-       git update-index --add xfoo2 &&
+       test_ln_s_add foo xfoo2 &&
        case "`git ls-files --stage xfoo2`" in
        120000" "*xfoo2) echo pass;;
        *) echo fail; git ls-files --stage xfoo2; (exit 1);;
        esac
 '
 
-test_expect_success SYMLINKS \
+test_expect_success \
        'git update-index --add: Test that executable bit is not used...' \
        'git config core.filemode 0 &&
-        ln -s xfoo2 xfoo3 &&
-        git update-index --add xfoo3 &&
+        test_ln_s_add xfoo2 xfoo3 &&   # runs git update-index --add
         case "`git ls-files --stage xfoo3`" in
         120000" "*xfoo3) echo pass;;
         *) echo fail; git ls-files --stage xfoo3; (exit 1);;
index 5dfbda7491aceaa64215ac94bdd416f9b93f55d3..8ff039bdfaeaea7382aef7fabd329cd17ff2027d 100755 (executable)
@@ -336,41 +336,58 @@ test_expect_success SYMLINKS 'stash file to symlink (full stage)' '
 
 # This test creates a commit with a symlink used for the following tests
 
-test_expect_success SYMLINKS 'stash symlink to file' '
+test_expect_success 'stash symlink to file' '
        git reset --hard &&
-       ln -s file filelink &&
-       git add filelink &&
+       test_ln_s_add file filelink &&
        git commit -m "Add symlink" &&
        rm filelink &&
        cp file filelink &&
-       git stash save "symlink to file" &&
+       git stash save "symlink to file"
+'
+
+test_expect_success SYMLINKS 'this must have re-created the symlink' '
        test -h filelink &&
-       case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
+       case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac
+'
+
+test_expect_success 'unstash must re-create the file' '
        git stash apply &&
        ! test -h filelink &&
        test bar = "$(cat file)"
 '
 
-test_expect_success SYMLINKS 'stash symlink to file (stage rm)' '
+test_expect_success 'stash symlink to file (stage rm)' '
        git reset --hard &&
        git rm filelink &&
        cp file filelink &&
-       git stash save "symlink to file (stage rm)" &&
+       git stash save "symlink to file (stage rm)"
+'
+
+test_expect_success SYMLINKS 'this must have re-created the symlink' '
        test -h filelink &&
-       case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
+       case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac
+'
+
+test_expect_success 'unstash must re-create the file' '
        git stash apply &&
        ! test -h filelink &&
        test bar = "$(cat file)"
 '
 
-test_expect_success SYMLINKS 'stash symlink to file (full stage)' '
+test_expect_success 'stash symlink to file (full stage)' '
        git reset --hard &&
        rm filelink &&
        cp file filelink &&
        git add filelink &&
-       git stash save "symlink to file (full stage)" &&
+       git stash save "symlink to file (full stage)"
+'
+
+test_expect_success SYMLINKS 'this must have re-created the symlink' '
        test -h filelink &&
-       case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
+       case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac
+'
+
+test_expect_success 'unstash must re-create the file' '
        git stash apply &&
        ! test -h filelink &&
        test bar = "$(cat file)"
index 73b4a24f5ef676b8fa9fb3dc83183437710853c3..27e98a8f9d6c858468904542c500236b9e9f99c2 100755 (executable)
@@ -99,11 +99,11 @@ test_expect_success \
     'validate result of -B -M (#4)' \
     'compare_diff_raw expected current'
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'make file0 into something completely different' \
     'rm -f file0 &&
-     ln -s frotz file0 &&
-     git update-index file0 file1'
+     test_ln_s_add frotz file0 &&
+     git update-index file1'
 
 test_expect_success \
     'run diff with -B' \
@@ -114,7 +114,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M100  file1
 EOF
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'validate result of -B (#5)' \
     'compare_diff_raw expected current'
 
@@ -129,7 +129,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 R     file0   file1
 EOF
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'validate result of -B -M (#6)' \
     'compare_diff_raw expected current'
 
@@ -144,7 +144,7 @@ cat >expected <<\EOF
 :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M     file1
 EOF
 
-test_expect_success SYMLINKS \
+test_expect_success \
     'validate result of -M (#7)' \
     'compare_diff_raw expected current'
 
index f0d5041c11581ec2d711c0ea3bfd479019814b78..13e7f621ab79f95cc7c3057d9de5710813049102 100755 (executable)
@@ -9,7 +9,7 @@ test_description='Test diff of symlinks.
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh
 
-test_expect_success SYMLINKS 'diff new symlink and file' '
+test_expect_success 'diff new symlink and file' '
        cat >expected <<-\EOF &&
        diff --git a/frotz b/frotz
        new file mode 120000
@@ -27,22 +27,25 @@ test_expect_success SYMLINKS 'diff new symlink and file' '
        @@ -0,0 +1 @@
        +xyzzy
        EOF
-       ln -s xyzzy frotz &&
-       echo xyzzy >nitfol &&
+
+       # the empty tree
        git update-index &&
        tree=$(git write-tree) &&
-       git update-index --add frotz nitfol &&
+
+       test_ln_s_add xyzzy frotz &&
+       echo xyzzy >nitfol &&
+       git update-index --add nitfol &&
        GIT_DIFF_OPTS=--unified=0 git diff-index -M -p $tree >current &&
        compare_diff_patch expected current
 '
 
-test_expect_success SYMLINKS 'diff unchanged symlink and file'  '
+test_expect_success 'diff unchanged symlink and file'  '
        tree=$(git write-tree) &&
        git update-index frotz nitfol &&
        test -z "$(git diff-index --name-only $tree)"
 '
 
-test_expect_success SYMLINKS 'diff removed symlink and file' '
+test_expect_success 'diff removed symlink and file' '
        cat >expected <<-\EOF &&
        diff --git a/frotz b/frotz
        deleted file mode 120000
@@ -66,12 +69,18 @@ test_expect_success SYMLINKS 'diff removed symlink and file' '
        compare_diff_patch expected current
 '
 
-test_expect_success SYMLINKS 'diff identical, but newly created symlink and file' '
+test_expect_success 'diff identical, but newly created symlink and file' '
        >expected &&
        rm -f frotz nitfol &&
        echo xyzzy >nitfol &&
        test-chmtime +10 nitfol &&
-       ln -s xyzzy frotz &&
+       if test_have_prereq SYMLINKS
+       then
+               ln -s xyzzy frotz
+       else
+               printf xyzzy >frotz
+               # the symlink property propagates from the index
+       fi &&
        git diff-index -M -p $tree >current &&
        compare_diff_patch expected current &&
 
@@ -80,7 +89,7 @@ test_expect_success SYMLINKS 'diff identical, but newly created symlink and file
        compare_diff_patch expected current
 '
 
-test_expect_success SYMLINKS 'diff different symlink and file' '
+test_expect_success 'diff different symlink and file' '
        cat >expected <<-\EOF &&
        diff --git a/frotz b/frotz
        index 7c465af..df1db54 120000
@@ -100,7 +109,13 @@ test_expect_success SYMLINKS 'diff different symlink and file' '
        +yxyyz
        EOF
        rm -f frotz &&
-       ln -s yxyyz frotz &&
+       if test_have_prereq SYMLINKS
+       then
+               ln -s yxyyz frotz
+       else
+               printf yxyyz >frotz
+               # the symlink property propagates from the index
+       fi &&
        echo yxyyz >nitfol &&
        git diff-index -M -p $tree >current &&
        compare_diff_patch expected current
index 5d20acf436558da6c11214f431beb503bc89459a..55d549fcf441be927bc43b2c41107a90aa614c2a 100755 (executable)
@@ -4,44 +4,44 @@ test_description='typechange rename detection'
 
 . ./test-lib.sh
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
        rm -f foo bar &&
        cat "$TEST_DIRECTORY"/../COPYING >foo &&
-       ln -s linklink bar &&
-       git add foo bar &&
+       test_ln_s_add linklink bar &&
+       git add foo &&
        git commit -a -m Initial &&
        git tag one &&
 
-       rm -f foo bar &&
+       git rm -f foo bar &&
        cat "$TEST_DIRECTORY"/../COPYING >bar &&
-       ln -s linklink foo &&
-       git add foo bar &&
+       test_ln_s_add linklink foo &&
+       git add bar &&
        git commit -a -m Second &&
        git tag two &&
 
-       rm -f foo bar &&
+       git rm -f foo bar &&
        cat "$TEST_DIRECTORY"/../COPYING >foo &&
        git add foo &&
        git commit -a -m Third &&
        git tag three &&
 
        mv foo bar &&
-       ln -s linklink foo &&
-       git add foo bar &&
+       test_ln_s_add linklink foo &&
+       git add bar &&
        git commit -a -m Fourth &&
        git tag four &&
 
        # This is purely for sanity check
 
-       rm -f foo bar &&
+       git rm -f foo bar &&
        cat "$TEST_DIRECTORY"/../COPYING >foo &&
        cat "$TEST_DIRECTORY"/../Makefile >bar &&
        git add foo bar &&
        git commit -a -m Fifth &&
        git tag five &&
 
-       rm -f foo bar &&
+       git rm -f foo bar &&
        cat "$TEST_DIRECTORY"/../Makefile >foo &&
        cat "$TEST_DIRECTORY"/../COPYING >bar &&
        git add foo bar &&
@@ -50,7 +50,7 @@ test_expect_success SYMLINKS setup '
 
 '
 
-test_expect_success SYMLINKS 'cross renames to be detected for regular files' '
+test_expect_success 'cross renames to be detected for regular files' '
 
        git diff-tree five six -r --name-status -B -M | sort >actual &&
        {
@@ -61,7 +61,7 @@ test_expect_success SYMLINKS 'cross renames to be detected for regular files' '
 
 '
 
-test_expect_success SYMLINKS 'cross renames to be detected for typechange' '
+test_expect_success 'cross renames to be detected for typechange' '
 
        git diff-tree one two -r --name-status -B -M | sort >actual &&
        {
@@ -72,7 +72,7 @@ test_expect_success SYMLINKS 'cross renames to be detected for typechange' '
 
 '
 
-test_expect_success SYMLINKS 'moves and renames' '
+test_expect_success 'moves and renames' '
 
        git diff-tree three four -r --name-status -B -M | sort >actual &&
        {
index 53ec330ce8a09cfde5b3b5e7661bb6dd457ba0db..f75f46f92d22451522d4676ff4ed709b49419481 100755 (executable)
@@ -139,12 +139,10 @@ index 0000000..67be421
 +frotz
 \ No newline at end of file
 EOF
-# make a symlink the hard way that works on symlink-challenged file systems
+
 test_expect_success 'textconv does not act on symlinks' '
-       printf frotz > file &&
-       git add file &&
-       git ls-files -s | sed -e s/100644/120000/ |
-               git update-index --index-info &&
+       rm -f file &&
+       test_ln_s_add frotz file &&
        git commit -m typechange &&
        git show >diff &&
        find_diff <diff >actual &&
index f12826fb09729d5753f3f6c9511dab5062f0aae1..ebadbc347fc4fd9d435a366e46e3e1cebba81b83 100755 (executable)
@@ -9,20 +9,19 @@ test_description='git apply should not get confused with type changes.
 
 . ./test-lib.sh
 
-test_expect_success SYMLINKS 'setup repository and commits' '
+test_expect_success 'setup repository and commits' '
        echo "hello world" > foo &&
        echo "hi planet" > bar &&
        git update-index --add foo bar &&
        git commit -m initial &&
        git branch initial &&
        rm -f foo &&
-       ln -s bar foo &&
-       git update-index foo &&
+       test_ln_s_add bar foo &&
        git commit -m "foo symlinked to bar" &&
        git branch foo-symlinked-to-bar &&
-       rm -f foo &&
+       git rm -f foo &&
        echo "how far is the sun?" > foo &&
-       git update-index foo &&
+       git update-index --add foo &&
        git commit -m "foo back to file" &&
        git branch foo-back-to-file &&
        printf "\0" > foo &&
@@ -42,7 +41,7 @@ test_expect_success SYMLINKS 'setup repository and commits' '
        git branch foo-baz-renamed-from-foo
        '
 
-test_expect_success SYMLINKS 'file renamed from foo to foo/baz' '
+test_expect_success 'file renamed from foo to foo/baz' '
        git checkout -f initial &&
        git diff-tree -M -p HEAD foo-baz-renamed-from-foo > patch &&
        git apply --index < patch
@@ -50,7 +49,7 @@ test_expect_success SYMLINKS 'file renamed from foo to foo/baz' '
 test_debug 'cat patch'
 
 
-test_expect_success SYMLINKS 'file renamed from foo/baz to foo' '
+test_expect_success 'file renamed from foo/baz to foo' '
        git checkout -f foo-baz-renamed-from-foo &&
        git diff-tree -M -p HEAD initial > patch &&
        git apply --index < patch
@@ -58,7 +57,7 @@ test_expect_success SYMLINKS 'file renamed from foo/baz to foo' '
 test_debug 'cat patch'
 
 
-test_expect_success SYMLINKS 'directory becomes file' '
+test_expect_success 'directory becomes file' '
        git checkout -f foo-becomes-a-directory &&
        git diff-tree -p HEAD initial > patch &&
        git apply --index < patch
@@ -66,7 +65,7 @@ test_expect_success SYMLINKS 'directory becomes file' '
 test_debug 'cat patch'
 
 
-test_expect_success SYMLINKS 'file becomes directory' '
+test_expect_success 'file becomes directory' '
        git checkout -f initial &&
        git diff-tree -p HEAD foo-becomes-a-directory > patch &&
        git apply --index < patch
@@ -74,7 +73,7 @@ test_expect_success SYMLINKS 'file becomes directory' '
 test_debug 'cat patch'
 
 
-test_expect_success SYMLINKS 'file becomes symlink' '
+test_expect_success 'file becomes symlink' '
        git checkout -f initial &&
        git diff-tree -p HEAD foo-symlinked-to-bar > patch &&
        git apply --index < patch
@@ -82,21 +81,21 @@ test_expect_success SYMLINKS 'file becomes symlink' '
 test_debug 'cat patch'
 
 
-test_expect_success SYMLINKS 'symlink becomes file' '
+test_expect_success 'symlink becomes file' '
        git checkout -f foo-symlinked-to-bar &&
        git diff-tree -p HEAD foo-back-to-file > patch &&
        git apply --index < patch
        '
 test_debug 'cat patch'
 
-test_expect_success SYMLINKS 'binary file becomes symlink' '
+test_expect_success 'binary file becomes symlink' '
        git checkout -f foo-becomes-binary &&
        git diff-tree -p --binary HEAD foo-symlinked-to-bar > patch &&
        git apply --index < patch
        '
 test_debug 'cat patch'
 
-test_expect_success SYMLINKS 'symlink becomes binary file' '
+test_expect_success 'symlink becomes binary file' '
        git checkout -f foo-symlinked-to-bar &&
        git diff-tree -p --binary HEAD foo-becomes-binary > patch &&
        git apply --index < patch
@@ -104,7 +103,7 @@ test_expect_success SYMLINKS 'symlink becomes binary file' '
 test_debug 'cat patch'
 
 
-test_expect_success SYMLINKS 'symlink becomes directory' '
+test_expect_success 'symlink becomes directory' '
        git checkout -f foo-symlinked-to-bar &&
        git diff-tree -p HEAD foo-becomes-a-directory > patch &&
        git apply --index < patch
@@ -112,7 +111,7 @@ test_expect_success SYMLINKS 'symlink becomes directory' '
 test_debug 'cat patch'
 
 
-test_expect_success SYMLINKS 'directory becomes symlink' '
+test_expect_success 'directory becomes symlink' '
        git checkout -f foo-becomes-a-directory &&
        git diff-tree -p HEAD foo-symlinked-to-bar > patch &&
        git apply --index < patch
index 7674dd2ec9d6f14a0f2181ebf415378521f90fa4..872fcda6cb6dce98ec360c41cb6ae1220193ca48 100755 (executable)
@@ -9,18 +9,16 @@ test_description='git apply symlinks and partial files
 
 . ./test-lib.sh
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
-       ln -s path1/path2/path3/path4/path5 link1 &&
-       git add link? &&
+       test_ln_s_add path1/path2/path3/path4/path5 link1 &&
        git commit -m initial &&
 
        git branch side &&
 
        rm -f link? &&
 
-       ln -s htap6 link1 &&
-       git update-index link? &&
+       test_ln_s_add htap6 link1 &&
        git commit -m second &&
 
        git diff-tree -p HEAD^ HEAD >patch  &&
@@ -37,7 +35,7 @@ test_expect_success SYMLINKS 'apply symlink patch' '
 
 '
 
-test_expect_success SYMLINKS 'apply --index symlink patch' '
+test_expect_success 'apply --index symlink patch' '
 
        git checkout -f side &&
        git apply --index patch &&
index 39407376ba7da1cb8256bcd3041a83147cd9eee5..70b3a06e1dc7a92ac5a0806854e100af02c2346b 100755 (executable)
@@ -10,11 +10,11 @@ lecho () {
        done
 }
 
-test_expect_success SYMLINKS setup '
+test_expect_success setup '
 
        mkdir -p arch/i386/boot arch/x86_64 &&
        lecho 1 2 3 4 5 >arch/i386/boot/Makefile &&
-       ln -s ../i386/boot arch/x86_64/boot &&
+       test_ln_s_add ../i386/boot arch/x86_64/boot &&
        git add . &&
        test_tick &&
        git commit -m initial &&
@@ -31,7 +31,7 @@ test_expect_success SYMLINKS setup '
 
 '
 
-test_expect_success SYMLINKS apply '
+test_expect_success apply '
 
        git checkout test &&
        git diff --exit-code test &&
@@ -40,7 +40,7 @@ test_expect_success SYMLINKS apply '
 
 '
 
-test_expect_success SYMLINKS 'check result' '
+test_expect_success 'check result' '
 
        git diff --exit-code master &&
        git diff --exit-code --cached master &&
index 2599ae50eb94051f66b4dc1de603aaf8cd1f79eb..9324ea44162130c0eea4dcc08d21866354e3c1da 100755 (executable)
@@ -3,7 +3,7 @@
 test_description='merging when a directory was replaced with a symlink'
 . ./test-lib.sh
 
-test_expect_success SYMLINKS 'create a commit where dir a/b changed to symlink' '
+test_expect_success 'create a commit where dir a/b changed to symlink' '
        mkdir -p a/b/c a/b-2/c &&
        > a/b/c/d &&
        > a/b-2/c/d &&
@@ -12,12 +12,12 @@ test_expect_success SYMLINKS 'create a commit where dir a/b changed to symlink'
        git commit -m base &&
        git tag start &&
        rm -rf a/b &&
-       ln -s b-2 a/b &&
        git add -A &&
+       test_ln_s_add b-2 a/b &&
        git commit -m "dir to symlink"
 '
 
-test_expect_success SYMLINKS 'checkout does not clobber untracked symlink' '
+test_expect_success 'checkout does not clobber untracked symlink' '
        git checkout HEAD^0 &&
        git reset --hard master &&
        git rm --cached a/b &&
@@ -25,7 +25,7 @@ test_expect_success SYMLINKS 'checkout does not clobber untracked symlink' '
        test_must_fail git checkout start^0
 '
 
-test_expect_success SYMLINKS 'a/b-2/c/d is kept when clobbering symlink b' '
+test_expect_success 'a/b-2/c/d is kept when clobbering symlink b' '
        git checkout HEAD^0 &&
        git reset --hard master &&
        git rm --cached a/b &&
@@ -34,14 +34,14 @@ test_expect_success SYMLINKS 'a/b-2/c/d is kept when clobbering symlink b' '
        test -f a/b-2/c/d
 '
 
-test_expect_success SYMLINKS 'checkout should not have deleted a/b-2/c/d' '
+test_expect_success 'checkout should not have deleted a/b-2/c/d' '
        git checkout HEAD^0 &&
        git reset --hard master &&
         git checkout start^0 &&
         test -f a/b-2/c/d
 '
 
-test_expect_success SYMLINKS 'setup for merge test' '
+test_expect_success 'setup for merge test' '
        git reset --hard &&
        test -f a/b-2/c/d &&
        echo x > a/x &&
@@ -50,39 +50,51 @@ test_expect_success SYMLINKS 'setup for merge test' '
        git tag baseline
 '
 
-test_expect_success SYMLINKS 'Handle D/F conflict, do not lose a/b-2/c/d in merge (resolve)' '
+test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (resolve)' '
        git reset --hard &&
        git checkout baseline^0 &&
        git merge -s resolve master &&
-       test -h a/b &&
        test -f a/b-2/c/d
 '
 
-test_expect_success SYMLINKS 'Handle D/F conflict, do not lose a/b-2/c/d in merge (recursive)' '
+test_expect_success SYMLINKS 'a/b was resolved as symlink' '
+       test -h a/b
+'
+
+test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (recursive)' '
        git reset --hard &&
        git checkout baseline^0 &&
        git merge -s recursive master &&
-       test -h a/b &&
        test -f a/b-2/c/d
 '
 
-test_expect_success SYMLINKS 'Handle F/D conflict, do not lose a/b-2/c/d in merge (resolve)' '
+test_expect_success SYMLINKS 'a/b was resolved as symlink' '
+       test -h a/b
+'
+
+test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (resolve)' '
        git reset --hard &&
        git checkout master^0 &&
        git merge -s resolve baseline^0 &&
-       test -h a/b &&
        test -f a/b-2/c/d
 '
 
-test_expect_success SYMLINKS 'Handle F/D conflict, do not lose a/b-2/c/d in merge (recursive)' '
+test_expect_success SYMLINKS 'a/b was resolved as symlink' '
+       test -h a/b
+'
+
+test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (recursive)' '
        git reset --hard &&
        git checkout master^0 &&
        git merge -s recursive baseline^0 &&
-       test -h a/b &&
        test -f a/b-2/c/d
 '
 
-test_expect_failure SYMLINKS 'do not lose untracked in merge (resolve)' '
+test_expect_success SYMLINKS 'a/b was resolved as symlink' '
+       test -h a/b
+'
+
+test_expect_failure 'do not lose untracked in merge (resolve)' '
        git reset --hard &&
        git checkout baseline^0 &&
        >a/b/c/e &&
@@ -91,7 +103,7 @@ test_expect_failure SYMLINKS 'do not lose untracked in merge (resolve)' '
        test -f a/b-2/c/d
 '
 
-test_expect_success SYMLINKS 'do not lose untracked in merge (recursive)' '
+test_expect_success 'do not lose untracked in merge (recursive)' '
        git reset --hard &&
        git checkout baseline^0 &&
        >a/b/c/e &&
@@ -100,52 +112,61 @@ test_expect_success SYMLINKS 'do not lose untracked in merge (recursive)' '
        test -f a/b-2/c/d
 '
 
-test_expect_success SYMLINKS 'do not lose modifications in merge (resolve)' '
+test_expect_success 'do not lose modifications in merge (resolve)' '
        git reset --hard &&
        git checkout baseline^0 &&
        echo more content >>a/b/c/d &&
        test_must_fail git merge -s resolve master
 '
 
-test_expect_success SYMLINKS 'do not lose modifications in merge (recursive)' '
+test_expect_success 'do not lose modifications in merge (recursive)' '
        git reset --hard &&
        git checkout baseline^0 &&
        echo more content >>a/b/c/d &&
        test_must_fail git merge -s recursive master
 '
 
-test_expect_success SYMLINKS 'setup a merge where dir a/b-2 changed to symlink' '
+test_expect_success 'setup a merge where dir a/b-2 changed to symlink' '
        git reset --hard &&
        git checkout start^0 &&
        rm -rf a/b-2 &&
-       ln -s b a/b-2 &&
        git add -A &&
+       test_ln_s_add b a/b-2 &&
        git commit -m "dir a/b-2 to symlink" &&
        git tag test2
 '
 
-test_expect_success SYMLINKS 'merge should not have D/F conflicts (resolve)' '
+test_expect_success 'merge should not have D/F conflicts (resolve)' '
        git reset --hard &&
        git checkout baseline^0 &&
        git merge -s resolve test2 &&
-       test -h a/b-2 &&
        test -f a/b/c/d
 '
 
-test_expect_success SYMLINKS 'merge should not have D/F conflicts (recursive)' '
+test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '
+       test -h a/b-2
+'
+
+test_expect_success 'merge should not have D/F conflicts (recursive)' '
        git reset --hard &&
        git checkout baseline^0 &&
        git merge -s recursive test2 &&
-       test -h a/b-2 &&
        test -f a/b/c/d
 '
 
-test_expect_success SYMLINKS 'merge should not have F/D conflicts (recursive)' '
+test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '
+       test -h a/b-2
+'
+
+test_expect_success 'merge should not have F/D conflicts (recursive)' '
        git reset --hard &&
        git checkout -b foo test2 &&
        git merge -s recursive baseline^0 &&
-       test -h a/b-2 &&
        test -f a/b/c/d
 '
 
+test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '
+       test -h a/b-2
+'
+
 test_done
index a845b154e4db50b52eb67eaefefcc42403c52c0e..101816e718d6149a0e8ee500026455f04a8384ed 100755 (executable)
@@ -218,13 +218,13 @@ test_expect_success 'git mv should not change sha1 of moved cache entry' '
 
 rm -f dirty dirty2
 
-test_expect_success SYMLINKS 'git mv should overwrite symlink to a file' '
+test_expect_success 'git mv should overwrite symlink to a file' '
 
        rm -fr .git &&
        git init &&
        echo 1 >moved &&
-       ln -s moved symlink &&
-       git add moved symlink &&
+       test_ln_s_add moved symlink &&
+       git add moved &&
        test_must_fail git mv moved symlink &&
        git mv -f moved symlink &&
        ! test -e moved &&
@@ -237,22 +237,26 @@ test_expect_success SYMLINKS 'git mv should overwrite symlink to a file' '
 
 rm -f moved symlink
 
-test_expect_success SYMLINKS 'git mv should overwrite file with a symlink' '
+test_expect_success 'git mv should overwrite file with a symlink' '
 
        rm -fr .git &&
        git init &&
        echo 1 >moved &&
-       ln -s moved symlink &&
-       git add moved symlink &&
+       test_ln_s_add moved symlink &&
+       git add moved &&
        test_must_fail git mv symlink moved &&
        git mv -f symlink moved &&
        ! test -e symlink &&
-       test -h moved &&
        git update-index --refresh &&
        git diff-files --quiet
 
 '
 
+test_expect_success SYMLINKS 'check moved symlink' '
+
+       test -h moved
+'
+
 rm -f moved symlink
 
 test_done
index 6547eb8f5459d4d95113469d338e1879f86b79ea..758a623cdbb5f7e367bcfce5c239d79258c46e84 100755 (executable)
@@ -141,11 +141,10 @@ test_expect_success SYMLINKS 'will not overwrite untracked symlink in leading pa
        test_path_is_missing .git/MERGE_HEAD
 '
 
-test_expect_success SYMLINKS 'will not be confused by symlink in leading path' '
+test_expect_success 'will not be confused by symlink in leading path' '
        git reset --hard c0 &&
        rm -rf sub &&
-       ln -s sub2 sub &&
-       git add sub &&
+       test_ln_s_add sub2 sub &&
        git commit -m ln &&
        git checkout sub
 '
index bf6caa4dc3d42230757526dd215ab777f77ae369..7683515155497d9303f319b31c3a49fb6610706f 100755 (executable)
@@ -18,17 +18,13 @@ test_expect_success 'setup ' '
        echo "bin: test number 0" >zero.bin &&
        echo "bin: test 1" >one.bin &&
        echo "bin: test number 2" >two.bin &&
-       if test_have_prereq SYMLINKS; then
-               ln -s one.bin symlink.bin
-       fi &&
+       test_ln_s_add one.bin symlink.bin &&
        git add . &&
        GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
        echo "bin: test 1 version 2" >one.bin &&
        echo "bin: test number 2 version 2" >>two.bin &&
-       if test_have_prereq SYMLINKS; then
-               rm symlink.bin &&
-               ln -s two.bin symlink.bin
-       fi &&
+       rm -f symlink.bin &&
+       test_ln_s_add two.bin symlink.bin &&
        GIT_AUTHOR_NAME=Number2 git commit -a -m Second --date="2010-01-01 20:00:00"
 '
 
@@ -135,7 +131,7 @@ test_expect_success SYMLINKS 'blame --textconv (on symlink)' '
 
 # cp two.bin three.bin  and make small tweak
 # (this will direct blame -C -C three.bin to consider two.bin and symlink.bin)
-test_expect_success SYMLINKS 'make another new commit' '
+test_expect_success 'make another new commit' '
        cat >three.bin <<\EOF &&
 bin: test number 2
 bin: test number 2 version 2
@@ -146,7 +142,7 @@ EOF
        GIT_AUTHOR_NAME=Number4 git commit -a -m Fourth --date="2010-01-01 23:00:00"
 '
 
-test_expect_success SYMLINKS 'blame on last commit (-C -C, symlink)' '
+test_expect_success 'blame on last commit (-C -C, symlink)' '
        git blame -C -C three.bin >blame &&
        find_blame <blame >result &&
        cat >expected <<\EOF &&
index 78a0085e648b8fa6773b47e86959853cf29ccdf9..b95e102891db65c184a2ee3137f1b3e20cdab2db 100755 (executable)
@@ -12,9 +12,7 @@ chmod +x helper
 
 test_expect_success 'setup ' '
        echo "bin: test" >one.bin &&
-       if test_have_prereq SYMLINKS; then
-               ln -s one.bin symlink.bin
-       fi &&
+       test_ln_s_add one.bin symlink.bin &&
        git add . &&
        GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
        echo "bin: test version 2" >one.bin &&
@@ -72,14 +70,14 @@ test_expect_success 'cat-file --textconv on previous commit' '
        test_cmp expected result
 '
 
-test_expect_success SYMLINKS 'cat-file without --textconv (symlink)' '
+test_expect_success 'cat-file without --textconv (symlink)' '
        git cat-file blob :symlink.bin >result &&
        printf "%s" "one.bin" >expected
        test_cmp expected result
 '
 
 
-test_expect_success SYMLINKS 'cat-file --textconv on index (symlink)' '
+test_expect_success 'cat-file --textconv on index (symlink)' '
        ! git cat-file --textconv :symlink.bin 2>result &&
        cat >expected <<\EOF &&
 fatal: git cat-file --textconv: unable to run textconv on :symlink.bin
@@ -87,7 +85,7 @@ EOF
        test_cmp expected result
 '
 
-test_expect_success SYMLINKS 'cat-file --textconv on HEAD (symlink)' '
+test_expect_success 'cat-file --textconv on HEAD (symlink)' '
        ! git cat-file --textconv HEAD:symlink.bin 2>result &&
        cat >expected <<EOF &&
 fatal: git cat-file --textconv: unable to run textconv on HEAD:symlink.bin
index 2471bc6777df58c222a96d4fc6e77d77e9e38703..34c2d8f49ab6fd02a19e4b9f95e31838c8de3ece 100755 (executable)
@@ -396,7 +396,7 @@ test_expect_success 'tree_tag-obj'    'git fast-export tree_tag-obj'
 test_expect_success 'tag-obj_tag'     'git fast-export tag-obj_tag'
 test_expect_success 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj'
 
-test_expect_success SYMLINKS 'directory becomes symlink'        '
+test_expect_success 'directory becomes symlink'        '
        git init dirtosymlink &&
        git init result &&
        (
@@ -408,8 +408,7 @@ test_expect_success SYMLINKS 'directory becomes symlink'        '
                git add foo/world bar/world &&
                git commit -q -mone &&
                git rm -r foo &&
-               ln -s bar foo &&
-               git add foo &&
+               test_ln_s_add bar foo &&
                git commit -q -mtwo
        ) &&
        (
index 6783c14c1ad9af0f5aa3d16e13250e9a1a292b28..6fca19353d7308f88e63806f7187d9d379412d18 100755 (executable)
@@ -156,10 +156,10 @@ test_expect_success \
         git commit -a -m "File renamed." &&
         gitweb_run "p=.git;a=commitdiff"'
 
-test_expect_success SYMLINKS \
+test_expect_success \
        'commitdiff(0): file to symlink' \
        'rm renamed_file &&
-        ln -s file renamed_file &&
+        test_ln_s_add file renamed_file &&
         git commit -a -m "File to symlink." &&
         gitweb_run "p=.git;a=commitdiff"'
 
@@ -212,15 +212,14 @@ test_expect_success \
 # ----------------------------------------------------------------------
 # commitdiff testing (taken from t4114-apply-typechange.sh)
 
-test_expect_success SYMLINKS 'setup typechange commits' '
+test_expect_success 'setup typechange commits' '
        echo "hello world" > foo &&
        echo "hi planet" > bar &&
        git update-index --add foo bar &&
        git commit -m initial &&
        git branch initial &&
        rm -f foo &&
-       ln -s bar foo &&
-       git update-index foo &&
+       test_ln_s_add bar foo &&
        git commit -m "foo symlinked to bar" &&
        git branch foo-symlinked-to-bar &&
        rm -f foo &&
@@ -361,11 +360,7 @@ test_expect_success \
         echo "Changed" >> 04-rename-to &&
         test_chmod +x 05-mode-change &&
         rm -f 06-file-or-symlink &&
-        if test_have_prereq SYMLINKS; then
-               ln -s 01-change 06-file-or-symlink
-        else
-               printf %s 01-change > 06-file-or-symlink
-        fi &&
+        test_ln_s_add 01-change 06-file-or-symlink &&
         echo "Changed and have mode changed" > 07-change-mode-change   &&
         test_chmod +x 07-change-mode-change &&
         git commit -a -m "Large commit" &&
index 52510094add59b508e1581ffebfa555e7249561c..fac9234d3c688ed588da6844163c5d0e712ba3ab 100644 (file)
@@ -679,3 +679,20 @@ test_create_repo () {
                mv .git/hooks .git/hooks-disabled
        ) || exit
 }
+
+# This function helps on symlink challenged file systems when it is not
+# important that the file system entry is a symbolic link.
+# Use test_ln_s_add instead of "ln -s x y && git add y" to add a
+# symbolic link entry y to the index.
+
+test_ln_s_add () {
+       if test_have_prereq SYMLINKS
+       then
+               ln -s "$1" "$2" &&
+               git update-index --add "$2"
+       else
+               printf '%s' "$1" >"$2" &&
+               ln_s_obj=$(git hash-object -w "$2") &&
+               git update-index --add --cacheinfo 120000 $ln_s_obj "$2"
+       fi
+}
index 02b42badd550a4b775aab084b38a63c2f4f561a9..2e601a80384688cc5b0efe5bf066b86bcbf2798e 100644 (file)
@@ -84,7 +84,7 @@ int main(int argc, const char *argv[])
                if (stat(argv[i], &sb) < 0) {
                        fprintf(stderr, "Failed to stat %s: %s\n",
                                argv[i], strerror(errno));
-                       return -1;
+                       return 1;
                }
 
 #ifdef WIN32
@@ -92,7 +92,7 @@ int main(int argc, const char *argv[])
                                chmod(argv[i], sb.st_mode | S_IWUSR)) {
                        fprintf(stderr, "Could not make user-writable %s: %s",
                                argv[i], strerror(errno));
-                       return -1;
+                       return 1;
                }
 #endif
 
@@ -107,7 +107,7 @@ int main(int argc, const char *argv[])
                if (utb.modtime != sb.st_mtime && utime(argv[i], &utb) < 0) {
                        fprintf(stderr, "Failed to modify time on %s: %s\n",
                                argv[i], strerror(errno));
-                       return -1;
+                       return 1;
                }
        }
 
@@ -115,5 +115,5 @@ int main(int argc, const char *argv[])
 
 usage:
        fprintf(stderr, "usage: %s %s\n", argv[0], usage_str);
-       return -1;
+       return 1;
 }