183 lines
5.1 KiB
Bash
183 lines
5.1 KiB
Bash
|
# /* 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 emergency"
|
||
|
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 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
|