| #!/bin/sh |
| # |
| # Copyright (c) 2005 Junio C Hamano |
| # |
| |
| test_description='git apply symlinks and partial files |
| |
| ' |
| |
| TEST_PASSES_SANITIZE_LEAK=true |
| . ./test-lib.sh |
| |
| test_expect_success setup ' |
| |
| test_ln_s_add path1/path2/path3/path4/path5 link1 && |
| git commit -m initial && |
| |
| git branch side && |
| |
| rm -f link? && |
| |
| test_ln_s_add htap6 link1 && |
| git commit -m second && |
| |
| git diff-tree -p HEAD^ HEAD >patch && |
| git apply --stat --summary patch |
| |
| ' |
| |
| test_expect_success SYMLINKS 'apply symlink patch' ' |
| |
| git checkout side && |
| git apply patch && |
| git diff-files -p >patched && |
| test_cmp patch patched |
| |
| ' |
| |
| test_expect_success 'apply --index symlink patch' ' |
| |
| git checkout -f side && |
| git apply --index patch && |
| git diff-index --cached -p HEAD >patched && |
| test_cmp patch patched |
| |
| ' |
| |
| test_expect_success 'symlink setup' ' |
| ln -s .git symlink && |
| git add symlink && |
| git commit -m "add symlink" |
| ' |
| |
| test_expect_success SYMLINKS 'symlink escape when creating new files' ' |
| test_when_finished "git reset --hard && git clean -dfx" && |
| |
| cat >patch <<-EOF && |
| diff --git a/symlink b/renamed-symlink |
| similarity index 100% |
| rename from symlink |
| rename to renamed-symlink |
| -- |
| diff --git /dev/null b/renamed-symlink/create-me |
| new file mode 100644 |
| index 0000000..039727e |
| --- /dev/null |
| +++ b/renamed-symlink/create-me |
| @@ -0,0 +1,1 @@ |
| +busted |
| EOF |
| |
| test_must_fail git apply patch 2>stderr && |
| cat >expected_stderr <<-EOF && |
| error: affected file ${SQ}renamed-symlink/create-me${SQ} is beyond a symbolic link |
| EOF |
| test_cmp expected_stderr stderr && |
| test_path_is_missing .git/create-me |
| ' |
| |
| test_expect_success SYMLINKS 'symlink escape when modifying file' ' |
| test_when_finished "git reset --hard && git clean -dfx" && |
| touch .git/modify-me && |
| |
| cat >patch <<-EOF && |
| diff --git a/symlink b/renamed-symlink |
| similarity index 100% |
| rename from symlink |
| rename to renamed-symlink |
| -- |
| diff --git a/renamed-symlink/modify-me b/renamed-symlink/modify-me |
| index 1111111..2222222 100644 |
| --- a/renamed-symlink/modify-me |
| +++ b/renamed-symlink/modify-me |
| @@ -0,0 +1,1 @@ |
| +busted |
| EOF |
| |
| test_must_fail git apply patch 2>stderr && |
| cat >expected_stderr <<-EOF && |
| error: renamed-symlink/modify-me: No such file or directory |
| EOF |
| test_cmp expected_stderr stderr && |
| test_must_be_empty .git/modify-me |
| ' |
| |
| test_expect_success SYMLINKS 'symlink escape when deleting file' ' |
| test_when_finished "git reset --hard && git clean -dfx && rm .git/delete-me" && |
| touch .git/delete-me && |
| |
| cat >patch <<-EOF && |
| diff --git a/symlink b/renamed-symlink |
| similarity index 100% |
| rename from symlink |
| rename to renamed-symlink |
| -- |
| diff --git a/renamed-symlink/delete-me b/renamed-symlink/delete-me |
| deleted file mode 100644 |
| index 1111111..0000000 100644 |
| EOF |
| |
| test_must_fail git apply patch 2>stderr && |
| cat >expected_stderr <<-EOF && |
| error: renamed-symlink/delete-me: No such file or directory |
| EOF |
| test_cmp expected_stderr stderr && |
| test_path_is_file .git/delete-me |
| ' |
| |
| test_expect_success SYMLINKS '--reject removes .rej symlink if it exists' ' |
| test_when_finished "git reset --hard && git clean -dfx" && |
| |
| test_commit file && |
| echo modified >file.t && |
| git diff -- file.t >patch && |
| echo modified-again >file.t && |
| |
| ln -s foo file.t.rej && |
| test_must_fail git apply patch --reject 2>err && |
| test_grep "Rejected hunk" err && |
| test_path_is_missing foo && |
| test_path_is_file file.t.rej |
| ' |
| |
| test_done |