]> arthur.barton.de Git - bup.git/blob - t/test-rm.sh
prune-older: keep most recent save in each period group
[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 observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
52 wv_matches_rx "$observed" \
53 '\*deleting[ ]+logs/refs/heads/src
54 \*deleting[ ]+refs/heads/src
55 \.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
56 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/'
57
58
59 WVSTART "rm /foo (one of many)"
60 WVPASS rm -rf bup
61 WVPASS mv bup-baseline bup
62 WVPASS echo twisty-maze > src/2
63 WVPASS bup index src
64 WVPASS bup save -n src-2 src
65 WVPASS echo twisty-maze > src/3
66 WVPASS bup index src
67 WVPASS bup save -n src-3 src
68 WVPASS "$top"/t/sync-tree bup/ bup-baseline/
69 WVPASS bup tick # Make sure we always get the timestamp changes below
70 WVPASS bup rm --unsafe /src
71 observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
72 wv_matches_rx "$observed" \
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 observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
92 wv_matches_rx "$observed" \
93 "\*deleting[ ]+logs/refs/heads/src-2
94 \*deleting[ ]+logs/refs/heads/src-4
95 \*deleting[ ]+refs/heads/src-2
96 \*deleting[ ]+refs/heads/src-4
97 \.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
98 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/"
99
100
101 WVSTART "rm /foo /bar (all)"
102 WVPASS rm -rf bup
103 WVPASS mv bup-baseline bup
104 WVPASS "$top"/t/sync-tree bup/ bup-baseline/
105 WVPASS bup tick # Make sure we always get the timestamp changes below
106 WVPASS bup rm --unsafe /src /src-2 /src-3 /src-4 /src-5
107 observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
108 wv_matches_rx "$observed" \
109 "\*deleting[ ]+logs/refs/heads/src
110 \*deleting[ ]+logs/refs/heads/src-2
111 \*deleting[ ]+logs/refs/heads/src-3
112 \*deleting[ ]+logs/refs/heads/src-4
113 \*deleting[ ]+logs/refs/heads/src-5
114 \*deleting[ ]+refs/heads/src
115 \*deleting[ ]+refs/heads/src-2
116 \*deleting[ ]+refs/heads/src-3
117 \*deleting[ ]+refs/heads/src-4
118 \*deleting[ ]+refs/heads/src-5
119 \.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
120 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/"
121
122
123 WVSTART "rm /foo/bar (lone save - equivalent to rm /foo)"
124 WVPASS rm -rf bup bup-baseline src
125 WVPASS bup init
126 WVPASS mkdir src
127 WVPASS echo twisty-maze > src/1
128 WVPASS bup index src
129 WVPASS bup save -n src src
130 WVPASS bup ls src > tmp-ls
131 save1="$(WVPASS head -n 1 tmp-ls)" || exit $?
132 WVPASS "$top"/t/sync-tree bup/ bup-baseline/
133 WVPASS bup tick # Make sure we always get the timestamp changes below
134 WVFAIL bup rm --unsafe /src/latest
135 WVPASS bup rm --unsafe /src/"$save1"
136 observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
137 wv_matches_rx "$observed" \
138 "\*deleting[ ]+logs/refs/heads/src
139 \*deleting[ ]+refs/heads/src
140 \.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
141 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/"
142
143
144 verify-changes-caused-by-rewriting-save()
145 {
146     local before="$1" after="$2" tmpdir
147     tmpdir="$(WVPASS wvmktempdir)" || exit $?
148     (WVPASS cd "$before" && WVPASS find . | WVPASS sort) \
149         > "$tmpdir/before" || exit $?
150     (WVPASS cd "$after" && WVPASS find . | WVPASS sort) \
151         > "$tmpdir/after" || exit $?
152     local new_paths new_idx new_pack observed
153     new_paths="$(WVPASS comm -13 "$tmpdir/before" "$tmpdir/after")" || exit $?
154     new_idx="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.idx$' | cut -b 3-)" || exit $?
155     new_pack="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.pack$' | cut -b 3-)" || exit $?
156     wv_matches_rx "$(compare-trees "$after/" "$before/")" \
157 ">fcst\.\.\.[.]*[ ]+logs/refs/heads/src
158 \.d\.\.t\.\.\.[.]*[ ]+objects/
159 \.d\.\.t\.\.\.[.]*[ ]+objects/pack/
160 >fcst\.\.\.[.]*[ ]+objects/pack/bup\.bloom
161 >f\+\+\+\+\+\+\+[+]*[ ]+$new_idx
162 >f\+\+\+\+\+\+\+[+]*[ ]+$new_pack
163 \.d\.\.t\.\.\.[.]*[ ]+refs/heads/
164 >fc\.t\.\.\.[.]*[ ]+refs/heads/src"
165     WVPASS rm -rf "$tmpdir"
166 }
167
168 commit-hash-n()
169 {
170     local n="$1" repo="$2" branch="$3"
171     GIT_DIR="$repo" WVPASS git rev-list --reverse "$branch" \
172         | WVPASS awk "FNR == $n"
173 }
174
175 rm-safe-cinfo()
176 {
177     local n="$1" repo="$2" branch="$3" hash
178     hash="$(commit-hash-n "$n" "$repo" "$branch")" || exit $?
179     local fmt='Tree: %T%n'
180     fmt="${fmt}Author: %an <%ae> %ai%n"
181     fmt="${fmt}Committer: %cn <%ce> %ci%n"
182     fmt="${fmt}%n%s%n%b"
183     GIT_DIR="$repo" WVPASS git log -n1 --pretty=format:"$fmt" "$hash"
184 }
185
186
187 WVSTART 'rm /foo/BAR (setup)'
188 WVPASS rm -rf bup bup-baseline src
189 WVPASS bup init
190 WVPASS mkdir src
191 WVPASS echo twisty-maze > src/1
192 WVPASS bup index src
193 WVPASS bup save -n src src
194 WVPASS echo twisty-maze > src/2
195 WVPASS bup index src
196 WVPASS bup tick
197 WVPASS bup save -n src src
198 WVPASS echo twisty-maze > src/3
199 WVPASS bup index src
200 WVPASS bup tick
201 WVPASS bup save -n src src
202 WVPASS mv bup bup-baseline
203 WVPASS bup tick # Make sure we always get the timestamp changes below
204
205
206 WVSTART "rm /foo/BAR (first of many)"
207 WVPASS "$top"/t/sync-tree bup-baseline/ bup/
208 WVPASS bup ls src > tmp-ls
209 victim="$(WVPASS head -n 1 tmp-ls)" || exit $?
210 WVPASS bup rm --unsafe /src/"$victim"
211 verify-changes-caused-by-rewriting-save bup-baseline bup
212 observed=$(WVPASS git rev-list src | WVPASS wc -l) || exit $?
213 WVPASSEQ 2 $observed
214 WVPASSEQ "$(rm-safe-cinfo 1 bup src)" "$(rm-safe-cinfo 2 bup-baseline src)"
215 WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
216
217
218 WVSTART "rm /foo/BAR (one of many)"
219 WVPASS "$top"/t/sync-tree bup-baseline/ bup/
220 victim="$(WVPASS bup ls src | tail -n +2 | head -n 1)" || exit $?
221 WVPASS bup rm --unsafe /src/"$victim"
222 verify-changes-caused-by-rewriting-save bup-baseline bup
223 observed=$(git rev-list src | wc -l) || exit $?
224 WVPASSEQ 2 $observed
225 WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
226 WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
227
228
229 WVSTART "rm /foo/BAR (last of many)"
230 WVPASS "$top"/t/sync-tree bup-baseline/ bup/
231 victim="$(WVPASS bup ls src | tail -n 2 | head -n 1)" || exit $?
232 WVPASS bup rm --unsafe -vv /src/"$victim"
233 observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
234 wv_matches_rx "$observed" \
235 "\.d\.\.t\.\.\.[.]*[ ]+refs/heads/
236 >fc\.t\.\.\.[.]*[ ]+refs/heads/src
237 >fcst\.\.\.[.]*[ ]+logs/refs/heads/src"
238 observed=$(git rev-list src | wc -l) || exit $?
239 WVPASSEQ 2 $observed
240 WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
241 WVPASSEQ "$(commit-hash-n 2 bup src)" "$(commit-hash-n 2 bup-baseline src)"
242
243
244 # FIXME: test that committer changes when rewriting, when appropriate
245
246 WVPASS rm -rf "$tmpdir"