-
Notifications
You must be signed in to change notification settings - Fork 1
/
sadb-completion.bash
175 lines (168 loc) · 5.42 KB
/
sadb-completion.bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
_sadb_completion()
{
local cur prev opts cmds c subcommand device_selected adb alias_cmds
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="-d -e -s -p"
cmds="backup bugreport connect devices disable-verity disconnect emu \
enable-verity features forward get-devpath get-serialno get-state \
help host-features install install-multiple jdwp keygen \
kill-server logcat longcat ls ppp pull push reboot \
reboot-bootloader reconnect remount restore reverse root shell \
sideload start-server sync tcpip track-devices track-jdwp \
uninstall unroot usb version wait-for-bootloader wait-for-device \
wait-for-recovery wait-for-sideload alias active"
cmds_not_need_device="connect devices disconnect help keygen kill-server \
start-server version alias active"
subcommand=""
device_selected=""
# Find the real adb.
adb=$(which adb)
adb_paths=$(which -a adb)
alias_cmds=$(awk -F '=' '{ print $1}' "${HOME}/.config/sadb/.alias" | tr '\n' ' ')
read -r line1 <<< "$adb_paths"
if [[ "$line1" == *"adb: aliased to"* ]]; then
adb=$(awk 'NR==2 {print; exit}' <<< "$adb_paths")
fi
# Look for the subcommand.
c=1
while [ $c -lt $COMP_CWORD ]; do
word="${COMP_WORDS[c]}"
if [ "$word" = "-d" -o "$word" = "-e" -o "$word" = "-s" ]; then
device_selected=true
opts="-p"
fi
for cmd in $cmds; do
if [ "$cmd" = "$word" ]; then
subcommand="$word"
fi
done
c=$((++c))
done
case "${subcommand}" in
'')
case "${prev}" in
-p)
return 0;
;;
-s)
# Use 'adb devices' to list serial numbers.
COMPREPLY=( $(compgen -W "$($adb devices |
awk '/(device|recovery|sideload)$/{print $1}')" -- ${cur} ) )
return 0
;;
esac
case "${cur}" in
-*)
COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
return 0
;;
esac
if [[ $alias_cmds ]]; then
cmds="$cmds_not_need_device \
$alias_cmds \
$cmds"
else
if [ -z "$device_selected" ]; then
local num_devices=$(( $($adb devices 2>/dev/null|wc -l) - 2 ))
if [ "$num_devices" -gt "1" ]; then
# With multiple devices, you must choose a device first.
COMPREPLY=( $(compgen -W "${opts} ${cmds_not_need_device}" -- ${cur}) )
return 0
fi
fi
fi
COMPREPLY=( $(compgen -W "${cmds}" -- ${cur}) )
return 0
;;
disconnect)
# Use 'adb devices' to list serial numbers.
COMPREPLY=( $(compgen -W "$($adb devices |
awk '/(device|recovery|sideload|offline|unauthorized)$/{print $1}')" -- ${cur} ) )
return 0
;;
install)
case "${cur}" in
-*)
COMPREPLY=( $(compgen -W "-l -r -s" -- ${cur}) )
return 0
;;
esac
;;
forward)
# Filename or installation option.
COMPREPLY=( $(compgen -W "tcp: localabstract: localreserved: localfilesystem: dev: jdwp:" -- ${cur}) )
return 0
;;
uninstall)
local apks=$($adb shell pm list packages 2>/dev/null | cut -b9-999 | tr '\n\r' ' ')
if [[ $prev != "-k" && $cur == "-" ]]; then
COMPREPLY=( $(compgen -W "-k $apks" -- ${cur}) )
else
COMPREPLY=( $(compgen -W "$apks" -- ${cur}) )
fi
return 0
;;
logcat)
case "${cur}" in
-*)
COMPREPLY=( $(compgen -W "-v -b -c -d -f -g -n -r -s" -- ${cur}) )
return 0
;;
esac
case "${prev}" in
-v)
COMPREPLY=( $(compgen -W "brief process tag thread raw time long" -- ${cur}) )
return 0
;;
-b)
COMPREPLY=( $(compgen -W "radio events main all" -- ${cur}) )
return 0
;;
esac
;;
backup)
case "${cur}" in
-*)
COMPREPLY=( $(compgen -W "-f -apk -noapk -obb -noobb -shared -noshared -all -system -nosystem" -- ${cur}) )
return 0
;;
esac
;;
pull)
if [ ${prev} == "pull" ]; then
local IFS=$'\n'
if [ -z ${cur} ]; then
local files=$($adb shell "ls -a -d /*" 2>/dev/null | tr -d '\r')
COMPREPLY=( $(compgen -W "$files" -o filenames -- ${cur}) )
else
local stripped_cur=$(echo ${cur} | sed 's,^",,')
local files=$($adb shell "ls -a -d '${stripped_cur}'*" 2>/dev/null | tr -d '\r')
COMPREPLY=( $(compgen -W "$files" -o filenames -- ${cur}) )
fi
return 0
fi
;;
push)
if [ "${COMP_WORDS[COMP_CWORD-2]}" == "push" ]; then
local IFS=$'\n'
if [ -z "${cur}" ]; then
local files=$($adb shell "ls -a -d /*" 2>/dev/null | tr -d '\r')
COMPREPLY=( $(compgen -W "$files" -o filenames -- ${cur}) )
else
local stripped_cur=$(echo ${cur} | sed 's,^",,')
local files=$($adb shell "ls -a -d '${stripped_cur}'*" 2>/dev/null | tr -d '\r')
COMPREPLY=( $(compgen -W "$files" -o filenames -- ${cur}) )
fi
return 0
fi
;;
alias)
if [ ${prev} == "alias" ]; then
COMPREPLY=( $(compgen -W "-l --list -r --remove -h --help" -o filenames -- ${cur}) )
fi
;;
esac
}
complete -o default -F _sadb_completion sadb