Re: [PATCH 2/2] complete: zsh: use zsh completion for the main cmd

2013-04-27 Thread Felipe Contreras
On Sat, Apr 27, 2013 at 4:39 PM, Junio C Hamano  wrote:
> Felipe Contreras  writes:
>
>> +__git_zsh_cmd_common ()
>> +{
>> + local -a list
>> + list=(
>> + add:'add file contents to the index'
>> + bisect:'find by binary search the change that introduced a bug'
>> + branch:'list, create, or delete branches'
>> + checkout:'checkout a branch or paths to the working tree'
>> + clone:'clone a repository into a new directory'
>> + commit:'record changes to the repository'
>> + diff:'show changes between commits, commit and working tree, etc'
>> + fetch:'download objects and refs from another repository'
>> + grep:'print lines matching a pattern'
>> + init:'create an empty Git repository or reinitialize an existing one'
>> + log:'show commit logs'
>> + merge:'join two or more development histories together'
>> + mv:'move or rename a file, a directory, or a symlink'
>> + pull:'fetch from and merge with another repository or a local branch'
>> + push:'update remote refs along with associated objects'
>> + rebase:'forward-port local commits to the updated upstream head'
>> + reset:'reset current HEAD to the specified state'
>> + rm:'remove files from the working tree and from the index'
>> + show:'show various types of objects'
>> + status:'show the working tree status'
>> + tag:'create, list, delete or verify a tag object signed with GPG')
>
> Maintaining this list feels somewhat painful.  Isn't this something
> we can help by tweaking "git help"?

Yes, that's the way Bazaar does it (bzr shell-complete), but for now
this does the trick.

Also, I've been carrying around the patches from Stephen Boyd that add
--dump-raw-long-options. I think it would be better if somehow 'git
help' learned how to throw this output for both commands and
arguments, and then use the first part for bash, or specify bash
format somehow. Of course, we would need to add support for
descriptions in the option parser.

It's the big world-domination plan for completions, but I haven't had
time to work on that.

Cheers.

-- 
Felipe Contreras
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] complete: zsh: use zsh completion for the main cmd

2013-04-27 Thread Junio C Hamano
Felipe Contreras  writes:

> +__git_zsh_cmd_common ()
> +{
> + local -a list
> + list=(
> + add:'add file contents to the index'
> + bisect:'find by binary search the change that introduced a bug'
> + branch:'list, create, or delete branches'
> + checkout:'checkout a branch or paths to the working tree'
> + clone:'clone a repository into a new directory'
> + commit:'record changes to the repository'
> + diff:'show changes between commits, commit and working tree, etc'
> + fetch:'download objects and refs from another repository'
> + grep:'print lines matching a pattern'
> + init:'create an empty Git repository or reinitialize an existing one'
> + log:'show commit logs'
> + merge:'join two or more development histories together'
> + mv:'move or rename a file, a directory, or a symlink'
> + pull:'fetch from and merge with another repository or a local branch'
> + push:'update remote refs along with associated objects'
> + rebase:'forward-port local commits to the updated upstream head'
> + reset:'reset current HEAD to the specified state'
> + rm:'remove files from the working tree and from the index'
> + show:'show various types of objects'
> + status:'show the working tree status'
> + tag:'create, list, delete or verify a tag object signed with GPG')

Maintaining this list feels somewhat painful.  Isn't this something
we can help by tweaking "git help"?
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/2] complete: zsh: use zsh completion for the main cmd

2013-04-27 Thread Felipe Contreras
So that we can have a nice zsh completion output:

% git 
add   -- add file contents to the index
bisect-- find by binary search the change that introduced a bug
branch-- list, create, or delete branches
checkout  -- checkout a branch or paths to the working tree
clone -- clone a repository into a new directory
commit-- record changes to the repository
diff  -- show changes between commits, commit and working tree, etc
fetch -- download objects and refs from another repository
grep  -- print lines matching a pattern
init  -- create an empty Git repository or reinitialize an existing one
log   -- show commit logs
merge -- join two or more development histories together
mv-- move or rename a file, a directory, or a symlink
pull  -- fetch from and merge with another repository or a local branch
push  -- update remote refs along with associated objects
rebase-- forward-port local commits to the updated upstream head
reset -- reset current HEAD to the specified state
rm-- remove files from the working tree and from the index
show  -- show various types of objects
status-- show the working tree status
tag   -- create, list, delete or verify a tag object signed with GPG

