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