# Abort if any error happens, and show the command that caused the error. _ERR() { error "Command $BASH_COMMAND failed (exit status: $?)" } set -eE trap _ERR ERR die() { if [ -n "$1" ]; then error "$1" fi exit 1 } error() { >/dev/stderr echo "[$(red ERROR)] $1" } warning() { >/dev/stderr echo "[$(yellow WARNING)] $1" } info() { >/dev/stderr echo "[$(green INFO)] $1" } # Print a full-width separator. # If given an argument, will print it in the middle of that separator. # If the argument is longer than the screen width, it will be printed between two separator lines. sep() { if [ -z "$COLUMNS" ]; then COLUMNS=80 fi SEP=$(yes = | tr -d "\n" | head -c $(($COLUMNS - 1))) if [ -z "$1" ]; then >/dev/stderr echo $SEP else MSGLEN=$(echo "$1" | wc -c) if [ $(($MSGLEN + 4)) -gt $COLUMNS ]; then >/dev/stderr echo "$SEP" >/dev/stderr echo "$1" >/dev/stderr echo "$SEP" else LEFTLEN=$((($COLUMNS - $MSGLEN - 2) / 2)) RIGHTLEN=$(($COLUMNS - $MSGLEN - 2 - $LEFTLEN)) LEFTSEP=$(echo $SEP | head -c $LEFTLEN) RIGHTSEP=$(echo $SEP | head -c $RIGHTLEN) >/dev/stderr echo "$LEFTSEP $1 $RIGHTSEP" fi fi } need_tag() { if [ -z "$TAG" ]; then die "Please specify a tag. To see available tags, run: $0 tags" fi if [ ! -d "tags/$TAG" ]; then die "Tag $TAG not found (directory tags/$TAG does not exist)." fi for FILE in mode provider settings.env status; do if [ ! -f "tags/$TAG/$FILE" ]; then warning "File tags/$TAG/$FILE not found." fi done if [ -f "tags/$TAG/settings.env" ]; then . tags/$TAG/settings.env fi }