# Perforce completion by Frank Cusack
# depot path completion by Andrew May
# Function to handle some of the lists/specs of things from the
# perforce depot.
#
# Arg 1 is the spec type to complete
# Arg 2 is the current input
#
# The typical use is for clientspecs/branchspecs etc. Most of the
# lists from perfoce have the relevant info in the 2nd set of data
# but a few others have it in the first data string.
#
_p4_spec_complete()
{
local p4spec
case "$1" in
counters|users|jobs)
p4spec="$( p4 $1 | awk 'NF>3 {print $1}' )"
;;
*)
p4spec="$( p4 $1 | awk 'NF>3 {print $2}' )"
;;
esac
COMPREPLY=( $( compgen -W "$p4spec" -- $2 ))
}
_p4_depot_path_complete()
{
local cur p4dirs p4files p4next p4list
cur="$1"
p4dirs=$(for x in `p4 dirs $cur\* 2>/dev/null` ; do echo -n "$x/ "; done)
p4files=$( p4 files $cur\* 2>/dev/null | cut -f1 -d# )
if [ `echo $p4dirs | wc -w` -eq 1 ] && [ `echo $p4files | wc -w` -eq 0 ]; then
p4next=$( echo $p4dirs | tr -d [:space:] )
p4dirs=$(for x in `p4 dirs $p4next\* 2>/dev/null` ; do echo -n "$x/ "; done)
p4files="$( p4 files $p4next\* 2>/dev/null | cut -f1 -d# )"
p4list="$p4next $p4dirs $p4files"
else
p4list="$p4dirs $p4files"
fi
COMPREPLY=( $( compgen -W "$p4list" -- $cur ) )
}
_p4()
{
local cur prev prev2 p4commands p4filetypes p4globalopts
local i cmd opts
COMPREPLY=()
i=1
unset cmd
while [ $i -lt $COMP_CWORD ]; do
if [ ${COMP_WORDS[$i]:0:1} != "-" ]; then
cmd=${COMP_WORDS[$i]}
break
fi
i=$(( $i + 1 ))
done
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}
# rename isn't really a command
#p4commands="$( p4 help commands | awk 'NF>3 {print $1}' )"
#use a static list of commands to be a bit faster with no server
p4commands="add admin annotate branch branches change changes changelist changelists \
client clients counter counters delete depot depots describe diff diff2 dirs edit filelog files \
fix fixes flush fstat group groups have help info integrate integrated job jobs jobspec label \
labels labelsync lock logger login logout monitor obliterate opened passwd print protect protects \
rename reopen resolve resolved revert review reviews set submit sync tag tickets triggers typemap \
unlock user users verify workspace workspaces where"
p4filetypes="ctext cxtext ktext kxtext ltext tempobj ubinary \
uresource uxbinary xbinary xltext xtempobj xtext \
text binary resource"
#Global options? from "p4 help usage", -c -C -d....-x
#plus the unlisted -h -? and -V
#skipping -v for debug
p4globalopts="-c -C -d -H -G -L -p -P -s -Q -u -x -V -h"
if [ ! $cmd ]; then
if [ "${cur:0:1}" = "-" ]; then
COMPREPLY=( $( compgen -W "$p4globalopts" -- $cur ) )
else
COMPREPLY=( $( compgen -W "$p4commands" -- $cur ) )
fi
return 0
fi
if [ "${cur:0:2}" = "//" ]; then
_p4_depot_path_complete $cur
return 0
fi
#Try to handle all the flags that need to take arguments.
#it may depend on the command on what the flag actually does.
# ie -b is always with a branch?
# but -t can be a filetype, or template clientspec, or timestamp flag
# depending on the command
if [ "${prev:0:1}" = "-" ]; then
case "$prev" in
-t)
case "$cmd" in
add|edit|reopen)
COMPREPLY=( $( compgen -W "$p4filetypes" \
-- $cur) )
return 0
;;
client|workspace)
_p4_spec_complete clients $cur
return 0
;;
changes|filelog)
#nothing to do just date
;;
*)
;;
esac
;;
-c)
case "$cmd" in
add|edit|reopen|deletex)
_p4_spec_complete "changes -s pending" $cur
;;
changes)
#this may not be a complete list of clients, since
#they may have been deleted
_p4_spec_complete "clients -s pending" $cur
;;
esac
return
;;
-b)
_p4_spec_complete branches $cur
return
;;
-s)
#status, for changes
COMPREPLY=( $( compgen -W "pending submitted" -- $cur ) )
;;
-u)
_p4_sepc_complete "users" $cur
;;
*)
;;
esac
fi
case "$cmd" in
add)
opts="-c -f -n -t"
;;
annotate)
opts="-a -c -db -dw -i -q"
;;
branch)
opts="-f -d -o -i"
;;
branches)
opts="-m"
;;
change|changelist)
opts="-f -s -d -o -i"
;;
changes|changelists)
opts="-i -t -l -L -c -m -s -u"
#-c client -s status -m max count -u user
;;
client|workspace)
opts="-f -t -d -o -i"
#-t template
;;
clients|workspaces)
opts="-m"
;;
counter)
opts="-f -d"
#counters output
;;
counters)
_p4_spec_complete counters $cur
return 0
;;
delete)
opts="-n -c"
;;
depot)
opts="-d -o -i"
;;
depots)
#nothing
opts=""
;;
describe)
opts="-dn -dc -ds -du -db -dw -s"
;;
diff)
# [ -d<flag> -f -m max -sa -sd -se -sl -sr -t ] [ file[rev] ... ]
opts=""
;;
diff2)
# [ -d<flag> -q -t -u ] -b branch [ [ file1 ] file2 ]
opts=""
;;
dirs)
opts="-C -D -H"
;;
edit)
opts="-c -n -t"
;;
filelog)
#-m max all others flaogs
opts="-i -t -l-L -m"
;;
files)
opts="-a"
;;
fix)
opts="-d -s -c"
_p4_spec_complete jobs $cur
return 0
;;
fixes)
#-m max -c changelist -j jobname
opts="-i -m -c -j"
;;
flush)
opts="-f -n -k"
;;
fstat)
opts="-m -c -e -Of -Ol -Op -Or -Os -Rc -Rh -Rn -Ro -Rr -Ru"
;;
#skiping group/groups
#have has nothing
#info nothing
integrate)
opts="-c -d -f -h -i -o -n -r -t -v -Dt -Ds -Di"
;;
integrated)
opts="-r -b"
;;
help)
COMPREPLY=( $( compgen -W "simple commands \
environment filetypes jobview revisions \
usage views $p4commands" -- $cur ) )
return 0
;;
tag)
opts="-b -n -l"
;;
admin)
COMPREPLY=( $( compgen -W "checkpoint journal stop -z" -- $cur ) )
return 0
;;
*)
;;
esac
#if they are trying to use
if [ "${cur:0:1}" = "-" ] && [ ! -z "$opts" ]; then
COMPREPLY=( $( compgen -W "$opts" -- $cur ) )
fi
return 0
}
complete -F _p4 -o default p4 g4
# |
Change |
User |
Description |
Committed |
|
#1
|
6113 |
Andrew May |
bash command completion for p4 |
|
|