p4 #7

  • //
  • guest/
  • gabor_maghera/
  • p4_bash_complete/
  • p4
  • View
  • Commits
  • Open Download .zip Download (8 KB)
# 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 [ -z "${cmd+x}" ]; 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
#7 7691 Gabor Maghera Massaged indentations.
#6 7690 Gabor Maghera Wrapped $cur with double quotes whenever it is passed as an argument in calling a function defined within the file.
 When $cur was null this was causing issues when the argument was referenced within a function.  Passing it as "$cur" will turn it into an empty string.
#5 7689 Gabor Maghera Modified syntax for testing whether the $cmd variable is set/unset.
#4 7688 Gabor Maghera Rollback //guest/gabor_maghera/p4_bash_complete/p4 to revision 1
#3 7687 Gabor Maghera Changed starting index for adding comands to cmd variable from 1 to 0.
#2 7686 Gabor Maghera Modified so it works with Mac OS X.
#1 7685 Gabor Maghera Branching Andrew May's bash p4 autocompletion work into my work area.
 I need to make some tweaks to get working on my MacBook Pro.
//guest/andrew_may/p4_bash_complete/p4
#1 6113 Andrew May bash command completion for p4