From 805619296044ec9e3410db8b1608beae52ca5d0b Mon Sep 17 00:00:00 2001 From: Travis Swicegood Date: Sat, 11 Feb 2012 15:48:48 -0600 Subject: [PATCH] Add in Fabric auto-completion (thanks @underself). Please see [underself/fabric-completion] for the original work that this is based off of. [underself/fabric-completion]: https://github.com/underself/fabric-completion --- completion/available/fabric-completion.bash | 133 ++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 completion/available/fabric-completion.bash diff --git a/completion/available/fabric-completion.bash b/completion/available/fabric-completion.bash new file mode 100644 index 0000000..a4aa90f --- /dev/null +++ b/completion/available/fabric-completion.bash @@ -0,0 +1,133 @@ +#!/bin/bash +# +# Bash completion support for Fabric (http://fabfile.org/) +# +# +# Copyright (C) 2011 by Konstantin Bakulin +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# Thanks to: +# - Adam Vandenberg, +# https://github.com/adamv/dotfiles/blob/master/completion_scripts/fab_completion.bash +# +# - Enrico Batista da Luz, +# https://github.com/ricobl/dotfiles/blob/master/bin/fab_bash_completion +# + + +# Use cache files for fab tasks or not. +# If set to "false" command "fab --shortlist" will be executed every time. +export FAB_COMPLETION_CACHE_TASKS=true + +# File name where tasks cache will be stored (in current dir). +export FAB_COMPLETION_CACHED_TASKS_FILENAME=".fab_tasks~" + + +# Set command to get time of last file modification as seconds since Epoch +case `uname` in + Darwin|FreeBSD) + __FAB_COMPLETION_MTIME_COMMAND="stat -f '%m'" + ;; + *) + __FAB_COMPLETION_MTIME_COMMAND="stat -c '%Y'" + ;; +esac + + +# +# Get time of last fab cache file modification as seconds since Epoch +# +function __fab_chache_mtime() { + ${__FAB_COMPLETION_MTIME_COMMAND} \ + $FAB_COMPLETION_CACHED_TASKS_FILENAME | xargs -n 1 expr +} + + +# +# Get time of last fabfile file/module modification as seconds since Epoch +# +function __fab_fabfile_mtime() { + local f="fabfile" + if [[ -e "$f.py" ]]; then + ${__FAB_COMPLETION_MTIME_COMMAND} "$f.py" | xargs -n 1 expr + else + # Suppose that it's a fabfile dir + find $f/*.py -exec ${__FAB_COMPLETION_MTIME_COMMAND} {} + \ + | xargs -n 1 expr | sort -n -r | head -1 + fi +} + + +# +# Completion for "fab" command +# +function __fab_completion() { + # Return if "fab" command doesn't exists + [[ -e `which fab 2> /dev/null` ]] || return 0 + + # Variables to hold the current word and possible matches + local cur="${COMP_WORDS[COMP_CWORD]}" + local opts=() + + # Generate possible matches and store them in variable "opts" + case "${cur}" in + -*) + if [[ -z "${__FAB_COMPLETION_LONG_OPT}" ]]; then + export __FAB_COMPLETION_LONG_OPT=$( + fab --help | egrep -o "\-\-[A-Za-z_\-]+\=?" | sort -u) + fi + opts="${__FAB_COMPLETION_LONG_OPT}" + ;; + + # Completion for short options is not nessary. + # It's left here just for history. + # -*) + # if [[ -z "${__FAB_COMPLETION_SHORT_OPT}" ]]; then + # export __FAB_COMPLETION_SHORT_OPT=$( + # fab --help | egrep -o "^ +\-[A-Za-z_\]" | sort -u) + # fi + # opts="${__FAB_COMPLETION_SHORT_OPT}" + # ;; + + *) + # If "fabfile.py" or "fabfile" dir with "__init__.py" file exists + local f="fabfile" + if [[ -e "$f.py" || (-d "$f" && -e "$f/__init__.py") ]]; then + # Build a list of the available tasks + if $FAB_COMPLETION_CACHE_TASKS; then + # If use cache + if [[ ! -s ${FAB_COMPLETION_CACHED_TASKS_FILENAME} || + $(__fab_fabfile_mtime) -gt $(__fab_chache_mtime) ]]; then + fab --shortlist > ${FAB_COMPLETION_CACHED_TASKS_FILENAME} \ + 2> /dev/null + fi + opts=$(cat ${FAB_COMPLETION_CACHED_TASKS_FILENAME}) + else + # Without cache + opts=$(fab --shortlist 2> /dev/null) + fi + fi + ;; + esac + + # Set possible completions + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) +} +complete -o default -o nospace -F __fab_completion fab -- 2.17.1