59
59
_comp_deprecate_var 2.12 \
60
60
COMP_TAR_INTERNAL_PATHS BASH_COMPLETION_CMD_TAR_INTERNAL_PATHS
61
61
62
- _comp_cmd_gtar__parse_help_opt ()
62
+ _comp_cmd_gtar__init_parse_help_opt ()
63
63
{
64
64
local opttype arg opt separator optvar
65
65
opttype=long
@@ -98,7 +98,7 @@ _comp_cmd_gtar__parse_help_opt()
98
98
eval " $optvar =\"\$ $optvar$separator \"\" $opt \" "
99
99
}
100
100
101
- _comp_cmd_gtar__parse_help_line ()
101
+ _comp_cmd_gtar__init_parse_help_line ()
102
102
{
103
103
local i
104
104
local -a tmp
@@ -107,7 +107,7 @@ _comp_cmd_gtar__parse_help_line()
107
107
case " $i " in
108
108
# regular options
109
109
--* | -* )
110
- _comp_cmd_gtar__parse_help_opt " $i " " $2 "
110
+ _comp_cmd_gtar__init_parse_help_opt " $i " " $2 "
111
111
;;
112
112
113
113
# end once there is single non-option word
@@ -119,8 +119,21 @@ _comp_cmd_gtar__parse_help_line()
119
119
done <<< " $1"
120
120
}
121
121
122
- _comp_cmd_gtar__parse_help ()
122
+ # Parse the output of "tar --help" with GNU tar and store the parse results
123
+ # in a global variable.
124
+ #
125
+ # @var[out] _comp_cmd_gtar__saved_opts
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__init_parse_help ()
123
129
{
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=" "
136
+
124
137
local str line arg
125
138
while IFS= read -r line; do
126
139
# Ok, this requires some comment probably. The GNU help output prints
@@ -141,14 +154,49 @@ _comp_cmd_gtar__parse_help()
141
154
[[ ${BASH_REMATCH[1]} ]] && arg=opt || arg=req
142
155
fi
143
156
144
- _comp_cmd_gtar__parse_help_line " $str " " $arg "
157
+ _comp_cmd_gtar__init_parse_help_line " $str " " $arg "
145
158
fi
146
159
done <<< " $(tar --help)"
147
160
148
- long_opts=" \
149
- $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__saved_opts ' %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 "
150
174
151
- short_opts=" $short_arg_none$short_arg_opt$short_arg_req "
175
+ # Clean up functions only used in initialization
176
+ unset -f _comp_cmd_gtar__init_parse_help
177
+ unset -f _comp_cmd_gtar__init_parse_help_line
178
+ unset -f _comp_cmd_gtar__init_parse_help_opt
179
+ }
180
+ _comp_cmd_gtar__init_parse_help
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__saved_opts
195
+ # The parse results are obtained by evaluating this variable with the
196
+ # "eval" builtin.
197
+ _comp_cmd_gtar__load_opts ()
198
+ {
199
+ eval -- " $_comp_cmd_gtar__saved_opts "
152
200
}
153
201
154
202
# Hack: parse --warning keywords from tar's error output
@@ -165,8 +213,15 @@ _comp_cmd_gtar__parse_warnings()
165
213
_comp_compgen -- -W ' "${warnings[@]}"'
166
214
}
167
215
216
+ # @var[out] old_opt_progress
217
+ # @var[out] old_opt_used
218
+ # @var[out,array] old_opt_parsed
168
219
_comp_cmd_tar__parse_old_opt ()
169
220
{
221
+ old_opt_progress=" "
222
+ old_opt_used=" "
223
+ old_opt_parsed=()
224
+
170
225
local first_word char
171
226
172
227
# current word is the first word
@@ -193,6 +248,10 @@ _comp_cmd_tar__parse_old_opt()
193
248
}
194
249
195
250
# Make the analysis of whole command line.
251
+ #
252
+ # @var[out] old_opt_progress
253
+ # @var[out] old_opt_used
254
+ # @var[out,array] old_opt_parsed
196
255
_comp_cmd_tar__preparse_cmdline ()
197
256
{
198
257
local first_arg=set i modes=" ctxurdA"
@@ -507,11 +566,7 @@ _comp_cmd_tar__detect_ext()
507
566
508
567
_comp_cmd_tar__gnu ()
509
568
{
510
- local long_opts short_opts basic_tar=" " \
511
- long_arg_none=" " long_arg_opt=" " long_arg_req=" " \
512
- short_arg_none=" " short_arg_opt=" " short_arg_req=" " \
513
- tar_mode tar_mode_arg old_opt_progress=" " \
514
- old_opt_used=" " old_opt_parsed=()
569
+ local basic_tar=" "
515
570
516
571
# Main mode, e.g. "x" or "c" or the long forms "extract" or "create"
517
572
local tar_mode=none
@@ -528,12 +583,15 @@ _comp_cmd_tar__gnu()
528
583
fi
529
584
530
585
local cur prev words cword was_split comp_args
531
-
532
586
_comp_initialize -s -- " $@ " || return
533
587
534
588
# Fill the {long,short}_{opts,arg*}
535
- _comp_cmd_gtar__parse_help
589
+ local long_opts short_opts \
590
+ long_arg_none long_arg_opt long_arg_req \
591
+ short_arg_none short_arg_opt short_arg_req
592
+ _comp_cmd_gtar__load_opts
536
593
594
+ local old_opt_progress old_opt_used old_opt_parsed
537
595
_comp_cmd_tar__preparse_cmdline " ${words[@]} "
538
596
539
597
local ext
@@ -694,11 +752,7 @@ _comp_cmd_tar__posix_prev_handle()
694
752
695
753
_comp_cmd_tar__posix ()
696
754
{
697
- local long_opts short_opts basic_tar=set \
698
- long_arg_none=" " long_arg_opt long_arg_req=" " \
699
- short_arg_none short_arg_opt short_arg_req \
700
- tar_mode tar_mode_arg old_opt_progress=" " \
701
- old_opt_used=set old_opt_parsed=()
755
+ local basic_tar=set
702
756
703
757
# Main mode, e.g. -x or -c (extract/creation)
704
758
local tar_mode=none
@@ -710,15 +764,25 @@ _comp_cmd_tar__posix()
710
764
local tar_compression_mode=none
711
765
712
766
local cur prev words cword was_split comp_args
713
-
714
767
_comp_initialize -s -- " $@ " || return
715
768
769
+ # Initialize option variables:
716
770
# relatively compatible modes are {c,t,x}
717
771
# relatively compatible options {b,f,m,v,w}
772
+ # Note: long_{opts,arg_{none,opt}} and short_arg_opt are currently unused
773
+ local long_opts short_opts \
774
+ long_arg_none long_arg_opt long_arg_req \
775
+ short_arg_none short_arg_opt short_arg_req
776
+ long_arg_none=" "
777
+ long_arg_opt=" "
778
+ long_arg_req=" "
779
+ long_opts=" "
718
780
short_arg_req=" fb"
781
+ short_arg_opt=" "
719
782
short_arg_none=" wmv"
720
783
short_opts=" $short_arg_req$short_arg_none "
721
784
785
+ local old_opt_progress old_opt_used old_opt_parsed
722
786
_comp_cmd_tar__preparse_cmdline " ${words[@]} "
723
787
724
788
local ext
0 commit comments