xref: /aosp_15_r20/system/core/fastboot/fastboot.bash (revision 00c7fec1bb09f3284aad6a6f96d2f63dfc3650ad)
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