#!/usr/bin/env 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