blob: dca3b4e0a042f9d56f4e8f1d768e03143e42dc9b [file] [log] [blame]
# /* vim: set ai ts=4 ft=sh: */
#
# Copyright 2017, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
_fastboot() {
if ! type -t "$1" >/dev/null; then
return
fi
if type -t _init_completion >/dev/null; then
_init_completion || return
fi
local where i cur serial
COMPREPLY=()
serial="${ANDROID_SERIAL:-none}"
where=OPTIONS
for ((i=1; i <= COMP_CWORD; i++)); do
cur="${COMP_WORDS[i]}"
case "${cur}" in
-s)
where=OPT_SERIAL
;;
--slot)
where=OPT_SLOT
;;
-*)
where=OPTIONS
;;
*)
if [[ $where == OPT_SERIAL ]]; then
where=OPT_SERIAL_ARG
serial=${cur}
elif [[ $where == OPT_SLOT ]]; then
where=OPT_SLOT_ARG
else
where=COMMAND
break
fi
;;
esac
done
if [[ $where == COMMAND && $i -ge $COMP_CWORD ]]; then
where=OPTIONS
fi
OPTIONS="-a -c --disable-verification --disable-verity -h --help -s --set-active --skip-secondary --skip-reboot --slot -u --version -w"
COMMAND="continue devices erase flash flashall flashing format getvar get_staged help oem reboot stage update"
case $where in
OPTIONS|OPT_SERIAL)
COMPREPLY=( $(compgen -W "$OPTIONS $COMMAND" -- "$cur") )
;;
OPT_SERIAL_ARG)
local devices=$(command fastboot devices 2> /dev/null | awk '{ print $1 }')
COMPREPLY=( $(compgen -W "${devices}" -- ${cur}) )
;;
OPT_SLOT_ARG)
local slots="a all b other"
COMPREPLY=( $(compgen -W "${slots}" -- ${cur}) )
;;
COMMAND)
if [[ $i -eq $COMP_CWORD ]]; then
COMPREPLY=( $(compgen -W "$COMMAND" -- "$cur") )
else
i=$((i+1))
case "${cur}" in
flash)
_fastboot_cmd_flash "$serial" $i
;;
reboot)
if [[ $COMP_CWORD == $i ]]; then
args="bootloader"
COMPREPLY=( $(compgen -W "${args}" -- "${COMP_WORDS[i]}") )
fi
;;
update)
_fastboot_cmd_update "$serial" $i
;;
esac
fi
;;
esac
return 0
}
_fastboot_cmd_flash() {
local serial i cur
local partitions
serial=$1
i=$2
cur="${COMP_WORDS[COMP_CWORD]}"
if [[ $i -eq $COMP_CWORD ]]; then
partitions="boot bootloader dtbo modem odm oem product radio recovery system vbmeta vendor"
COMPREPLY=( $(compgen -W "$partitions" -- $cur) )
else
_fastboot_util_complete_local_file "${cur}" '!*.img'
fi
}
_fastboot_cmd_update() {
local serial i cur
serial=$1
i=$2
cur="${COMP_WORDS[COMP_CWORD]}"
_fastboot_util_complete_local_file "${cur}" '!*.zip'
}
_fastboot_util_complete_local_file() {
local file xspec i j IFS=$'\n'
local -a dirs files
file=$1
xspec=$2
# Since we're probably doing file completion here, don't add a space after.
if [[ $(type -t compopt) = "builtin" ]]; then
compopt -o plusdirs
if [[ "${xspec}" == "" ]]; then
COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") )
else
compopt +o filenames
COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") )
fi
else
# Work-around for shells with no compopt
dirs=( $(compgen -d -- "${cur}" ) )
if [[ "${xspec}" == "" ]]; then
files=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") )
else
files=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") )
fi
COMPREPLY=( $(
for i in "${files[@]}"; do
local skip=
for j in "${dirs[@]}"; do
if [[ $i == $j ]]; then
skip=1
break
fi
done
[[ -n $skip ]] || printf "%s\n" "$i"
done
))
COMPREPLY=( ${COMPREPLY[@]:-} $(
for i in "${dirs[@]}"; do
printf "%s/\n" "$i"
done
))
fi
}
if [[ $(type -t compopt) = "builtin" ]]; then
complete -F _fastboot fastboot
else
complete -o nospace -F _fastboot fastboot
fi