[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: bash completion for subversion

From: Philip Martin <philip_at_codematters.co.uk>
Date: 2004-11-08 20:24:54 CET

Martin Blais <martin.blais@gmail.com> writes:

> a little potential contribution: i took the bash completion file for
> subversion and modified it so that it uses the output of subversion
> itself to provide the completions, similar in idea to optcomplete
> (http://furius.ca/optcomplete). the idea is that the completions will
> never go out-of-sync with whatever version of subversion you have
> installed (well, unless the help format changes, which i estimate to
> be unlikely).
>
> cheers,
>
> p.s. if someone thinks that this is worth adding to the codebase, feel
> free to do so.

I like the idea, but when I try to use it bash goes awol, using more
and more memory until I interrupt the completion.

> #!/bin/sh

Why? Doesn't it need to be sourced by a shell, rather than executed?

> #
> # $Id: bashrc,v 1.1 2004/11/08 00:09:46 blais Exp $
> # $Source: /u/blais/cvsroot/oversion/etc/bashrc,v $
> #
> # Author: Martin Blais
> # Date: 2004-11-07
> #
>
> _svn_common ()
> {
> exe=$1
> local cur cmds cmdOpts pOpts mOpts rOpts qOpts nOpts optsParam opt
> local helpCmds optBase i

A lot of these are now not used and could be removed.

>
> COMPREPLY=()
> cur=${COMP_WORDS[COMP_CWORD]}
>
> # Possible expansions, without unambiguous abbreviations such as "up".
> cmds=$($exe help| egrep '^ ' | sed -e 's/(//;s/)//;s/,//g')
>
> if [[ $COMP_CWORD -eq 1 ]] ; then
> COMPREPLY=( $( compgen -W "$cmds" -- $cur ) )
> return 0
> fi
>
> # find the current command
> cmd=${COMP_WORDS[1]}
>
> # options that require a parameter
> helpOut=$($exe $cmd --help | egrep '^ .* : ' | \
> sed -e 's/[ ]*:.*//;s/\[//;s/\]//;')
>
> optsParam=$(echo "$helpOut" | grep arg$)
> optsParam=$(echo $optsParam | sed -e 's/ arg//g;s/ /|/g')
>
> # if not typing an option, or if the previous option required a
> # parameter, then fallback on ordinary filename expansion
> helpCmds='help|--help|h|\?'
> if [[ ${COMP_WORDS[1]} != @($helpCmds) ]] && \
> [[ "$cur" != -* ]] || \
> [[ ${COMP_WORDS[COMP_CWORD-1]} == @($optsParam) ]] ; then
> return 0
> fi
>
> cmdOpts=$(echo $helpOut | sed -e 's/ arg//g')
>
> COMPREPLY=( $( compgen -W "$cmdOpts" -- $cur ) )
>
> return 0
> }
>
> _svn_new ()
> {
> _svn_common "svn"
> }
> complete -F _svn_new -o default svn
>
> _svnadmin_new ()
> {
> _svn_common "svnadmin"
> }

You have also removed the alternatives/exclusives handling, I'd like
to see that back.

My real problem is that I can't get it to work. The things that don't
work are:

   $ svn <TAB>

The shell uses CPU and memory (it goes into swap) but doesn't generate
a list of commands. Command completion fails in the same way:

   $ svn che<TAB>

but option expansion works fine:

   $ svn commit -<TAB><TAB>
   --config-dir --message --quiet -m
   --editor-cmd --no-auth-cache --targets -q
   --encoding --non-interactive --username
   --file --non-recursive -F
   --force-log --password -N

-- 
Philip Martin
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Mon Nov 8 20:26:05 2004

This is an archived mail posted to the Subversion Dev mailing list.