201 lines
4.6 KiB
Plaintext
201 lines
4.6 KiB
Plaintext
|
#!/usr/bin/env zsh
|
||
|
|
||
|
set -eu
|
||
|
|
||
|
# The default ZSH to use; it can just be the first few characters.
|
||
|
# This should be the oldest version we support.
|
||
|
default_version='4.'
|
||
|
|
||
|
setopt extended_glob glob_subst numeric_glob_sort
|
||
|
setopt warn_create_global warn_nested_var 2> /dev/null
|
||
|
cd "${${(%):-%x}:A:h}"
|
||
|
|
||
|
# TODO: Crazy Logic to munge TERM to something supported in Ubuntu 14.04
|
||
|
term=screen-256color
|
||
|
|
||
|
# Note: If versions and frameworks looks complicated, it isn't that bad...
|
||
|
# ...see Modifiers in zshexpn(1) for details.
|
||
|
|
||
|
# List of ZSH versions
|
||
|
typeset -aU versions
|
||
|
versions=( docker/base-*/Dockerfile(N.on:h:t:s/base-//) )
|
||
|
typeset -r versions
|
||
|
|
||
|
# List of frameworks
|
||
|
typeset -aU frameworks
|
||
|
frameworks=( docker/*/Dockerfile(N.on:h:t) )
|
||
|
for i in {$#frameworks..1}; do
|
||
|
# Remove all base entries
|
||
|
[[ "${frameworks[$i]}" == base-* ]] && frameworks[$i]=()
|
||
|
done
|
||
|
typeset -r frameworks
|
||
|
|
||
|
# Known Issues
|
||
|
typeset -A known_issues
|
||
|
known_issues["4.3.11-antigen"]="Antigen commands that need git won't work; it needs a newer version of git."
|
||
|
known_issues["4.3.11-zim"]="BROKEN: Zim wants ZSH 5.2 or newer."
|
||
|
known_issues["5.0.3-zim"]="DEPRECATED: Zim wants ZSH 5.2 or newer."
|
||
|
known_issues["5.1.1-zim"]="DEPRECATED: Zim wants ZSH 5.2 or newer."
|
||
|
known_issues["4.3.11-zulu"]="Zulu doesn't work; it needs a newer version of git."
|
||
|
typeset -r known_issues
|
||
|
|
||
|
err()
|
||
|
{
|
||
|
print -P "%F{red}Error:%f $*"
|
||
|
exit 2
|
||
|
}
|
||
|
|
||
|
resolve_framework() {
|
||
|
local f=$1 found
|
||
|
found=${frameworks[(In:-1:)$f*]}
|
||
|
if (( found <= $#frameworks )); then
|
||
|
echo "${frameworks[$found]}"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
resolve_version() {
|
||
|
local v=$1 found
|
||
|
found=${versions[(In:-1:)$v*]}
|
||
|
if (( found <= $#versions )); then
|
||
|
echo "${versions[$found]}"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
check_for_known_issues() {
|
||
|
local version="$1"
|
||
|
local framework="$2"
|
||
|
local name="${version}-${framework}"
|
||
|
|
||
|
if (( ${+known_issues["$name"]} )); then
|
||
|
echo
|
||
|
print -P "%F{red}Known Issue: %F{yellow}${known_issues["$name"]}%f"
|
||
|
echo
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
cmd() {
|
||
|
if (( dry_run )); then
|
||
|
echo "${(@q)*}" 1>&2
|
||
|
else
|
||
|
"${(@)*}"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
build_and_run() {
|
||
|
local version="$1"
|
||
|
local framework="$2"
|
||
|
local name="${version}-${framework}"
|
||
|
|
||
|
check_for_known_issues "$version" "$framework"
|
||
|
|
||
|
print -P "%F{green}Preparing containers...%f"
|
||
|
|
||
|
echo -n "p9k:base-${version}: "
|
||
|
cmd docker build \
|
||
|
--quiet \
|
||
|
--tag "p9k:base-${version}" \
|
||
|
--file "docker/base-${version}/Dockerfile" \
|
||
|
.
|
||
|
|
||
|
echo -n "p9k:${version}-${framework}: "
|
||
|
cmd docker build \
|
||
|
--quiet \
|
||
|
--build-arg="base=base-${version}" \
|
||
|
--tag "p9k:${version}-${framework}" \
|
||
|
--file "docker/${framework}/Dockerfile" \
|
||
|
.
|
||
|
|
||
|
print -P "%F{green}Starting ${name} container...%f"
|
||
|
cmd docker run \
|
||
|
--rm \
|
||
|
--interactive \
|
||
|
--tty \
|
||
|
--hostname="${name//./_}" \
|
||
|
--env="TERM=${term}" \
|
||
|
"p9k:${version}-${framework}"
|
||
|
}
|
||
|
|
||
|
show_help() {
|
||
|
local f v
|
||
|
echo "Usage: ${(%):-%x} <framework>|--list"
|
||
|
echo
|
||
|
echo "Loads up a docker image with powershell9k configured in <framework>"
|
||
|
echo
|
||
|
echo " -f --frameworks Lists all available frameworks, newline separated."
|
||
|
echo " -v --versions Lists all available ZSH versions, newline separated."
|
||
|
echo " -z --zsh VER Uses ZSH with version VER."
|
||
|
echo " -n --dry-run Just prints the docker commands that would be run."
|
||
|
echo " --help You're soaking in it."
|
||
|
echo
|
||
|
echo "ZSH versions:"
|
||
|
for v in "${(@)versions}"; do
|
||
|
echo " $v"
|
||
|
done
|
||
|
echo
|
||
|
echo "Framework containers:"
|
||
|
for f in "${(@)frameworks}"; do
|
||
|
echo " $f"
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# No arguments
|
||
|
if (( $# == 0 )); then
|
||
|
show_help
|
||
|
exit
|
||
|
fi
|
||
|
|
||
|
# Parse flags and such.
|
||
|
asked_for_version=$default_version
|
||
|
asked_for_framework=
|
||
|
dry_run=0
|
||
|
while (( $# > 0 )); do
|
||
|
case "$1" in
|
||
|
-f | --frameworks )
|
||
|
print -l "${(@)frameworks}"
|
||
|
exit
|
||
|
;;
|
||
|
-v | --versions )
|
||
|
print -l "${(@)versions}"
|
||
|
exit
|
||
|
;;
|
||
|
-z | --zsh )
|
||
|
shift
|
||
|
asked_for_version=$1
|
||
|
;;
|
||
|
-n | --dry-run ) dry_run=1 ;;
|
||
|
-h | --help )
|
||
|
show_help
|
||
|
exit
|
||
|
;;;
|
||
|
-* )
|
||
|
err "Unknown option ${1}"
|
||
|
show_help
|
||
|
exit 1
|
||
|
;;
|
||
|
* )
|
||
|
if [[ -z "$asked_for_framework" ]]; then
|
||
|
asked_for_framework=$1
|
||
|
else
|
||
|
err "You can only specify one framework at a time; you already specified '${asked_for_framework}'"
|
||
|
fi
|
||
|
;;
|
||
|
esac
|
||
|
shift
|
||
|
done
|
||
|
|
||
|
typeset -r asked_for_version asked_for_framework
|
||
|
|
||
|
typeset -r use_version="$(resolve_version "${asked_for_version}")"
|
||
|
if [[ -z "$use_version" ]]; then
|
||
|
err "No such ZSH version '${asked_for_version}'"
|
||
|
fi
|
||
|
|
||
|
typeset -r use_framework="$(resolve_framework "${asked_for_framework}")"
|
||
|
if [[ -z "$use_framework" ]]; then
|
||
|
err "No such framework '${asked_for_framework}'"
|
||
|
fi
|
||
|
|
||
|
build_and_run "$use_version" "$use_framework"
|
||
|
|
||
|
# EOF
|