#!/bin/bash # # Provides short mappings for common Git commands # # Copyright (C) 2011, 2012, 2013, 2014, 2015 Mike Gerwitz # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # declare -r __git_short_path="${1:-$(pwd)/shortmaps}" __git-short_cmdok() { local -r cmd="$1" test "${cmd:0:1}" != - } __git-short_docomplete() { local -r cmd="$1" fn="$2" # ignore problem commands __git-short_cmdok "$cmd" || return complete -o bashdefault -o default -o nospace -F"$fn" "$cmd" 1>/dev/null \ || complete -o default -o nospace -F"$fn" "$cmd" } __git-short_shortmap() { local -r shortcmd="$1" # only perform completion when within a git dir git rev-parse &>/dev/null || return # populate variables used by various git completion functions local cur words cword prev _get_comp_words_by_ref -n =: cur words cword prev # execute the associated completion function (column two of the shortmaps # file) "${__git_short_comp[$shortcmd]}" } __git-short_register_alias() { local -r cmd="$1" # ignore invalid aliases (for which we define functions to handle them # instead) __git-short_cmdok "$cmd" || return alias $cmd="__git-short_shortalias '$cmd'" } __git-short_shortalias() { local -r shortcmd="$1" shift if [ "$shortcmd" == --help ]; then __git-short_help return fi # if we're not within a git dir, fall back to an actual command of this # name git rev-parse &>/dev/null || { command "$shortcmd" "$@" return } local cmd="${__git_short_maps[$shortcmd]}" test -n "$cmd" || return # pipe cmd prefix indicates a verbatim command if [ "${cmd:0:1}" == '|' ]; then eval "${cmd:1}" '"$@"' return fi # intentionally unquoted $cmd "$@" } __git-short_help() { cat <. EOH } __git-short_map_out() { local shortcmd for shortcmd in "${!__git_short_maps[@]}"; do echo -e "$shortcmd\t${__git_short_maps[$shortcmd]}" done \ | sort \ | { type column &>/dev/null && column -t -s$'\t' || cat; } } # load shortmaps from cwd (or provided path) and home dir (if available) __git-short_load_maps() { local -r path="$1" cat "$path" ~/.git-shortmaps 2>/dev/null } # functions that cannot be aliased - () { __git-short_shortalias - "$@"; } -- () { __git-short_shortalias -- "$@"; } declare shortcmd comp cmd declare -gA __git_short_maps __git_short_comp # register each shortmap while read shortcmd comp cmd; do test -n "$shortcmd" || continue if [ "${cmd:0:1}" == : ]; then cmd="git ${cmd:1}" fi __git_short_maps["$shortcmd"]="$cmd" __git_short_comp["$shortcmd"]="$comp" __git-short_docomplete "$shortcmd" __git-short_shortmap __git-short_register_alias "$shortcmd" done < <( __git-short_load_maps "$__git_short_path" ) # some distros use completion lazy-loading type -t _completion_loader &>/dev/null \ && _completion_loader git