Skip to content

Commit b030e07

Browse files
committed
perf(tar): parse the GNU tar help on initialization
1 parent 281261a commit b030e07

File tree

1 file changed

+49
-20
lines changed

1 file changed

+49
-20
lines changed

completions/tar

+49-20
Original file line numberDiff line numberDiff line change
@@ -120,25 +120,19 @@ _comp_cmd_gtar__parse_help_line()
120120
}
121121

122122
# Parse the output of "tar --help" with GNU tar and store the parse results
123-
# into variables.
123+
# in a global variable.
124124
#
125-
# @var[out] long_opts
126-
# @var[out] short_opts
127-
# @var[out] long_arg_none
128-
# @var[out] long_arg_opt
129-
# @var[out] long_arg_req
130-
# @var[out] short_arg_none
131-
# @var[out] short_arg_opt
132-
# @var[out] short_arg_req
133-
# The parse results are returned in these variables.
134-
_comp_cmd_gtar__parse_help()
125+
# @var[out] _comp_cmd_gtar__parse_help__result
126+
# The parse results are stored in this global variable in a form that can
127+
# be evaluated by the builtin "eval".
128+
_comp_cmd_gtar__parse_help_initialize()
135129
{
136-
long_arg_none=""
137-
long_arg_opt=""
138-
long_arg_req=""
139-
short_arg_none=""
140-
short_arg_opt=""
141-
short_arg_req=""
130+
local long_arg_none=""
131+
local long_arg_opt=""
132+
local long_arg_req=""
133+
local short_arg_none=""
134+
local short_arg_opt=""
135+
local short_arg_req=""
142136

143137
local str line arg
144138
while IFS= read -r line; do
@@ -164,10 +158,45 @@ _comp_cmd_gtar__parse_help()
164158
fi
165159
done <<<"$(tar --help)"
166160

167-
long_opts="\
168-
$long_arg_none $long_arg_opt $long_arg_req"
161+
local long_opts="$long_arg_none $long_arg_opt $long_arg_req"
162+
163+
local short_opts="$short_arg_none$short_arg_opt$short_arg_req"
164+
165+
printf -v _comp_cmd_gtar__parse_help__result '%s=%q ' \
166+
long_opts "$long_opts" \
167+
short_opts "$short_opts" \
168+
long_arg_none "$long_arg_none" \
169+
long_arg_opt "$long_arg_opt" \
170+
long_arg_req "$long_arg_req" \
171+
short_arg_none "$short_arg_none" \
172+
short_arg_opt "$short_arg_opt" \
173+
short_arg_req "$short_arg_req"
169174

170-
short_opts="$short_arg_none$short_arg_opt$short_arg_req"
175+
# Clean up functions only used in initialization
176+
unset -f "$FUNCNAME"
177+
unset -f _comp_cmd_gtar__parse_help_line
178+
unset -f _comp_cmd_gtar__parse_help_opt
179+
}
180+
_comp_cmd_gtar__parse_help_initialize
181+
182+
# Load the parse results of "tar --help" for GNU tar into variables.
183+
#
184+
# @var[out] long_opts
185+
# @var[out] short_opts
186+
# @var[out] long_arg_none
187+
# @var[out] long_arg_opt
188+
# @var[out] long_arg_req
189+
# @var[out] short_arg_none
190+
# @var[out] short_arg_opt
191+
# @var[out] short_arg_req
192+
# The parse results are returned in these variables.
193+
#
194+
# @var[in] _comp_cmd_gtar__parse_help__result
195+
# The parse results are obtained by evaluating this variable with the
196+
# "eval" builtin.
197+
_comp_cmd_gtar__parse_help()
198+
{
199+
eval -- "$_comp_cmd_gtar__parse_help__result"
171200
}
172201

173202
# Hack: parse --warning keywords from tar's error output

0 commit comments

Comments
 (0)