#!/usr/bin/env bash # # The gate. Everything that has to be true before a change is finished, in one command: # # ./tools/verify.sh # what every change has to pass # ./tools/verify.sh --release # ...and an R8 release build, which is what the nightly runs # GRADLE_FLAGS=--offline ./tools/verify.sh # keeps working without a network # # Cheapest first, so a stale document fails in a second rather than after a release build. Each step # is here because it has caught a real defect in this project at least once; nothing is on the list # because it is fashionable. set -euo pipefail cd "$(dirname "$0")/.." release=false for arg in "$@"; do case "$arg" in --release) release=true ;; *) echo "verify: unknown option '$arg' (only --release is understood)" >&2; exit 2 ;; esac done # Word splitting is intended here: GRADLE_FLAGS is a place to put several flags. # shellcheck disable=SC2086 gradle() { ./gradlew ${GRADLE_FLAGS:-} "$@" --console=plain; } step() { printf '\n\033[1m== %s\033[0m\n' "$1"; } step "Code map is current" python3 tools/make-code-map.py --check step "Kotlin static analysis (detekt, against the baseline)" gradle :app:detekt step "JVM unit tests" gradle :app:testDebugUnitTest step "Android Lint" gradle :app:lintDebug if $release; then step "Release build (R8)" # Signed when keystore.properties happens to be present, unsigned otherwise — either way R8 # runs, and a release-only defect (a class reached only through a resource, for instance) is # exactly what this step is for. gradle :app:assembleRelease step "Benchmark APKs compile" # No device: this only proves that :benchmark still compiles against the app's benchmark build # type, which is the thing that rots silently between device runs. :baselineprofile is included for # the same reason — its generator only runs on a device with API 33+, so nothing else would notice it # breaking. gradle :app:assembleBenchmark :benchmark:assembleDebug :baselineprofile:assembleBenchmark fi printf '\n\033[1mverify: all checks passed\033[0m\n'