1#!/bin/sh
2#
3# Copyright (c) 2007 Junio C Hamano
4#
56
test_description='Test prune and reflog expiration'
7. ./test-lib.sh
89
check_have () {
10gaah= &&
11for N in "$@"
12do
13eval "o=\$$N" && git cat-file -t $o || {
14echo Gaah $N
15gaah=$N
16break
17}
18done &&
19test -z "$gaah"
20}
2122
check_fsck () {
23output=$(git fsck --full)
24case "$1" in
25'')
26test -z "$output" ;;
27*)
28echo "$output" | grep "$1" ;;
29esac
30}
3132
corrupt () {
33aa=${1%??????????????????????????????????????} zz=${1#??}
34mv .git/objects/$aa/$zz .git/$aa$zz
35}
3637
recover () {
38aa=${1%??????????????????????????????????????} zz=${1#??}
39mkdir -p .git/objects/$aa
40mv .git/$aa$zz .git/objects/$aa/$zz
41}
4243
check_dont_have () {
44gaah= &&
45for N in "$@"
46do
47eval "o=\$$N"
48git cat-file -t $o && {
49echo Gaah $N
50gaah=$N
51break
52}
53done
54test -z "$gaah"
55}
5657
test_expect_success setup '
58mkdir -p A/B &&
59echo rat >C &&
60echo ox >A/D &&
61echo tiger >A/B/E &&
62git add . &&
6364
test_tick && git commit -m rabbit &&
65H=`git rev-parse --verify HEAD` &&
66A=`git rev-parse --verify HEAD:A` &&
67B=`git rev-parse --verify HEAD:A/B` &&
68C=`git rev-parse --verify HEAD:C` &&
69D=`git rev-parse --verify HEAD:A/D` &&
70E=`git rev-parse --verify HEAD:A/B/E` &&
71check_fsck &&
7273
test_chmod +x C &&
74git add C &&
75test_tick && git commit -m dragon &&
76L=`git rev-parse --verify HEAD` &&
77check_fsck &&
7879
rm -f C A/B/E &&
80echo snake >F &&
81echo horse >A/G &&
82git add F A/G &&
83test_tick && git commit -a -m sheep &&
84F=`git rev-parse --verify HEAD:F` &&
85G=`git rev-parse --verify HEAD:A/G` &&
86I=`git rev-parse --verify HEAD:A` &&
87J=`git rev-parse --verify HEAD` &&
88check_fsck &&
8990
rm -f A/G &&
91test_tick && git commit -a -m monkey &&
92K=`git rev-parse --verify HEAD` &&
93check_fsck &&
9495
check_have A B C D E F G H I J K L &&
9697
git prune &&
9899
check_have A B C D E F G H I J K L &&
100101
check_fsck &&
102103
test_line_count = 4 .git/logs/refs/heads/master
104'
105106
test_expect_success rewind '
107test_tick && git reset --hard HEAD~2 &&
108test -f C &&
109test -f A/B/E &&
110! test -f F &&
111! test -f A/G &&
112113
check_have A B C D E F G H I J K L &&
114115
git prune &&
116117
check_have A B C D E F G H I J K L &&
118119
test_line_count = 5 .git/logs/refs/heads/master
120'
121122
test_expect_success 'corrupt and check' '
123124
corrupt $F &&
125check_fsck "missing blob $F"
126127
'
128129
test_expect_success 'reflog expire --dry-run should not touch reflog' '
130131
git reflog expire --dry-run \
132--expire=$(($test_tick - 10000)) \
133--expire-unreachable=$(($test_tick - 10000)) \
134--stale-fix \
135--all &&
136137
test_line_count = 5 .git/logs/refs/heads/master &&
138139
check_fsck "missing blob $F"
140'
141142
test_expect_success 'reflog expire' '
143144
git reflog expire --verbose \
145--expire=$(($test_tick - 10000)) \
146--expire-unreachable=$(($test_tick - 10000)) \
147--stale-fix \
148--all &&
149150
test_line_count = 2 .git/logs/refs/heads/master &&
151152
check_fsck "dangling commit $K"
153'
154155
test_expect_success 'prune and fsck' '
156157
git prune &&
158check_fsck &&
159160
check_have A B C D E H L &&
161check_dont_have F G I J K
162163
'
164165
test_expect_success 'recover and check' '
166167
recover $F &&
168check_fsck "dangling blob $F"
169170
'
171172
test_expect_success 'delete' '
173echo 1 > C &&
174test_tick &&
175git commit -m rat C &&
176177
echo 2 > C &&
178test_tick &&
179git commit -m ox C &&
180181
echo 3 > C &&
182test_tick &&
183git commit -m tiger C &&
184185
HEAD_entry_count=$(git reflog | wc -l) &&
186master_entry_count=$(git reflog show master | wc -l) &&
187188
test $HEAD_entry_count = 5 &&
189test $master_entry_count = 5 &&
190191
192
git reflog delete master@{1} &&
193git reflog show master > output &&
194test $(($master_entry_count - 1)) = $(wc -l < output) &&
195test $HEAD_entry_count = $(git reflog | wc -l) &&
196! grep ox < output &&
197198
master_entry_count=$(wc -l < output) &&
199200
git reflog delete HEAD@{1} &&
201test $(($HEAD_entry_count -1)) = $(git reflog | wc -l) &&
202test $master_entry_count = $(git reflog show master | wc -l) &&
203204
HEAD_entry_count=$(git reflog | wc -l) &&
205206
git reflog delete master@{07.04.2005.15:15:00.-0700} &&
207git reflog show master > output &&
208test $(($master_entry_count - 1)) = $(wc -l < output) &&
209! grep dragon < output
210211
'
212213
test_expect_success 'rewind2' '
214215
test_tick && git reset --hard HEAD~2 &&
216test_line_count = 4 .git/logs/refs/heads/master
217'
218219
test_expect_success '--expire=never' '
220221
git reflog expire --verbose \
222--expire=never \
223--expire-unreachable=never \
224--all &&
225test_line_count = 4 .git/logs/refs/heads/master
226'
227228
test_expect_success 'gc.reflogexpire=never' '
229230
git config gc.reflogexpire never &&
231git config gc.reflogexpireunreachable never &&
232git reflog expire --verbose --all &&
233test_line_count = 4 .git/logs/refs/heads/master
234'
235236
test_expect_success 'gc.reflogexpire=false' '
237238
git config gc.reflogexpire false &&
239git config gc.reflogexpireunreachable false &&
240git reflog expire --verbose --all &&
241test_line_count = 4 .git/logs/refs/heads/master &&
242243
git config --unset gc.reflogexpire &&
244git config --unset gc.reflogexpireunreachable
245246
'
247248
test_done