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.
172 lines
7.4 KiB
Bash
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
|