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