зеркало из https://github.com/microsoft/git.git
Merge branch 'js/test-ln-s-add'
Many tests that check the behaviour of symbolic links stored in the index or the tree objects do not have to be skipped on a filesystem that lack symbolic link support. * 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
This commit is contained in:
Коммит
c0266ed275
14
t/README
14
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
|
||||
-------------
|
||||
|
||||
|
|
|
@ -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) &&
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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)'
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
'
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
'
|
||||
|
||||
|
|
|
@ -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"
|
||||
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
|
||||
'
|
||||
|
||||
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 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 \
|
||||
'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 'validate git ls-files -k output.' '
|
||||
cat >.expected <<-\EOF &&
|
||||
path0/file0
|
||||
path1/file1
|
||||
path2
|
||||
path3
|
||||
EOF
|
||||
test_cmp .expected .output
|
||||
'
|
||||
|
||||
test_expect_success \
|
||||
'validate git ls-files -k output.' \
|
||||
'test_cmp .expected .output'
|
||||
test_expect_success 'git ls-files -m to show modified files.' '
|
||||
git ls-files -m >.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 \
|
||||
'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
|
||||
|
|
|
@ -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' '
|
||||
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
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);;
|
||||
|
|
|
@ -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)"
|
||||
|
|
|
@ -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'
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 &&
|
||||
{
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
'
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
) &&
|
||||
(
|
||||
|
|
|
@ -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" &&
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -84,7 +84,7 @@ int main(int argc, 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 GIT_WINDOWS_NATIVE
|
||||
|
@ -92,7 +92,7 @@ int main(int argc, 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, 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, char *argv[])
|
|||
|
||||
usage:
|
||||
fprintf(stderr, "usage: %s %s\n", argv[0], usage_str);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче