134 lines
4.5 KiB
Bash
134 lines
4.5 KiB
Bash
|
#!/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
|