1*00c7fec1SAndroid Build Coastguard Worker# /* vim: set ai ts=4 ft=sh: */ 2*00c7fec1SAndroid Build Coastguard Worker# 3*00c7fec1SAndroid Build Coastguard Worker# Copyright 2017, The Android Open Source Project 4*00c7fec1SAndroid Build Coastguard Worker# 5*00c7fec1SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*00c7fec1SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*00c7fec1SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*00c7fec1SAndroid Build Coastguard Worker# 9*00c7fec1SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*00c7fec1SAndroid Build Coastguard Worker# 11*00c7fec1SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*00c7fec1SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*00c7fec1SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*00c7fec1SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*00c7fec1SAndroid Build Coastguard Worker# limitations under the License. 16*00c7fec1SAndroid Build Coastguard Worker# 17*00c7fec1SAndroid Build Coastguard Worker 18*00c7fec1SAndroid Build Coastguard Worker_fastboot() { 19*00c7fec1SAndroid Build Coastguard Worker if ! check_type "$1" >/dev/null; then 20*00c7fec1SAndroid Build Coastguard Worker return 21*00c7fec1SAndroid Build Coastguard Worker fi 22*00c7fec1SAndroid Build Coastguard Worker 23*00c7fec1SAndroid Build Coastguard Worker if check_type _init_completion >/dev/null; then 24*00c7fec1SAndroid Build Coastguard Worker _init_completion || return 25*00c7fec1SAndroid Build Coastguard Worker fi 26*00c7fec1SAndroid Build Coastguard Worker 27*00c7fec1SAndroid Build Coastguard Worker local where i cur serial 28*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=() 29*00c7fec1SAndroid Build Coastguard Worker 30*00c7fec1SAndroid Build Coastguard Worker serial="${ANDROID_SERIAL:-none}" 31*00c7fec1SAndroid Build Coastguard Worker where=OPTIONS 32*00c7fec1SAndroid Build Coastguard Worker for ((i=1; i <= COMP_CWORD; i++)); do 33*00c7fec1SAndroid Build Coastguard Worker cur="${COMP_WORDS[i]}" 34*00c7fec1SAndroid Build Coastguard Worker case "${cur}" in 35*00c7fec1SAndroid Build Coastguard Worker -s) 36*00c7fec1SAndroid Build Coastguard Worker where=OPT_SERIAL 37*00c7fec1SAndroid Build Coastguard Worker ;; 38*00c7fec1SAndroid Build Coastguard Worker --slot) 39*00c7fec1SAndroid Build Coastguard Worker where=OPT_SLOT 40*00c7fec1SAndroid Build Coastguard Worker ;; 41*00c7fec1SAndroid Build Coastguard Worker -*) 42*00c7fec1SAndroid Build Coastguard Worker where=OPTIONS 43*00c7fec1SAndroid Build Coastguard Worker ;; 44*00c7fec1SAndroid Build Coastguard Worker *) 45*00c7fec1SAndroid Build Coastguard Worker if [[ $where == OPT_SERIAL ]]; then 46*00c7fec1SAndroid Build Coastguard Worker where=OPT_SERIAL_ARG 47*00c7fec1SAndroid Build Coastguard Worker serial=${cur} 48*00c7fec1SAndroid Build Coastguard Worker elif [[ $where == OPT_SLOT ]]; then 49*00c7fec1SAndroid Build Coastguard Worker where=OPT_SLOT_ARG 50*00c7fec1SAndroid Build Coastguard Worker else 51*00c7fec1SAndroid Build Coastguard Worker where=COMMAND 52*00c7fec1SAndroid Build Coastguard Worker break 53*00c7fec1SAndroid Build Coastguard Worker fi 54*00c7fec1SAndroid Build Coastguard Worker ;; 55*00c7fec1SAndroid Build Coastguard Worker esac 56*00c7fec1SAndroid Build Coastguard Worker done 57*00c7fec1SAndroid Build Coastguard Worker 58*00c7fec1SAndroid Build Coastguard Worker if [[ $where == COMMAND && $i -ge $COMP_CWORD ]]; then 59*00c7fec1SAndroid Build Coastguard Worker where=OPTIONS 60*00c7fec1SAndroid Build Coastguard Worker fi 61*00c7fec1SAndroid Build Coastguard Worker 62*00c7fec1SAndroid Build Coastguard Worker OPTIONS="-a -c --disable-verification --disable-verity -h --help -s --set-active --skip-secondary --skip-reboot --slot -u --version -w" 63*00c7fec1SAndroid Build Coastguard Worker COMMAND="continue devices erase flash flashall flashing format getvar get_staged help oem reboot stage update" 64*00c7fec1SAndroid Build Coastguard Worker 65*00c7fec1SAndroid Build Coastguard Worker case $where in 66*00c7fec1SAndroid Build Coastguard Worker OPTIONS|OPT_SERIAL) 67*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$OPTIONS $COMMAND" -- "$cur") ) 68*00c7fec1SAndroid Build Coastguard Worker ;; 69*00c7fec1SAndroid Build Coastguard Worker OPT_SERIAL_ARG) 70*00c7fec1SAndroid Build Coastguard Worker local devices=$(command fastboot devices 2> /dev/null | awk '{ print $1 }') 71*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "${devices}" -- ${cur}) ) 72*00c7fec1SAndroid Build Coastguard Worker ;; 73*00c7fec1SAndroid Build Coastguard Worker OPT_SLOT_ARG) 74*00c7fec1SAndroid Build Coastguard Worker local slots="a all b other" 75*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "${slots}" -- ${cur}) ) 76*00c7fec1SAndroid Build Coastguard Worker ;; 77*00c7fec1SAndroid Build Coastguard Worker COMMAND) 78*00c7fec1SAndroid Build Coastguard Worker if [[ $i -eq $COMP_CWORD ]]; then 79*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$COMMAND" -- "$cur") ) 80*00c7fec1SAndroid Build Coastguard Worker else 81*00c7fec1SAndroid Build Coastguard Worker i=$((i+1)) 82*00c7fec1SAndroid Build Coastguard Worker case "${cur}" in 83*00c7fec1SAndroid Build Coastguard Worker flash) 84*00c7fec1SAndroid Build Coastguard Worker _fastboot_cmd_flash "$serial" $i 85*00c7fec1SAndroid Build Coastguard Worker ;; 86*00c7fec1SAndroid Build Coastguard Worker reboot) 87*00c7fec1SAndroid Build Coastguard Worker if [[ $COMP_CWORD == $i ]]; then 88*00c7fec1SAndroid Build Coastguard Worker args="bootloader" 89*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "${args}" -- "${COMP_WORDS[i]}") ) 90*00c7fec1SAndroid Build Coastguard Worker fi 91*00c7fec1SAndroid Build Coastguard Worker ;; 92*00c7fec1SAndroid Build Coastguard Worker update) 93*00c7fec1SAndroid Build Coastguard Worker _fastboot_cmd_update "$serial" $i 94*00c7fec1SAndroid Build Coastguard Worker ;; 95*00c7fec1SAndroid Build Coastguard Worker esac 96*00c7fec1SAndroid Build Coastguard Worker fi 97*00c7fec1SAndroid Build Coastguard Worker ;; 98*00c7fec1SAndroid Build Coastguard Worker esac 99*00c7fec1SAndroid Build Coastguard Worker 100*00c7fec1SAndroid Build Coastguard Worker return 0 101*00c7fec1SAndroid Build Coastguard Worker} 102*00c7fec1SAndroid Build Coastguard Worker 103*00c7fec1SAndroid Build Coastguard Worker_fastboot_cmd_flash() { 104*00c7fec1SAndroid Build Coastguard Worker local serial i cur 105*00c7fec1SAndroid Build Coastguard Worker local partitions 106*00c7fec1SAndroid Build Coastguard Worker 107*00c7fec1SAndroid Build Coastguard Worker serial=$1 108*00c7fec1SAndroid Build Coastguard Worker i=$2 109*00c7fec1SAndroid Build Coastguard Worker 110*00c7fec1SAndroid Build Coastguard Worker cur="${COMP_WORDS[COMP_CWORD]}" 111*00c7fec1SAndroid Build Coastguard Worker if [[ $i -eq $COMP_CWORD ]]; then 112*00c7fec1SAndroid Build Coastguard Worker partitions="boot bootloader dtbo init_boot modem odm odm_dlkm oem product pvmfw radio recovery system system_dlkm vbmeta vendor vendor_dlkm vendor_kernel_boot" 113*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( $(compgen -W "$partitions" -- $cur) ) 114*00c7fec1SAndroid Build Coastguard Worker else 115*00c7fec1SAndroid Build Coastguard Worker _fastboot_util_complete_local_file "${cur}" '!*.img' 116*00c7fec1SAndroid Build Coastguard Worker fi 117*00c7fec1SAndroid Build Coastguard Worker} 118*00c7fec1SAndroid Build Coastguard Worker 119*00c7fec1SAndroid Build Coastguard Worker_fastboot_cmd_update() { 120*00c7fec1SAndroid Build Coastguard Worker local serial i cur 121*00c7fec1SAndroid Build Coastguard Worker 122*00c7fec1SAndroid Build Coastguard Worker serial=$1 123*00c7fec1SAndroid Build Coastguard Worker i=$2 124*00c7fec1SAndroid Build Coastguard Worker 125*00c7fec1SAndroid Build Coastguard Worker cur="${COMP_WORDS[COMP_CWORD]}" 126*00c7fec1SAndroid Build Coastguard Worker 127*00c7fec1SAndroid Build Coastguard Worker _fastboot_util_complete_local_file "${cur}" '!*.zip' 128*00c7fec1SAndroid Build Coastguard Worker} 129*00c7fec1SAndroid Build Coastguard Worker 130*00c7fec1SAndroid Build Coastguard Worker_fastboot_util_complete_local_file() { 131*00c7fec1SAndroid Build Coastguard Worker local file xspec i j IFS=$'\n' 132*00c7fec1SAndroid Build Coastguard Worker local -a dirs files 133*00c7fec1SAndroid Build Coastguard Worker 134*00c7fec1SAndroid Build Coastguard Worker file=$1 135*00c7fec1SAndroid Build Coastguard Worker xspec=$2 136*00c7fec1SAndroid Build Coastguard Worker 137*00c7fec1SAndroid Build Coastguard Worker # Since we're probably doing file completion here, don't add a space after. 138*00c7fec1SAndroid Build Coastguard Worker if [[ $(check_type compopt) == "builtin" ]]; then 139*00c7fec1SAndroid Build Coastguard Worker compopt -o plusdirs 140*00c7fec1SAndroid Build Coastguard Worker if [[ "${xspec}" == "" ]]; then 141*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") ) 142*00c7fec1SAndroid Build Coastguard Worker else 143*00c7fec1SAndroid Build Coastguard Worker compopt +o filenames 144*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") ) 145*00c7fec1SAndroid Build Coastguard Worker fi 146*00c7fec1SAndroid Build Coastguard Worker else 147*00c7fec1SAndroid Build Coastguard Worker # Work-around for shells with no compopt 148*00c7fec1SAndroid Build Coastguard Worker 149*00c7fec1SAndroid Build Coastguard Worker dirs=( $(compgen -d -- "${cur}" ) ) 150*00c7fec1SAndroid Build Coastguard Worker 151*00c7fec1SAndroid Build Coastguard Worker if [[ "${xspec}" == "" ]]; then 152*00c7fec1SAndroid Build Coastguard Worker files=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") ) 153*00c7fec1SAndroid Build Coastguard Worker else 154*00c7fec1SAndroid Build Coastguard Worker files=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") ) 155*00c7fec1SAndroid Build Coastguard Worker fi 156*00c7fec1SAndroid Build Coastguard Worker 157*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( $( 158*00c7fec1SAndroid Build Coastguard Worker for i in "${files[@]}"; do 159*00c7fec1SAndroid Build Coastguard Worker local skip= 160*00c7fec1SAndroid Build Coastguard Worker for j in "${dirs[@]}"; do 161*00c7fec1SAndroid Build Coastguard Worker if [[ $i == $j ]]; then 162*00c7fec1SAndroid Build Coastguard Worker skip=1 163*00c7fec1SAndroid Build Coastguard Worker break 164*00c7fec1SAndroid Build Coastguard Worker fi 165*00c7fec1SAndroid Build Coastguard Worker done 166*00c7fec1SAndroid Build Coastguard Worker [[ -n $skip ]] || printf "%s\n" "$i" 167*00c7fec1SAndroid Build Coastguard Worker done 168*00c7fec1SAndroid Build Coastguard Worker )) 169*00c7fec1SAndroid Build Coastguard Worker 170*00c7fec1SAndroid Build Coastguard Worker COMPREPLY=( ${COMPREPLY[@]:-} $( 171*00c7fec1SAndroid Build Coastguard Worker for i in "${dirs[@]}"; do 172*00c7fec1SAndroid Build Coastguard Worker printf "%s/\n" "$i" 173*00c7fec1SAndroid Build Coastguard Worker done 174*00c7fec1SAndroid Build Coastguard Worker )) 175*00c7fec1SAndroid Build Coastguard Worker fi 176*00c7fec1SAndroid Build Coastguard Worker} 177*00c7fec1SAndroid Build Coastguard Worker 178*00c7fec1SAndroid Build Coastguard Workerif [[ $(check_type compopt) == "builtin" ]]; then 179*00c7fec1SAndroid Build Coastguard Worker complete -F _fastboot fastboot 180*00c7fec1SAndroid Build Coastguard Workerelse 181*00c7fec1SAndroid Build Coastguard Worker complete -o nospace -F _fastboot fastboot 182*00c7fec1SAndroid Build Coastguard Workerfi 183