From e5ab35441d32aba09850851ecc8f63da4252946a Mon Sep 17 00:00:00 2001 From: Omer Katz Date: Tue, 28 Oct 2014 13:40:28 +0200 Subject: [PATCH] Added packer bash completion. --- completion/available/packer.completion.bash | 164 ++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 completion/available/packer.completion.bash diff --git a/completion/available/packer.completion.bash b/completion/available/packer.completion.bash new file mode 100644 index 00000000..99c221ea --- /dev/null +++ b/completion/available/packer.completion.bash @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +# Packer (http://www.packer.io) bash completion +# +# This script provides bash completion for packer and supports: +# +# - template filename completion (*.json) in cwd +# - support for basic options (i.e.. -debug) +# - support for complex options (i.e. -parallel=[true|false] +# +# The scirpt has been successfully tested with packer-0.6.0 and the +# following OS: +# +# - OS X 10.9 +# - CentOS-6.5 +# - Ubuntu 12.04 Server +# +# The script technically is heavily inspired by the git-completion.bash +# script. Kudos to Shawn O. Pearce and all other +# contributors for the inspiration and especially to the bash-completion +# team in general. +# +# Copyright (c) 2014 IT Services Department, University of Bern +# +# This script is licensed under the MIT License (MIT) +# For licsense details see the LICENSE file included in the repository +# or read the license text at http://opensource.org/licenses/MIT. +# + +# Generates completion reply, appending a space to possible completion words, +# if necessary. +# It accepts 2 arguments though the second is optional: +# 1: List of possible completion words. +# 2: Generate possible completion matches for this word (optional). +__packercomp () +{ + local cur_="${2-$cur}" + + case "$cur_" in + -*=) + ;; + *) + local c i=0 IFS=$' \t\n' + for c in $1; do + if [[ $c == "$cur_"* ]]; then + case $c in + -*=*|*.) ;; + *) c="$c " ;; + esac + COMPREPLY[i++]="$c" + fi + done + ;; + esac +} + +# Generates completion reply for template files in cwd. +__packercomp_template_file () +{ + local IFS=$'\n' + + COMPREPLY=($(compgen -S " " -A file -X '!*.json' -- "${cur}")) +} + +# Generates completion for the build command. +__packer_build () +{ + local builders=" + amazon-ebs amazon-instance amazon-chroot digitalocean docker + googlecompute openstack parallels-iso parallels-pvm qemu + virtualbox-iso virtualbox-ovf vmware-iso vmware-vmx" + + case "$cur" in + -parallel=*) + __packercomp "false true" "${cur##-parallel=}" + return + ;; + -except=*) + __packercomp "$builders" "${cur##-except=}" + return + ;; + -only=*) + __packercomp "$builders" "${cur##-only=}" + return + ;; + -*) + __packercomp "-debug -force -machine-readable -except= -only= -parallel= -var -var-file" + return + ;; + *) + esac + + __packercomp_template_file +} + +# Generates completion for the fix command. +__packer_fix () +{ + __packercomp_template_file +} + +# Generates completion for the inspect command. +__packer_inspect () +{ + case "$cur" in + -*) + __packercomp "-machine-readable" + return + ;; + *) + esac + + __packercomp_template_file +} + +# Generates completion for the validate command. +__packer_validate () +{ + __packercomp_template_file +} + +# Main function for packer completion. +# +# Searches for a command in $COMP_WORDS. If one is found +# the appropriate function from above is called, if not +# completion for global options is done. +_packer_completion () +{ + cur=${COMP_WORDS[COMP_CWORD]} + # Words containing an equal sign get split into tokens in bash > 4, which + # doesn't come in handy here. + # This is handled here. bash < 4 does not split. + declare -f _get_comp_words_by_ref >/dev/null && _get_comp_words_by_ref -n = cur + + COMPREPLY=() + local i c=1 command + + while [ $c -lt $COMP_CWORD ]; do + i="${COMP_WORDS[c]}" + case "$i" in + -*) ;; + *) command="$i"; break ;; + esac + ((c++)) + done + + if [ -z $command ]; then + case "$cur" in + '-'*) + __packercomp "-machine-readable --help --version" + ;; + *) + __packercomp "build fix inspect validate" + ;; + esac + return + fi + + local completion_func="__packer_${command}" + declare -f $completion_func >/dev/null && $completion_func +} + +complete -o nospace -F _packer_completion packer +