@@ -44,4 +44,85 @@ test_expect_success 'apply --index symlink patch' '
44
44
45
45
'
46
46
47
+ test_expect_success ' symlink setup' '
48
+ ln -s .git symlink &&
49
+ git add symlink &&
50
+ git commit -m "add symlink"
51
+ '
52
+
53
+ test_expect_success SYMLINKS ' symlink escape when creating new files' '
54
+ test_when_finished "git reset --hard && git clean -dfx" &&
55
+
56
+ cat >patch <<-EOF &&
57
+ diff --git a/symlink b/renamed-symlink
58
+ similarity index 100%
59
+ rename from symlink
60
+ rename to renamed-symlink
61
+ --
62
+ diff --git /dev/null b/renamed-symlink/create-me
63
+ new file mode 100644
64
+ index 0000000..039727e
65
+ --- /dev/null
66
+ +++ b/renamed-symlink/create-me
67
+ @@ -0,0 +1,1 @@
68
+ +busted
69
+ EOF
70
+
71
+ test_must_fail git apply patch 2>stderr &&
72
+ cat >expected_stderr <<-EOF &&
73
+ error: affected file ${SQ}renamed-symlink/create-me${SQ} is beyond a symbolic link
74
+ EOF
75
+ test_cmp expected_stderr stderr &&
76
+ ! test_path_exists .git/create-me
77
+ '
78
+
79
+ test_expect_success SYMLINKS ' symlink escape when modifying file' '
80
+ test_when_finished "git reset --hard && git clean -dfx" &&
81
+ touch .git/modify-me &&
82
+
83
+ cat >patch <<-EOF &&
84
+ diff --git a/symlink b/renamed-symlink
85
+ similarity index 100%
86
+ rename from symlink
87
+ rename to renamed-symlink
88
+ --
89
+ diff --git a/renamed-symlink/modify-me b/renamed-symlink/modify-me
90
+ index 1111111..2222222 100644
91
+ --- a/renamed-symlink/modify-me
92
+ +++ b/renamed-symlink/modify-me
93
+ @@ -0,0 +1,1 @@
94
+ +busted
95
+ EOF
96
+
97
+ test_must_fail git apply patch 2>stderr &&
98
+ cat >expected_stderr <<-EOF &&
99
+ error: renamed-symlink/modify-me: No such file or directory
100
+ EOF
101
+ test_cmp expected_stderr stderr &&
102
+ test_must_be_empty .git/modify-me
103
+ '
104
+
105
+ test_expect_success SYMLINKS ' symlink escape when deleting file' '
106
+ test_when_finished "git reset --hard && git clean -dfx && rm .git/delete-me" &&
107
+ touch .git/delete-me &&
108
+
109
+ cat >patch <<-EOF &&
110
+ diff --git a/symlink b/renamed-symlink
111
+ similarity index 100%
112
+ rename from symlink
113
+ rename to renamed-symlink
114
+ --
115
+ diff --git a/renamed-symlink/delete-me b/renamed-symlink/delete-me
116
+ deleted file mode 100644
117
+ index 1111111..0000000 100644
118
+ EOF
119
+
120
+ test_must_fail git apply patch 2>stderr &&
121
+ cat >expected_stderr <<-EOF &&
122
+ error: renamed-symlink/delete-me: No such file or directory
123
+ EOF
124
+ test_cmp expected_stderr stderr &&
125
+ test_path_is_file .git/delete-me
126
+ '
127
+
47
128
test_done
0 commit comments