| #!/bin/bash |
| # Copyright 2015 The Vanadium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style |
| # license that can be found in the LICENSE file. |
| |
| # Check for bash |
| [[ -z "$BASH_VERSION" ]] && return |
| |
| # Extracts subcommands from the help output of a given command ($1). |
| # An example help output from "jiri help": |
| # ... |
| # The jiri commands are: |
| # build Tool for managing vanadium builds |
| # contributors List vanadium project contributors |
| # ... |
| # Run "jiri help [command]" for command usage. |
| # ... |
| _jiri_extract_subcommands() { |
| local -r CMD="$1" |
| local -r START_LINE="The .* commands are" |
| local -r END_LINE="Run \"jiri" |
| ${CMD} -h > /dev/null 2>&1 |
| if [[ "$?" = 0 ]]; then |
| ${CMD} -h \ |
| | sed -n "/${START_LINE}/,/${END_LINE}/p" | grep '^ '| awk '{print $1}' | sort |
| fi |
| } |
| |
| # Extracts flags from the help output of a given command ($1). |
| # Note that we ignore all "global" flags. |
| # An example help output from "jiri help update": |
| # ... |
| # The jiri update flags are: |
| # -gc=false |
| # Garbage collect obsolete repositories. |
| # -n=false |
| # ... |
| _jiri_extract_flags() { |
| local -r CMD="$1" |
| local -r START_LINE="The .* flags are" |
| local -r END_LINE="^$" |
| ${CMD} -h > /dev/null 2>&1 |
| if [[ "$?" = 0 ]]; then |
| ${CMD} -h | sed -n "/${START_LINE}/,/${END_LINE}/p" | grep '^ -'| cut -d= -f1 | tr -d " " | sort |
| fi |
| } |
| |
| # Gets the command line before the word where the current cursor is. |
| _jiri_get_cmdline_before_cursor() { |
| local i |
| local CMD="" |
| for(( i=0; i<COMP_CWORD; i++ )); do |
| CMD="${CMD} ${COMP_WORDS[i]}" |
| done |
| echo "${CMD}" |
| } |
| |
| # Gets the names of available projects. |
| _jiri_get_project_names() { |
| jiri project list | sed "s/^.*project=\"\(.*\)\" path.*/\1/" |
| } |
| |
| |
| # Main bash completion function for the "jiri" command. |
| # |
| # Completion-related internal Bash vars: |
| # - COMP_WORDS: An array variable consisting of the individual words in the |
| # current command line |
| # - COMP_CWORD: An index into ${COMP_WORDS} of the word containing the current cursor |
| # position. |
| # - COMPREPLY An array variable from which bash reads the possible completions |
| # generated by a completion function. |
| _jiri_complete() { |
| local -r CUR="${COMP_WORDS[COMP_CWORD]}" |
| local -r CMD="$(_jiri_get_cmdline_before_cursor)" |
| |
| case "${CUR}" in |
| -*) |
| # Complete flags. |
| COMPREPLY=($(compgen -W "$(_jiri_extract_flags "${CMD}")" -- ${CUR})) |
| ;; |
| *) |
| # Complete commands. |
| if [[ "${COMP_LINE}" =~ .*test(\ )+project.* ]]; then |
| # Special handling for completing "jiri test project". |
| COMPREPLY=($(compgen -W "$(_jiri_get_project_names)" -- ${CUR})) |
| elif [[ "${COMP_LINE}" =~ .*test(\ )+run.* ]]; then |
| # Special handling for completing "jiri test run". |
| COMPREPLY=($(compgen -W "$(jiri test list)" -- ${CUR})) |
| else |
| COMPREPLY=($(compgen -W "$(_jiri_extract_subcommands "${CMD}")" -- ${CUR})) |
| fi |
| ;; |
| esac |
| |
| return 0 |
| } |
| |
| # Main bash completion function for the "vcd" command. |
| _jiri_vcd_complete() { |
| local -r CUR="${COMP_WORDS[COMP_CWORD]}" |
| |
| COMPREPLY=($(compgen -W "$(_jiri_get_project_names)" -- ${CUR})) |
| } |
| |
| complete -F _jiri_complete jiri |
| complete -F _jiri_vcd_complete vcd |