Commit e4774f20335241b0d8c3f4291e654e5946aa4f1e

Authored by mj
1 parent ab0f2f9d57
Exists in master and in 2 other branches 02-merge, dev

Squashed 'repos/robbyrussell/oh-my-zsh/' changes from 3ea3384..a207a38

a207a38 Merge pull request #4099 from moncho/master
0950f9c Plugin now uses completion script from docker-compose repo.

git-subtree-dir: repos/robbyrussell/oh-my-zsh
git-subtree-split: a207a38d634cc10441636bc4359cd8a18c502dea

Showing 3 changed files with 312 additions and 14 deletions Side-by-side Diff

plugins/docker-compose/README.md
1 1 # Docker-compose plugin for oh my zsh
  2 +
  3 +A copy of the completion script from the [docker-compose](1) git repo.
  4 +
  5 +[1]:[https://github.com/docker/compose/blob/master/contrib/completion/zsh/_docker-compose]
plugins/docker-compose/_docker-compose
... ... @@ -0,0 +1,308 @@
  1 +#compdef docker-compose
  2 +
  3 +# Description
  4 +# -----------
  5 +# zsh completion for docker-compose
  6 +# https://github.com/sdurrheimer/docker-compose-zsh-completion
  7 +# -------------------------------------------------------------------------
  8 +# Version
  9 +# -------
  10 +# 0.1.0
  11 +# -------------------------------------------------------------------------
  12 +# Authors
  13 +# -------
  14 +# * Steve Durrheimer <s.durrheimer@gmail.com>
  15 +# -------------------------------------------------------------------------
  16 +# Inspiration
  17 +# -----------
  18 +# * @albers docker-compose bash completion script
  19 +# * @felixr docker zsh completion script : https://github.com/felixr/docker-zsh-completion
  20 +# -------------------------------------------------------------------------
  21 +
  22 +# For compatibility reasons, Compose and therefore its completion supports several
  23 +# stack compositon files as listed here, in descending priority.
  24 +# Support for these filenames might be dropped in some future version.
  25 +__docker-compose_compose_file() {
  26 + local file
  27 + for file in docker-compose.y{,a}ml fig.y{,a}ml ; do
  28 + [ -e $file ] && {
  29 + echo $file
  30 + return
  31 + }
  32 + done
  33 + echo docker-compose.yml
  34 +}
  35 +
  36 +# Extracts all service names from docker-compose.yml.
  37 +___docker-compose_all_services_in_compose_file() {
  38 + local already_selected
  39 + local -a services
  40 + already_selected=$(echo ${words[@]} | tr " " "|")
  41 + awk -F: '/^[a-zA-Z0-9]/{print $1}' "${compose_file:-$(__docker-compose_compose_file)}" 2>/dev/null | grep -Ev "$already_selected"
  42 +}
  43 +
  44 +# All services, even those without an existing container
  45 +__docker-compose_services_all() {
  46 + services=$(___docker-compose_all_services_in_compose_file)
  47 + _alternative "args:services:($services)"
  48 +}
  49 +
  50 +# All services that have an entry with the given key in their docker-compose.yml section
  51 +___docker-compose_services_with_key() {
  52 + local already_selected
  53 + local -a buildable
  54 + already_selected=$(echo ${words[@]} | tr " " "|")
  55 + # flatten sections to one line, then filter lines containing the key and return section name.
  56 + awk '/^[a-zA-Z0-9]/{printf "\n"};{printf $0;next;}' "${compose_file:-$(__docker-compose_compose_file)}" 2>/dev/null | awk -F: -v key=": +$1:" '$0 ~ key {print $1}' 2>/dev/null | grep -Ev "$already_selected"
  57 +}
  58 +
  59 +# All services that are defined by a Dockerfile reference
  60 +__docker-compose_services_from_build() {
  61 + buildable=$(___docker-compose_services_with_key build)
  62 + _alternative "args:buildable services:($buildable)"
  63 +}
  64 +
  65 +# All services that are defined by an image
  66 +__docker-compose_services_from_image() {
  67 + pullable=$(___docker-compose_services_with_key image)
  68 + _alternative "args:pullable services:($pullable)"
  69 +}
  70 +
  71 +__docker-compose_get_services() {
  72 + local kind expl
  73 + declare -a running stopped lines args services
  74 +
  75 + docker_status=$(docker ps > /dev/null 2>&1)
  76 + if [ $? -ne 0 ]; then
  77 + _message "Error! Docker is not running."
  78 + return 1
  79 + fi
  80 +
  81 + kind=$1
  82 + shift
  83 + [[ $kind = (stopped|all) ]] && args=($args -a)
  84 +
  85 + lines=(${(f)"$(_call_program commands docker ps ${args})"})
  86 + services=(${(f)"$(_call_program commands docker-compose 2>/dev/null ${compose_file:+-f $compose_file} ${compose_project:+-p $compose_project} ps -q)"})
  87 +
  88 + # Parse header line to find columns
  89 + local i=1 j=1 k header=${lines[1]}
  90 + declare -A begin end
  91 + while (( $j < ${#header} - 1 )) {
  92 + i=$(( $j + ${${header[$j,-1]}[(i)[^ ]]} - 1))
  93 + j=$(( $i + ${${header[$i,-1]}[(i) ]} - 1))
  94 + k=$(( $j + ${${header[$j,-1]}[(i)[^ ]]} - 2))
  95 + begin[${header[$i,$(($j-1))]}]=$i
  96 + end[${header[$i,$(($j-1))]}]=$k
  97 + }
  98 + lines=(${lines[2,-1]})
  99 +
  100 + # Container ID
  101 + local line s name
  102 + local -a names
  103 + for line in $lines; do
  104 + if [[ $services == *"${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}"* ]]; then
  105 + names=(${(ps:,:)${${line[${begin[NAMES]},-1]}%% *}})
  106 + for name in $names; do
  107 + s="${${name%_*}#*_}:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}"
  108 + s="$s, ${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}"
  109 + s="$s, ${${${line[$begin[IMAGE],$end[IMAGE]]}/:/\\:}%% ##}"
  110 + if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = Exit* ]]; then
  111 + stopped=($stopped $s)
  112 + else
  113 + running=($running $s)
  114 + fi
  115 + done
  116 + fi
  117 + done
  118 +
  119 + [[ $kind = (running|all) ]] && _describe -t services-running "running services" running
  120 + [[ $kind = (stopped|all) ]] && _describe -t services-stopped "stopped services" stopped
  121 +}
  122 +
  123 +__docker-compose_stoppedservices() {
  124 + __docker-compose_get_services stopped "$@"
  125 +}
  126 +
  127 +__docker-compose_runningservices() {
  128 + __docker-compose_get_services running "$@"
  129 +}
  130 +
  131 +__docker-compose_services () {
  132 + __docker-compose_get_services all "$@"
  133 +}
  134 +
  135 +__docker-compose_caching_policy() {
  136 + oldp=( "$1"(Nmh+1) ) # 1 hour
  137 + (( $#oldp ))
  138 +}
  139 +
  140 +__docker-compose_commands () {
  141 + local cache_policy
  142 +
  143 + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
  144 + if [[ -z "$cache_policy" ]]; then
  145 + zstyle ":completion:${curcontext}:" cache-policy __docker-compose_caching_policy
  146 + fi
  147 +
  148 + if ( [[ ${+_docker_compose_subcommands} -eq 0 ]] || _cache_invalid docker_compose_subcommands) \
  149 + && ! _retrieve_cache docker_compose_subcommands;
  150 + then
  151 + local -a lines
  152 + lines=(${(f)"$(_call_program commands docker-compose 2>&1)"})
  153 + _docker_compose_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/ ##/:})
  154 + _store_cache docker_compose_subcommands _docker_compose_subcommands
  155 + fi
  156 + _describe -t docker-compose-commands "docker-compose command" _docker_compose_subcommands
  157 +}
  158 +
  159 +__docker-compose_subcommand () {
  160 + local -a _command_args
  161 + integer ret=1
  162 + case "$words[1]" in
  163 + (build)
  164 + _arguments \
  165 + '--no-cache[Do not use cache when building the image]' \
  166 + '*:services:__docker-compose_services_from_build' && ret=0
  167 + ;;
  168 + (help)
  169 + _arguments ':subcommand:__docker-compose_commands' && ret=0
  170 + ;;
  171 + (kill)
  172 + _arguments \
  173 + '-s[SIGNAL to send to the container. Default signal is SIGKILL.]:signal:_signals' \
  174 + '*:running services:__docker-compose_runningservices' && ret=0
  175 + ;;
  176 + (logs)
  177 + _arguments \
  178 + '--no-color[Produce monochrome output.]' \
  179 + '*:services:__docker-compose_services_all' && ret=0
  180 + ;;
  181 + (migrate-to-labels)
  182 + _arguments \
  183 + '(-):Recreate containers to add labels' && ret=0
  184 + ;;
  185 + (port)
  186 + _arguments \
  187 + '--protocol=-[tcp or udap (defaults to tcp)]:protocol:(tcp udp)' \
  188 + '--index=-[index of the container if there are mutiple instances of a service (defaults to 1)]:index: ' \
  189 + '1:running services:__docker-compose_runningservices' \
  190 + '2:port:_ports' && ret=0
  191 + ;;
  192 + (ps)
  193 + _arguments \
  194 + '-q[Only display IDs]' \
  195 + '*:services:__docker-compose_services_all' && ret=0
  196 + ;;
  197 + (pull)
  198 + _arguments \
  199 + '--allow-insecure-ssl[Allow insecure connections to the docker registry]' \
  200 + '*:services:__docker-compose_services_from_image' && ret=0
  201 + ;;
  202 + (rm)
  203 + _arguments \
  204 + '(-f --force)'{-f,--force}"[Don't ask to confirm removal]" \
  205 + '-v[Remove volumes associated with containers]' \
  206 + '*:stopped services:__docker-compose_stoppedservices' && ret=0
  207 + ;;
  208 + (run)
  209 + _arguments \
  210 + '--allow-insecure-ssl[Allow insecure connections to the docker registry]' \
  211 + '-d[Detached mode: Run container in the background, print new container name.]' \
  212 + '--entrypoint[Overwrite the entrypoint of the image.]:entry point: ' \
  213 + '*-e[KEY=VAL Set an environment variable (can be used multiple times)]:environment variable KEY=VAL: ' \
  214 + '(-u --user)'{-u,--user=-}'[Run as specified username or uid]:username or uid:_users' \
  215 + "--no-deps[Don't start linked services.]" \
  216 + '--rm[Remove container after run. Ignored in detached mode.]' \
  217 + "--service-ports[Run command with the service's ports enabled and mapped to the host.]" \
  218 + '-T[Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY.]' \
  219 + '(-):services:__docker-compose_services' \
  220 + '(-):command: _command_names -e' \
  221 + '*::arguments: _normal' && ret=0
  222 + ;;
  223 + (scale)
  224 + _arguments '*:running services:__docker-compose_runningservices' && ret=0
  225 + ;;
  226 + (start)
  227 + _arguments '*:stopped services:__docker-compose_stoppedservices' && ret=0
  228 + ;;
  229 + (stop|restart)
  230 + _arguments \
  231 + '(-t --timeout)'{-t,--timeout}"[Specify a shutdown timeout in seconds. (default: 10)]:seconds: " \
  232 + '*:running services:__docker-compose_runningservices' && ret=0
  233 + ;;
  234 + (up)
  235 + _arguments \
  236 + '--allow-insecure-ssl[Allow insecure connections to the docker registry]' \
  237 + '-d[Detached mode: Run containers in the background, print new container names.]' \
  238 + '--no-color[Produce monochrome output.]' \
  239 + "--no-deps[Don't start linked services.]" \
  240 + "--no-recreate[If containers already exist, don't recreate them.]" \
  241 + "--no-build[Don't build an image, even if it's missing]" \
  242 + '(-t --timeout)'{-t,--timeout}"[Specify a shutdown timeout in seconds. (default: 10)]:seconds: " \
  243 + "--x-smart-recreate[Only recreate containers whose configuration or image needs to be updated. (EXPERIMENTAL)]" \
  244 + '*:services:__docker-compose_services_all' && ret=0
  245 + ;;
  246 + (version)
  247 + _arguments \
  248 + "--short[Shows only Compose's version number.]" && ret=0
  249 + ;;
  250 + (*)
  251 + _message 'Unknown sub command'
  252 + esac
  253 +
  254 + return ret
  255 +}
  256 +
  257 +_docker-compose () {
  258 + # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`.
  259 + # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`.
  260 + if [[ $service != docker-compose ]]; then
  261 + _call_function - _$service
  262 + return
  263 + fi
  264 +
  265 + local curcontext="$curcontext" state line ret=1
  266 + typeset -A opt_args
  267 +
  268 + _arguments -C \
  269 + '(- :)'{-h,--help}'[Get help]' \
  270 + '--verbose[Show more output]' \
  271 + '(- :)'{-v,--version}'[Print version and exit]' \
  272 + '(-f --file)'{-f,--file}'[Specify an alternate docker-compose file (default: docker-compose.yml)]:file:_files -g "*.yml"' \
  273 + '(-p --project-name)'{-p,--project-name}'[Specify an alternate project name (default: directory name)]:project name:' \
  274 + '(-): :->command' \
  275 + '(-)*:: :->option-or-argument' && ret=0
  276 +
  277 + local counter=1
  278 + #local compose_file compose_project
  279 + while [ $counter -lt ${#words[@]} ]; do
  280 + case "${words[$counter]}" in
  281 + -f|--file)
  282 + (( counter++ ))
  283 + compose_file="${words[$counter]}"
  284 + ;;
  285 + -p|--project-name)
  286 + (( counter++ ))
  287 + compose_project="${words[$counter]}"
  288 + ;;
  289 + *)
  290 + ;;
  291 + esac
  292 + (( counter++ ))
  293 + done
  294 +
  295 + case $state in
  296 + (command)
  297 + __docker-compose_commands && ret=0
  298 + ;;
  299 + (option-or-argument)
  300 + curcontext=${curcontext%:*:*}:docker-compose-$words[1]:
  301 + __docker-compose_subcommand && ret=0
  302 + ;;
  303 + esac
  304 +
  305 + return ret
  306 +}
  307 +
  308 +_docker-compose "$@"
plugins/docker-compose/docker-compose.plugin.zsh
... ... @@ -1,14 +0,0 @@
1   -# Authors:
2   -# https://github.com/tristola
3   -#
4   -# Docker-compose related zsh aliases
5   -
6   -# Aliases ###################################################################
7   -
8   -alias dcup='docker-compose up'
9   -alias dcb='docker-compose build'
10   -alias dcrm='docker-compose rm'
11   -alias dcps='docker-compose ps'
12   -alias dcstop='docker-compose stop'
13   -alias dcrestart='docker-compose restart'
14   -