diff --git a/plugins/git-extras/git-extras.plugin.zsh b/plugins/git-extras/git-extras.plugin.zsh index 8419166a..d91c1af8 100644 --- a/plugins/git-extras/git-extras.plugin.zsh +++ b/plugins/git-extras/git-extras.plugin.zsh @@ -3,19 +3,20 @@ # Description # ----------- # -# Completion script for git-extras (http://github.com/visionmedia/git-extras). +# Completion script for git-extras (http://github.com/tj/git-extras). # # ------------------------------------------------------------------------------ # Authors # ------- # # * Alexis GRIMALDI (https://github.com/agrimaldi) +# * spacewander (https://github.com/spacewander) # # ------------------------------------------------------------------------------ # Inspirations # ----------- # -# * git-extras (http://github.com/visionmedia/git-extras) +# * git-extras (http://github.com/tj/git-extras) # * git-flow-completion (http://github.com/bobthecow/git-flow-completion) # # ------------------------------------------------------------------------------ @@ -30,10 +31,21 @@ __git_command_successful () { } +__git_commits() { + declare -A commits + git log --oneline -15 | sed 's/\([[:alnum:]]\{7\}\) /\1:/' | while read commit + do + hash=$(echo $commit | cut -d':' -f1) + commits[$hash]="$commit" + done + local ret=1 + _describe -t commits commit commits && ret=0 +} + __git_tag_names() { local expl declare -a tag_names - tag_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/}) + tag_names=(${${(f)"$(_call_program tags git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/}) __git_command_successful || return _wanted tag-names expl tag-name compadd $* - $tag_names } @@ -47,31 +59,27 @@ __git_branch_names() { _wanted branch-names expl branch-name compadd $* - $branch_names } - -__git_feature_branch_names() { +__git_specific_branch_names() { local expl declare -a branch_names - branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/feature 2>/dev/null)"}#refs/heads/feature/}) + branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/"$1" 2>/dev/null)"}#refs/heads/$1/}) __git_command_successful || return _wanted branch-names expl branch-name compadd $* - $branch_names } +__git_feature_branch_names() { + __git_specific_branch_names 'feature' +} + + __git_refactor_branch_names() { - local expl - declare -a branch_names - branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/refactor 2>/dev/null)"}#refs/heads/refactor/}) - __git_command_successful || return - _wanted branch-names expl branch-name compadd $* - $branch_names + __git_specific_branch_names 'refactor' } __git_bug_branch_names() { - local expl - declare -a branch_names - branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/bug 2>/dev/null)"}#refs/heads/bug/}) - __git_command_successful || return - _wanted branch-names expl branch-name compadd $* - $branch_names + __git_specific_branch_names 'bug' } @@ -92,6 +100,35 @@ __git_author_names() { _wanted author-names expl author-name compadd $* - $author_names } +# subcommands + +_git-bug() { + local curcontext=$curcontext state line ret=1 + declare -A opt_args + + _arguments -C \ + ': :->command' \ + '*:: :->option-or-argument' && ret=0 + + case $state in + (command) + declare -a commands + commands=( + 'finish:merge bug into the current branch' + ) + _describe -t commands command commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*}-$line[1]: + case $line[1] in + (finish) + _arguments -C \ + ':branch-name:__git_bug_branch_names' + ;; + esac + esac +} + _git-changelog() { _arguments \ @@ -99,11 +136,6 @@ _git-changelog() { } -_git-effort() { - _arguments \ - '--above[ignore file with less than x commits]' \ -} - _git-contrib() { _arguments \ @@ -135,6 +167,11 @@ _git-delete-tag() { } +_git-effort() { + _arguments \ + '--above[ignore file with less than x commits]' +} + _git-extras() { local curcontext=$curcontext state line ret=1 declare -A opt_args @@ -154,20 +191,7 @@ _git-extras() { esac _arguments \ - '(-v --version)'{-v,--version}'[show current version]' \ -} - - -_git-graft() { - _arguments \ - ':src-branch-name:__git_branch_names' \ - ':dest-branch-name:__git_branch_names' -} - - -_git-squash() { - _arguments \ - ':branch-name:__git_branch_names' + '(-v --version)'{-v,--version}'[show current version]' } @@ -199,6 +223,25 @@ _git-feature() { } +_git-graft() { + _arguments \ + ':src-branch-name:__git_branch_names' \ + ':dest-branch-name:__git_branch_names' +} + + +_git-ignore() { + _arguments -C \ + '(--local -l)'{--local,-l}'[show local gitignore]' \ + '(--global -g)'{--global,-g}'[show global gitignore]' +} + +_git-missing() { + _arguments \ + ':first-branch-name:__git_branch_names' \ + ':second-branch-name:__git_branch_names' +} + _git-refactor() { local curcontext=$curcontext state line ret=1 declare -A opt_args @@ -227,59 +270,62 @@ _git-refactor() { } -_git-bug() { - local curcontext=$curcontext state line ret=1 - declare -A opt_args +_git-squash() { + _arguments \ + ':branch-name:__git_branch_names' +} - _arguments -C \ - ': :->command' \ - '*:: :->option-or-argument' && ret=0 - - case $state in - (command) - declare -a commands - commands=( - 'finish:merge bug into the current branch' - ) - _describe -t commands command commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*}-$line[1]: - case $line[1] in - (finish) - _arguments -C \ - ':branch-name:__git_bug_branch_names' - ;; - esac - esac +_git-summary() { + _arguments '--line[summarize with lines other than commits]' + __git_commits } +_git-undo(){ + _arguments -C \ + '(--soft -s)'{--soft,-s}'[only rolls back the commit but changes remain un-staged]' \ + '(--hard -h)'{--hard,-h}'[wipes your commit(s)]' +} + zstyle ':completion:*:*:git:*' user-commands \ + alias:'define, search and show aliases' \ + archive-file:'export the current HEAD of the git repository to a archive' \ + back:'undo and stage latest commits' \ + bug:'create a bug branch' \ changelog:'populate changelog file with commits since the previous tag' \ + commits-since:'list commits since a given date' \ contrib:'display author contributions' \ count:'count commits' \ + create-branch:'create local and remote branch' \ delete-branch:'delete local and remote branch' \ + delete-merged-brancees:'delete merged branches'\ delete-submodule:'delete submodule' \ delete-tag:'delete local and remote tag' \ - extras:'git-extras' \ - graft:'merge commits from source branch to destination branch' \ - squash:'merge commits from source branch into the current one as a single commit' \ - feature:'create a feature branch' \ - refactor:'create a refactor branch' \ - bug:'create a bug branch' \ - summary:'repository summary' \ effort:'display effort statistics' \ - repl:'read-eval-print-loop' \ - commits-since:'list commits since a given date' \ - release:'release commit with the given tag' \ - alias:'define, search and show aliases' \ + extras:'git-extras' \ + feature:'create a feature branch' \ + fork:'fork a repo on github' \ + fresh-branch:'create empty local branch' \ + gh-pages:'create the GitHub Pages branch' \ + graft:'merge commits from source branch to destination branch' \ ignore:'add patterns to .gitignore' \ info:'show info about the repository' \ - create-branch:'create local and remote branch' \ - fresh-branch:'create empty local branch' \ - undo:'remove the latest commit' \ - setup:'setup a git repository' \ - touch:'one step creation of new files' \ - obliterate:'Completely remove a file from the repository, including past commits and tags' \ local-commits:'list unpushed commits on the local branch' \ + lock:'lock a file excluded from version control' \ + locked:'ls files that have been locked' \ + missing:'show commits missing from another branch' \ + pr:'checks out a pull request locally' \ + rebase-patch:'rebases a patch' \ + refactor:'create a refactor branch' \ + release:'commit, tag and push changes to the repository' \ + rename-tag:'rename a tag' \ + repl:'read-eval-print-loop' \ + reset-file:'reset one file' \ + root:'show path of root' \ + setup:'setup a git repository' \ + show-tree:'show branch tree of commit history' \ + squash:'merge commits from source branch into the current one as a single commit' \ + summary:'repository summary' \ + touch:'one step creation of new files' \ + undo:'remove the latest commit' \ + unlock:'unlock a file excluded from version control'