| OLD | NEW | 
|    1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |    1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 
|    2 # Use of this source code is governed by a BSD-style license that can be |    2 # Use of this source code is governed by a BSD-style license that can be | 
|    3 # found in the LICENSE file. |    3 # found in the LICENSE file. | 
|    4  |    4  | 
|    5 # Add programmable completion to some Chromium OS build scripts |    5 # Add programmable completion to some Chromium OS build scripts | 
|    6  |    6  | 
|    7  |    7  | 
|    8 # Echo a list of -- flags that the current command accepts. The |    8 # Echo a list of -- flags that the current command accepts. The | 
|    9 # function assumes that the command supports shflags' --help flag. |    9 # function assumes that the command supports shflags' --help flag. | 
|   10 # |   10 _flags() { | 
|   11 _flags() |   11   echo $(command "${COMP_WORDS[0]}" --help 2>&1 \ | 
|   12 { |   12     | egrep -o -- --\[^\ \]+: \ | 
|   13   echo $(command "${COMP_WORDS[0]}" --help 2>&1 | \ |   13     | sed 's/://; s/--\[no\]\(.\+\)/--\1 --no\1/') | 
|   14     egrep -o -- --\[^\ \]+: | \ |  | 
|   15     sed 's/://; s/--\[no\]\(.\+\)/--\1 --no\1/') |  | 
|   16 } |   14 } | 
|   17  |   15  | 
|   18  |   16  | 
|   19 # Complete flags, i.e., current words starting with --. Return 1 if |   17 # Complete flags, i.e., current words starting with --. Return 1 if | 
|   20 # the current word doesn't start with --, 0 otherwise. |   18 # the current word doesn't start with --, 0 otherwise. | 
|   21 # |   19 _flag_complete() { | 
|   22 _flag_complete() |  | 
|   23 { |  | 
|   24   COMPREPLY=() |   20   COMPREPLY=() | 
|   25   local cur="${COMP_WORDS[COMP_CWORD]}" |   21   local cur="${COMP_WORDS[COMP_CWORD]}" | 
|   26   if [[ "${cur}" == --* ]]; then |   22   if [[ "${cur}" == --* ]]; then | 
|   27     COMPREPLY=( $(compgen -W "$(_flags)" -- ${cur}) ) |   23     COMPREPLY=( $(compgen -W "$(_flags)" -- ${cur}) ) | 
|   28     return 0 |   24     return 0 | 
|   29   fi |   25   fi | 
|   30   return 1 |   26   return 1 | 
|   31 } |   27 } | 
|   32  |   28  | 
|   33  |   29  | 
|   34 # Look for "--arg=foo" or "--arg foo" (where foo can be an empty string) in the |   30 # Look for "--arg=foo" or "--arg foo" (where foo can be an empty string) in the | 
|   35 # word to be completed. If found, echo "--arg=foo". |   31 # word to be completed. If found, echo "--arg=foo". | 
|   36 # |   32 _argeq() { | 
|   37 _argeq() |  | 
|   38 { |  | 
|   39   local arg=$1 |   33   local arg=$1 | 
|   40   local w0="${COMP_WORDS[COMP_CWORD]}" |   34   local w0="${COMP_WORDS[COMP_CWORD]}" | 
|   41   local w1="${COMP_WORDS[COMP_CWORD-1]}" |   35   local w1="${COMP_WORDS[COMP_CWORD-1]}" | 
|   42  |   36  | 
|   43   # Check for completing "--arg=" |   37   # Check for completing "--arg=" | 
|   44   if [ "${w1}" == ${arg} -a "${w0}" == "=" ]; then |   38   if [ "${w1}" == ${arg} -a "${w0}" == "=" ]; then | 
|   45     echo "${w1}${w0}" |   39     echo "${w1}${w0}" | 
|   46     return 0 |   40     return 0 | 
|   47   fi |   41   fi | 
|   48  |   42  | 
|   49   # Check for completing "--arg foo" |   43   # Check for completing "--arg foo" | 
|   50   if [ "${w1}" == ${arg} ]; then |   44   if [ "${w1}" == ${arg} ]; then | 
|   51     echo "${w1}=${w0}" |   45     echo "${w1}=${w0}" | 
|   52     return 0 |   46     return 0 | 
|   53   fi |   47   fi | 
|   54  |   48  | 
|   55   # Check for completing "--arg=foo" |   49   # Check for completing "--arg=foo" | 
|   56   if [ ${COMP_CWORD} -gt 2 ]; then |   50   if [ ${COMP_CWORD} -gt 2 ]; then | 
|   57     local w2="${COMP_WORDS[COMP_CWORD-2]}" |   51     local w2="${COMP_WORDS[COMP_CWORD-2]}" | 
|   58     if [ "${w2}" == ${arg} -a "${w1}" == "=" ]; then |   52     if [ "${w2}" == ${arg} -a "${w1}" == "=" ]; then | 
|   59       echo "${w2}${w1}${w0}" |   53       echo "${w2}${w1}${w0}" | 
|   60       return 0 |   54       return 0 | 
|   61     fi |   55     fi | 
|   62   fi |   56   fi | 
|   63 } |   57 } | 
|   64  |   58  | 
|   65  |   59  | 
|   66 # echo the existing target board sysroots |   60 # echo the existing target board sysroots | 
|   67 # |   61 _board_sysroots() { | 
|   68 _board_sysroots() |  | 
|   69 { |  | 
|   70   local builddir=/build |   62   local builddir=/build | 
|   71   if [ -d ${builddir} ]; then |   63   if [ -d ${builddir} ]; then | 
|   72     echo $(command ls "${builddir}") |   64     echo $(command ls "${builddir}") | 
|   73   fi |   65   fi | 
|   74 } |   66 } | 
|   75  |   67  | 
|   76 _complete_board_sysroot_flag() |   68 _complete_board_sysroot_flag() { | 
|   77 { |  | 
|   78   COMPREPLY=() |   69   COMPREPLY=() | 
|   79   local arg=$(_argeq --board) |   70   local arg=$(_argeq --board) | 
|   80   if [[ ${arg} == --board=* ]]; then |   71   if [[ ${arg} == --board=* ]]; then | 
|   81     COMPREPLY=( $(compgen -W "$(_board_sysroots)" -- ${arg#--board=}) ) |   72     COMPREPLY=( $(compgen -W "$(_board_sysroots)" -- ${arg#--board=}) ) | 
|   82     return 0 |   73     return 0 | 
|   83   fi |   74   fi | 
|   84   return 1 |   75   return 1 | 
|   85 } |   76 } | 
|   86  |   77  | 
|   87 # Completion for --board= argument for existing board sysroots |   78 # Completion for --board= argument for existing board sysroots | 
|   88 # |   79 _board_sysroot() { | 
|   89 _board_sysroot() |  | 
|   90 { |  | 
|   91   _flag_complete && return 0 |   80   _flag_complete && return 0 | 
|   92   _complete_board_sysroot_flag && return 0 |   81   _complete_board_sysroot_flag && return 0 | 
|   93 } |   82 } | 
|   94  |   83  | 
|   95 complete -o bashdefault -o default -F _board_sysroot \ |  | 
|   96   build_autotest.sh \ |  | 
|   97   build_image \ |  | 
|   98   build_packages \ |  | 
|   99   image_to_usb.sh \ |  | 
|  100   mod_image_for_test.sh |  | 
|  101  |  | 
|  102  |  | 
|  103 # echo the existing target board overlays |   84 # echo the existing target board overlays | 
|  104 # |   85 _board_overlays() { | 
|  105 _board_overlays() |  | 
|  106 { |  | 
|  107   local overlaydir=../overlays |   86   local overlaydir=../overlays | 
|  108   if [ -d ${overlaydir} ]; then |   87   if [ -d ${overlaydir} ]; then | 
|  109     echo $(command ls $overlaydir | grep overlay- | sed s,overlay-,,) |   88     echo $(command ls $overlaydir | grep overlay- | sed s,overlay-,,) | 
|  110   fi |   89   fi | 
|  111 } |   90 } | 
|  112  |   91  | 
|  113 # Completion for --board= argument for existing board overlays |   92 # Completion for --board= argument for existing board overlays | 
|  114 # |   93 _board_overlay() { | 
|  115 _board_overlay() |  | 
|  116 { |  | 
|  117   _flag_complete && return 0 |   94   _flag_complete && return 0 | 
|  118  |   95  | 
|  119   COMPREPLY=() |   96   COMPREPLY=() | 
|  120   local arg=$(_argeq --board) |   97   local arg=$(_argeq --board) | 
|  121   if [[ ${arg} == --board=* ]]; then |   98   if [[ ${arg} == --board=* ]]; then | 
|  122     COMPREPLY=( $(compgen -W "$(_board_overlays)" -- ${arg#--board=}) ) |   99     COMPREPLY=( $(compgen -W "$(_board_overlays)" -- ${arg#--board=}) ) | 
|  123   fi |  100   fi | 
|  124 } |  101 } | 
|  125  |  102  | 
|  126 complete -o bashdefault -o default -F _board_overlay setup_board |  | 
|  127  |  | 
|  128 # Completion for -c and -s argument for autotest script |  103 # Completion for -c and -s argument for autotest script | 
|  129 _ls_autotest() { |  104 _ls_autotest() { | 
|  130   local autotest_dir=../third_party/autotest/files |  105   local autotest_dir=../third_party/autotest/files | 
|  131   ls --color=never -dBFH ${autotest_dir}/$1* 2>/dev/null |\ |  106   ls --color=never -dBFH ${autotest_dir}/$1* 2>/dev/null \ | 
|  132     sed s/"..\/third_party\/autotest\/files\/"//g |  107     | sed s/"..\/third_party\/autotest\/files\/"//g | 
|  133 } |  108 } | 
|  134  |  109  | 
|  135 _autotest_complete() |  110 _autotest_complete() { | 
|  136 { |  | 
|  137   _flag_complete && return 0 |  111   _flag_complete && return 0 | 
|  138  |  112  | 
|  139   local arg=$(_argeq -c) |  113   local arg=$(_argeq -c) | 
|  140   if [[ ${arg} == -c=* ]]; then |  114   if [[ ${arg} == -c=* ]]; then | 
|  141     COMPREPLY=($(compgen -W "$(_ls_autotest ${arg#-c=})")) |  115     COMPREPLY=($(compgen -W "$(_ls_autotest ${arg#-c=})")) | 
|  142     return 0 |  116     return 0 | 
|  143   fi |  117   fi | 
|  144  |  118  | 
|  145   arg=$(_argeq -s) |  119   arg=$(_argeq -s) | 
|  146   if [[ ${arg} == -s=* ]]; then |  120   if [[ ${arg} == -s=* ]]; then | 
|  147     COMPREPLY=($(compgen -W "$(_ls_autotest ${arg#-s=})")) |  121     COMPREPLY=($(compgen -W "$(_ls_autotest ${arg#-s=})")) | 
|  148     return 0 |  122     return 0 | 
|  149   fi |  123   fi | 
|  150  |  124  | 
|  151   _complete_board_sysroot_flag && return 0 |  125   _complete_board_sysroot_flag && return 0 | 
|  152 } |  126 } | 
|  153  |  127  | 
 |  128 # Complete the cros_workon <command> argument. | 
 |  129 # | 
 |  130 # TODO(petkov): We should probably extract the list of commands from | 
 |  131 # cros_workon --help, just like we do for flags (see _flag_complete). | 
 |  132 # | 
 |  133 # TODO(petkov): Currently, this assumes that the command is the first | 
 |  134 # argument. In practice, the command is the first non-flag | 
 |  135 # argument. I.e., this should be fixed to support something like | 
 |  136 # "./cros_workon --all list". | 
 |  137 _cros_workon_command_complete() { | 
 |  138   [ ${COMP_CWORD} -eq 1 ] || return 1 | 
 |  139   local command="${COMP_WORDS[1]}" | 
 |  140   COMPREPLY=($(compgen -W "start stop list iterate" -- "$command")) | 
 |  141   return 0 | 
 |  142 } | 
 |  143  | 
 |  144 # Lists the workon (or live, if --all is passed in) ebuilds. Lists | 
 |  145 # both the full names (e.g., chromeos-base/metrics) as well as just | 
 |  146 # the ebuild names (e.g., metrics). | 
 |  147 _cros_workon_list() { | 
 |  148   local cros_workon="${COMP_WORDS[0]}" | 
 |  149   ${cros_workon} list $1 | sed 's,\(.\+\)/\(.\+\),\1/\2 \2,' | 
 |  150 } | 
 |  151  | 
 |  152 # Completes the current cros_workon argument assuming it's a | 
 |  153 # package/ebuild name. | 
 |  154 _cros_workon_package_complete() { | 
 |  155   [ ${COMP_CWORD} -gt 1 ] || return 1 | 
 |  156   local package="${COMP_WORDS[COMP_CWORD]}" | 
 |  157   local command="${COMP_WORDS[1]}" | 
 |  158   # If "start", complete based on all workon packages. | 
 |  159   if [[ ${command} == "start" ]]; then | 
 |  160     COMPREPLY=($(compgen -W "$(_cros_workon_list --all)" -- "$package")) | 
 |  161     return 0 | 
 |  162   fi | 
 |  163   # If "stop" or "iterate", complete based on all live packages. | 
 |  164   if [[ ${command} == "stop" ]] || [[ ${command} == "iterate" ]]; then | 
 |  165     COMPREPLY=($(compgen -W "$(_cros_workon_list)" -- "$package")) | 
 |  166     return 0 | 
 |  167   fi | 
 |  168   return 1 | 
 |  169 } | 
 |  170  | 
 |  171 # Complete the cros_workon arguments. | 
 |  172 _cros_workon() { | 
 |  173   COMPREPLY=() | 
 |  174   _cros_workon_command_complete && return 0 | 
 |  175   _flag_complete && return 0 | 
 |  176   _complete_board_sysroot_flag && return 0 | 
 |  177   _cros_workon_package_complete && return 0 | 
 |  178   return 0 | 
 |  179 } | 
 |  180  | 
 |  181 complete -o bashdefault -o default -F _board_sysroot \ | 
 |  182   build_autotest.sh \ | 
 |  183   build_image \ | 
 |  184   build_packages \ | 
 |  185   image_to_usb.sh \ | 
 |  186   mod_image_for_test.sh | 
 |  187 complete -o bashdefault -o default -F _board_overlay setup_board | 
|  154 complete -o bashdefault -o default -o nospace -F _autotest_complete autotest |  188 complete -o bashdefault -o default -o nospace -F _autotest_complete autotest | 
 |  189 complete -o bashdefault -o default -F _cros_workon cros_workon | 
|  155  |  190  | 
|  156 ###  Local Variables: |  191 ###  Local Variables: | 
|  157 ###  mode: shell-script |  192 ###  mode: shell-script | 
|  158 ###  End: |  193 ###  End: | 
| OLD | NEW |