]> arthur.barton.de Git - bup.git/blob - t/test-rm.sh
Add bup prune-older command
[bup.git] / t / test-rm.sh
1 #!/usr/bin/env bash
2 . ./wvtest-bup.sh || exit $?
3 . ./t/lib.sh || exit $?
4
5 top="$(WVPASS pwd)" || exit $?
6 tmpdir="$(WVPASS wvmktempdir)" || exit $?
7
8 export BUP_DIR="$tmpdir/bup"
9 export GIT_DIR="$tmpdir/bup"
10
11
12 bup() { "$top/bup" "$@"; }
13 compare-trees() { "$top/t/compare-trees" "$@"; }
14
15 wv_matches_rx()
16 {
17     local caller_file=${BASH_SOURCE[0]}
18     local caller_line=${BASH_LINENO[0]}
19     local src="$caller_file:$caller_line"
20     if test $# -ne 2; then
21         echo "! $src wv_matches_rx requires 2 arguments FAILED" 1>&2
22         return
23     fi
24     local str="$1"
25     local rx="$2"
26     echo "Matching:" 1>&2 || exit $?
27     echo "$str" | sed 's/^\(.*\)/  \1/' 1>&2 || exit $?
28     echo "Against:" 1>&2 || exit $?
29     echo "$rx" | sed 's/^\(.*\)/  \1/' 1>&2 || exit $?
30     if [[ "$str" =~ $rx ]]; then
31         echo "! $src regex matches ok" 1>&2 || exit $?
32     else
33         echo "! $src regex doesn't match FAILED" 1>&2 || exit $?
34     fi
35 }
36
37
38 WVPASS bup init
39 WVPASS cd "$tmpdir"
40
41
42 WVSTART "rm /foo (lone branch)"
43 WVPASS mkdir src src/foo
44 WVPASS echo twisty-maze > src/1
45 WVPASS bup index src
46 WVPASS bup save -n src src
47 WVPASS "$top"/t/sync-tree bup/ bup-baseline/
48 # FIXME: test -n
49 WVPASS bup tick # Make sure we always get the timestamp changes below
50 WVPASS bup rm --unsafe /src
51 wv_matches_rx "$(compare-trees bup/ bup-baseline/)" \
52 '\*deleting[ ]+logs/refs/heads/src
53 \*deleting[ ]+refs/heads/src
54 \.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
55 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/'
56
57
58 WVSTART "rm /foo (one of many)"
59 WVPASS rm -rf bup
60 WVPASS mv bup-baseline bup
61 WVPASS echo twisty-maze > src/2
62 WVPASS bup index src
63 WVPASS bup save -n src-2 src
64 WVPASS echo twisty-maze > src/3
65 WVPASS bup index src
66 WVPASS bup save -n src-3 src
67 WVPASS "$top"/t/sync-tree bup/ bup-baseline/
68 WVPASS bup tick # Make sure we always get the timestamp changes below
69 WVPASS bup rm --unsafe /src
70 wv_matches_rx "$(compare-trees bup/ bup-baseline/)" \
71 "\*deleting[ ]+logs/refs/heads/src
72 \*deleting[ ]+refs/heads/src
73 \.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
74 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/"
75
76
77 WVSTART "rm /foo /bar (multiple of many)"
78 WVPASS rm -rf bup
79 WVPASS mv bup-baseline bup
80 WVPASS echo twisty-maze > src/4
81 WVPASS bup index src
82 WVPASS bup save -n src-4 src
83 WVPASS echo twisty-maze > src/5
84 WVPASS bup index src
85 WVPASS bup save -n src-5 src
86 WVPASS "$top"/t/sync-tree bup/ bup-baseline/
87 WVPASS bup tick # Make sure we always get the timestamp changes below
88 WVPASS bup rm --unsafe /src-2 /src-4
89 wv_matches_rx "$(compare-trees bup/ bup-baseline/)" \
90 "\*deleting[ ]+logs/refs/heads/src-4
91 \*deleting[ ]+logs/refs/heads/src-2
92 \*deleting[ ]+refs/heads/src-4
93 \*deleting[ ]+refs/heads/src-2
94 \.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
95 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/"
96
97
98 WVSTART "rm /foo /bar (all)"
99 WVPASS rm -rf bup
100 WVPASS mv bup-baseline bup
101 WVPASS "$top"/t/sync-tree bup/ bup-baseline/
102 WVPASS bup tick # Make sure we always get the timestamp changes below
103 WVPASS bup rm --unsafe /src /src-2 /src-3 /src-4 /src-5
104 wv_matches_rx "$(compare-trees bup/ bup-baseline/)" \
105 "\*deleting[ ]+logs/refs/heads/src-5
106 \*deleting[ ]+logs/refs/heads/src-4
107 \*deleting[ ]+logs/refs/heads/src-3
108 \*deleting[ ]+logs/refs/heads/src-2
109 \*deleting[ ]+logs/refs/heads/src
110 \*deleting[ ]+refs/heads/src-5
111 \*deleting[ ]+refs/heads/src-4
112 \*deleting[ ]+refs/heads/src-3
113 \*deleting[ ]+refs/heads/src-2
114 \*deleting[ ]+refs/heads/src
115 \.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
116 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/"
117
118
119 WVSTART "rm /foo/bar (lone save - equivalent to rm /foo)"
120 WVPASS rm -rf bup bup-baseline src
121 WVPASS bup init
122 WVPASS mkdir src
123 WVPASS echo twisty-maze > src/1
124 WVPASS bup index src
125 WVPASS bup save -n src src
126 WVPASS bup ls src > tmp-ls
127 save1="$(WVPASS head -n 1 tmp-ls)" || exit $?
128 WVPASS "$top"/t/sync-tree bup/ bup-baseline/
129 WVPASS bup tick # Make sure we always get the timestamp changes below
130 WVFAIL bup rm --unsafe /src/latest
131 WVPASS bup rm --unsafe /src/"$save1"
132 wv_matches_rx "$(compare-trees bup/ bup-baseline/)" \
133 "\*deleting[ ]+logs/refs/heads/src
134 \*deleting[ ]+refs/heads/src
135 \.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
136 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/"
137
138
139 verify-changes-caused-by-rewriting-save()
140 {
141     local before="$1" after="$2" tmpdir
142     tmpdir="$(WVPASS wvmktempdir)" || exit $?
143     (WVPASS cd "$before" && WVPASS find . | WVPASS sort) \
144         > "$tmpdir/before" || exit $?
145     (WVPASS cd "$after" && WVPASS find . | WVPASS sort) \
146         > "$tmpdir/after" || exit $?
147     local new_paths new_idx new_pack observed
148     new_paths="$(WVPASS comm -13 "$tmpdir/before" "$tmpdir/after")" || exit $?
149     new_idx="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.idx$' | cut -b 3-)" || exit $?
150     new_pack="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.pack$' | cut -b 3-)" || exit $?
151     wv_matches_rx "$(compare-trees "$after/" "$before/")" \
152 ">fcst\.\.\.[.]*[ ]+logs/refs/heads/src
153 \.d\.\.t\.\.\.[.]*[ ]+objects/
154 \.d\.\.t\.\.\.[.]*[ ]+objects/pack/
155 >fcst\.\.\.[.]*[ ]+objects/pack/bup\.bloom
156 >f\+\+\+\+\+\+\+[+]*[ ]+$new_idx
157 >f\+\+\+\+\+\+\+[+]*[ ]+$new_pack
158 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/
159 >fc\.t\.\.\.[.]*[ ]+refs/heads/src"
160     WVPASS rm -rf "$tmpdir"
161 }
162
163 commit-hash-n()
164 {
165     local n="$1" repo="$2" branch="$3"
166     GIT_DIR="$repo" WVPASS git rev-list --reverse "$branch" \
167         | WVPASS awk "FNR == $n"
168 }
169
170 rm-safe-cinfo()
171 {
172     local n="$1" repo="$2" branch="$3" hash
173     hash="$(commit-hash-n "$n" "$repo" "$branch")" || exit $?
174     local fmt='Tree: %T%n'
175     fmt="${fmt}Author: %an <%ae> %ai%n"
176     fmt="${fmt}Committer: %cn <%ce> %ci%n"
177     fmt="${fmt}%n%s%n%b"
178     GIT_DIR="$repo" WVPASS git log -n1 --pretty=format:"$fmt" "$hash"
179 }
180
181
182 WVSTART 'rm /foo/BAR (setup)'
183 WVPASS rm -rf bup bup-baseline src
184 WVPASS bup init
185 WVPASS mkdir src
186 WVPASS echo twisty-maze > src/1
187 WVPASS bup index src
188 WVPASS bup save -n src src
189 WVPASS echo twisty-maze > src/2
190 WVPASS bup index src
191 WVPASS bup tick
192 WVPASS bup save -n src src
193 WVPASS echo twisty-maze > src/3
194 WVPASS bup index src
195 WVPASS bup tick
196 WVPASS bup save -n src src
197 WVPASS mv bup bup-baseline
198 WVPASS bup tick # Make sure we always get the timestamp changes below
199
200
201 WVSTART "rm /foo/BAR (first of many)"
202 WVPASS "$top"/t/sync-tree bup-baseline/ bup/
203 WVPASS bup ls src > tmp-ls
204 victim="$(WVPASS head -n 1 tmp-ls)" || exit $?
205 WVPASS bup rm --unsafe /src/"$victim"
206 verify-changes-caused-by-rewriting-save bup-baseline bup
207 observed=$(WVPASS git rev-list src | WVPASS wc -l) || exit $?
208 WVPASSEQ 2 $observed
209 WVPASSEQ "$(rm-safe-cinfo 1 bup src)" "$(rm-safe-cinfo 2 bup-baseline src)"
210 WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
211
212
213 WVSTART "rm /foo/BAR (one of many)"
214 WVPASS "$top"/t/sync-tree bup-baseline/ bup/
215 victim="$(WVPASS bup ls src | tail -n +2 | head -n 1)" || exit $?
216 WVPASS bup rm --unsafe /src/"$victim"
217 verify-changes-caused-by-rewriting-save bup-baseline bup
218 observed=$(git rev-list src | wc -l) || exit $?
219 WVPASSEQ 2 $observed
220 WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
221 WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
222
223
224 WVSTART "rm /foo/BAR (last of many)"
225 WVPASS "$top"/t/sync-tree bup-baseline/ bup/
226 victim="$(WVPASS bup ls src | tail -n 2 | head -n 1)" || exit $?
227 WVPASS bup rm --unsafe -vv /src/"$victim"
228 wv_matches_rx "$(compare-trees bup/ bup-baseline/)" \
229 ">fcst\.\.\.[.]*[ ]+logs/refs/heads/src
230 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/
231 >fc\.t\.\.\.[.]*[ ]+refs/heads/src"
232 observed=$(git rev-list src | wc -l) || exit $?
233 WVPASSEQ 2 $observed
234 WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
235 WVPASSEQ "$(commit-hash-n 2 bup src)" "$(commit-hash-n 2 bup-baseline src)"
236
237
238 # FIXME: test that committer changes when rewriting, when appropriate
239
240 WVPASS rm -rf "$tmpdir"