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