13bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# /* vim: set ai ts=4 ft=sh: */ 23bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# 33bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# Copyright 2011, The Android Open Source Project 43bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# 53bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# Licensed under the Apache License, Version 2.0 (the "License"); 63bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# you may not use this file except in compliance with the License. 73bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# You may obtain a copy of the License at 83bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# 93bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# http://www.apache.org/licenses/LICENSE-2.0 103bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# 113bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# Unless required by applicable law or agreed to in writing, software 123bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# distributed under the License is distributed on an "AS IS" BASIS, 133bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# See the License for the specific language governing permissions and 153bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# limitations under the License. 163bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root# 173bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 183bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb() { 193bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root unset -v have 203bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root type $1 &> /dev/null && have="yes" 213bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 223bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [ "$have" != "yes" ]; then 233bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root return 243bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 253bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 263bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local where i cur serial 273bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=() 283bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 293bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root serial="${ANDROID_SERIAL:-none}" 303bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 313bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root for ((i=1; i <= COMP_CWORD; i++)); do 323bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="${COMP_WORDS[i]}" 333bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root case "${cur}" in 343bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root -s) 353bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPT_SERIAL 363bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 373bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root -p) 383bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPT_PATH 393bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 403bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root -*) 413bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 423bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 433bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root *) 443bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $where == OPT_SERIAL ]]; then 453bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPT_SERIAL_ARG 463bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root elif [[ $where == OPT_SERIAL_ARG ]]; then 473bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root serial=${cur} 483bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 493bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root else 503bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=COMMAND 513bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root break 523bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 533bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 543bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root esac 553bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 563bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 573bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $where == COMMAND && $i -ge $COMP_CWORD ]]; then 583bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 593bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 603bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 613bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root OPTIONS="-d -e -s -p" 623bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMMAND="devices connect disconnect push pull sync shell emu logcat lolcat forward jdwp install uninstall bugreport help version start-server kill-server get-state get-serialno status-window remount reboot reboot-bootloader root usb tcpip" 633bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 643bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root case $where in 653bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root OPTIONS|OPT_SERIAL|OPT_PATH) 663bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( $(compgen -W "$OPTIONS $COMMAND" -- "$cur") ) 673bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 683bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root OPT_SERIAL_ARG) 697d56e24dd9ebe85d255afbb21c1da4f82b51cc3eJP Abgrall local devices=$(command adb devices 2> /dev/null | grep -v "List of devices" | awk '{ print $1 }') 703bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( $(compgen -W "${devices}" -- ${cur}) ) 713bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 723bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMMAND) 733bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $i -eq $COMP_CWORD ]]; then 743bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( $(compgen -W "$COMMAND" -- "$cur") ) 753bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root else 763bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root i=$((i+1)) 773bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root case "${cur}" in 783bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root install) 793bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_cmd_install "$serial" $i 803bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 810ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai sideload) 820ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai _adb_cmd_sideload "$serial" $i 830ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai ;; 843bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root pull) 853bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_cmd_pull "$serial" $i 863bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 873bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root push) 883bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_cmd_push "$serial" $i 893bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 903bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root reboot) 913bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $COMP_CWORD == $i ]]; then 923bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root args="bootloader recovery" 933bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( $(compgen -W "${args}" -- "${COMP_WORDS[i]}") ) 943bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 953bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 963bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root shell) 973bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_cmd_shell "$serial" $i 983bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 993bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root uninstall) 1003bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_cmd_uninstall "$serial" $i 1013bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 1023bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root esac 1033bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 1043bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 1053bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root esac 1063bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1073bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root return 0 1083bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root} 1093bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1103bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_install() { 1113bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local serial i cur where 1123bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1133bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root serial=$1 1143bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root i=$2 1153bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1163bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 1173bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root for ((; i <= COMP_CWORD; i++)); do 1183bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="${COMP_WORDS[i]}" 1193bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root case "${cur}" in 1203bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root -*) 1213bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 1223bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 1233bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root *) 1243bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=FILE 1253bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root break 1263bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 1273bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root esac 1283bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 1293bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1303bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="${COMP_WORDS[COMP_CWORD]}" 1313bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $where == OPTIONS ]]; then 13231c667a772ef6ba491232daf658195d5fcdcb86cKenny Root COMPREPLY=( $(compgen -W "-d -l -r -s" -- "${cur}") ) 1333bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root return 1343bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 1353bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1363bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_util_complete_local_file "${cur}" '!*.apk' 1373bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root} 1383bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1390ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai_adb_cmd_sideload() { 1400ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai local serial i cur 1410ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai 1420ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai serial=$1 1430ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai i=$2 1440ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai 1450ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai cur="${COMP_WORDS[COMP_CWORD]}" 1460ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai 1470ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai _adb_util_complete_local_file "${cur}" '!*.zip' 1480ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai} 1490ac2b21e5d9798e40c1dca70ed72e704d0acc293Chirayu Desai 1503bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_push() { 1513bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local serial IFS=$'\n' i cur 1523bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1533bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root serial=$1 1543bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root i=$2 1553bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1563bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="${COMP_WORDS[COMP_CWORD]}" 1573bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1583bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $COMP_CWORD == $i ]]; then 1593bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_util_complete_local_file "${cur}" 1603bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root elif [[ $COMP_CWORD == $(($i+1)) ]]; then 1613bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [ "${cur}" == "" ]; then 1623bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="/" 1633bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 1643bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_util_list_files $serial "${cur}" 1653bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 1663bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root} 1673bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1683bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_pull() { 1693bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local serial IFS=$'\n' i cur 1703bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1713bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root serial=$1 1723bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root i=$2 1733bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1743bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="${COMP_WORDS[COMP_CWORD]}" 1753bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1763bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $COMP_CWORD == $i ]]; then 1773bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [ "${cur}" == "" ]; then 1783bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="/" 1793bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 1803bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_util_list_files $serial "${cur}" 1813bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root elif [[ $COMP_CWORD == $(($i+1)) ]]; then 1823bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_util_complete_local_file "${cur}" 1833bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 1843bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root} 1853bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1863bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_shell() { 1873bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local serial IFS=$'\n' i cur 1883bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local -a args 1893bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1903bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root serial=$1 1913bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root i=$2 1923bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1933bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="${COMP_WORDS[i]}" 1943bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [ "$serial" != "none" ]; then 1953bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root args=(-s $serial) 1963bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 1973bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 1983bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $i -eq $COMP_CWORD && ${cur:0:1} != "/" ]]; then 1993bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root paths=$(command adb ${args[@]} shell echo '$'PATH 2> /dev/null | tr -d '\r' | tr : '\n') 2003bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMMAND=$(command adb ${args[@]} shell ls $paths '2>' /dev/null | tr -d '\r' | { 2013bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root while read -r tmp; do 2023bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root command=${tmp##*/} 2033bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root printf '%s\n' "$command" 2043bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 2053bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root }) 2063bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( $(compgen -W "$COMMAND" -- "$cur") ) 2073bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root return 0 2083bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 2093bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2103bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root i=$((i+1)) 2113bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root case "$cur" in 2123bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ls) 2133bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_shell_ls $serial $i 2143bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 2153bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root /*) 2163bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_util_list_files $serial "$cur" 2173bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 2183bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root *) 2193bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( ) 2203bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 2213bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root esac 2223bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2233bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root return 0 2243bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root} 2253bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2263bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_cmd_uninstall() { 2273bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local serial i where cur packages 2283bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2293bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root serial=$1 2303bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root i=$2 2313bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [ "$serial" != "none" ]; then 2323bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root args=(-s $serial) 2333bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 2343bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2353bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 2363bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root for ((; i <= COMP_CWORD; i++)); do 2373bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="${COMP_WORDS[i]}" 2383bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root case "${cur}" in 2393bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root -*) 2403bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 2413bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 2423bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root *) 2433bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=FILE 2443bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root break 2453bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 2463bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root esac 2473bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 2483bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2493bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="${COMP_WORDS[COMP_CWORD]}" 2503bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $where == OPTIONS ]]; then 2513bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( $(compgen -W "-k" -- "${cur}") ) 2523bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 2533bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2543bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root packages="$( 2553bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root command adb ${args[@]} shell pm list packages '2>' /dev/null 2> /dev/null | tr -d '\r' | { 2563bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root while read -r tmp; do 2573bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local package=${tmp#package:} 2583bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root echo -n "${package} " 2593bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 2603bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root } 2613bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root )" 2623bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2633bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${packages}" -- "${cur}") ) 2643bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root} 2653bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2663bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_shell_ls() { 2673bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local serial i cur file 2683bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local -a args 2693bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2703bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root serial=$1 2713bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root i=$2 2723bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [ "$serial" != "none" ]; then 2733bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root args=(-s $serial) 2743bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 2753bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2763bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 2773bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root for ((; i <= COMP_CWORD; i++)); do 2783bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root cur="${COMP_WORDS[i]}" 2793bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root case "${cur}" in 2803bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root -*) 2813bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=OPTIONS 2823bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 2833bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root *) 2843bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root where=FILE 2853bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root break 2863bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 2873bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root esac 2883bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 2893bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2903bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root file="${COMP_WORDS[COMP_CWORD]}" 2913bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ ${file} == "" ]]; then 2923bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root file="/" 2933bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 2943bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 2953bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root case $where in 2963bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root OPTIONS) 2973bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( $(compgen -W "$OPTIONS" -- "$cur") ) 2983bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_util_list_files $serial "$file" 2993bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 3003bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root FILE) 3013bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root _adb_util_list_files $serial "$file" 3023bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root ;; 3033bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root esac 3043bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3053bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root return 0 3063bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root} 3073bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3083bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_util_list_files() { 3093bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local serial dir IFS=$'\n' 3103bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local -a toks 3113bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local -a args 3123bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3133bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root serial="$1" 3143bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root file="$2" 3153bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3163bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [ "$serial" != "none" ]; then 3173bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root args=(-s $serial) 3183bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 3193bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3203bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root toks=( ${toks[@]-} $( 3213bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root command adb ${args[@]} shell ls -dF ${file}"*" '2>' /dev/null 2> /dev/null | tr -d '\r' | { 3223bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root while read -r tmp; do 3233bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root filetype=${tmp%% *} 3243bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root filename=${tmp:${#filetype}+1} 3253bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ ${filetype:${#filetype}-1:1} == d ]]; then 3263bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root printf '%s/\n' "$filename" 3273bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root else 3283bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root printf '%s\n' "$filename" 3293bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 3303bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 3313bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root } 3323bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root )) 3333bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3343bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root # Since we're probably doing file completion here, don't add a space after. 3353bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $(type -t compopt) = "builtin" ]]; then 3363bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root compopt -o nospace 3373bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 3383bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3393bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( ${COMPREPLY[@]:-} "${toks[@]}" ) 3403bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root} 3413bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3423bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root_adb_util_complete_local_file() 3433bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root{ 34491fcc30acea4a45bf749338a5f614f3848290cf5Jeff Brown local file xspec i j IFS=$'\n' 3453bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local -a dirs files 3463bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3473bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root file=$1 3483bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root xspec=$2 3493bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3503bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root # Since we're probably doing file completion here, don't add a space after. 3513bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $(type -t compopt) = "builtin" ]]; then 3523bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root compopt -o plusdirs 3533bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ "${xspec}" == "" ]]; then 3543bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") ) 3553bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root else 3563bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root compopt +o filenames 3573bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") ) 3583bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 3593bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root else 3603bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root # Work-around for shells with no compopt 3613bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3623bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root dirs=( $(compgen -d -- "${cur}" ) ) 3633bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3643bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ "${xspec}" == "" ]]; then 3653bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root files=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") ) 3663bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root else 3673bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root files=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") ) 3683bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 3693bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3703bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( $( 3713bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root for i in "${files[@]}"; do 3723bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root local skip= 3733bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root for j in "${dirs[@]}"; do 3743bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root if [[ $i == $j ]]; then 3753bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root skip=1 3763bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root break 3773bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 3783bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 3793bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root [[ -n $skip ]] || printf "%s\n" "$i" 3803bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 3813bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root )) 3823bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3833bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root COMPREPLY=( ${COMPREPLY[@]:-} $( 3843bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root for i in "${dirs[@]}"; do 3853bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root printf "%s/\n" "$i" 3863bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root done 3873bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root )) 3883bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root fi 3893bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root} 3903bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3913bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root 3923bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Rootif [[ $(type -t compopt) = "builtin" ]]; then 3933bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root complete -F _adb adb 3943bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Rootelse 3953bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Root complete -o nospace -F _adb adb 3963bf0a01ef66a9b99149ba3faaf34a1362581dd01Kenny Rootfi 397