Blame


1 b3d68e7f 2021-07-03 stsp #!/bin/sh
2 b3d68e7f 2021-07-03 stsp #
3 b3d68e7f 2021-07-03 stsp # Copyright (c) 2021 Stefan Sperling <stsp@openbsd.org>
4 b3d68e7f 2021-07-03 stsp #
5 b3d68e7f 2021-07-03 stsp # Permission to use, copy, modify, and distribute this software for any
6 b3d68e7f 2021-07-03 stsp # purpose with or without fee is hereby granted, provided that the above
7 b3d68e7f 2021-07-03 stsp # copyright notice and this permission notice appear in all copies.
8 b3d68e7f 2021-07-03 stsp #
9 b3d68e7f 2021-07-03 stsp # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 b3d68e7f 2021-07-03 stsp # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 b3d68e7f 2021-07-03 stsp # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 b3d68e7f 2021-07-03 stsp # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 b3d68e7f 2021-07-03 stsp # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 b3d68e7f 2021-07-03 stsp # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 b3d68e7f 2021-07-03 stsp # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 b3d68e7f 2021-07-03 stsp
17 b3d68e7f 2021-07-03 stsp . ./common.sh
18 b3d68e7f 2021-07-03 stsp
19 b3d68e7f 2021-07-03 stsp test_cleanup_unreferenced_loose_objects() {
20 b3d68e7f 2021-07-03 stsp local testroot=`test_init cleanup_unreferenced_loose_objects`
21 b3d68e7f 2021-07-03 stsp
22 b3d68e7f 2021-07-03 stsp nloose0=`gotadmin info -r $testroot/repo | grep '^loose objects:' | \
23 b3d68e7f 2021-07-03 stsp cut -d ':' -f 2 | tr -d ' '`
24 b3d68e7f 2021-07-03 stsp if [ "$nloose0" != "8" ]; then
25 b3d68e7f 2021-07-03 stsp echo "unexpected number of loose objects: $nloose0" >&2
26 b3d68e7f 2021-07-03 stsp test_done "$testroot" "1"
27 b3d68e7f 2021-07-03 stsp return 1
28 b3d68e7f 2021-07-03 stsp fi
29 b3d68e7f 2021-07-03 stsp
30 b3d68e7f 2021-07-03 stsp # create a branch with some changes
31 b3d68e7f 2021-07-03 stsp got branch -r $testroot/repo newbranch >/dev/null
32 b3d68e7f 2021-07-03 stsp
33 b3d68e7f 2021-07-03 stsp got checkout -b newbranch $testroot/repo $testroot/wt >/dev/null
34 b3d68e7f 2021-07-03 stsp ret="$?"
35 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
36 b3d68e7f 2021-07-03 stsp echo "got checkout command failed unexpectedly"
37 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
38 b3d68e7f 2021-07-03 stsp return 1
39 b3d68e7f 2021-07-03 stsp fi
40 b3d68e7f 2021-07-03 stsp
41 b3d68e7f 2021-07-03 stsp echo 'foo' > $testroot/wt/foo
42 b3d68e7f 2021-07-03 stsp (cd $testroot/wt && got add foo > /dev/null)
43 b3d68e7f 2021-07-03 stsp echo 'modified alpha' > $testroot/wt/alpha
44 b3d68e7f 2021-07-03 stsp (cd $testroot/wt && got commit -m 'newbranch commit' > /dev/null)
45 b3d68e7f 2021-07-03 stsp local commit1=`git_show_branch_head $testroot/repo newbranch`
46 b3d68e7f 2021-07-03 stsp local tree1=`got cat -r $testroot/repo $newbranch_commit | \
47 b3d68e7f 2021-07-03 stsp grep ^tree | cut -d ' ' -f2`
48 b3d68e7f 2021-07-03 stsp local alpha1=`got tree -r $testroot/repo -i -c $commit1 | \
49 b3d68e7f 2021-07-03 stsp grep "[0-9a-f] alpha$" | cut -d' ' -f 1`
50 b3d68e7f 2021-07-03 stsp local foo1=`got tree -r $testroot/repo -i -c $commit1 | \
51 b3d68e7f 2021-07-03 stsp grep "[0-9a-f] foo$" | cut -d' ' -f 1`
52 b3d68e7f 2021-07-03 stsp
53 b3d68e7f 2021-07-03 stsp nloose1=`gotadmin info -r $testroot/repo | grep '^loose objects:' | \
54 b3d68e7f 2021-07-03 stsp cut -d ':' -f 2 | tr -d ' '`
55 b3d68e7f 2021-07-03 stsp if [ "$nloose1" != "12" ]; then
56 b3d68e7f 2021-07-03 stsp echo "unexpected number of loose objects: $nloose1" >&2
57 b3d68e7f 2021-07-03 stsp test_done "$testroot" "1"
58 b3d68e7f 2021-07-03 stsp return 1
59 b3d68e7f 2021-07-03 stsp fi
60 b3d68e7f 2021-07-03 stsp
61 b3d68e7f 2021-07-03 stsp # delete the branch
62 b3d68e7f 2021-07-03 stsp got branch -r $testroot/repo -d newbranch >/dev/null
63 b3d68e7f 2021-07-03 stsp
64 b3d68e7f 2021-07-03 stsp # remove worktree's base commit reference, which points at the branch
65 b3d68e7f 2021-07-03 stsp wt_uuid=`(cd $testroot/wt && got info | grep 'UUID:' | \
66 b3d68e7f 2021-07-03 stsp cut -d ':' -f 2 | tr -d ' ')`
67 b3d68e7f 2021-07-03 stsp got ref -r $testroot/repo -d "refs/got/worktree/base-$wt_uuid"
68 b3d68e7f 2021-07-03 stsp
69 b3d68e7f 2021-07-03 stsp # cleanup -n should not remove any objects
70 b3d68e7f 2021-07-03 stsp ls -1 -R $testroot/repo/.git/objects > $testroot/objects-before
71 b3d68e7f 2021-07-03 stsp gotadmin cleanup -n -q -r $testroot/repo > $testroot/stdout
72 b3d68e7f 2021-07-03 stsp echo -n > $testroot/stdout.expected
73 b3d68e7f 2021-07-03 stsp cmp -s $testroot/stdout.expected $testroot/stdout
74 b3d68e7f 2021-07-03 stsp ret="$?"
75 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
76 b3d68e7f 2021-07-03 stsp diff -u $testroot/stdout.expected $testroot/stdout
77 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
78 b3d68e7f 2021-07-03 stsp return 1
79 b3d68e7f 2021-07-03 stsp fi
80 b3d68e7f 2021-07-03 stsp ls -1 -R $testroot/repo/.git/objects > $testroot/objects-after
81 b3d68e7f 2021-07-03 stsp cmp -s $testroot/objects-before $testroot/objects-after
82 b3d68e7f 2021-07-03 stsp ret="$?"
83 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
84 b3d68e7f 2021-07-03 stsp diff -u $testroot/objects-before $testroot/objects-after
85 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
86 b3d68e7f 2021-07-03 stsp return 1
87 b3d68e7f 2021-07-03 stsp fi
88 b3d68e7f 2021-07-03 stsp
89 b3d68e7f 2021-07-03 stsp # cleanup should remove loose objects that belonged to the branch
90 b3d68e7f 2021-07-03 stsp gotadmin cleanup -q -r $testroot/repo > $testroot/stdout
91 b3d68e7f 2021-07-03 stsp ret="$?"
92 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
93 b3d68e7f 2021-07-03 stsp echo "gotadmin cleanup failed unexpectedly" >&2
94 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
95 b3d68e7f 2021-07-03 stsp return 1
96 b3d68e7f 2021-07-03 stsp fi
97 b3d68e7f 2021-07-03 stsp echo -n > $testroot/stdout.expected
98 b3d68e7f 2021-07-03 stsp cmp -s $testroot/stdout.expected $testroot/stdout
99 b3d68e7f 2021-07-03 stsp ret="$?"
100 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
101 b3d68e7f 2021-07-03 stsp diff -u $testroot/stdout.expected $testroot/stdout
102 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
103 b3d68e7f 2021-07-03 stsp return 1
104 b3d68e7f 2021-07-03 stsp fi
105 b3d68e7f 2021-07-03 stsp
106 b3d68e7f 2021-07-03 stsp nloose2=`gotadmin info -r $testroot/repo | grep '^loose objects:' | \
107 b3d68e7f 2021-07-03 stsp cut -d ':' -f 2 | tr -d ' '`
108 b3d68e7f 2021-07-03 stsp if [ "$nloose2" != "$nloose0" ]; then
109 b3d68e7f 2021-07-03 stsp echo "unexpected number of loose objects: $nloose2" >&2
110 b3d68e7f 2021-07-03 stsp test_done "$testroot" "1"
111 b3d68e7f 2021-07-03 stsp return 1
112 b3d68e7f 2021-07-03 stsp fi
113 b3d68e7f 2021-07-03 stsp
114 b3d68e7f 2021-07-03 stsp for id in $commit1 $tree1 $alpha1 $foo1; do
115 b3d68e7f 2021-07-03 stsp path=`get_loose_object_path $testroot/repo $id`
116 b3d68e7f 2021-07-03 stsp if [ -e "$path" ]; then
117 b3d68e7f 2021-07-03 stsp echo "loose object $path was not purged" >&2
118 b3d68e7f 2021-07-03 stsp ret=1
119 b3d68e7f 2021-07-03 stsp break
120 b3d68e7f 2021-07-03 stsp fi
121 b3d68e7f 2021-07-03 stsp done
122 b3d68e7f 2021-07-03 stsp
123 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
124 b3d68e7f 2021-07-03 stsp }
125 b3d68e7f 2021-07-03 stsp
126 b3d68e7f 2021-07-03 stsp test_cleanup_redundant_loose_objects() {
127 b3d68e7f 2021-07-03 stsp local testroot=`test_init cleanup_redundant_loose_objects`
128 b3d68e7f 2021-07-03 stsp
129 b3d68e7f 2021-07-03 stsp # tags should also be packed
130 b3d68e7f 2021-07-03 stsp got tag -r $testroot/repo -m 1.0 1.0 >/dev/null
131 b3d68e7f 2021-07-03 stsp
132 b3d68e7f 2021-07-03 stsp nloose0=`gotadmin info -r $testroot/repo | grep '^loose objects:' | \
133 b3d68e7f 2021-07-03 stsp cut -d ':' -f 2 | tr -d ' '`
134 b3d68e7f 2021-07-03 stsp if [ "$nloose0" != "9" ]; then
135 b3d68e7f 2021-07-03 stsp echo "unexpected number of loose objects: $nloose0" >&2
136 b3d68e7f 2021-07-03 stsp test_done "$testroot" "1"
137 b3d68e7f 2021-07-03 stsp return 1
138 b3d68e7f 2021-07-03 stsp fi
139 b3d68e7f 2021-07-03 stsp
140 b3d68e7f 2021-07-03 stsp # no pack files should exist yet
141 b3d68e7f 2021-07-03 stsp ls $testroot/repo/.git/objects/pack/ > $testroot/stdout
142 b3d68e7f 2021-07-03 stsp ret="$?"
143 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
144 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
145 b3d68e7f 2021-07-03 stsp return 1
146 b3d68e7f 2021-07-03 stsp fi
147 b3d68e7f 2021-07-03 stsp echo -n > $testroot/stdout.expected
148 b3d68e7f 2021-07-03 stsp cmp -s $testroot/stdout.expected $testroot/stdout
149 b3d68e7f 2021-07-03 stsp ret="$?"
150 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
151 b3d68e7f 2021-07-03 stsp diff -u $testroot/stdout.expected $testroot/stdout
152 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
153 b3d68e7f 2021-07-03 stsp return 1
154 b3d68e7f 2021-07-03 stsp fi
155 b3d68e7f 2021-07-03 stsp
156 b3d68e7f 2021-07-03 stsp gotadmin pack -r $testroot/repo > /dev/null
157 b3d68e7f 2021-07-03 stsp
158 b3d68e7f 2021-07-03 stsp npacked0=`gotadmin info -r $testroot/repo | grep '^packed objects:' | \
159 b3d68e7f 2021-07-03 stsp cut -d ':' -f 2 | tr -d ' '`
160 b3d68e7f 2021-07-03 stsp if [ "$npacked0" != "9" ]; then
161 b3d68e7f 2021-07-03 stsp echo "unexpected number of loose objects: $npacked0" >&2
162 b3d68e7f 2021-07-03 stsp test_done "$testroot" "1"
163 b3d68e7f 2021-07-03 stsp return 1
164 b3d68e7f 2021-07-03 stsp fi
165 b3d68e7f 2021-07-03 stsp
166 b3d68e7f 2021-07-03 stsp # cleanup -n should not remove any objects
167 b3d68e7f 2021-07-03 stsp ls -1 -R $testroot/repo/.git/objects > $testroot/objects-before
168 b3d68e7f 2021-07-03 stsp gotadmin cleanup -n -q -r $testroot/repo > $testroot/stdout
169 b3d68e7f 2021-07-03 stsp echo -n > $testroot/stdout.expected
170 b3d68e7f 2021-07-03 stsp cmp -s $testroot/stdout.expected $testroot/stdout
171 b3d68e7f 2021-07-03 stsp ret="$?"
172 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
173 b3d68e7f 2021-07-03 stsp diff -u $testroot/stdout.expected $testroot/stdout
174 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
175 b3d68e7f 2021-07-03 stsp return 1
176 b3d68e7f 2021-07-03 stsp fi
177 b3d68e7f 2021-07-03 stsp ls -1 -R $testroot/repo/.git/objects > $testroot/objects-after
178 b3d68e7f 2021-07-03 stsp cmp -s $testroot/objects-before $testroot/objects-after
179 b3d68e7f 2021-07-03 stsp ret="$?"
180 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
181 b3d68e7f 2021-07-03 stsp diff -u $testroot/objects-before $testroot/objects-after
182 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
183 b3d68e7f 2021-07-03 stsp return 1
184 b3d68e7f 2021-07-03 stsp fi
185 b3d68e7f 2021-07-03 stsp
186 b3d68e7f 2021-07-03 stsp nloose1=`gotadmin info -r $testroot/repo | grep '^loose objects:' | \
187 b3d68e7f 2021-07-03 stsp cut -d ':' -f 2 | tr -d ' '`
188 b3d68e7f 2021-07-03 stsp if [ "$nloose1" != "$nloose0" ]; then
189 b3d68e7f 2021-07-03 stsp echo "unexpected number of loose objects: $nloose1" >&2
190 b3d68e7f 2021-07-03 stsp test_done "$testroot" "1"
191 b3d68e7f 2021-07-03 stsp return 1
192 b3d68e7f 2021-07-03 stsp fi
193 b3d68e7f 2021-07-03 stsp
194 b3d68e7f 2021-07-03 stsp # cleanup should remove all loose objects
195 b3d68e7f 2021-07-03 stsp gotadmin cleanup -q -r $testroot/repo > $testroot/stdout
196 b3d68e7f 2021-07-03 stsp ret="$?"
197 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
198 b3d68e7f 2021-07-03 stsp echo "gotadmin cleanup failed unexpectedly" >&2
199 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
200 b3d68e7f 2021-07-03 stsp return 1
201 b3d68e7f 2021-07-03 stsp fi
202 b3d68e7f 2021-07-03 stsp echo -n > $testroot/stdout.expected
203 b3d68e7f 2021-07-03 stsp cmp -s $testroot/stdout.expected $testroot/stdout
204 b3d68e7f 2021-07-03 stsp ret="$?"
205 b3d68e7f 2021-07-03 stsp if [ "$ret" != "0" ]; then
206 b3d68e7f 2021-07-03 stsp diff -u $testroot/stdout.expected $testroot/stdout
207 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
208 b3d68e7f 2021-07-03 stsp return 1
209 b3d68e7f 2021-07-03 stsp fi
210 b3d68e7f 2021-07-03 stsp
211 b3d68e7f 2021-07-03 stsp nloose2=`gotadmin info -r $testroot/repo | grep '^loose objects:' | \
212 b3d68e7f 2021-07-03 stsp cut -d ':' -f 2 | tr -d ' '`
213 b3d68e7f 2021-07-03 stsp if [ "$nloose2" != "0" ]; then
214 b3d68e7f 2021-07-03 stsp echo "unexpected number of loose objects: $nloose2" >&2
215 b3d68e7f 2021-07-03 stsp test_done "$testroot" "1"
216 b3d68e7f 2021-07-03 stsp return 1
217 b3d68e7f 2021-07-03 stsp fi
218 b3d68e7f 2021-07-03 stsp
219 b3d68e7f 2021-07-03 stsp for d in $testroot/repo/.git/objects/[0-9a-f][0-9a-f]; do
220 b3d68e7f 2021-07-03 stsp id0=`basename $d`
221 b3d68e7f 2021-07-03 stsp ret=0
222 b3d68e7f 2021-07-03 stsp for e in `ls $d`; do
223 b3d68e7f 2021-07-03 stsp obj_id=${id0}${e}
224 b3d68e7f 2021-07-03 stsp echo "loose object $obj_id was not purged" >&2
225 b3d68e7f 2021-07-03 stsp ret=1
226 b3d68e7f 2021-07-03 stsp break
227 b3d68e7f 2021-07-03 stsp done
228 b3d68e7f 2021-07-03 stsp if [ "$ret" == "1" ]; then
229 b3d68e7f 2021-07-03 stsp break
230 b3d68e7f 2021-07-03 stsp fi
231 b3d68e7f 2021-07-03 stsp done
232 b3d68e7f 2021-07-03 stsp
233 b3d68e7f 2021-07-03 stsp test_done "$testroot" "$ret"
234 b3d68e7f 2021-07-03 stsp }
235 b3d68e7f 2021-07-03 stsp
236 b3d68e7f 2021-07-03 stsp test_parseargs "$@"
237 b3d68e7f 2021-07-03 stsp run_test test_cleanup_unreferenced_loose_objects
238 b3d68e7f 2021-07-03 stsp run_test test_cleanup_redundant_loose_objects