393 lines
11 KiB
Plaintext
Raw Normal View History

# cvs(1) completion
have cvs || return
set_prefix()
{
2009-10-04 19:42:50 +02:00
[ -z ${prefix:-} ] || prefix=${cur%/*}/
[ -r ${prefix:-}CVS/Entries ] || prefix=""
}
get_entries()
{
2009-10-04 19:42:50 +02:00
local IFS=$'\n'
[ -r ${prefix:-}CVS/Entries ] && \
entries=$(cut -d/ -f2 -s ${prefix:-}CVS/Entries)
}
get_modules()
{
2009-10-04 19:42:50 +02:00
if [ -n "$prefix" ]; then
COMPREPLY=( $( command ls -d ${cvsroot}/${prefix}/!(CVSROOT) ) )
else
COMPREPLY=( $( command ls -d ${cvsroot}/!(CVSROOT) ) )
fi
}
_cvs_commands()
{
cvs --help-commands 2>&1 | awk '/^( *|\t)/ { print $1 }'
}
_cvs_options()
{
cvs --help-options 2>&1 | awk '/^( *|\t)-/ { print $1 }'
}
_cvs_command_options()
{
cvs --help $1 2>&1 | sed -ne 's/^[[:space:]]*\(-[^[:space:]=[]*\).*/\1/p'
}
_cvs_kflags()
{
COMPREPLY=( $( compgen -W 'kv kvl k o b v' -- "$cur" ) )
}
_cvs_roots()
{
local -a cvsroots
cvsroots=( $CVSROOT )
[ -r ~/.cvspass ] && \
cvsroots+=( $( awk '{ print $2 }' ~/.cvspass ) )
[ -r CVS/Root ] && cvsroots+=( $( cat CVS/Root ) )
COMPREPLY=( $( compgen -W '${cvsroots[@]}' -- "$cur" ) )
__ltrim_colon_completions "$cur"
}
_cvs()
{
local cur prev words cword
_init_completion -n : || return
local count mode i cvsroot cvsroots pwd
local -a flags miss files entries changed newremoved
2009-10-04 19:42:50 +02:00
count=0
for i in "${words[@]}"; do
[ $count -eq $cword ] && break
2009-10-04 19:42:50 +02:00
# Last parameter was the CVSROOT, now go back to mode selection
if [[ "${words[((count))]}" == "$cvsroot" && "$mode" == cvsroot ]]; then
2009-10-04 19:42:50 +02:00
mode=""
fi
if [ -z "$mode" ]; then
case $i in
2009-10-20 21:51:47 +03:00
-H|--help)
COMPREPLY=( $( compgen -W "$( _cvs_commands )" -- "$cur" ) )
return 0
;;
-d)
mode=cvsroot
cvsroot=${words[((count+1))]}
2009-10-20 21:51:47 +03:00
;;
ad|add|new)
2009-10-20 21:51:47 +03:00
mode=add
;;
adm|admin|rcs)
2009-10-20 21:51:47 +03:00
mode=admin
;;
ann|annotate)
2009-10-20 21:51:47 +03:00
mode=annotate
;;
checkout|co|get)
2009-10-20 21:51:47 +03:00
mode=checkout
;;
com|commit|ci)
2009-10-20 21:51:47 +03:00
mode=commit
;;
di|dif|diff)
2009-10-20 21:51:47 +03:00
mode=diff
;;
ex|exp|export)
2009-10-20 21:51:47 +03:00
mode=export
;;
edit|unedit)
2009-10-20 21:51:47 +03:00
mode=$i
;;
hi|his|history)
2009-10-20 21:51:47 +03:00
mode=history
;;
im|imp|import)
2009-10-20 21:51:47 +03:00
mode=import
;;
re|rel|release)
2009-10-20 21:51:47 +03:00
mode=release
;;
log|rlog)
2009-10-20 21:51:47 +03:00
mode=log
;;
rdiff|patch)
2009-10-20 21:51:47 +03:00
mode=rdiff
;;
remove|rm|delete)
2009-10-20 21:51:47 +03:00
mode=remove
;;
rtag|rfreeze)
2009-10-20 21:51:47 +03:00
mode=rtag
;;
st|stat|status)
2009-10-20 21:51:47 +03:00
mode=status
;;
tag|freeze)
2009-10-20 21:51:47 +03:00
mode=tag
;;
up|upd|update)
2009-10-20 21:51:47 +03:00
mode=update
;;
2009-10-04 19:42:50 +02:00
esac
elif [[ "$i" = -* ]]; then
flags+=( $i )
2009-10-04 19:42:50 +02:00
fi
count=$((++count))
done
case $mode in
2009-10-04 19:42:50 +02:00
add)
case $prev in
-m)
return 0
;;
-k)
_cvs_kflags
return 0
;;
esac
2009-10-04 19:42:50 +02:00
if [[ "$cur" != -* ]]; then
set_prefix
if [[ $cword -gt 1 && -r ${prefix:-}CVS/Entries ]]; then
2009-10-04 19:42:50 +02:00
get_entries
[ -z "$cur" ] && \
files=$( command ls -Ad !(CVS) ) || \
files=$( command ls -d ${cur}* 2>/dev/null )
for i in "${entries[@]}"; do
files=( ${files[@]/#$i//} )
done
COMPREPLY=( $( compgen -X '*~' -W '${files[@]}' -- $cur ) )
fi
else
COMPREPLY=( $( compgen -W "$( _cvs_command_options $mode )" \
-- "$cur" ) )
2009-10-04 19:42:50 +02:00
fi
;;
admin)
case $prev in
-a|-A|-b|-c|-e|-l|-m|-n|-N|-o|-s|-t-|-u)
return 0
;;
-t)
_filedir
return 0
;;
-k)
_cvs_kflags
return 0
;;
esac
2009-10-04 19:42:50 +02:00
if [[ "$cur" = -* ]]; then
COMPREPLY=( $( compgen -W "$( _cvs_command_options $mode )" \
-- "$cur" ) )
2009-10-04 19:42:50 +02:00
fi
;;
annotate)
[[ "$prev" == -@(r|D) ]] && return 0
2009-10-04 19:42:50 +02:00
if [[ "$cur" = -* ]]; then
COMPREPLY=( $( compgen -W "$( _cvs_command_options $mode )" \
-- "$cur" ) )
2009-10-04 19:42:50 +02:00
else
get_entries
COMPREPLY=( $( compgen -W '${entries[@]}' -- "$cur" ) )
fi
;;
checkout)
case $prev in
-r|-D|j)
return 0
;;
-d)
_filedir -d
return 0
;;
-k)
_cvs_kflags
return 0
;;
esac
2009-10-04 19:42:50 +02:00
if [[ "$cur" != -* ]]; then
[ -z "$cvsroot" ] && cvsroot=$CVSROOT
COMPREPLY=( $( cvs -d "$cvsroot" co -c 2> /dev/null | \
awk '{print $1}' ) )
COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- "$cur" ) )
else
COMPREPLY=( $( compgen -W "$( _cvs_command_options $mode )" \
-- "$cur" ) )
2009-10-04 19:42:50 +02:00
fi
;;
commit)
case $prev in
-m|-r)
return 0
;;
-F)
_filedir
return 0
;;
esac
2009-10-04 19:42:50 +02:00
set_prefix
2010-07-01 20:21:35 +03:00
if [[ "$cur" != -* && -r ${prefix:-}CVS/Entries ]]; then
2009-10-04 19:42:50 +02:00
# if $COMP_CVS_REMOTE is not null, 'cvs commit' will
# complete on remotely checked-out files (requires
# passwordless access to the remote repository
if [ -n "${COMP_CVS_REMOTE:-}" ]; then
# this is the least computationally intensive
# way found so far, but other changes
# (something other than changed/removed/new)
# may be missing
changed=( $( cvs -q diff --brief 2>&1 | \
sed -ne 's/^Files [^ ]* and \([^ ]*\) differ$/\1/p' ) )
newremoved=( $( cvs -q diff --brief 2>&1 | \
sed -ne 's/^cvs diff: \([^ ]*\) .*, no comparison available$/\1/p' ) )
COMPREPLY=( $( compgen -W '${changed[@]:-} \
${newremoved[@]:-}' -- "$cur" ) )
else
COMPREPLY=( $(compgen -o default -- "$cur") )
2009-10-04 19:42:50 +02:00
fi
else
COMPREPLY=( $( compgen -W "$( _cvs_command_options $mode )" \
-- "$cur" ) )
2009-10-04 19:42:50 +02:00
fi
;;
cvsroot)
# TODO: works poorly because of the colons and -o default,
# could we drop -o default? works ok without it in cvsps
_cvs_roots
2009-10-04 19:42:50 +02:00
;;
export)
case $prev in
-r|-D)
return 0
;;
-d)
_filedir -d
return 0
;;
-k)
_cvs_kflags
return 0
;;
esac
2009-10-04 19:42:50 +02:00
if [[ "$cur" != -* ]]; then
[ -z "$cvsroot" ] && cvsroot=$CVSROOT
COMPREPLY=( $( cvs -d "$cvsroot" co -c | awk '{print $1}' ) )
COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- "$cur" ) )
else
COMPREPLY=( $( compgen -W "$( _cvs_command_options $mode )" \
2009-10-04 19:42:50 +02:00
-- "$cur" ) )
fi
;;
diff)
if [[ "$cur" == -* ]]; then
_longopt diff
else
get_entries
COMPREPLY=( $( compgen -W '${entries[@]:-}' -- "$cur" ) )
fi
;;
remove)
if [[ "$cur" != -* ]]; then
set_prefix
if [[ $cword -gt 1 && -r ${prefix:-}CVS/Entries ]]; then
2009-10-04 19:42:50 +02:00
get_entries
# find out what files are missing
for i in "${entries[@]}"; do
[ ! -r "$i" ] && miss+=( $i )
2009-10-04 19:42:50 +02:00
done
COMPREPLY=( $(compgen -W '${miss[@]:-}' -- "$cur") )
fi
else
COMPREPLY=( $( compgen -W "$( _cvs_command_options $mode )" \
-- "$cur" ) )
2009-10-04 19:42:50 +02:00
fi
;;
import)
case $prev in
-I|-b|-m|-W)
return 0
;;
-k)
_cvs_kflags
return 0
;;
esac
2009-10-04 19:42:50 +02:00
if [[ "$cur" != -* ]]; then
# starts with same algorithm as checkout
[ -z "$cvsroot" ] && cvsroot=$CVSROOT
prefix=${cur%/*}
if [ -r ${cvsroot}/${prefix} ]; then
get_modules
COMPREPLY=( ${COMPREPLY[@]#$cvsroot} )
COMPREPLY=( ${COMPREPLY[@]#\/} )
fi
pwd=$( pwd )
pwd=${pwd##*/}
COMPREPLY=( $( compgen -W '${COMPREPLY[@]} $pwd' -- $cur ) )
else
COMPREPLY=( $( compgen -W "$( _cvs_command_options $mode )" \
-- "$cur" ) )
2009-10-04 19:42:50 +02:00
fi
;;
update)
case $prev in
-r|-D|-j|-I|-W)
return 0
;;
-k)
_cvs_kflags
return 0
;;
esac
2009-10-04 19:42:50 +02:00
if [[ "$cur" = -* ]]; then
COMPREPLY=( $( compgen -W "$( _cvs_command_options $mode )" \
-- "$cur" ) )
2009-10-04 19:42:50 +02:00
fi
;;
"")
case $prev in
-T)
_filedir -d
return 0
;;
-e|-s)
return 0
;;
-z)
COMPREPLY=( $( compgen -W '1 2 3 4 5 6 7 8 9' -- "$cur" ) )
return 0
;;
esac
COMPREPLY=( $( compgen -W '$( _cvs_commands ) $( _cvs_options ) \
--help --help-commands --help-options --version' -- "$cur" ) )
2009-10-04 19:42:50 +02:00
;;
esac
2009-10-04 19:42:50 +02:00
return 0
2011-04-04 22:14:39 +03:00
} &&
complete -F _cvs -o default cvs
# Local variables:
# mode: shell-script
2009-10-04 19:42:50 +02:00
# sh-basic-offset: 4
# sh-indent-comment: t
2009-10-04 19:42:50 +02:00
# indent-tabs-mode: nil
# End:
2009-10-04 19:42:50 +02:00
# ex: ts=4 sw=4 et filetype=sh