]>
Commit | Line | Data |
---|---|---|
7cfab449 XL |
1 | #!/bin/bash |
2 | # Run `cargo test` on an installed Debian crate, e.g. in an autopkgtest. | |
3 | # | |
4 | # Requires dev-dependencies to be installed. If you give extra flags such as | |
5 | # "--all-features", then these features' dependencies must also be installed. | |
0e351150 XL |
6 | # |
7 | # This script also swallows some known false-positive test failures, so you | |
8 | # don't have to set test_is_broken everywhere in your debcargo.toml configs. | |
7cfab449 XL |
9 | |
10 | set -e | |
11 | ||
12 | pkg="$1" | |
13 | ver="$2" | |
14 | ||
15 | if [ -z "$pkg" -o -z "$ver" ]; then | |
16 | echo >&2 "Usage: $0 <crate> <version> [<extra test flags, e.g. --all-features>]" | |
17 | exit 2 | |
18 | fi | |
19 | shift 2 | |
20 | ||
21 | pkgdir="/usr/share/cargo/registry/${pkg}-${ver}" | |
22 | if [ ! -d "$pkgdir" ]; then | |
23 | echo >&2 "crate directory not found: $pkgdir" | |
24 | exit 1 | |
25 | fi | |
26 | cd "$pkgdir" | |
27 | ||
28 | rundir=$(mktemp -d) | |
29 | # https://stackoverflow.com/a/14812383 inside "trap" avoids running handler twice | |
30 | trap 'excode=$?; rm -rf "'"$rundir"'"; trap - EXIT' EXIT HUP INT QUIT PIPE TERM | |
31 | ||
32 | # set envvars necessary for cargo-debian-wrapper | |
33 | ||
34 | export DEB_CARGO_CRATE="${pkg}_${ver}" | |
35 | export CARGO_HOME="$rundir/debian/cargo_home" | |
36 | mkdir -p "$CARGO_HOME" | |
37 | mkdir -p "$rundir/registry" | |
38 | ||
39 | . <(dpkg-buildflags --export) | |
40 | . <(dpkg-architecture -s) | |
41 | RUST_TYPE="$(rustc --version --verbose | sed -ne 's/^host: //p')" | |
42 | export DEB_HOST_RUST_TYPE="$RUST_TYPE" | |
43 | export DEB_BUILD_RUST_TYPE="$RUST_TYPE" | |
44 | export DEB_TARGET_RUST_TYPE="$RUST_TYPE" | |
45 | ||
46 | export CARGO_TARGET_DIR="$rundir/target" | |
47 | export PATH="/usr/share/cargo/bin:$PATH" | |
48 | ||
49 | # run the test! | |
50 | ||
0e351150 XL |
51 | if [ -t 2 ]; then flags="--color=always"; export RUSTDOCFLAGS="--color=always"; fi |
52 | ||
53 | run_test() { | |
54 | local n="$1" | |
55 | shift | |
56 | { cargo test $flags "$@" 2>&1; echo "$?" > "$rundir/run-$n.ec"; } | tee "$rundir/run-$n.log" | |
57 | sed -i -e 's/\x1b\[[0-9;]*m//g' "$rundir/run-$n.log" # rm ansi colour codes | |
58 | local x="$(< "$rundir/run-$n.ec")" | |
59 | if [ "$x" = "0" ]; then | |
60 | return 0 | |
61 | fi | |
62 | local e="$(egrep -o '^error\[E[0-9]+\]' "$rundir/run-$n.log" | sort -u | tr '\n' ',')" | |
63 | # some crates like to update their old versions to depend on their new | |
64 | # versions, e.g. rand-core. unfortunately this breaks cargo test, see | |
65 | # https://github.com/rust-lang/cargo/issues/6819. so just ignore them. | |
66 | if [ "$e" = "error[E0463],error[E0465]," ]; then | |
67 | echo "cargo-auto-test: ignore test failure due to upstream #6819: $e" | |
68 | return 0 | |
69 | fi | |
70 | return "$x" | |
71 | } | |
72 | ||
73 | set +e | |
74 | ||
7cfab449 | 75 | cargo prepare-debian "$rundir/registry" --link-from-system |
0e351150 XL |
76 | |
77 | run_test 0 "$@" | |
78 | x="$?" | |
79 | if [ "$x" = "0" ]; then exit 0; fi | |
80 | if ! egrep -q '^error\[E0554\]' "$rundir/run-0.log"; then exit "$x"; fi | |
81 | ||
82 | echo | |
83 | echo "----------------------------------------------------------------" | |
84 | echo "cargo-auto-test: re-running test with RUSTC_BOOTSTRAP due to E0554" | |
85 | RUSTC_BOOTSTRAP=1 run_test 1 "$@" |