Blame view

tools/perf/perf-completion.sh 6.17 KB
f38ab8af7   Ramkumar Ramachandra   perf completion: ...
1
  # perf bash and zsh completion
b24413180   Greg Kroah-Hartman   License cleanup: ...
2
  # SPDX-License-Identifier: GPL-2.0
98a4179c9   Frederic Weisbecker   perf tools: Initi...
3

c3fb6717e   Ramkumar Ramachandra   perf completion: ...
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
  # Taken from git.git's completion script.
  __my_reassemble_comp_words_by_ref()
  {
  	local exclude i j first
  	# Which word separators to exclude?
  	exclude="${1//[^$COMP_WORDBREAKS]}"
  	cword_=$COMP_CWORD
  	if [ -z "$exclude" ]; then
  		words_=("${COMP_WORDS[@]}")
  		return
  	fi
  	# List of word completion separators has shrunk;
  	# re-assemble words to complete.
  	for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
  		# Append each nonempty word consisting of just
  		# word separator characters to the current word.
  		first=t
  		while
  			[ $i -gt 0 ] &&
  			[ -n "${COMP_WORDS[$i]}" ] &&
  			# word consists of excluded word separators
  			[ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
  		do
  			# Attach to the previous token,
  			# unless the previous token is the command name.
  			if [ $j -ge 2 ] && [ -n "$first" ]; then
  				((j--))
  			fi
  			first=
  			words_[$j]=${words_[j]}${COMP_WORDS[i]}
  			if [ $i = $COMP_CWORD ]; then
  				cword_=$j
  			fi
  			if (($i < ${#COMP_WORDS[@]} - 1)); then
  				((i++))
  			else
  				# Done.
  				return
  			fi
  		done
  		words_[$j]=${words_[j]}${COMP_WORDS[i]}
  		if [ $i = $COMP_CWORD ]; then
  			cword_=$j
  		fi
  	done
  }
1312c8a8f   Yunlong Song   perf tools: Avoid...
50
51
52
53
54
55
56
57
58
59
  # Define preload_get_comp_words_by_ref="false", if the function
  # __perf_get_comp_words_by_ref() is required instead.
  preload_get_comp_words_by_ref="true"
  
  if [ $preload_get_comp_words_by_ref = "true" ]; then
  	type _get_comp_words_by_ref &>/dev/null ||
  	preload_get_comp_words_by_ref="false"
  fi
  [ $preload_get_comp_words_by_ref = "true" ] ||
  __perf_get_comp_words_by_ref()
c3fb6717e   Ramkumar Ramachandra   perf completion: ...
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
  {
  	local exclude cur_ words_ cword_
  	if [ "$1" = "-n" ]; then
  		exclude=$2
  		shift 2
  	fi
  	__my_reassemble_comp_words_by_ref "$exclude"
  	cur_=${words_[cword_]}
  	while [ $# -gt 0 ]; do
  		case "$1" in
  		cur)
  			cur=$cur_
  			;;
  		prev)
  			prev=${words_[$cword_-1]}
  			;;
  		words)
  			words=("${words_[@]}")
  			;;
  		cword)
  			cword=$cword_
  			;;
  		esac
  		shift
  	done
  }
1312c8a8f   Yunlong Song   perf tools: Avoid...
86
87
88
89
90
91
92
93
94
95
  # Define preload__ltrim_colon_completions="false", if the function
  # __perf__ltrim_colon_completions() is required instead.
  preload__ltrim_colon_completions="true"
  
  if [ $preload__ltrim_colon_completions = "true" ]; then
  	type __ltrim_colon_completions &>/dev/null ||
  	preload__ltrim_colon_completions="false"
  fi
  [ $preload__ltrim_colon_completions = "true" ] ||
  __perf__ltrim_colon_completions()
ae0c1f993   Namhyung Kim   perf tools: Compl...
96
97
98
  {
  	if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then
  		# Remove colon-word prefix from COMPREPLY items
30079d1d5   Ramkumar Ramachandra   perf completion: ...
99
  		local colon_word=${1%"${1##*:}"}
ae0c1f993   Namhyung Kim   perf tools: Compl...
100
101
102
103
104
105
  		local i=${#COMPREPLY[*]}
  		while [[ $((--i)) -ge 0 ]]; do
  			COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
  		done
  	fi
  }
12f9dd504   Ramkumar Ramachandra   perf completion: ...
106
107
108
109
  __perfcomp ()
  {
  	COMPREPLY=( $( compgen -W "$1" -- "$2" ) )
  }
37e72c310   Ramkumar Ramachandra   perf completion: ...
110
111
112
  __perfcomp_colon ()
  {
  	__perfcomp "$1" "$2"
1312c8a8f   Yunlong Song   perf tools: Avoid...
113
114
115
116
117
  	if [ $preload__ltrim_colon_completions = "true" ]; then
  		__ltrim_colon_completions $cur
  	else
  		__perf__ltrim_colon_completions $cur
  	fi
37e72c310   Ramkumar Ramachandra   perf completion: ...
118
  }
67afff485   Yunlong Song   perf tools: Fix t...
119
120
121
122
123
  __perf_prev_skip_opts ()
  {
  	local i cmd_ cmds_
  
  	let i=cword-1
eee200a6c   Yunlong Song   perf tools: Provi...
124
  	cmds_=$($cmd $1 --list-cmds)
67afff485   Yunlong Song   perf tools: Fix t...
125
126
  	prev_skip_opts=()
  	while [ $i -ge 0 ]; do
eee200a6c   Yunlong Song   perf tools: Provi...
127
128
129
  		if [[ ${words[i]} == $1 ]]; then
  			return
  		fi
67afff485   Yunlong Song   perf tools: Fix t...
130
131
132
133
134
135
136
137
138
  		for cmd_ in $cmds_; do
  			if [[ ${words[i]} == $cmd_ ]]; then
  				prev_skip_opts=${words[i]}
  				return
  			fi
  		done
  		((i--))
  	done
  }
6fdd9cb70   Yunlong Song   perf tools: Add t...
139

2cf025e69   Ramkumar Ramachandra   perf completion: ...
140
  __perf_main ()
98a4179c9   Frederic Weisbecker   perf tools: Initi...
141
  {
2cf025e69   Ramkumar Ramachandra   perf completion: ...
142
  	local cmd
98a4179c9   Frederic Weisbecker   perf tools: Initi...
143

6e0dc374a   Ramkumar Ramachandra   perf completion: ...
144
  	cmd=${words[0]}
2cf025e69   Ramkumar Ramachandra   perf completion: ...
145
  	COMPREPLY=()
98a4179c9   Frederic Weisbecker   perf tools: Initi...
146

67afff485   Yunlong Song   perf tools: Fix t...
147
148
  	# Skip options backward and find the last perf command
  	__perf_prev_skip_opts
35c2fde11   Namhyung Kim   perf tools: Compl...
149
  	# List perf subcommands or long options
e003ce54d   Yunlong Song   perf tools: Fix t...
150
  	if [ -z $prev_skip_opts ]; then
35c2fde11   Namhyung Kim   perf tools: Compl...
151
  		if [[ $cur == --* ]]; then
7335399a6   Yunlong Song   perf tools: Fix t...
152
  			cmds=$($cmd --list-opts)
35c2fde11   Namhyung Kim   perf tools: Compl...
153
154
  		else
  			cmds=$($cmd --list-cmds)
35c2fde11   Namhyung Kim   perf tools: Compl...
155
  		fi
7335399a6   Yunlong Song   perf tools: Fix t...
156
  		__perfcomp "$cmds" "$cur"
6fdd9cb70   Yunlong Song   perf tools: Add t...
157
158
159
  	# List possible events for -e option
  	elif [[ $prev == @("-e"|"--event") &&
  		$prev_skip_opts == @(record|stat|top) ]]; then
74cd5815d   Jin Yao   perf tool: Improv...
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
  
  		local cur1=${COMP_WORDS[COMP_CWORD]}
  		local raw_evts=$($cmd list --raw-dump)
  		local arr s tmp result
  
  		if [[ "$cur1" == */* && ${cur1#*/} =~ ^[A-Z] ]]; then
  			OLD_IFS="$IFS"
  			IFS=" "
  			arr=($raw_evts)
  			IFS="$OLD_IFS"
  
  			for s in ${arr[@]}
  			do
  				if [[ "$s" == *cpu/* ]]; then
  					tmp=${s#*cpu/}
  					result=$result" ""cpu/"${tmp^^}
  				else
  					result=$result" "$s
  				fi
  			done
34c16db0f   Jin Yao   perf tools: Retur...
180
  			evts=${result}" "$(ls /sys/bus/event_source/devices/cpu/events)
74cd5815d   Jin Yao   perf tool: Improv...
181
  		else
34c16db0f   Jin Yao   perf tools: Retur...
182
  			evts=${raw_evts}" "$(ls /sys/bus/event_source/devices/cpu/events)
74cd5815d   Jin Yao   perf tool: Improv...
183
  		fi
34c16db0f   Jin Yao   perf tools: Retur...
184
185
186
187
188
  		if [[ "$cur1" == , ]]; then
  			__perfcomp_colon "$evts" ""
  		else
  			__perfcomp_colon "$evts" "$cur1"
  		fi
02fde323b   Yunlong Song   perf tools: Fix t...
189
190
  	else
  		# List subcommands for perf commands
6fdd9cb70   Yunlong Song   perf tools: Add t...
191
192
  		if [[ $prev_skip_opts == @(kvm|kmem|mem|lock|sched|
  			|data|help|script|test|timechart|trace) ]]; then
67afff485   Yunlong Song   perf tools: Fix t...
193
  			subcmds=$($cmd $prev_skip_opts --list-cmds)
02fde323b   Yunlong Song   perf tools: Fix t...
194
195
196
197
  			__perfcomp_colon "$subcmds" "$cur"
  		fi
  		# List long option names
  		if [[ $cur == --* ]];  then
eee200a6c   Yunlong Song   perf tools: Provi...
198
199
200
  			subcmd=$prev_skip_opts
  			__perf_prev_skip_opts $subcmd
  			subcmd=$subcmd" "$prev_skip_opts
02fde323b   Yunlong Song   perf tools: Fix t...
201
202
203
  			opts=$($cmd $subcmd --list-opts)
  			__perfcomp "$opts" "$cur"
  		fi
98a4179c9   Frederic Weisbecker   perf tools: Initi...
204
  	fi
2cf025e69   Ramkumar Ramachandra   perf completion: ...
205
  }
f38ab8af7   Ramkumar Ramachandra   perf completion: ...
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
  if [[ -n ${ZSH_VERSION-} ]]; then
  	autoload -U +X compinit && compinit
  
  	__perfcomp ()
  	{
  		emulate -L zsh
  
  		local c IFS=$' \t
  '
  		local -a array
  
  		for c in ${=1}; do
  			case $c in
  			--*=*|*.) ;;
  			*) c="$c " ;;
  			esac
  			array[${#array[@]}+1]="$c"
  		done
  
  		compset -P '*[=:]'
  		compadd -Q -S '' -a -- array && _ret=0
  	}
  
  	__perfcomp_colon ()
  	{
  		emulate -L zsh
  
  		local cur_="${2-$cur}"
  		local c IFS=$' \t
  '
  		local -a array
  
  		if [[ "$cur_" == *:* ]]; then
  			local colon_word=${cur_%"${cur_##*:}"}
  		fi
  
  		for c in ${=1}; do
  			case $c in
  			--*=*|*.) ;;
  			*) c="$c " ;;
  			esac
  			array[$#array+1]=${c#"$colon_word"}
  		done
  
  		compset -P '*[=:]'
  		compadd -Q -S '' -a -- array && _ret=0
  	}
  
  	_perf ()
  	{
  		local _ret=1 cur cword prev
  		cur=${words[CURRENT]}
  		prev=${words[CURRENT-1]}
  		let cword=CURRENT-1
  		emulate ksh -c __perf_main
  		let _ret && _default && _ret=0
  		return _ret
  	}
  
  	compdef _perf perf
  	return
  fi
2cf025e69   Ramkumar Ramachandra   perf completion: ...
268
269
270
  type perf &>/dev/null &&
  _perf()
  {
74cd5815d   Jin Yao   perf tool: Improv...
271
272
273
274
  	if [[ "$COMP_WORDBREAKS" != *,* ]]; then
  		COMP_WORDBREAKS="${COMP_WORDBREAKS},"
  		export COMP_WORDBREAKS
  	fi
5d4fd9c8b   Jin Yao   perf tools: Auto-...
275
276
277
278
  	if [[ "$COMP_WORDBREAKS" == *:* ]]; then
  		COMP_WORDBREAKS="${COMP_WORDBREAKS/:/}"
  		export COMP_WORDBREAKS
  	fi
2cf025e69   Ramkumar Ramachandra   perf completion: ...
279
  	local cur words cword prev
1312c8a8f   Yunlong Song   perf tools: Avoid...
280
  	if [ $preload_get_comp_words_by_ref = "true" ]; then
74cd5815d   Jin Yao   perf tool: Improv...
281
  		_get_comp_words_by_ref -n =:, cur words cword prev
1312c8a8f   Yunlong Song   perf tools: Avoid...
282
  	else
74cd5815d   Jin Yao   perf tool: Improv...
283
  		__perf_get_comp_words_by_ref -n =:, cur words cword prev
1312c8a8f   Yunlong Song   perf tools: Avoid...
284
  	fi
2cf025e69   Ramkumar Ramachandra   perf completion: ...
285
  	__perf_main
98a4179c9   Frederic Weisbecker   perf tools: Initi...
286
  } &&
7b6c48e16   Ramkumar Ramachandra   perf completion: ...
287
288
289
  
  complete -o bashdefault -o default -o nospace -F _perf perf 2>/dev/null \
  	|| complete -o default -o nospace -F _perf perf