#!/bin/sh # mesh-check-toolchain: go # # This repository's own check, mesh/repo-check (novox/hq ADR 0238 §4), written with its first commit (ADR 0428 §4): # every Go module in the tree is vetted, its unit tests run, and then its integration tests (-tags integration). # A tree with no Go module has nothing to test, and the check says so and passes. # # No module commits its dependencies (no vendor directory: .gitignore). A module's dependencies are fetched, or a # requirement of the mesh's own forge (the pinned mesh-sdk commit) is taken from its repository's clone beside the check # (MESH_CHECK_BESIDE), through a go.mod of its own (-modfile), by mesh-catalog's helper checks/deps, built from the # clone of mesh-catalog beside this check and not copied here: the build seat forgets the forge credential before the # check runs, so a commit the seat's module cache does not hold cannot be fetched from the forge (novox/hq issue 385). A # module whose dependencies cannot be had **fails the check**, by name and why: its tests could not run, and a test that # could not run is a failure, never a note. Run by hand, without MESH_CHECK_BESIDE, the dependencies are fetched. set -eu cd "$(dirname "$0")" # The toolchain the check runs in sets -mod=vendor; there is no vendor directory, so the modules are used as they are. GOFLAGS="$(printf '%s' "${GOFLAGS:-}" | sed 's/-mod=[a-z]*//g') -mod=mod" export GOFLAGS export GOPRIVATE=git.novox.be modules=$(find . -name go.mod -not -path '*/vendor/*' -not -path './.git/*' | sort) if [ -z "$modules" ]; then echo "This tree holds no Go module, so there are no tests to run; the check passes." exit 0 fi work=$(mktemp -d) trap 'rm -rf "$work"' EXIT deps="" helper="${MESH_CHECK_BESIDE:-}/mesh-catalog/checks/deps" if [ -n "${MESH_CHECK_BESIDE:-}" ] && [ -f "$helper/main.go" ]; then if ! (cd "$helper" && go build -o "$work/deps" .); then echo "FAILED: the dependency helper of mesh-catalog beside this check could not be built" exit 1 fi deps="$work/deps" elif [ -n "${MESH_CHECK_BESIDE:-}" ]; then echo "NOT TAKEN FROM BESIDE: no mesh-catalog/checks/deps beside this check ($MESH_CHECK_BESIDE); the dependencies are fetched" fi untestable="" for mod in $modules; do dir=$(dirname "$mod") modfile="" if [ -n "$deps" ]; then if ! modfile=$("$deps" -beside "$MESH_CHECK_BESIDE" -work "$work" "$dir"); then echo "FAILED: $dir could not be tested: $modfile" untestable="$untestable $dir" continue fi [ -n "$modfile" ] && echo "$dir takes its forge dependencies from the clones beside the check" elif ! fetched=$(cd "$dir" && go mod download 2>&1); then echo "FAILED: $dir could not be tested: its dependencies cannot be fetched: $(printf '%s\n' "$fetched" | tail -n 1)" untestable="$untestable $dir" continue fi mf="" [ -n "$modfile" ] && mf="-modfile=$modfile" unformatted=$(cd "$dir" && gofmt -l .) if [ -n "$unformatted" ]; then echo "$dir is not gofmt'd: $unformatted" exit 1 fi echo "== $dir: go vet and the unit tests" (cd "$dir" && go vet $mf ./... && go test $mf ./...) echo "== $dir: the integration tests (-tags integration)" (cd "$dir" && go vet $mf -tags integration ./... && go test $mf -tags integration ./...) done if [ -n "$untestable" ]; then echo "the check fails: the tests of$untestable could not run (novox/hq issue 385)" exit 1 fi