#!/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 fi printf '\n\033[1mverify: all checks passed\033[0m\n'