@@ -205,10 +205,15 @@ _comp_cmd_tar__preparse_cmdline()
205
205
case " $i " in
206
206
--delete | --test-label | --catenate | --concatenate | --extract | --get | --update | --list | --append | --create)
207
207
tar_mode=${i: 2: 100}
208
- # FIXME: We don't set $tar_mode_arg since it's used for combined
209
- # single letter options, but that means we don't handle
210
- # compression formats.
211
- break
208
+ ;;
209
+ --bzip2 | --xz | --lzip | --lzma | --lzop | --zstd)
210
+ tar_compression_mode=${i: 2: 100}
211
+ ;;
212
+ --gzip | --gunzip | --ungzip)
213
+ tar_compression_mode=" gzip"
214
+ ;;
215
+ --compress | --uncompress)
216
+ tar_compression_mode=" compress"
212
217
;;
213
218
--* )
214
219
# skip
@@ -439,10 +444,15 @@ _comp_cmd_tar__cleanup_prev()
439
444
fi
440
445
}
441
446
447
+ _comp_cmd_tar__is_bsdtar ()
448
+ {
449
+ [[ ${COMP_WORDS[0]} == ? (* /)bsdtar ]]
450
+ }
451
+
442
452
_comp_cmd_tar__detect_ext ()
443
453
{
444
454
local tars=' @(@(tar|spkg)?(.@(Z|[bgx]z|bz2|lz?(ma|o)|zst))|t@([abglx]z|b?(z)2|zst)|cbt|gem|xbps)'
445
- if [[ ${COMP_WORDS[0]} == ? ( * /)bsdtar ]] ; then
455
+ if _comp_cmd_tar__is_bsdtar ; then
446
456
# https://github.com/libarchive/libarchive/wiki/LibarchiveFormats
447
457
tars=${tars/% \) / |pax|cpio|iso|zip|@ (j|x)ar|mtree|a|7z|warc}
448
458
if _comp_cmd_tar__extract_like_mode; then
@@ -455,33 +465,44 @@ _comp_cmd_tar__detect_ext()
455
465
fi
456
466
ext=" $tars "
457
467
458
- case " $tar_mode_arg " in
459
- --* )
460
- # FIXME: get correct extensions for long options (gnu style)
461
- ;;
462
- ? (-)* [cr]* f)
468
+ if ! _comp_cmd_tar__extract_like_mode; then
469
+ if ! _comp_cmd_tar__is_bsdtar; then
463
470
ext=' @(tar|gem|spkg|cbt|xpbs)'
464
- case ${words[1]} in
465
- * a* ) ext=" $tars " ;;
466
- * z* ) ext=' t?(ar.)gz' ;;
467
- * Z* ) ext=' ta@(r.Z|z)' ;;
468
- * [jy]* ) ext=' t@(?(ar.)bz?(2)|b2)' ;;
469
- * J* ) ext=' t?(ar.)xz' ;;
470
- esac
471
- ;;
472
- + ([^ZzJjy])f)
473
- # Pass through using defaults above
474
- ;;
475
- * [Zz]* f)
476
- ext=' @(@(t?(ar.)|spkg.)@(gz|Z)|taz)'
477
- ;;
478
- * [jy]* f)
479
- ext=' @(t?(ar.)bz?(2)|spkg|tb2)'
480
- ;;
481
- * [J]* f)
482
- ext=' @(@(tar|spkg).@(lzma|xz)|t[lx]z)'
483
- ;;
484
- esac
471
+ fi
472
+ case $tar_mode_arg :$tar_compression_mode in
473
+ * a* :none | * :auto-compress)
474
+ ext=" $tars "
475
+ ;;
476
+ * z* :none | * :gzip)
477
+ ext=' t?(ar.)gz'
478
+ ;;
479
+ * Z* :none | * :compress)
480
+ ext=' ta@(r.Z|z)'
481
+ ;;
482
+ * [jy]* :none | * :bzip2)
483
+ ext=' t@(?(ar.)bz?(2)|b2)'
484
+ ;;
485
+ * J* :none | * :xz)
486
+ ext=' t?(ar.)xz'
487
+ ;;
488
+ esac
489
+ else
490
+ # TODO: lzip, lzma, lzop
491
+ case $tar_mode_arg :$tar_compression_mode in
492
+ * [Zz]* f:none | * :gzip | * :compress)
493
+ ext=' @(@(t?(ar.)|spkg.)@(gz|Z)|taz)'
494
+ ;;
495
+ * [jy]* f:none | * :bzip2)
496
+ ext=' @(t?(ar.)bz?(2)|spkg|tb2)'
497
+ ;;
498
+ * J* f:none | * :xz)
499
+ ext=' @(@(tar|spkg).@(lzma|xz)|t[lx]z)'
500
+ ;;
501
+ * :zstd)
502
+ ext=' t?(ar.)zst'
503
+ ;;
504
+ esac
505
+ fi
485
506
}
486
507
487
508
_comp_cmd_tar__gnu ()
@@ -496,9 +517,11 @@ _comp_cmd_tar__gnu()
496
517
local tar_mode=none
497
518
498
519
# The mode argument, e.g. -cpf or -c
499
- # FIXME: handle long options
500
520
local tar_mode_arg=
501
521
522
+ # Compression mode - from long options
523
+ local tar_compression_mode=none
524
+
502
525
if [[ -v _comp_cmd_tar__debug ]]; then
503
526
set -x
504
527
local PS4=' $BASH_SOURCE:$LINENO: '
@@ -683,6 +706,9 @@ _comp_cmd_tar__posix()
683
706
# The mode argument, e.g. -cpf or -c
684
707
local tar_mode_arg=
685
708
709
+ # Compression mode - from long options
710
+ local tar_compression_mode=none
711
+
686
712
local cur prev words cword was_split comp_args
687
713
688
714
_comp_initialize -s -- " $@ " || return
0 commit comments