]>
Commit | Line | Data |
---|---|---|
8464010f DST |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2008 Johannes E. Schindelin | |
4 | # | |
5 | ||
6 | test_description='prune' | |
7 | . ./test-lib.sh | |
8 | ||
98df233e CB |
9 | day=$((60*60*24)) |
10 | week=$(($day*7)) | |
11 | ||
12 | add_blob() { | |
13 | before=$(git count-objects | sed "s/ .*//") && | |
14 | BLOB=$(echo aleph_0 | git hash-object -w --stdin) && | |
15 | BLOB_FILE=.git/objects/$(echo $BLOB | sed "s/^../&\//") && | |
16 | test $((1 + $before)) = $(git count-objects | sed "s/ .*//") && | |
e3b02bc9 MG |
17 | test -f $BLOB_FILE && |
18 | test-chmtime =+0 $BLOB_FILE | |
98df233e CB |
19 | } |
20 | ||
8464010f DST |
21 | test_expect_success setup ' |
22 | ||
23 | : > file && | |
24 | git add file && | |
25 | test_tick && | |
26 | git commit -m initial && | |
27 | git gc | |
28 | ||
29 | ' | |
30 | ||
31 | test_expect_success 'prune stale packs' ' | |
32 | ||
33 | orig_pack=$(echo .git/objects/pack/*.pack) && | |
34 | : > .git/objects/tmp_1.pack && | |
35 | : > .git/objects/tmp_2.pack && | |
21926fe8 | 36 | test-chmtime =-86501 .git/objects/tmp_1.pack && |
8464010f DST |
37 | git prune --expire 1.day && |
38 | test -f $orig_pack && | |
39 | test -f .git/objects/tmp_2.pack && | |
40 | ! test -f .git/objects/tmp_1.pack | |
41 | ||
42 | ' | |
43 | ||
25ee9731 JS |
44 | test_expect_success 'prune --expire' ' |
45 | ||
98df233e | 46 | add_blob && |
25ee9731 JS |
47 | git prune --expire=1.hour.ago && |
48 | test $((1 + $before)) = $(git count-objects | sed "s/ .*//") && | |
49 | test -f $BLOB_FILE && | |
21926fe8 | 50 | test-chmtime =-86500 $BLOB_FILE && |
25ee9731 JS |
51 | git prune --expire 1.day && |
52 | test $before = $(git count-objects | sed "s/ .*//") && | |
53 | ! test -f $BLOB_FILE | |
54 | ||
55 | ' | |
56 | ||
57 | test_expect_success 'gc: implicit prune --expire' ' | |
58 | ||
98df233e CB |
59 | add_blob && |
60 | test-chmtime =-$((2*$week-30)) $BLOB_FILE && | |
25ee9731 JS |
61 | git gc && |
62 | test $((1 + $before)) = $(git count-objects | sed "s/ .*//") && | |
63 | test -f $BLOB_FILE && | |
98df233e | 64 | test-chmtime =-$((2*$week+1)) $BLOB_FILE && |
25ee9731 JS |
65 | git gc && |
66 | test $before = $(git count-objects | sed "s/ .*//") && | |
67 | ! test -f $BLOB_FILE | |
68 | ||
69 | ' | |
70 | ||
71 | test_expect_success 'gc: refuse to start with invalid gc.pruneExpire' ' | |
72 | ||
73 | git config gc.pruneExpire invalid && | |
74 | test_must_fail git gc | |
75 | ||
76 | ' | |
77 | ||
78 | test_expect_success 'gc: start with ok gc.pruneExpire' ' | |
79 | ||
80 | git config gc.pruneExpire 2.days.ago && | |
81 | git gc | |
82 | ||
83 | ' | |
84 | ||
0c62705a MB |
85 | test_expect_success 'prune: prune nonsense parameters' ' |
86 | ||
87 | test_must_fail git prune garbage && | |
88 | test_must_fail git prune --- && | |
89 | test_must_fail git prune --no-such-option | |
90 | ||
91 | ' | |
92 | ||
93 | test_expect_success 'prune: prune unreachable heads' ' | |
94 | ||
95 | git config core.logAllRefUpdates false && | |
96 | mv .git/logs .git/logs.old && | |
97 | : > file2 && | |
98 | git add file2 && | |
99 | git commit -m temporary && | |
100 | tmp_head=$(git rev-list -1 HEAD) && | |
101 | git reset HEAD^ && | |
102 | git prune && | |
103 | test_must_fail git reset $tmp_head -- | |
104 | ||
105 | ' | |
106 | ||
fe308f53 | 107 | test_expect_success 'prune: do not prune heads listed as an argument' ' |
0c62705a MB |
108 | |
109 | : > file2 && | |
110 | git add file2 && | |
111 | git commit -m temporary && | |
112 | tmp_head=$(git rev-list -1 HEAD) && | |
113 | git reset HEAD^ && | |
114 | git prune -- $tmp_head && | |
115 | git reset $tmp_head -- | |
116 | ||
117 | ' | |
118 | ||
58e9d9d4 JS |
119 | test_expect_success 'gc --no-prune' ' |
120 | ||
98df233e CB |
121 | add_blob && |
122 | test-chmtime =-$((5001*$day)) $BLOB_FILE && | |
58e9d9d4 JS |
123 | git config gc.pruneExpire 2.days.ago && |
124 | git gc --no-prune && | |
125 | test 1 = $(git count-objects | sed "s/ .*//") && | |
126 | test -f $BLOB_FILE | |
127 | ||
128 | ' | |
129 | ||
130 | test_expect_success 'gc respects gc.pruneExpire' ' | |
131 | ||
132 | git config gc.pruneExpire 5002.days.ago && | |
133 | git gc && | |
134 | test -f $BLOB_FILE && | |
135 | git config gc.pruneExpire 5000.days.ago && | |
136 | git gc && | |
137 | test ! -f $BLOB_FILE | |
138 | ||
139 | ' | |
140 | ||
141 | test_expect_success 'gc --prune=<date>' ' | |
142 | ||
98df233e CB |
143 | add_blob && |
144 | test-chmtime =-$((5001*$day)) $BLOB_FILE && | |
58e9d9d4 JS |
145 | git gc --prune=5002.days.ago && |
146 | test -f $BLOB_FILE && | |
147 | git gc --prune=5000.days.ago && | |
148 | test ! -f $BLOB_FILE | |
149 | ||
150 | ' | |
151 | ||
cbf731ed AS |
152 | test_expect_success 'gc --prune=never' ' |
153 | ||
154 | add_blob && | |
155 | git gc --prune=never && | |
156 | test -f $BLOB_FILE && | |
157 | git gc --prune=now && | |
158 | test ! -f $BLOB_FILE | |
159 | ||
160 | ' | |
161 | ||
162 | test_expect_success 'gc respects gc.pruneExpire=never' ' | |
163 | ||
164 | git config gc.pruneExpire never && | |
165 | add_blob && | |
166 | git gc && | |
167 | test -f $BLOB_FILE && | |
168 | git config gc.pruneExpire now && | |
169 | git gc && | |
170 | test ! -f $BLOB_FILE | |
171 | ||
172 | ' | |
173 | ||
174 | test_expect_success 'prune --expire=never' ' | |
175 | ||
176 | add_blob && | |
177 | git prune --expire=never && | |
178 | test -f $BLOB_FILE && | |
179 | git prune && | |
180 | test ! -f $BLOB_FILE | |
181 | ||
182 | ' | |
183 | ||
98df233e CB |
184 | test_expect_success 'gc: prune old objects after local clone' ' |
185 | add_blob && | |
186 | test-chmtime =-$((2*$week+1)) $BLOB_FILE && | |
187 | git clone --no-hardlinks . aclone && | |
188 | ( | |
189 | cd aclone && | |
190 | test 1 = $(git count-objects | sed "s/ .*//") && | |
191 | test -f $BLOB_FILE && | |
192 | git gc --prune && | |
193 | test 0 = $(git count-objects | sed "s/ .*//") && | |
194 | ! test -f $BLOB_FILE | |
195 | ) | |
196 | ' | |
197 | ||
543c5caa NTND |
198 | test_expect_success 'garbage report in count-objects -v' ' |
199 | : >.git/objects/pack/foo && | |
200 | : >.git/objects/pack/foo.bar && | |
201 | : >.git/objects/pack/foo.keep && | |
202 | : >.git/objects/pack/foo.pack && | |
203 | : >.git/objects/pack/fake.bar && | |
204 | : >.git/objects/pack/fake.keep && | |
205 | : >.git/objects/pack/fake.pack && | |
206 | : >.git/objects/pack/fake.idx && | |
207 | : >.git/objects/pack/fake2.keep && | |
208 | : >.git/objects/pack/fake3.idx && | |
209 | git count-objects -v 2>stderr && | |
210 | grep "index file .git/objects/pack/fake.idx is too small" stderr && | |
211 | grep "^warning:" stderr | sort >actual && | |
212 | cat >expected <<\EOF && | |
213 | warning: garbage found: .git/objects/pack/fake.bar | |
214 | warning: garbage found: .git/objects/pack/foo | |
215 | warning: garbage found: .git/objects/pack/foo.bar | |
235e8d59 | 216 | warning: no corresponding .idx or .pack: .git/objects/pack/fake2.keep |
543c5caa NTND |
217 | warning: no corresponding .idx: .git/objects/pack/foo.keep |
218 | warning: no corresponding .idx: .git/objects/pack/foo.pack | |
219 | warning: no corresponding .pack: .git/objects/pack/fake3.idx | |
220 | EOF | |
221 | test_cmp expected actual | |
222 | ' | |
223 | ||
eab3296c NTND |
224 | test_expect_success 'prune .git/shallow' ' |
225 | SHA1=`echo hi|git commit-tree HEAD^{tree}` && | |
226 | echo $SHA1 >.git/shallow && | |
227 | git prune --dry-run >out && | |
228 | grep $SHA1 .git/shallow && | |
229 | grep $SHA1 out && | |
230 | git prune && | |
231 | ! test -f .git/shallow | |
232 | ' | |
233 | ||
8464010f | 234 | test_done |