chiark / gitweb /
dgit(1): don't have pbuilder description refer to sbuild description
[dgit.git] / tests / lib-build-modes
1
2 bm-prep-ownpackage-branches () {
3         cat <<'END' >$tmp/stunt-git
4 #!/bin/sh -e
5 case "$*" in
6 *clean*) echo >&2 "BUILD-MODES PROGRAM git $*" ;;
7 esac
8 exec git "$@"
9 END
10         chmod +x $tmp/stunt-git
11
12         bm_branches="$1"
13 }
14
15 bm-prep () {
16         t-tstunt-parsechangelog
17
18         t-prep-newpackage example 1.0
19
20         cd $p
21
22         git checkout -b bad-build-deps indep-arch
23         perl -pe 's/Build-Depends.*/$&, x-dgit-no-such-package/' \
24                 -i debian/control
25         git commit -a -m bad-build-deps
26
27         bm-prep-ownpackage-branches 'indep-arch bad-build-deps'
28
29         if zgrep 'dpkg-buildpackage: Make dependency checks fatal for -S' \
30                 /usr/share/doc/dpkg-dev/changelog.gz; then
31                         dpkgbuildpackage_deps_for_clean=true
32         else
33                         dpkgbuildpackage_deps_for_clean=false
34         fi
35
36         cleanmodes_default="git none dpkg-source dpkg-source-d"
37         cleanmodes_all="$cleanmodes_default git-ff check"
38         cleanmodes="$cleanmodes_default"
39 }
40
41 bm-gbp-example-acts () {
42         t-gbp-example-prep
43
44         git checkout -b for-build-modes qc/quilt-tip-2
45         # build-modes cannot cope with branches containing /
46
47         bm-prep-ownpackage-branches for-build-modes
48
49         cleanmodes='git dpkg-source'
50
51         for act in "$@"; do
52                 bm-guess-e-source-e-targets "$act"
53                 real_act="--quilt=gbp $act"
54                 case "$act" in
55                 sbuild*)    bm_quirk_after_act=bm-quirk-sbuild-after-act ;;
56                 gbp-*)      real_act="$real_act --git-ignore-branch" ;;
57                 *)          bm_quirk_after_act='' ;;
58                 esac
59                 bm-act-iterate
60         done
61 }
62
63 bm-guess-e-source-e-targets () {
64         local some_act=$1
65         case "$some_act" in
66         sbuild*" --no-arch-all"*)
67                 e_source=true;  e_targets='build-arch binary-arch'      ;;
68         build-source)
69                 e_source=true;  e_targets=''                            ;;
70         *" -b") e_source=false; e_targets='build binary'                ;;
71         *" -B") e_source=false; e_targets='build-arch binary-arch'      ;;
72         *" -A") e_source=false; e_targets='build-indep binary-indep'    ;;
73         *" -S") e_source=true;  e_targets=' '                           ;;
74         *" -F") e_source=true;  e_targets='build binary'                ;;
75         *" -G") e_source=true;  e_targets='build-arch binary-arch'      ;;
76         *" -g") e_source=true;  e_targets='build-indep binary-indep'    ;;
77         *)      e_source=true;  e_targets='build binary'                ;;
78         esac
79 }
80
81 bm-quirk-sbuild-after-act () {
82         # sbuild likes to run the package clean target in the chroot,
83         # which isn't necessary in our case.  We don't disable it in
84         # dgit because we want to do what sbuild does, in case there
85         # are packages which don't build unless their clean target was
86         # run.  We know it must be running it in the chroot because we
87         # provide sbuild with the dsc, not the tree, so we simply
88         # ignore all executions of the clean target by schroot.
89         local arch; arch=$(dpkg-architecture -qDEB_BUILD_ARCH)
90         local sblog=$bpd/example_${v}_$arch.build
91         if [ -e $sblog ]; then
92                 sed '
93                         s/^EXAMPLE RULES TARGET clean/HOOK SUPPRESSED &/;
94                 ' <$sblog >>$bmlog
95         else
96                 echo "SBUILD LOG FILE ($sblog) MISSING"
97         fi
98 }
99
100 bm-report-test () {
101         local desc=$1; shift
102         if "$@"; then
103                 echo >&4 "$desc EXISTS"
104         else
105                 echo >&4 "$desc MISSING"
106         fi
107 }
108
109 bm-build-deps-ok () {
110         case "$branch" in
111         *bad-build-deps*)       return 1        ;;
112         *)                      return 0        ;;
113         esac
114 }
115
116 bm-compute-expected () {
117         require_fail=unexpect # or required
118         tolerate_fail=unexpect # or tolerate
119
120         exec 4>$bmexp
121         echo >&4 "$heading"
122
123         local eff_cleanmode=$cleanmode
124
125         case "$e_targets" in
126         *[^\ ]*)
127                 ;;
128         *)
129                 # dgit won't bother cleaning the tree
130                 # if no build is going to be run
131                 eff_cleanmode=none
132                 ;;
133         esac
134
135         case "$act" in
136         sbuild*)
137                 # dgit sbuild won't bother cleaning the tree
138                 # because it doesn't need to to make a .dsc for sbuild
139                 eff_cleanmode=none
140                 ;;
141         esac
142
143         # we are running the builder in-tree ?
144         # when we have --include-dirty, we will want to check
145         # that too and reset eff_cleanmode to $cleanmode
146
147         case $eff_cleanmode in
148         git)            echo >&4 'BUILD-MODES PROGRAM git clean -xdf' ;;
149         git-ff)         echo >&4 'BUILD-MODES PROGRAM git clean -xdff' ;;
150         check)          echo >&4 'BUILD-MODES PROGRAM git clean -xdn' ;;
151         dpkg-source-d)  echo >&4 "EXAMPLE RULES TARGET clean" ;;
152         dpkg-source)    bm-build-deps-ok || tolerate_fail=tolerate
153                         echo >&4 "EXAMPLE RULES TARGET clean"
154                         ;;
155         none)           ;;
156         *)              fail "t-compute-expected-run $cleanmode ??" ;;
157         esac
158
159         if [ "x$e_targets" != x ]; then
160                 # e_targets can be " " to mean `/may/ fail due to b-d'
161                 bm-build-deps-ok || tolerate_fail=tolerate
162         fi
163
164         for t in $e_targets; do
165                 bm-build-deps-ok || require_fail=required
166                 echo >&4 "EXAMPLE RULES TARGET $t"
167         done
168
169         bm-report-test "SOURCE FILE" $e_source
170         bm-report-test "SOURCE IN CHANGES" $e_source
171         bm-report-test "DEBS IN CHANGES" expr "$e_targets" : '.*binary.*'
172
173         exec 4>&-
174 }
175
176 bm-run-one () {
177         local args="$DGIT_TEST_BM_BASEARGS --clean=$cleanmode $real_act"
178
179         bmid="$act,$cleanmode,$branch"
180         bmid=${bmid// /_}
181
182         rm -f $bpd/${p}_{v}_*.changes
183
184         heading="===== [$bmid] dgit $args ====="
185
186         bmlog=$tmp/run.$bmid.output
187         bmexp=$tmp/run.$bmid.expected
188         bmgot=$tmp/run.$bmid.results
189
190         bm-compute-expected
191
192         git checkout $branch
193         git clean -xdf # since we might not do any actual cleaning
194
195         dsc="$bpd/example_$v.dsc"
196         rm -f $dsc
197
198         set +o pipefail
199         t-dgit --rm-old-changes --git=$tmp/stunt-git $args 2>&1 | tee $bmlog
200         local ps="${PIPESTATUS[*]}"
201         set -o pipefail
202
203         $bm_quirk_after_act
204
205         exec 4>$bmgot
206         echo >&4 "$heading"
207
208         case $ps in
209         "0 0")  actual_status=success ;;
210         *" 0")  actual_status=failure; echo >&4 "OPERATION FAILED"; ;;
211         *)      fail "tee failed" ;;
212         esac
213
214         case "$require_fail-$tolerate_fail-$actual_status" in
215         required-********-failure) echo >>$bmexp "REQUIRED FAILURE" ;;
216         ********-tolerate-failure) echo >>$bmexp "TOLERATED FAILURE" ;;
217         unexpect-********-success) ;;
218         *)      fail "RF=$require_fail TF=$tolerate_fail AS=$actual_status" ;;
219         esac
220
221         egrep >&4 '^EXAMPLE RULES TARGET|^BUILD-MODES' $bmlog || [ $? = 1 ]
222
223         bm-report-test "SOURCE FILE" [ -e $dsc ]
224
225         if [ $actual_status = success ]; then
226                 local changes; changes=$(echo $bpd/example_${v}_*.changes)
227                 case "$changes" in
228                 *' '*)  fail "build generated ambiguous .changes: $changes" ;;
229                 esac
230
231                 perl -ne 'print if m/^files:/i ... m/^\S/' \
232                         <$changes >$changes.files
233
234                 bm-report-test "SOURCE IN CHANGES" grep '\.dsc$' $changes.files
235                 bm-report-test "DEBS IN CHANGES" grep '\.deb$' $changes.files
236         fi
237
238         exec 4>&-
239
240         $bm_quirk_before_diff
241
242         [ $actual_status = failure ] || diff -U10 $bmexp $bmgot
243 }
244
245 bm-act-iterate () {
246         for cleanmode in $cleanmodes; do
247                 for branch in $bm_branches; do
248                         bm-run-one
249                 done
250         done
251         : bm-act-iterate done.
252 }