#! /usr/bin/env bash # vim: set filetype=sh ts=4 sw=4 sts=4 et: set -eo pipefail NAME=the-bastion-devenv BASEDIR=$(readlink -f "$(dirname "$0")/../..") docker_run() { echo "The Bastion devenv docker wasn't running, starting it..." docker run -d --name $NAME -v "$BASEDIR:/opt/bastion" $NAME } docker_build() { echo "The Bastion devenv docker image has never been built, building it..." docker build -t $NAME:latest -f "$(dirname "$0")/Dockerfile" "$BASEDIR" } is_running=$(docker inspect --type=container --format='{{ .State.Running }}' $NAME 2>/dev/null || true) case "$is_running" in false) # not running, but container exists, start it docker start $NAME ;; true) # running, nothing to do ;; *) # docker instance doesn't exist, is the image already built? if docker image history $NAME >/dev/null 2>&1; then # yes: just run it, then docker_run else # no: build it first docker_build # then run it docker_run fi ;; esac cmd="${1:-}" shift || true case "$cmd" in tidy) docker exec $NAME /opt/bastion/bin/dev/perl-tidy.sh tidy "$@";; checktidy) docker exec $NAME /opt/bastion/bin/dev/perl-tidy.sh test "$@";; perlcritic) docker exec $NAME /opt/bastion/bin/dev/perl-critic.sh;; shellcheck) docker exec $NAME /opt/bastion/bin/dev/shell-check.sh system "$@";; lint) docker exec $NAME /opt/bastion/bin/dev/perl-tidy.sh tidy "$@" docker exec $NAME /opt/bastion/bin/dev/perl-critic.sh docker exec $NAME /opt/bastion/bin/dev/shell-check.sh system "$@" ;; rebuild) docker rm -f $NAME docker image rm $NAME docker_build docker_run echo "The Bastion devenv has been rebuilt successfully." ;; doc) docker exec $NAME bash -c 'cd /opt/bastion/doc/sphinx && make';; sphinx-view-objects) docker exec $NAME python3 -m sphinx.ext.intersphinx /opt/bastion/doc/sphinx/_build/html/objects.inv;; doc-serve) if [ -n "$1" ]; then pkill -f "python3 -m http.server $1" || true ( cd "$BASEDIR/docs" && python3 -m http.server "$1" 2>/dev/null ) & else echo "Usage: $0 doc-serve PORT" exit 1 fi ;; bash) docker exec -it $NAME bash;; *) cat < spawn an interactive shell to run any arbitrary command in the devenv docker doc-serve starts a local HTTP python server on PORT to view generated documentation EOF esac