aboutsummaryrefslogtreecommitdiff
path: root/maint/check-cargo-tree
blob: de3600e22a9d1decf9083191b80068c13b699186 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env bash
#
# Use cargo-tree to check our dependencies for crates which we must
# not depend on unconditionally.

set -eu

forbid () {
    local our_crate="$1"
    local feature="$2"
    local forbidden="$3"

    set +e
    cargo tree --prefix=none -p "$our_crate" --features "$feature" \
	  --format="    {p}" | grep "^    $forbidden "
    # Note that the space in the grep pattern above is necessary to
    # make sure we don't match prefixes.  (The cargo tree output will be
    # something like "    cratename v1.2.3".)

    local result="${PIPESTATUS[*]}"
    set -e

    case "$result" in
	"0 0")
	    # cargo-tree succeeded, and so did grep: we found the
	    # forbidden package.
            echo "Uh-oh: $forbidden has shown up in $our_crate/$feature."
    	    exit 1
	    ;;
	"0 1")
	    # cargo-tree succeeded, and grep failed: we didn't find the
	    # forbidden package.
	    echo "Didn't find $forbidden in $our_crate/$feature.  Good."
	    ;;
	*)
	    # cargo-tree failed (or maybe grep is gruesomely nonstandard)
	    echo "cargo tree failed unexpectedly when checking for $forbidden in $our_crate/$feature" >&2
	    exit 1
	    ;;
    esac
}

# We can't use these crates in arti/full, since they expose us to the old
# OpenSSL (3BSD + SSLeay) license.
forbid arti full ring
forbid arti full webpki

echo "Everything looks fine."