]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t4115-apply-symlink.sh
Sync with 2.34.8
[thirdparty/git.git] / t / t4115-apply-symlink.sh
index d0f3edef54acf6247a034041eb234c73f67d5762..e95e6d4e7d6419236c1e8bb9bc519b05ea8efec3 100755 (executable)
@@ -45,4 +45,100 @@ test_expect_success 'apply --index symlink patch' '
 
 '
 
+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_exists .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_i18ngrep "Rejected hunk" err &&
+       test_path_is_missing foo &&
+       test_path_is_file file.t.rej
+'
+
 test_done