summaryrefslogtreecommitdiffstats
path: root/t/t4129-apply-samemode.sh
blob: 2149ad5da44cdeb544ec0bc7642e1c3147870f38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#!/bin/sh

test_description='applying patch with mode bits'


. ./test-lib.sh

test_expect_success setup '
	echo original >file &&
	git add file &&
	test_tick &&
	git commit -m initial &&
	git tag initial &&
	echo modified >file &&
	git diff --stat -p >patch-0.txt &&
	chmod +x file &&
	git diff --stat -p >patch-1.txt &&
	sed "s/^\(new mode \).*/\1/" <patch-1.txt >patch-empty-mode.txt &&
	sed "s/^\(new mode \).*/\1garbage/" <patch-1.txt >patch-bogus-mode.txt
'

test_expect_success FILEMODE 'same mode (no index)' '
	git reset --hard &&
	chmod +x file &&
	git apply patch-0.txt &&
	test -x file
'

test_expect_success FILEMODE 'same mode (with index)' '
	git reset --hard &&
	chmod +x file &&
	git add file &&
	git apply --index patch-0.txt &&
	test -x file &&
	git diff --exit-code
'

test_expect_success FILEMODE 'same mode (index only)' '
	git reset --hard &&
	chmod +x file &&
	git add file &&
	git apply --cached patch-0.txt &&
	git ls-files -s file >ls-files-output &&
	test_grep "^100755" ls-files-output
'

test_expect_success FILEMODE 'mode update (no index)' '
	git reset --hard &&
	git apply patch-1.txt &&
	test -x file
'

test_expect_success FILEMODE 'mode update (with index)' '
	git reset --hard &&
	git apply --index patch-1.txt &&
	test -x file &&
	git diff --exit-code
'

test_expect_success FILEMODE 'mode update (index only)' '
	git reset --hard &&
	git apply --cached patch-1.txt &&
	git ls-files -s file >ls-files-output &&
	test_grep "^100755" ls-files-output
'

test_expect_success FILEMODE 'empty mode is rejected' '
	git reset --hard &&
	test_must_fail git apply patch-empty-mode.txt 2>err &&
	test_grep "invalid mode" err
'

test_expect_success FILEMODE 'bogus mode is rejected' '
	git reset --hard &&
	test_must_fail git apply patch-bogus-mode.txt 2>err &&
	test_grep "invalid mode" err
'

test_expect_success POSIXPERM 'do not use core.sharedRepository for working tree files' '
	git reset --hard &&
	test_config core.sharedRepository 0666 &&
	(
		# Remove a default ACL if possible.
		(setfacl -k . 2>/dev/null || true) &&
		umask 0077 &&

		# Test both files (f1) and leading dirs (d)
		mkdir d &&
		touch f1 d/f2 &&
		git add f1 d/f2 &&
		git diff --staged >patch-f1-and-f2.txt &&

		rm -rf d f1 &&
		git apply patch-f1-and-f2.txt &&

		echo "-rw-------" >f1_mode.expected &&
		echo "drwx------" >d_mode.expected &&
		test_modebits f1 >f1_mode.actual &&
		test_modebits d >d_mode.actual &&
		test_cmp f1_mode.expected f1_mode.actual &&
		test_cmp d_mode.expected d_mode.actual
	)
'

test_expect_success 'git apply respects core.fileMode' '
	test_config core.fileMode false &&
	echo true >script.sh &&
	git add --chmod=+x script.sh &&
	git ls-files -s script.sh >ls-files-output &&
	test_grep "^100755" ls-files-output &&
	test_tick && git commit -m "Add script" &&
	git ls-tree -r HEAD script.sh >ls-tree-output &&
	test_grep "^100755" ls-tree-output &&

	echo true >>script.sh &&
	test_tick && git commit -m "Modify script" script.sh &&
	git format-patch -1 --stdout >patch &&
	test_grep "^index.*100755$" patch &&

	git switch -c branch HEAD^ &&
	git apply --index patch 2>err &&
	test_grep ! "has type 100644, expected 100755" err &&
	git reset --hard &&

	git apply patch 2>err &&
	test_grep ! "has type 100644, expected 100755" err &&

	git apply --cached patch 2>err &&
	test_grep ! "has type 100644, expected 100755" err
'

test_expect_success POSIXPERM 'patch mode for new file is canonicalized' '
	cat >patch <<-\EOF &&
	diff --git a/non-canon b/non-canon
	new file mode 100660
	--- /dev/null
	+++ b/non-canon
	+content
	EOF
	test_when_finished "git reset --hard" &&
	(
		umask 0 &&
		git apply --index patch 2>err
	) &&
	test_must_be_empty err &&
	git ls-files -s -- non-canon >staged &&
	test_grep "^100644" staged &&
	ls -l non-canon >worktree &&
	test_grep "^-rw-rw-rw" worktree
'

test_expect_success POSIXPERM 'patch mode for deleted file is canonicalized' '
	test_when_finished "git reset --hard" &&
	echo content >non-canon &&
	chmod 666 non-canon &&
	git add non-canon &&

	cat >patch <<-\EOF &&
	diff --git a/non-canon b/non-canon
	deleted file mode 100660
	--- a/non-canon
	+++ /dev/null
	@@ -1 +0,0 @@
	-content
	EOF
	git apply --index patch 2>err &&
	test_must_be_empty err &&
	git ls-files -- non-canon >staged &&
	test_must_be_empty staged &&
	test_path_is_missing non-canon
'

test_expect_success POSIXPERM 'patch mode for mode change is canonicalized' '
	test_when_finished "git reset --hard" &&
	echo content >non-canon &&
	git add non-canon &&

	cat >patch <<-\EOF &&
	diff --git a/non-canon b/non-canon
	old mode 100660
	new mode 100770
	EOF
	(
		umask 0 &&
		git apply --index patch 2>err
	) &&
	test_must_be_empty err &&
	git ls-files -s -- non-canon >staged &&
	test_grep "^100755" staged &&
	ls -l non-canon >worktree &&
	test_grep "^-rwxrwxrwx" worktree
'

test_done