diff --git a/plugins/git2/README.md b/plugins/git2/README.md new file mode 100644 index 00000000..a739245b --- /dev/null +++ b/plugins/git2/README.md @@ -0,0 +1,7 @@ +## Git plugin +**Maintainer:** [Stibbons](https://github.com/Stibbons) + +Compared to the first git plugin, this one adds several organised git aliases and increase the completion +function provided by zsh. Please note that is is a complete rework, with many new aliases to relearn. + + diff --git a/plugins/git2/_git-branch b/plugins/git2/_git-branch new file mode 100644 index 00000000..6b9c1a48 --- /dev/null +++ b/plugins/git2/_git-branch @@ -0,0 +1,83 @@ +#compdef git-branch + +_git-branch () +{ + declare l c m d + + l='--color --no-color -r -a --all -v --verbose --abbrev --no-abbrev' + c='-l -f --force -t --track --no-track --set-upstream --contains --merged --no-merged' + m='-m -M' + d='-d -D' + + declare -a dependent_creation_args + if (( words[(I)-r] == 0 )); then + dependent_creation_args=( + "($l $m $d): :__git_branch_names" + "::start-point:__git_revisions") + fi + + declare -a dependent_deletion_args + if (( words[(I)-d] || words[(I)-D] )); then + dependent_creation_args= + dependent_deletion_args=( + '-r[delete only remote-tracking branches]') + if (( words[(I)-r] )); then + dependent_deletion_args+='*: :__git_ignore_line_inside_arguments __git_remote_branch_names' + else + dependent_deletion_args+='*: :__git_ignore_line_inside_arguments __git_branch_names' + fi + fi + + declare -a dependent_modification_args + if (( words[(I)-m] || words[(I)-M] )); then + dependent_creation_args= + dependent_modification_args=( + ':old or new branch name:__git_branch_names' + '::new branch name:__git_branch_names') + fi + + _arguments -w -S -s \ + "($c $m $d --no-color :)--color=-[turn on branch coloring]:: :__git_color_whens" \ + "($c $m $d : --color)--no-color[turn off branch coloring]" \ + "($c $m -a --all)-r[list or delete only remote-tracking branches]" \ + "($c $m $d : -r)"{-a,--all}"[list both remote-tracking branches and local branches]" \ + "($c $m $d : -v --verbose)"{-v,--verbose}'[show SHA1 and commit subject line for each head]' \ + "($c $m $d :)--abbrev=[set minimum SHA1 display-length]: :__git_guard_number length" \ + "($c $m $d :)--no-abbrev[do not abbreviate sha1s]" \ + "($l $m $d)-l[create the branch's reflog]" \ + "($l $m $d -f --force)"{-f,--force}"[force the creation of a new branch]" \ + "($l $m $d -t --track)"{-t,--track}"[set up configuration so that pull merges from the start point]" \ + "($l $m $d)--no-track[override the branch.autosetupmerge configuration variable]" \ + "($l $m $d)--set-upstream[set up configuration so that pull merges]" \ + "($l $m $d)--contains=[only list branches which contain the specified commit]: :__git_committishs" \ + "($l $m $d)--merged=[only list branches which are fully contained by HEAD]: :__git_committishs" \ + "($l $m $d)--no-merged=[do not list branches which are fully contained by HEAD]: :__git_committishs" \ + $dependent_creation_args \ + "($l $c $d -M)-m[rename a branch and the corresponding reflog]" \ + "($l $c $d -m)-M[rename a branch even if the new branch-name already exists]" \ + $dependent_modification_args \ + "($l $c $m -D)-d[delete a fully merged branch]" \ + "($l $c $m -d)-D[delete a branch]" \ + $dependent_deletion_args +} + +(( $+functions[__git_ignore_line] )) || +__git_ignore_line () { + declare -a ignored + ignored=() + ((CURRENT > 1)) && + ignored+=(${line[1,CURRENT-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) + ((CURRENT < $#line)) && + ignored+=(${line[CURRENT+1,-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) + $* -F ignored +} + +(( $+functions[__git_ignore_line_inside_arguments] )) || +__git_ignore_line_inside_arguments () { + declare -a compadd_opts + + zparseopts -D -E -a compadd_opts V: J: 1 2 n f X: M: P: S: r: R: q F: + + __git_ignore_line $* $compadd_opts +} + diff --git a/plugins/git2/_git-remote b/plugins/git2/_git-remote new file mode 100644 index 00000000..4ba62a35 --- /dev/null +++ b/plugins/git2/_git-remote @@ -0,0 +1,74 @@ +#compdef git-remote + +# NOTE: --track is undocumented. +# TODO: --track, -t, --master, and -m should take remote branches, I guess. +# NOTE: --master is undocumented. +# NOTE: --fetch is undocumented. +_git-remote () { + local curcontext=$curcontext state line + declare -A opt_args + + _arguments -C \ + ':command:->command' \ + '*::options:->options' && ret=0 + + case $state in + (command) + declare -a commands + + commands=( + 'add:add a new remote' + 'show:show information about a given remote' + 'prune:delete all stale tracking branches for a given remote' + 'update:fetch updates for a set of remotes' + 'rm:remove a remote from .git/config and all associated tracking branches' + 'rename:rename a remote from .git/config and update all associated tracking branches' + 'set-head:sets or deletes the default branch' + 'set-branches:changes the list of branches tracked by the named remote.' + 'set-url:changes URL remote points to.' + ) + + _describe -t commands 'sub-command' commands && ret=0 + ;; + (options) + case $line[1] in + (add) + _arguments \ + '*'{--track,-t}'[track given branch instead of default glob refspec]:branch:__git_branch_names' \ + '(--master -m)'{--master,-m}'[set the remote'\''s HEAD to point to given master branch]:branch:__git_branch_names' \ + '(--fetch -f)'{--fetch,-f}'[run git-fetch on the new remote after it has been created]' \ + ':branch name:__git_remotes' \ + ':url:_urls' && ret=0 + ;; + (show) + _arguments \ + '-n[do not contact the remote for a list of branches]' \ + ':remote:__git_remotes' && ret=0 + ;; + (prune) + _arguments \ + '(--dry-run -n)'{-n,--dry-run}'[do not actually prune, only list what would be done]' \ + ':remote:__git_remotes' && ret=0 + ;; + (update) + __git_remote-groups && ret=0 + ;; + (rm) + __git_remotes && ret=0 + ;; + (rename) + __git_remotes && ret=0 + ;; + (set-url) + _arguments \ + '*--push[manipulate push URLs]' \ + '(--add)--add[add URL]' \ + '(--delete)--delete[delete URLs]' \ + ':branch name:__git_remotes' \ + ':url:_urls' && ret=0 + ;; + + esac + ;; + esac +} diff --git a/plugins/git2/git.plugin.zsh b/plugins/git2/git.plugin.zsh new file mode 100644 index 00000000..5c8bb280 --- /dev/null +++ b/plugins/git2/git.plugin.zsh @@ -0,0 +1,332 @@ +# Aliases for Git tool. + +############ +# Common (g) +############ +alias g='git' +compdef g=git + +################## +# Git status (gst) +################## +# Git status +alias gst='git status' +compdef _git gst=git-status +# shortened git status +alias gsts='git status -s' +compdef _git gsts=git-status + +############### +# Git Diff (gd) +############### +# Git diff (colorful) +alias gd='git diff --color' +compdef _git gd=git-diff +# Git diff staged changes +alias gdc='git diff --cached' +compdef _git gdc=git-diff +# Git diff in a vim editor +gdv() { git diff -w "$@" | view - } +compdef _git gdv=git-diff + +############### +# Git Pull (gp) +############### +# Git pull +alias gp='git pull' +compdef _git gl=git-pull +# Git pull and rebase +alias gpr='git pull --rebase' +compdef _git gpr=git-pull + +############### +# git push (gP) +############### +# since pushing has much impact than pulling (gp), it use a capital case +# git push +alias gP='git push' +compdef _git gP=git-push +# git push dry run +alias gPd='git push --dry-run' +compdef _git gPd=git-push +# git push force +alias gPf='git push --force' +compdef _git gPf=git-push + +################ +# Git Fetch (gf) +################ +# Git fetch current branch +alias gf='git fetch' +compdef _git gf='git-fetch' +# Git fetch all branches +alias gfa='git fetch --all' +compdef _git gfa='git-fetch' +# reset your work to the latest status of the code base (and fetch all other branches). +# (git fetch all branch and rebase) +alias gfagpr='git fetch --all && git pull --rebase' +compdef _git gfagpr='git-pull' + +################# +# Git Commit (gc) +################# +# Git commit +alias gc='git commit -v' +compdef _git gc=git-commit +# Git commit amend +alias gc!='git commit -v --amend' +compdef _git gc!=git-commit +# Git commit all tracked files +alias gca='git commit -v -a' +compdef _git gca=git-commit +# Git commit amend all tracked files +alias gca!='git commit -v -a --amend' +compdef _git gca!=git-commit +# Git commit with message +alias gcmsg='git commit -m' +compdef _git gcmsg=git-commit + +#################### +# Git Checkout (gco) +#################### +# git checkout +alias gco='git checkout' +compdef _git gco=git-checkout +# Git checkout master +alias gcom='git checkout master' +compdef _git gcom=git-checkout + +# Git Remote (gre) +alias gre='git remote' +compdef _git gre=git-remote +alias grev='git remote -v' +compdef _git grv=git-remote +alias gremv='git remote rename' +compdef _git gremv=git-remote +alias grerm='git remote remove' +compdef _git grrm=git-remote +alias greset='git remote set-url' +compdef _git greset=git-remote +alias greup='git remote update' +compdef _git greset=git-remote + +# Git Rebase (gr) +alias gr='git rebase -i' +compdef _git gr=git-rebase +alias grc='git rebase --continue' +compdef _git grc=git-rebase +alias gra='git rebase --abort' +compdef _git gra=git-rebase +alias grs='git rebase --skip' +compdef _git grs=git-rebase +alias grm='git rebase master' +compdef _git grm=git-rebase + +##################################################### +# Git rebase Interactively N commit (rewrite history) +##################################################### +alias gr2='git rebase -i HEAD~2' +compdef _git gr2=git-rebase +alias gr3='git rebase -i HEAD~3' +compdef _git gr3=git-rebase +alias gr4='git rebase -i HEAD~4' +compdef _git gr4=git-rebase +alias gr5='git rebase -i HEAD~5' +compdef _git gr5=git-rebase +alias gr6='git rebase -i HEAD~6' +compdef _git gr6=git-rebase +alias gr7='git rebase -i HEAD~7' +compdef _git gr7=git-rebase +alias gr8='git rebase -i HEAD~8' +compdef _git gr8=git-rebase +alias gr9='git rebase -i HEAD~9' +compdef _git gr9=git-rebase +alias gr10='git rebase -i HEAD~10' +compdef _git gr10=git-rebase + +# Git Branch (gb) +alias gb='git branch' +compdef _git gb=git-branch +alias gba='git branch -a' +compdef _git gba=git-branch + +############## +# Git Log (gl) +############## +alias gl='git log' +compdef _git gl=git-log +# Git log graph +alias glg='git log --stat --max-count=10' +compdef _git glg=git-log +# Git log graph with patch content +alias glgp='git log --graph --max-count=10 -p' +compdef _git glgp=git-log +## Git log graph limited to 10 +alias glgm='git log --graph --max-count=10' +compdef _git glgm=git-log +# Git log graph colorful +alias glgg='git log --graph --color' +compdef _git glgg=git-log +# Git log graph with all branches +alias glgga='git log --graph --decorate --all' +compdef _git glgga=git-log +# one line git log +alias glo='git log --oneline' +compdef _git glo=git-log + +###################### +# Git Reset Head (grh) +###################### +# Soft Reset to HEAD +alias grh='git reset HEAD' +compdef _git grh=git-reset +# Hard reset to HEAD +alias grhh='git reset HEAD --hard' +compdef _git grhh=git-reset + +################ +# Git merge (gm) +################ +# Git merge +alias gm='git merge' +compdef _git gm=git-merge +# git merge changes from the master branch on the upstream remote +alias gmum='git merge upstream/master' +compdef _git gmum=git-merge + +# Other +# Show contribution scorecard +alias gcount='git shortlog -sn' +compdef gcount=git +# Show current configuration +alias gcl='git config --list' +compdef _git gcl=git-config +alias gcp='git cherry-pick' +compdef _git gcp=git-cherry-pick +alias ga='git add' +compdef _git ga=git-add + +# See what changed in the current commit +alias gwc='git whatchanged -p --abbrev-commit --pretty=medium' +compdef _git gwc=git-whatchanged + +# Search for a changed file +alias gls='git ls-files | grep' +compdef _git gls=git-ls-files + +alias gpoat='git push origin --all && git push origin --tags' +compdef _git gpoat=git-push +alias gmt='git mergetool --no-prompt' +compdef _git gmt=git-mergetool +alias gmtvim='git mergetool --no-prompt --tool=vimdiff' +compdef _git gmtvim=git-mergetool + +# Git stash (gsta) +alias gsta='git stash' +compdef _git gsta='git-stash' +alias gstas='git stash show --text' +compdef _git gstas='git-stash' +alias gstap='git stash pop' +compdef _git gstap='git-stash' +alias gstaa='git stash apply' +compdef _git gstaa='git-stash' +alias gstad='git stash drop' +compdef _git gstad='git-stash' + +# Git Gui (gg) +alias gg='git gui citool' +compdef _git gg='git gui' +alias gga='git gui citool --amend' +compdef _git gga='git gui citool --amend' + +# Gitk +alias gk='\gitk --all --branches' +compdef _git gk='gitk' +# show complete history, with dangling commits +alias gitk-entier-history='\gitk --all $(git log -g --pretty=format:%h)' +compdef _git gitk='gitk' +alias gke='gitk-entier-history' +compdef _git gke='gitk' +# Note: if the commit has been cleaned my 'git gc', the dangling commits older than 2 weeks may have been deleted + +# Clean +# Remove all .orig, .BASE.*, .REMOTE.*, .LOCAL.*, *.BACKUP files +alias gclean=" find . -name '*.orig' -or -name '*.REMOTE.*' -or -name '*.LOCAL.*' -or -name '*.BACKUP.*' -or -name '*.BASE.*' | xargs -r rm -v" + +# Edit global Git configuration files +alias gitconfig="vim ~/.gitconfig" +alias gitmessage="vim ~/.gitmessage" + +# Will cd into the top of the current repository +# or submodule. +alias grt='cd $(git rev-parse --show-toplevel || echo ".")' + +# Git and svn mix +alias git-svn-dcommit-push='git svn dcommit && git push github master:svntrunk' +compdef git-svn-dcommit-push=git + +# Git SVN +alias gsr='git svn rebase' +compdef _git gsr='git-svn' +alias gsd='git svn dcommit' +compdef _git gsd='git-svn' + +# +# Will return the current branch name +# Usage example: git pull origin $(current_branch) +# +function current_branch() { + ref=$(git symbolic-ref HEAD 2> /dev/null) || \ + ref=$(git rev-parse --short HEAD 2> /dev/null) || return + echo ${ref#refs/heads/} +} + +function current_repository() { + ref=$(git symbolic-ref HEAD 2> /dev/null) || \ + ref=$(git rev-parse --short HEAD 2> /dev/null) || return + echo $(git remote -v | cut -d':' -f 2) +} + +# these aliases take advantage of the previous function +alias ggpull='git pull origin $(current_branch)' +compdef ggpull=git +alias ggpur='git pull --rebase origin $(current_branch)' +compdef ggpur=git +alias ggpush='git push origin $(current_branch)' +compdef ggpush=git +alias ggpnp='git pull origin $(current_branch) && git push origin $(current_branch)' +compdef ggpnp=git + +# Pretty log messages +function _git_log_prettily(){ + if ! [ -z $1 ]; then + git log --pretty=$1 + fi +} +alias glp="_git_log_prettily" +compdef _git glp=git-log + +# Work In Progress (wip) +# These features allow to pause a branch development and switch to another one (wip) +# When you want to go back to work, just unwip it +# +# This function return a warning if the current branch is a wip +function work_in_progress() { + if $(git log -n 1 2>/dev/null | grep -q -c "\-\-wip\-\-"); then + echo "WIP!!" + fi +} +# these alias commit and uncomit wip branches +alias gwip='git add -A; git ls-files --deleted -z | xargs -0 git rm; git commit -m "--wip--"' +alias gunwip='git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1' + +# these alias ignore changes to file +alias gignore='git update-index --assume-unchanged' +compdef _git gignore='git update-index' +alias gunignore='git update-index --no-assume-unchanged' +compdef _git gunignore='git update-index' +# list temporarily ignored files +alias gignored='git ls-files -v | grep "^[[:lower:]]"' + + +