1
+#!/bin/sh
2
+
3
+test_description='git rev-list using object filtering'
4
+
5
+. ./test-lib.sh
6
+
7
+# Test the blob:none filter.
8
+
9
+test_expect_success 'setup r1' '
10
+ echo "{print \$1}" >print_1.awk &&
11
+ echo "{print \$2}" >print_2.awk &&
12
+
13
+ git init r1 &&
14
+ for n in 1 2 3 4 5
15
+ do
16
+ echo "This is file: $n" > r1/file.$n
17
+ git -C r1 add file.$n
18
+ git -C r1 commit -m "$n"
19
+ done
20
+'
21
+
22
+test_expect_success 'verify blob:none omits all 5 blobs' '
23
+ git -C r1 ls-files -s file.1 file.2 file.3 file.4 file.5 \
24
+ | awk -f print_2.awk \
25
+ | sort >expected &&
26
+ git -C r1 rev-list HEAD --quiet --objects --filter-print-omitted --filter=blob:none \
27
+ | awk -f print_1.awk \
28
+ | sed "s/~//" \
29
+ | sort >observed &&
30
+ test_cmp observed expected
31
+'
32
+
33
+test_expect_success 'verify emitted+omitted == all' '
34
+ git -C r1 rev-list HEAD --objects \
35
+ | awk -f print_1.awk \
36
+ | sort >expected &&
37
+ git -C r1 rev-list HEAD --objects --filter-print-omitted --filter=blob:none \
38
+ | awk -f print_1.awk \
39
+ | sed "s/~//" \
40
+ | sort >observed &&
41
+ test_cmp observed expected
42
+'
43
+
44
+
45
+# Test blob:limit=<n>[kmg] filter.
46
+# We boundary test around the size parameter. The filter is strictly less than
47
+# the value, so size 500 and 1000 should have the same results, but 1001 should
48
+# filter more.
49
+
50
+test_expect_success 'setup r2' '
51
+ git init r2 &&
52
+ for n in 1000 10000
53
+ do
54
+ printf "%"$n"s" X > r2/large.$n
55
+ git -C r2 add large.$n
56
+ git -C r2 commit -m "$n"
57
+ done
58
+'
59
+
60
+test_expect_success 'verify blob:limit=500 omits all blobs' '
61
+ git -C r2 ls-files -s large.1000 large.10000 \
62
+ | awk -f print_2.awk \
63
+ | sort >expected &&
64
+ git -C r2 rev-list HEAD --quiet --objects --filter-print-omitted --filter=blob:limit=500 \
65
+ | awk -f print_1.awk \
66
+ | sed "s/~//" \
67
+ | sort >observed &&
68
+ test_cmp observed expected
69
+'
70
+
71
+test_expect_success 'verify emitted+omitted == all' '
72
+ git -C r2 rev-list HEAD --objects \
73
+ | awk -f print_1.awk \
74
+ | sort >expected &&
75
+ git -C r2 rev-list HEAD --objects --filter-print-omitted --filter=blob:limit=500 \
76
+ | awk -f print_1.awk \
77
+ | sed "s/~//" \
78
+ | sort >observed &&
79
+ test_cmp observed expected
80
+'
81
+
82
+test_expect_success 'verify blob:limit=1000' '
83
+ git -C r2 ls-files -s large.1000 large.10000 \
84
+ | awk -f print_2.awk \
85
+ | sort >expected &&
86
+ git -C r2 rev-list HEAD --quiet --objects --filter-print-omitted --filter=blob:limit=1000 \
87
+ | awk -f print_1.awk \
88
+ | sed "s/~//" \
89
+ | sort >observed &&
90
+ test_cmp observed expected
91
+'
92
+
93
+test_expect_success 'verify blob:limit=1001' '
94
+ git -C r2 ls-files -s large.10000 \
95
+ | awk -f print_2.awk \
96
+ | sort >expected &&
97
+ git -C r2 rev-list HEAD --quiet --objects --filter-print-omitted --filter=blob:limit=1001 \
98
+ | awk -f print_1.awk \
99
+ | sed "s/~//" \
100
+ | sort >observed &&
101
+ test_cmp observed expected
102
+'
103
+
104
+test_expect_success 'verify blob:limit=1k' '
105
+ git -C r2 ls-files -s large.10000 \
106
+ | awk -f print_2.awk \
107
+ | sort >expected &&
108
+ git -C r2 rev-list HEAD --quiet --objects --filter-print-omitted --filter=blob:limit=1k \
109
+ | awk -f print_1.awk \
110
+ | sed "s/~//" \
111
+ | sort >observed &&
112
+ test_cmp observed expected
113
+'
114
+
115
+test_expect_success 'verify blob:limit=1m' '
116
+ cat </dev/null >expected &&
117
+ git -C r2 rev-list HEAD --quiet --objects --filter-print-omitted --filter=blob:limit=1m \
118
+ | awk -f print_1.awk \
119
+ | sed "s/~//" \
120
+ | sort >observed &&
121
+ test_cmp observed expected
122
+'
123
+
124
+# Test sparse:path=<path> filter.
125
+# Use a local file containing a sparse-checkout specification to filter
126
+# out blobs not required for the corresponding sparse-checkout. We do not
127
+# require sparse-checkout to actually be enabled.
128
+
129
+test_expect_success 'setup r3' '
130
+ git init r3 &&
131
+ mkdir r3/dir1 &&
132
+ for n in sparse1 sparse2
133
+ do
134
+ echo "This is file: $n" > r3/$n
135
+ git -C r3 add $n
136
+ echo "This is file: dir1/$n" > r3/dir1/$n
137
+ git -C r3 add dir1/$n
138
+ done &&
139
+ git -C r3 commit -m "sparse" &&
140
+ echo dir1/ >pattern1 &&
141
+ echo sparse1 >pattern2
142
+'
143
+
144
+test_expect_success 'verify sparse:path=pattern1 omits top-level files' '
145
+ git -C r3 ls-files -s sparse1 sparse2 \
146
+ | awk -f print_2.awk \
147
+ | sort >expected &&
148
+ git -C r3 rev-list HEAD --quiet --objects --filter-print-omitted --filter=sparse:path=../pattern1 \
149
+ | awk -f print_1.awk \
150
+ | sed "s/~//" \
151
+ | sort >observed &&
152
+ test_cmp observed expected
153
+'
154
+
155
+test_expect_success 'verify sparse:path=pattern2 omits both sparse2 files' '
156
+ git -C r3 ls-files -s sparse2 dir1/sparse2 \
157
+ | awk -f print_2.awk \
158
+ | sort >expected &&
159
+ git -C r3 rev-list HEAD --quiet --objects --filter-print-omitted --filter=sparse:path=../pattern2 \
160
+ | awk -f print_1.awk \
161
+ | sed "s/~//" \
162
+ | sort >observed &&
163
+ test_cmp observed expected
164
+'
165
+
166
+# Test sparse:oid=<oid-ish> filter.
167
+# Like sparse:path, but we get the sparse-checkout specification from
168
+# a blob rather than a file on disk.
169
+
170
+test_expect_success 'setup r3 part 2' '
171
+ echo dir1/ >r3/pattern &&
172
+ git -C r3 add pattern &&
173
+ git -C r3 commit -m "pattern"
174
+'
175
+
176
+test_expect_success 'verify sparse:oid=OID omits top-level files' '
177
+ git -C r3 ls-files -s pattern sparse1 sparse2 \
178
+ | awk -f print_2.awk \
179
+ | sort >expected &&
180
+ oid=$(git -C r3 ls-files -s pattern | awk -f print_2.awk) &&
181
+ git -C r3 rev-list HEAD --quiet --objects --filter-print-omitted --filter=sparse:oid=$oid \
182
+ | awk -f print_1.awk \
183
+ | sed "s/~//" \
184
+ | sort >observed &&
185
+ test_cmp observed expected
186
+'
187
+
188
+test_expect_success 'verify sparse:oid=oid-ish omits top-level files' '
189
+ git -C r3 ls-files -s pattern sparse1 sparse2 \
190
+ | awk -f print_2.awk \
191
+ | sort >expected &&
192
+ git -C r3 rev-list HEAD --quiet --objects --filter-print-omitted --filter=sparse:oid=master:pattern \
193
+ | awk -f print_1.awk \
194
+ | sed "s/~//" \
195
+ | sort >observed &&
196
+ test_cmp observed expected
197
+'
198
+
199
+# Delete some loose objects and use rev-list, but WITHOUT any filtering.
200
+# This models previously omitted objects that we did not receive.
201
+
202
+test_expect_success 'rev-list W/ --missing=print' '
203
+ git -C r1 ls-files -s file.1 file.2 file.3 file.4 file.5 \
204
+ | awk -f print_2.awk \
205
+ | sort >expected &&
206
+ for id in `cat expected | sed "s|..|&/|"`
207
+ do
208
+ rm r1/.git/objects/$id
209
+ done &&
210
+ git -C r1 rev-list --quiet HEAD --missing=print --objects \
211
+ | awk -f print_1.awk \
212
+ | sed "s/?//" \
213
+ | sort >observed &&
214
+ test_cmp observed expected
215
+'
216
+
217
+test_expect_success 'rev-list W/O --missing fails' '
218
+ test_must_fail git -C r1 rev-list --quiet --objects HEAD
219
+'
220
+
221
+test_expect_success 'rev-list W/ missing=allow-any' '
222
+ git -C r1 rev-list --quiet --missing=allow-any --objects HEAD
223
+'
224
+
225
+test_done