Files
scm_breeze/lib/git/aliases.sh
Matthew Rothenberg 70c9501550 fix ability to undefine default aliases in zsh
The ability to not define default aliases in the `.git.scmbrc` file
leading to not having those aliases not present worked fine in bash.

However, this seems to still have thrown an error in zsh.  For example,
if you commented out the line:

        git_checkout_alias="gco"

then when sourcing scm_breeze aliases.sh would throw an error.

This applied only to aliases defined with the `_alias()` function and
not those with the `_git_alias()` function.

To fix this, I wrapped `_alias()` in a similar check to the one
`_git_alias()` has, where it passes the portions as arguments and
verifies the first is present before proceeding.

I'm not 100% certain why seperate functions exist for these two things
to begin with (as far as I can tell from a cursory examination the main
difference is `_git_aliases()` defines a tab completion?) but I believe
my change has fixed the ability to comment out aliases in `.git.scmbrc`
in zsh for users who do not want them (I'm in this boat, there are too
many for me and I get confused).

I tested manually in both bash and zsh and it appears to work, however
you might want to review this before merging given my relative
unfamiliarity with the codebase.
2014-10-02 20:42:43 -04:00

172 lines
7.4 KiB
Bash

# ------------------------------------------------------------------------------
# SCM Breeze - Streamline your SCM workflow.
# Copyright 2011 Nathan Broadbent (http://madebynathan.com). All Rights Reserved.
# Released under the LGPL (GNU Lesser General Public License)
# ------------------------------------------------------------------------------
# Set up configured aliases & keyboard shortcuts
# --------------------------------------------------------------------
# _alias() ignores errors if alias is not defined. (from lib/scm_breeze.sh)
# Print formatted alias index
list_aliases() { alias | grep "$*" --color=never | sed -e 's/alias //' -e "s/=/::/" -e "s/'//g" | awk -F "::" '{ printf "\033[1;36m%15s \033[2;37m=>\033[0m %-8s\n",$1,$2}'; }
alias git_aliases="list_aliases git"
# Remove any existing git alias or function
unalias git > /dev/null 2>&1
unset -f git > /dev/null 2>&1
# Use the full path to git to avoid infinite loop with git function
export _git_cmd="$(\which git)"
# Wrap git with the 'hub' github wrapper, if installed (https://github.com/defunkt/hub)
if type hub > /dev/null 2>&1; then export _git_cmd="hub"; fi
if type gh > /dev/null 2>&1; then export _git_cmd="gh"; fi
# Create 'git' function that calls hub if defined, and expands all numeric arguments
function git(){
# Only expand args for git commands that deal with paths or branches
case $1 in
commit|blame|add|log|rebase|merge)
exec_scmb_expand_args "$_git_cmd" "$@";;
checkout|diff|rm|reset)
exec_scmb_expand_args --relative "$_git_cmd" "$@";;
branch)
_scmb_git_branch_shortcuts "${@:2}";;
*)
"$_git_cmd" "$@";;
esac
}
_alias "$git_alias" "git"
# --------------------------------------------------------------------
# Thanks to Scott Bronson for coming up the following git tab completion workaround,
# which I've altered slightly to be more flexible.
# https://github.com/bronson/dotfiles/blob/731bfd951be68f395247982ba1fb745fbed2455c/.bashrc#L81
# (only works for bash)
__define_git_completion () {
eval "
_git_$1_shortcut () {
COMP_LINE=\"git $2 \${COMP_LINE/$1 }\"
let COMP_POINT+=$((4+${#2}-${#1}))
COMP_WORDS=(git $2 \"\${COMP_WORDS[@]:1}\")
let COMP_CWORD+=1
local cur words cword prev
_get_comp_words_by_ref -n =: cur words cword prev
_git
}
"
}
# Define git alias with tab completion
# Usage: __git_alias <alias> <command_prefix> <command>
__git_alias () {
if [ -n "$1" ]; then
local alias_str="$1"; local cmd_prefix="$2"; local cmd="$3"; local cmd_args="${4-}"
alias $alias_str="$cmd_prefix $cmd${cmd_args:+ }$cmd_args"
if [ "$shell" = "bash" ]; then
__define_git_completion $alias_str $cmd
complete -o default -o nospace -F _git_"$alias_str"_shortcut $alias_str
fi
fi
}
# --------------------------------------------------------------------
# SCM Breeze functions
_alias "$git_status_shortcuts_alias" "git_status_shortcuts"
_alias "$git_add_shortcuts_alias" "git_add_shortcuts"
_alias "$exec_scmb_expand_args_alias" "exec_scmb_expand_args"
_alias "$git_show_files_alias" "git_show_affected_files"
_alias "$git_commit_all_alias" "git_commit_all"
# Git Index alias
_alias "$git_index_alias" "git_index"
# Only set up the following aliases if 'git_setup_aliases' is 'yes'
if [ "$git_setup_aliases" = "yes" ]; then
# Commands that deal with paths
__git_alias "$git_checkout_alias" "git" "checkout"
__git_alias "$git_commit_alias" "git" "commit"
__git_alias "$git_commit_verbose_alias" "git" "commit" "--verbose"
__git_alias "$git_reset_alias" "git" "reset" "--"
__git_alias "$git_reset_hard_alias" "git" "reset" "--hard"
__git_alias "$git_rm_alias" "git" "rm"
__git_alias "$git_blame_alias" "git" "blame"
__git_alias "$git_diff_alias" "git" "diff" "--"
__git_alias "$git_diff_word_alias" "git" "diff" "--word-diff"
__git_alias "$git_diff_cached_alias" "git" "diff" "--cached --"
__git_alias "$git_add_patch_alias" "git" "add" "-p"
__git_alias "$git_add_updated_alias" "git" "add" "-u"
__git_alias "$git_difftool_alias" "git" "difftool"
# Custom default format for git log
git_log_command="log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
__git_alias "$git_log_alias" "git" "$git_log_command"
# Same as the above, but displays all the branches and remotes
__git_alias "$git_log_all_alias" "git" "$git_log_command" "--branches" "--remotes"
# Standard commands
__git_alias "$git_clone_alias" "git" 'clone'
__git_alias "$git_fetch_alias" "git" 'fetch'
__git_alias "$git_checkout_branch_alias" "git" 'checkout' "-b"
__git_alias "$git_pull_alias" "git" 'pull'
__git_alias "$git_push_alias" "git" 'push'
__git_alias "$git_push_force_alias" "git" 'push' '-f'
__git_alias "$git_status_original_alias" "git" 'status' # (Standard git status)
__git_alias "$git_status_short_alias" "git" 'status' '-s'
__git_alias "$git_clean_alias" "git" "clean"
__git_alias "$git_clean_force_alias" "git" "clean" "-fd"
__git_alias "$git_remote_alias" "git" 'remote' '-v'
__git_alias "$git_rebase_alias" "git" 'rebase'
__git_alias "$git_rebase_interactive_alias" "git" 'rebase' "-i"
__git_alias "$git_rebase_alias_continue" "git" 'rebase' "--continue"
__git_alias "$git_rebase_alias_abort" "git" 'rebase' "--abort"
__git_alias "$git_reset_last_commit" "git" "reset HEAD~"
__git_alias "$git_merge_alias" "git" 'merge'
__git_alias "$git_merge_no_fast_forward_alias" "git" "merge" "--no-ff"
__git_alias "$git_merge_only_fast_forward_alias" "git" "merge" "--ff"
__git_alias "$git_cherry_pick_alias" "git" 'cherry-pick'
__git_alias "$git_show_alias" "git" 'show'
__git_alias "$git_show_summary" "git" 'show' '--summary'
__git_alias "$git_stash_alias" "git" 'stash'
__git_alias "$git_stash_apply_alias" "git" 'stash' 'apply'
__git_alias "$git_stash_pop_alias" "git" 'stash' 'pop'
__git_alias "$git_stash_list_alias" "git" 'stash' 'list'
__git_alias "$git_tag_alias" "git" 'tag'
# Compound/complex commands
_alias "$git_fetch_all_alias" "git fetch --all"
_alias "$git_pull_then_push_alias" "git pull && git push"
_alias "$git_fetch_and_rebase_alias" "git fetch && git rebase"
_alias "$git_commit_amend_alias" "git commit --amend"
# Add staged changes to latest commit without prompting for message
_alias "$git_commit_amend_no_msg_alias" "git commit --amend -C HEAD"
_alias "$git_commit_no_msg_alias" "git commit -C HEAD"
_alias "$git_log_stat_alias" "git log --stat --max-count=5"
_alias "$git_log_graph_alias" "git log --graph --max-count=5"
_alias "$git_add_all_alias" "git add --all ."
fi
# Tab completion
if [ $shell = "bash" ]; then
# Fix to preload Arch bash completion for git
[[ -s "/usr/share/git/completion/git-completion.bash" ]] && source "/usr/share/git/completion/git-completion.bash"
# new path in Ubuntu 13.04
[[ -s "/usr/share/bash-completion/completions/git" ]] && source "/usr/share/bash-completion/completions/git"
complete -o default -o nospace -F _git $git_alias
# Git repo management & aliases.
# If you know how to rewrite _git_index_tab_completion() for zsh, please send me a pull request!
complete -o nospace -F _git_index_tab_completion git_index
complete -o nospace -F _git_index_tab_completion $git_index_alias
else
compdef _git_index_tab_completion git_index $git_index_alias
fi