Ignore:
Timestamp:
Oct 5, 2009, 8:05:08 AM (10 years ago)
Author:
raimue@…
Message:

sysutils/bash-completion:
Rewritten completion for the port command. It is much faster now by directly
passing glob expressions with the port commands.
Fixes #11441 and #21630

Location:
trunk/dports/sysutils/bash-completion
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/dports/sysutils/bash-completion/Portfile

    r58360 r58784  
    55name            bash-completion
    66version         1.0
    7 revision        2
     7revision        3
    88epoch           1
    99categories      sysutils
  • trunk/dports/sysutils/bash-completion/files/port

    r58310 r58784  
    77_port()
    88{
    9         local cur prev mode count portdir portdiropt i port
    10                
    11         COMPREPLY=()
    12         cur=${COMP_WORDS[COMP_CWORD]}
    13         prev=${COMP_WORDS[COMP_CWORD-1]}
     9        local cur prev mode count portdir cmdfile i port
    1410
    15         count=0
    16         for i in ${COMP_WORDS[@]}; do
    17             [ $count -eq $COMP_CWORD ] && break
    18             # Last parameter was the portdir, now go back to mode selection
    19             if [ "${COMP_WORDS[((count))]}" == "$portdir" -a "$mode" == "portdir" ]; then
    20                 mode=""
    21             fi
    22             if [ -z "$mode" ]; then
    23                 case $i in
    24                     -D)
    25                         mode=portdir
    26                         portdir=${COMP_WORDS[((count+1))]}
    27                         portdiropt="-D $portdir"
    28                         ;;
    29                     activate|archive|build|cat|cd|checksum|clean|compact|configure|\
    30                         contents|deactivate|dependents|deps|destroot|dir|distcheck|dmg|\
     11        COMPREPLY=()
     12        cur=${COMP_WORDS[COMP_CWORD]}
     13        prev=${COMP_WORDS[COMP_CWORD-1]}
     14
     15        count=0
     16        for i in ${COMP_WORDS[@]}; do
     17            [ $count -eq $COMP_CWORD ] && break
     18            # Last parameter was a required parameter, now go back to mode selection
     19            if [ "${COMP_WORDS[((count))]}" == "$portdir" -a "$mode" == "portdir" ] \
     20                    || [ "${COMP_WORDS[((count))]}" == "$cmdfile" -a "$mode" == "cmdfile" ]; then
     21                mode=""
     22            fi
     23            if [ -z "$mode" ]; then
     24                case $i in
     25                    -D)
     26                        mode=portdir
     27                        portdir=${COMP_WORDS[((count+1))]}
     28                        ;;
     29                    -F)
     30                        mode=cmdfile
     31                        cmdfile=${COMP_WORDS[((count+1))]}
     32                        ;;
     33                    activate|archive|build|cat|cd|checksum|clean|configure|contents|\
     34                        deactivate|dependents|deps|destroot|dir|distcheck|distfiles|dmg|\
    3135                        dpkg|echo|ed|edit|exit|extract|fetch|file|gohome|help|info|\
    3236                        install|installed|lint|list|livecheck|load|location|mdmg|mirror|\
    33                         mpkg|outdated|patch|pkg|platform|provides|quit|rpm|search|selfupdate|\
    34                         srpm|submit|sync|test|trace|unarchive|uncompact|uninstall|unload|\
    35                         upgrade|url|usage|variants|version|work)
     37                        mpkg|notes|outdated|patch|pkg|platform|portpkg|provides|quit|\
     38                        rpm|search|select|selfupdate|srpm|submit|sync|test|trace|unarchive|\
     39                        uninstall|unload|upgrade|url|usage|variants|version|work)
    3640                        mode=$i
    37                         ;;
    38                 esac
    39             elif [  -z "$port" ]; then
    40             case $mode in
    41                 uninstall|upgrade|contents)
    42                     if [ $( port installed | awk ' !/The following ports/ {print $1}' \
    43                         | uniq | grep '^'$i'$') ]; then
    44                         port=$i
    45                     fi
    46                     ;;
    47                 *)
    48                     if [ $(port $portdiropt list | awk '{ print $1 }' | grep '^'$i'$') ]; then
    49                         port=$i
    50                     fi
    51                     ;;
    52             esac
    53             fi
    54             count=$((++count))
    55         done
     41                        ;;
     42                esac
     43            elif [ -z "$port" ]; then
     44                case $mode in
     45                    contents|uninstall|upgrade)
     46                        if port -q installed "$i" | awk '{print $1}' | grep -q '^'$i'$'; then
     47                            port=$i
     48                        fi
     49                        ;;
     50                    *)
     51                        if port -q search --exact "$i" | grep -q '^'$i'$'; then
     52                            port=$i
     53                        fi
     54                        ;;
     55                esac
     56            fi
     57            count=$((++count))
     58        done
    5659
    57         if [ -n "$port" ]; then
     60        if [ -n "$port" ]; then
    5861            # complete variants
    59             case $mode in
    60                 contents|uninstall)
    61                     # installed variants
    62                     COMPREPLY=( $( port installed \
    63                         | awk '/'$port'/ { print $2 }' | tr '\r' ' ' 2> /dev/null ) )
    64                     COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) )
    65                     return 0
    66                     ;;
    67                 activate)
    68                     # inactive variants
    69                     COMPREPLY=( $( port installed | grep -v '(active)' \
    70                         | awk '/'$port'/ { print $2 }' | tr '\r' ' ' 2> /dev/null ) )
    71                     COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) )
    72                     return 0
    73                     ;;
    74                 deactivate)
    75                     # active variants
    76                     COMPREPLY=( $( port installed | grep '(active)' \
    77                         | awk '/'$port'/ { print $2 }' | tr '\r' ' ' 2> /dev/null ) )
    78                     COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) )
    79                     return 0
    80                     ;;
    81                 *)
    82                     # all variants
    83                     COMPREPLY=( $(port $portdiropt variants $port | tr '\r' ' ' | grep -v "has no variants") )
    84                     COMPREPLY=( $( compgen -P'+' -W '${COMPREPLY[@]}' -- $cur ) )
    85                     return 0
    86                     ;;
    87             esac
     62            case $mode in
     63                contents|uninstall)
     64                    # installed variants
     65                    COMPREPLY=( $( port -q installed "$port" \
     66                        | awk '{print $2}' | tr '\r' ' ' 2>/dev/null ) )
     67                    COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) )
     68                    return 0
     69                    ;;
     70                activate)
     71                    # inactive variants
     72                    COMPREPLY=( $( port -q installed "$port" | grep -v '(active)' \
     73                        | awk '{print $2}' | tr '\r' ' ' 2>/dev/null ) )
     74                    COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) )
     75                    return 0
     76                    ;;
     77                deactivate)
     78                    # active variants
     79                    COMPREPLY=( $( port -q installed "$port" | grep '(active)' \
     80                        | awk '{print $2}' | tr '\r' ' ' 2>/dev/null ) )
     81                    COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) )
     82                    return 0
     83                    ;;
     84                *)
     85                    # all variants
     86                    COMPREPLY=( $( port -q info --line --variants "$port" | tr '\r,' '  ' ) )
     87                    COMPREPLY=( $( compgen -P'+' -W '${COMPREPLY[@]}' -- $cur ) )
     88                    return 0
     89                    ;;
     90            esac
    8891
    89         fi
     92        fi
    9093
    91         if [ -n "$mode" ]; then
    92             # complete port names
    93             case $mode in
    94                 uninstall|upgrade|contents)
    95                     # installed ports
    96                     COMPREPLY=( $( port installed \
    97                         | sed -ne 's|^  \('$cur'[^ ]*\).*$|\1|p' | uniq ) )
    98                     return 0
    99                     ;;
    100                 activate)
    101                     # inactive ports
    102                     COMPREPLY=( $( port installed | grep -v '(active)' \
    103                         | sed -ne 's|^  \('$cur'[^ ]*\).*$|\1|p' | uniq ) )
    104                     return 0
    105                     ;;
    106                 deactivate)
    107                     # active ports
    108                     COMPREPLY=( $( port installed | grep '(active)' \
    109                         | sed -ne 's|^  \('$cur'[^ ]*\).*$|\1|p' | uniq ) )
    110                     return 0
    111                     ;;
    112                 provides|portdir)
    113                     _filedir
    114                     return 0
    115                     ;;
    116                 installed|outdated|list|sync|selfupdate)
    117                     # no port
    118                     return 0
    119                     ;;
    120                 *)
    121                     # all ports
    122                     COMPREPLY=( $( port $portdiropt list \
    123                         | awk '/^'$cur'/ { print $1 }' | sort 2> /dev/null ) )
    124                     return 0
    125                     ;;
    126                 esac
    127         fi
     94        if [ -n "$mode" ]; then
     95            # complete port names
     96            case $mode in
     97                contents|installed|outdated|uninstall|upgrade)
     98                    # installed ports
     99                    COMPREPLY=( $( port -q installed "$cur*" \
     100                        | awk '{print $1}' | uniq ) )
     101                    return 0
     102                    ;;
     103                activate)
     104                    # inactive ports
     105                    COMPREPLY=( $( port -q installed "$cur*" | grep -v '(active)' \
     106                        | awk '{print $1}' | uniq ) )
     107                    return 0
     108                    ;;
     109                deactivate)
     110                    # active ports
     111                    COMPREPLY=( $( port -q installed "$cur*" | grep '(active)' \
     112                        | awk '{print $1}' | uniq ) )
     113                    return 0
     114                    ;;
     115                provides|cmdfile)
     116                    _filedir
     117                    return 0
     118                    ;;
     119                portdir)
     120                    _filedir -d
     121                    return 0
     122                    ;;
     123                selfupdate|search|sync)
     124                    # no port
     125                    return 0
     126                    ;;
     127                *)
     128                    # all ports
     129                    COMPREPLY=( $( port -q search --glob "$cur*" 2>/dev/null | uniq ) )
     130                    return 0
     131                    ;;
     132                esac
     133        fi
    128134
    129         COMPREPLY=( $( compgen -W '-b -c -d -f -i -k -n -o -p -q -R -s -t -u -v -x \
    130                                 activate archive build cat cd checksum clean compact configure \
    131                                 contents deactivate dependents deps destroot dir distcheck dmg \
     135        COMPREPLY=( $( compgen -W '-b -c -d -f -k -n -o -p -q -R -s -t -u -v -y \
     136                                activate archive build cat cd checksum clean configure contents \
     137                                deactivate dependents deps destroot dir distcheck distfiles dmg \
    132138                                dpkg echo ed edit exit extract fetch file gohome help info \
    133139                                install installed lint list livecheck load location mdmg mirror \
    134                                 mpkg outdated patch pkg platform provides quit rpm search selfupdate \
    135                                 srpm submit sync test trace unarchive uncompact uninstall unload \
    136                                 upgrade url usage variants version work' -- $cur ) )
    137         return 0
     140                                mpkg notes outdated patch pkg platform portpkg provides quit \
     141                                rpm search select selfupdate srpm submit sync test trace unarchive \
     142                                uninstall unload upgrade url usage variants version work' -- $cur ) )
     143        return 0
    138144}
    139145complete -F _port $filenames port
Note: See TracChangeset for help on using the changeset viewer.