Thu, 10 Jul 2008 19:51:53 -0400
Count files in the archive and report that in the recursion prompt.
I like this because, for example, if you see that all or most of the files
in the archive are recursive, you can go ahead and decide to recurse right
away.
This invoved making the grep tests a little smarter about handling white
space.
- name: basic .tar filenames: test-1.23.tar baseline: | tar -xf $1 - name: basic .tar.gz filenames: test-1.23.tar.gz baseline: | tar -zxf $1 - name: basic .tar.bz2 filenames: test-1.23.tar.bz2 baseline: | mkdir test-1.23 cd test-1.23 tar -jxf ../$1 - name: basic .zip filenames: test-1.23.zip baseline: | mkdir test-1.23 cd test-1.23 unzip -q ../$1 - name: basic .deb filenames: test-1.23_all.deb baseline: | mkdir test-1.23 cd test-1.23 ar p ../$1 data.tar.gz | tar -zx - name: basic .gem filenames: test-1.23.gem baseline: | mkdir test-1.23 cd test-1.23 tar -xOf ../$1 data.tar.gz | tar -zx - name: basic .7z filenames: test-1.23.7z baseline: | 7z x $1 - name: basic .lzma filenames: test-1.23.tar.lzma baseline: | lzcat $1 | tar -x - name: .deb metadata filenames: test-1.23_all.deb options: --metadata baseline: | mkdir test-1.23 cd test-1.23 ar p ../$1 control.tar.gz | tar -zx - name: .gem metadata filenames: test-1.23.gem options: -m baseline: | tar -xOf $1 metadata.gz | zcat > test-1.23.gem-metadata.txt cleanup: rm -f test-1.23.gem-metadata.txt posttest: | if [ "x`cat test-1.23.gem-metadata.txt`" != "xhi" ]; then exit 1; fi - name: recursion and permissions filenames: test-recursive-badperms.tar.bz2 options: -n -r baseline: | mkdir test-recursive-badperms cd test-recursive-badperms tar -jxf ../$1 mkdir test-badperms cd test-badperms tar -xf ../test-badperms.tar chmod 700 testdir posttest: | if [ "x`cat test-recursive-badperms/test-badperms/testdir/testfile`" != \ "xhey" ]; then exit 1; fi - name: decompressing gz directory: inside-dir filenames: ../test-text.gz baseline: | zcat $1 >test-text posttest: | if [ "x`cat test-text`" != "xhi" ]; then exit 1; fi - name: decompressing bz2 directory: inside-dir filenames: ../test-text.bz2 baseline: | bzcat $1 >test-text posttest: | if [ "x`cat test-text`" != "xhi" ]; then exit 1; fi - name: decompression with -r directory: inside-dir filenames: ../test-text.gz options: -n -r baseline: | zcat $1 >test-text - name: decompression with -fr directory: inside-dir filenames: ../test-text.gz options: -n -fr baseline: | zcat $1 >test-text - name: overwrite protection filenames: test-1.23.tar.bz2 baseline: | mkdir test-1.23.1 cd test-1.23.1 tar -jxf ../$1 prerun: | mkdir test-1.23 - name: overwrite option filenames: test-1.23.tar.bz2 options: -n -o baseline: | cd test-1.23 tar -jxf ../$1 prerun: | mkdir test-1.23 - name: flat option directory: inside-dir filenames: ../test-1.23.tar.bz2 options: -n -f baseline: | tar -jxf $1 - name: flat recursion and permissions directory: inside-dir filenames: ../test-recursive-badperms.tar.bz2 options: -n -fr baseline: | tar -jxf $1 tar -xf test-badperms.tar chmod 700 testdir posttest: | if [ "x`cat testdir/testfile`" != "xhey" ]; then exit 1; fi - name: no files error: true grep: "[Uu]sage" - name: bad file error: true filenames: nonexistent-file.tar - name: not an archive error: true filenames: tests.yml - name: bad options options: -n --nonexistent-option filenames: test-1.23.tar error: true - name: --version options: -n --version grep: ersion \d+\.\d+ filenames: test-1.23.tar baseline: | exit 0 - name: one good archive of many filenames: tests.yml test-1.23.tar nonexistent-file.tar error: true baseline: | tar -xf $2 - name: silence filenames: tests.yml options: -n -qq error: true antigrep: . - name: can't write to directory directory: inside-dir filenames: ../test-1.23.tar error: true grep: ERROR antigrep: Traceback prerun: | chmod 500 . - name: list contents of one file options: -n -l filenames: test-1.23.tar output: | test-1.23/ test-1.23/1/ test-1.23/1/2/ test-1.23/1/2/3 test-1.23/a/ test-1.23/a/b test-1.23/foobar - name: list contents of multiple files options: -n --table filenames: test-1.23_all.deb test-1.23.zip output: | test-1.23_all.deb: 1/ 1/2/ 1/2/3 a/ a/b foobar test-1.23.zip: 1/2/3 a/b foobar - name: list contents of compressed file options: -n -t filenames: test-text.gz output: test-text - name: default behavior with one directory (gz) options: -n filenames: test-onedir.tar.gz baseline: | mkdir test-onedir cd test-onedir tar -zxf ../$1 - name: one directory extracted inside another (gz) options: "" filenames: test-onedir.tar.gz grep: one directory input: i baseline: | mkdir test-onedir cd test-onedir tar -zxf ../$1 - name: one directory extracted with rename (gz) options: "" filenames: test-onedir.tar.gz input: r baseline: | tar -zxf $1 mv test test-onedir - name: one directory extracted here (gz) options: "" filenames: test-onedir.tar.gz input: h baseline: | tar -zxf $1 - name: default behavior with one directory (bz2) options: -n filenames: test-onedir.tar.gz baseline: | mkdir test-onedir cd test-onedir tar -zxf ../$1 - name: one directory extracted inside another (bz2) options: "" filenames: test-onedir.tar.gz input: i baseline: | mkdir test-onedir cd test-onedir tar -zxf ../$1 - name: one directory extracted with rename (bz2) options: "" filenames: test-onedir.tar.gz input: r baseline: | tar -zxf $1 mv test test-onedir - name: one directory extracted here (bz2) options: "" filenames: test-onedir.tar.gz input: h baseline: | tar -zxf $1 - name: default behavior with one file options: -n filenames: test-onefile.tar.gz baseline: | mkdir test-onefile cd test-onefile tar -zxf ../$1 - name: one file extracted inside a directory options: "" filenames: test-onefile.tar.gz input: i grep: one file baseline: | mkdir test-onefile cd test-onefile tar -zxf ../$1 - name: one file extracted with rename, with Expected text options: "" filenames: test-onefile.tar.gz input: r grep: "Expected: test-onefile" baseline: | tar -zxOf $1 >test-onefile - name: one file extracted here, with Actual text options: "" filenames: test-onefile.tar.gz input: h grep: " Actual: test-text" baseline: | tar -zxf $1 - name: bomb with preceding dot in the table filenames: test-dot-first-bomb.tar.gz options: "" antigrep: one entry baseline: | mkdir test-dot-first-bomb cd test-dot-first-bomb tar -zxf ../$1 - name: one directory preceded by dot in the table filenames: test-dot-first-onedir.tar.gz options: "" grep: "Actual: (./)?dir/" input: h baseline: | tar -zxf $1 - name: two one-item archives with different answers filenames: test-onedir.tar.gz test-onedir.tar.gz options: "" input: | h r baseline: | tar -zxf $1 mv test test-onedir tar -zxf $1 - name: interactive recursion (always) filenames: test-recursive-badperms.tar.bz2 test-recursive-badperms.tar.bz2 options: "" input: | i a i baseline: | extract() { mkdir test-recursive-badperms$2 cd test-recursive-badperms$2 tar -jxf ../$1 mkdir test-badperms cd test-badperms tar -xf ../test-badperms.tar chmod 700 testdir cd ../.. } extract $1 extract $1 .1 - name: interactive recursion (once) filenames: test-recursive-badperms.tar.bz2 test-recursive-badperms.tar.bz2 options: "" input: | i o i n baseline: | mkdir test-recursive-badperms cd test-recursive-badperms tar -jxf ../$1 mkdir test-badperms cd test-badperms tar -xf ../test-badperms.tar chmod 700 testdir cd ../.. mkdir test-recursive-badperms.1 cd test-recursive-badperms.1 tar -jxf ../$1 - name: interactive recursion (never) filenames: test-recursive-badperms.tar.bz2 test-recursive-badperms.tar.bz2 options: "" input: | i v i baseline: | extract() { mkdir test-recursive-badperms$2 cd test-recursive-badperms$2 tar -jxf ../$1 cd .. } extract $1 extract $1 .1 - name: recursion in subdirectories here filenames: test-deep-recursion.tar options: "" input: | h o grep: "contains 2 other archive file\(s\), out of 2 files" baseline: | tar -xf $1 cd subdir zcat test-text.gz > test-text cd subsubdir zcat test-text.gz > test-text - name: recursion in subdirectories with rename filenames: test-deep-recursion.tar options: "" input: | r o grep: "contains 2" baseline: | tar -xf $1 mv subdir test-deep-recursion cd test-deep-recursion zcat test-text.gz > test-text cd subsubdir zcat test-text.gz > test-text - name: recursion in subdirectories inside new dir filenames: test-deep-recursion.tar options: "" input: | i o grep: "contains 2" baseline: | mkdir test-deep-recursion cd test-deep-recursion tar -xf ../$1 cd subdir zcat test-text.gz > test-text cd subsubdir zcat test-text.gz > test-text - name: extracting file with bad extension filenames: test-1.23.bin prerun: cp ${1}test-1.23.tar.gz ${1}test-1.23.bin cleanup: rm -f ${1}test-1.23.bin baseline: | tar -zxf $1 - name: extracting file with misleading extension filenames: trickery.tar.gz prerun: cp ${1}test-1.23.zip ${1}trickery.tar.gz cleanup: rm -f ${1}trickery.tar.gz baseline: | mkdir trickery cd trickery unzip -q ../$1 - name: non-archive error filenames: /dev/null error: true grep: "not a known archive type" - name: no such file error filenames: nonexistent-file.tar.gz error: true grep: "[Nn]o such file" - name: no such file error with no extension filenames: nonexistent-file error: true grep: "[Nn]o such file" - name: try to extract a directory error filenames: test-directory prerun: mkdir test-directory error: true grep: "cannot extract a directory" - name: permission denied error filenames: unreadable-file.tar.gz prerun: | touch unreadable-file.tar.gz chmod 000 unreadable-file.tar.gz cleanup: rm -f unreadable-file.tar.gz error: true grep: "[Pp]ermission denied" - name: permission denied no-pipe file error filenames: unreadable-file.zip prerun: | touch unreadable-file.zip chmod 000 unreadable-file.zip cleanup: rm -f unreadable-file.zip error: true grep: "[Pp]ermission denied" - name: bad file error filenames: bogus-file.tar.gz prerun: | touch bogus-file.tar.gz cleanup: rm -f bogus-file.tar.gz error: true grep: "returned status code [^0]" - name: try to extract in unwritable directory directory: unwritable-dir filenames: ../test-1.23.tar.gz prerun: chmod 500 . error: true grep: "cannot extract here: [Pp]ermission denied" - name: recursive listing is a no-op options: -rl filenames: test-recursive-badperms.tar.bz2 grep: test-badperms.tar antigrep: testdir/ - name: graceful coping when many extraction directories are taken directory: busydir prerun: | mkdir test-1.23 for i in $(seq 1 10); do mkdir test-1.23.$i; done filenames: ../test-1.23.tar.gz grep: "WARNING: extracting" - name: graceful coping when many decompression targets are taken directory: busydir prerun: | touch test-text for i in $(seq 1 10); do touch test-text.$i; done filenames: ../test-text.gz grep: "WARNING: extracting" - name: output filenames with -v options: -v -n filenames: test-onedir.tar.gz test-text.gz output: | test-onedir.tar.gz: test-onedir/ test-onedir/test/ test-onedir/test/foobar test-onedir/test/quux test-text.gz: test-text - name: output filenames with -v and -f options: -nvf directory: busydir filenames: ../test-onedir.tar.gz output: | ../test-onedir.tar.gz: test/ test/foobar test/quux - name: list recursive archives options: "" filenames: test-deep-recursion.tar input: | r l n grep: "^test-deep-recursion/subsubdir/test-text\.gz$" - name: partly failed extraction options: -n filenames: test-tar-with-node.tar.gz baseline: | mkdir test-tar-with-node cd test-tar-with-node tar -zxf ../$1 grep: Cannot mknod - name: flat extraction of one-file archive directory: inside-dir options: -f filenames: ../test-onefile.tar.gz baseline: tar -zxf $1 antigrep: "contains"