And other niceties, like 'git --git-dir=' showing only directories.

For the rest, the bash completion stuff is still used.

Also, add my copyright, since this more than a thin wrapper.

Signed-off-by: Felipe Contreras 
---
 contrib/completion/git-completion.zsh | 120 +-
 1 file changed, 119 insertions(+), 1 deletion(-)

diff --git a/contrib/completion/git-completion.zsh 
b/contrib/completion/git-completion.zsh
index 93d8f42..49f0cb8 100644
--- a/contrib/completion/git-completion.zsh
+++ b/contrib/completion/git-completion.zsh
@@ -2,6 +2,8 @@
 
 # zsh completion wrapper for git
 #
+# Copyright (c) 2012-2013 Felipe Contreras 
+#
 # You need git's bash completion script installed somewhere, by default on the
 # same directory as this script.
 #
@@ -21,6 +23,9 @@ complete ()
return 0
 }
 
+zstyle -T ':completion:*:*:git:*' tag-order && \
+   zstyle ':completion:*:*:git:*' tag-order 'common-commands'
+
 zstyle -s ":completion:*:*:git:*" script script
 test -z "$script" && script="$(dirname 
${funcsourcetrace[1]%:*})"/git-completion.bash
 ZSH_VERSION='' . "$script"
@@ -69,6 +74,115 @@ __gitcomp_file ()
compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
 }
 
+__git_zsh_bash_func ()
+{
+   emulate -L ksh
+
+   local command=$1
+
+   local completion_func="_git_${command//-/_}"
+   declare -f $completion_func >/dev/null && $completion_func && return
+
+   local expansion=$(__git_aliased_command "$command")
+   if [ -n "$expansion" ]; then
+   completion_func="_git_${expansion//-/_}"
+   declare -f $completion_func >/dev/null && $completion_func
+   fi
+}
+
+__git_zsh_cmd_common ()
+{
+   local -a list
+   list=(
+   add:'add file contents to the index'
+   bisect:'find by binary search the change that introduced a bug'
+   branch:'list, create, or delete branches'
+   checkout:'checkout a branch or paths to the working tree'
+   clone:'clone a repository into a new directory'
+   commit:'record changes to the repository'
+   diff:'show changes between commits, commit and working tree, etc'
+   fetch:'download objects and refs from another repository'
+   grep:'print lines matching a pattern'
+   init:'create an empty Git repository or reinitialize an existing one'
+   log:'show commit logs'
+   merge:'join two or more development histories together'
+   mv:'move or rename a file, a directory, or a symlink'
+   pull:'fetch from and merge with another repository or a local branch'
+   push:'update remote refs along with associated objects'
+   rebase:'forward-port local commits to the updated upstream head'
+   reset:'reset current HEAD to the specified state'
+   rm:'remove files from the working tree and from the index'
+   show:'show various types of objects'
+   status:'show the working tree status'
+   tag:'create, list, delete or verify a tag object signed with GPG')
+   _describe -t common-commands 'common commands' list && _ret=0
+}
+
+__git_zsh_cmd_alias ()
+{
+   local -a list
+   list=(${${${(0)"$(git config -z --get-regexp 
'^alias\.')"}#alias.}%$'\n'*})
+   _describe -t alias-commands 'aliases' list $* && _ret=0
+}
+
+__git_zsh_cmd_all ()
+{
+   local -a list
+   emulate ksh -c __git_compute_all_commands
+   list=( ${=__git_all_commands} )
+   _describe -t all-commands 'all commands' list && _ret=0
+}
+
+__git_zsh_main ()
+{
+   local curcontext="$curcontext" state state_descr line
+   typeset -A opt_args
+   local -a orig_words
+
+   orig_words=( ${words[@]} )
+
+   _arguments -C \
+   '(-p --paginate --no-p