Pavel Raiskup 8b23c84cc2 tar: rework the completion completely
Use the parsed 'tar --help' output for completion, at least for
GNU tar.  For non-GNU tars use the _posix_tar completion.  Adjust
the testsuite to cover some improvements.
2015-06-01 18:44:22 +03:00

126 lines
3.6 KiB
Plaintext

proc setup {} {
save_env
}
proc teardown {} {
assert_env_unmodified {/OLDPWD=/d}
}
setup
# Detect whether system's tar is GNU tar
set cmd "tar --version"
send "$cmd\r"
expect "^$cmd\r\n"
expect {
-re "GNU\[^\n\]*\n" {
set tar_version gnu
}
-re ".*\n" {
set tar_version unknown
}
}
sync_after_int
set test "old option: list escaped chars"
assert_complete_dir "a/b\\'c/" "tar tf escape.tar a/b\\\'" $::srcdir/fixtures/tar $test
sync_after_int
# TODO: "tar tf escape.tar a/b"
set test "check that any completion done"
assert_complete_any "tar "
sync_after_int
# Use bsdtar as the it completes to only 'zc zt zx' ('tar' can be GNU tar and it
# can would have more options)
set test "old option: mode is not on first place"
assert_complete {zc zt zx} "bsdtar z" $test
sync_after_int
set test "old option: test 'f' when mode is not as a first option"
assert_complete_dir "dir/ dir2/" "tar zfc " $::srcdir/fixtures/tar
sync_after_int
set test "old option: creating archive and 'f' option"
assert_complete_dir "dir/ dir2/" "tar cf " $::srcdir/fixtures/tar
sync_after_int
set test "old option: archive listing"
assert_complete_dir "dir/fileA dir/fileB dir/fileC" "tar tf archive.tar.xz dir/file" $::srcdir/fixtures/tar
sync_after_int
set test "old option: check _second_ option in \"old\" argument"
assert_complete_dir "dir/ dir2/" "bsdtar cbfvv NOT_EXISTS " $::srcdir/fixtures/tar
sync_after_int
set test "old option: create and members"
assert_complete_dir "dir/ dir2/ archive.tar.xz escape.tar" "tar cTfvv NOT_EXISTS DONT_CREATE.tar " $::srcdir/fixtures/tar
sync_after_int
if { "$tar_version" == "gnu" } {
set test "check short options"
assert_complete_any "tar -c"
sync_after_int
set test "mode not as a first option"
assert_complete_dir "dir/ dir2/" "tar -zcf " $::srcdir/fixtures/tar
sync_after_int
# Only directories should be completed.
set test "check that we do not suggest re-writing existing archive"
assert_complete_dir "dir/ dir2/" "tar -cf " $::srcdir/fixtures/tar
sync_after_int
set test "check --file option"
assert_complete_dir "dir/ dir2/" "tar -c --file " $::srcdir/fixtures/tar
sync_after_int
set test "check --file option #2"
assert_complete_dir "dir/ dir2/" "tar -cvv --file " $::srcdir/fixtures/tar
sync_after_int
set test "archive listing"
assert_complete_dir "dir/fileA dir/fileB dir/fileC" "tar -tf archive.tar.xz dir/file" $::srcdir/fixtures/tar
sync_after_int
set test "archive listing with --file"
assert_complete_dir "dir/fileA dir/fileB dir/fileC" "tar -t --file archive.tar.xz dir/file" $::srcdir/fixtures/tar
sync_after_int
# Some random options should work:
set test "test random tar's long option #1"
assert_complete "--blocking-factor= --block-number" "tar --block" $test
sync_after_int
set test "test random tar's long option #2"
assert_complete "--owner=" "tar --own" $test -nospace
sync_after_int
set test "test random tar's long option #3"
assert_complete "--posix" "tar -cf /dev/null --posi" $test
sync_after_int
# --owner
set users [exec bash -c "compgen -A user"]
set test "test --owner option"
assert_complete $users "tar --owner=" $test
sync_after_int
# --group
set groups [exec bash -c "compgen -A group"]
set test "test --group option"
assert_complete $groups "tar --group=" $test
sync_after_int
# use -b for this as -b is still not handled by tar's completion
set test "short opt -XXXb <TAB> (arg required)"
assert_no_complete "tar -cvvfb " $test
sync_after_int
# TODO: how to test that 'tar -cf<TAB>' completes to 'tar -cf '
}
teardown