aboutsummaryrefslogtreecommitdiff
path: root/tests/tar.test
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tar.test')
-rwxr-xr-x[-rw-r--r--]tests/tar.test391
1 files changed, 262 insertions, 129 deletions
diff --git a/tests/tar.test b/tests/tar.test
index 034a3bfb..e6487bd7 100644..100755
--- a/tests/tar.test
+++ b/tests/tar.test
@@ -4,148 +4,161 @@
#testing "name" "command" "result" "infile" "stdin"
-# For reproducibility: UTC and umask 0002
-
-OLDTZ="$TZ"
+# For reproducibility: TZ=UTC, umask 0002, override ownership and timestamp
export TZ=utc
-OLDUMASK=$(umask)
umask 0002
+TAR='tar c --owner root --group sys --mtime @1234567890'
# 255 bytes, longest VFS name
LONG=0123456789abcdef0123456789abcdef
LONG=$LONG$LONG$LONG$LONG$LONG$LONG$LONG$LONG
LONG=${LONG:1:255}
-# Reproducible tarballs: override ownership and timestamp.
-TAR='tar c --owner root --group root --mtime @1234567890'
+# We check both sha1sum (to ensure binary identical output) and list contents.
-# Different tars add variable trailing NUL padding (1024 bytes is just minimum)
-# so look at first N 512-byte frames when analyzing header content.
+# Check hash of first N 512 byte frames to ensure result is binary identical.
function SUM()
{
+ # Different tars add variable trailing NUL padding (1024 bytes is just
+ # minimum) so look at first N 512-byte frames when analyzing header content.
tee save.dat | head -c $(($1*512)) | sha1sum | sed "s/ .*//"
}
+# List tarball contents, converting variable tabs into one space
function LST()
{
tar tv "$@" | sed 's/[ \t][ \t]*/ /g'
}
+# Check that stored empty file is binary identical and decodes as expected.
touch file
-testing "create file" "$TAR file | SUM 3" \
- "fecaecba936e604bb115627a6ef4db7c7a3a8f81\n" "" ""
-
+testing "store file" "$TAR file | SUM 3" \
+ "2735f3a18d770dd0d7145d76108532f72bef9927\n" "" ""
testing "pass file" "$TAR file | LST" \
- "-rw-rw-r-- root/root 0 2009-02-13 23:31 file\n" "" ""
-
-# The kernel has two hardwired meaningful UIDs: 0 (root) and 65534 (nobody).
-# (Technically changeable via /proc/sys/*/overflowuid but nobody ever does)
-skipnot id nobody >/dev/null
-testing "pass user" "tar -c --owner nobody:65534 --group root --mtime @0 file | LST" \
- "-rw-rw-r-- nobody/root 0 1970-01-01 00:00 file\n" "" ""
-# (We assume that if we have the nobody user, we also have the group, in the
-# absence of a good portable way to test for the existence of a named group.)
-skipnot id nobody >/dev/null
-testing "pass group" "tar c --owner root --group nobody:65534 --mtime @0 file | LST" \
+ "-rw-rw-r-- root/sys 0 2009-02-13 23:31 file\n" "" ""
+
+# Two files from -T list
+touch file1 file2
+testing "-T newline" "$TAR -T input | LST" \
+ "-rw-rw-r-- root/sys 0 2009-02-13 23:31 file1\n-rw-rw-r-- root/sys 0 2009-02-13 23:31 file2\n" "file1\nfile2\n" ""
+testing "-T null" "$TAR --null -T input | LST" \
+ "-rw-rw-r-- root/sys 0 2009-02-13 23:31 file1\n-rw-rw-r-- root/sys 0 2009-02-13 23:31 file2\n" "file1\0file2\0" ""
+
+# User "root" is UID 0 and group "sys" is GID 3 (on Linux, BSD, and Mac),
+# inherited from Bell Labs Unix v7
+
+# Note: testing both "tar c" and "tar -c" here.
+testing "specify UID, fetch GID" "tar -c --owner nobody:65534 --group sys --mtime @0 file | LST" \
+ "-rw-rw-r-- nobody/sys 0 1970-01-01 00:00 file\n" "" ""
+testing "fetch UID, specify GID" "tar c --owner root --group nobody:65534 --mtime @0 file | LST" \
"-rw-rw-r-- root/nobody 0 1970-01-01 00:00 file\n" "" ""
-# Historically we output a "base 256" format that _we_ could decode but that
-# GNU tar choked on, so check the exact bytes with SUM, not a LST round trip.
+# Large values switch from ascii numbers to a binary format.
testing "huge values" "tar c --owner 9999999 --group 8888888 --mtime @0 file | SUM 3" \
"396b07fd2f80eeb312462e3bfb7dc1325dc6bcfb\n" "" ""
+testcmd "longname" "tf $FILES/tar/long_path.tar" \
+ "$(printf 'long file name%86cTRAILING' ' ' | tr ' ' _)\n" "" ""
+
touch -t 198701231234.56 file
testing "pass mtime" \
- "tar c --owner root --group root file | LST --full-time" \
- "-rw-rw-r-- root/root 0 1987-01-23 12:34:56 file\n" "" ""
+ "tar c --owner root --group sys file | LST --full-time" \
+ "-rw-rw-r-- root/sys 0 1987-01-23 12:34:56 file\n" "" ""
testing "adjust mode" \
- "tar c --owner root --group root --mode a+x file | LST --full-time" \
- "-rwxrwxr-x root/root 0 1987-01-23 12:34:56 file\n" "" ""
+ "tar c --owner root --group sys --mode a+x file | LST --full-time" \
+ "-rwxrwxr-x root/sys 0 1987-01-23 12:34:56 file\n" "" ""
mkdir dir
-testing "create dir" "$TAR dir | SUM 3" \
- "05739c423d7d4a7f12b3dbb7c94149acb2bb4f8d\n" "" ""
-
+testing "store dir" "$TAR dir | SUM 3" \
+ "85add1060cfe831ca0cdc945158efe6db485b81e\n" "" ""
testing "pass dir" "$TAR dir | LST" \
- "drwxrwxr-x root/root 0 2009-02-13 23:31 dir/\n" "" ""
+ "drwxrwxr-x root/sys 0 2009-02-13 23:31 dir/\n" "" ""
# note: does _not_ include dir entry in archive, just file
touch dir/file
-testing "create file in dir" "$TAR dir/file | SUM 3" \
- "2d7b96c7025987215f5a41f10eaa84311160afdb\n" "" ""
+testing "store file in dir" "$TAR dir/file | SUM 3" \
+ "d9e7fb3884430d29e7eed0dc04a2593dd260df14\n" "" ""
-# Tests recursion without worrying about content order
-testing "create dir and dir/file" "$TAR dir | SUM 3" \
- "0bcc8005a3e07eb63c9b735267aecc5b774795d7\n" "" ""
+# Test recursion with one file so filesystem sort order can't change result
+testing "store dir and dir/file" "$TAR dir | SUM 3" \
+ "a4e35f87e28c4565b60ba01dbe79e431914f8788\n" "" ""
testing "pass dir/file" "$TAR dir | LST" \
- "drwxrwxr-x root/root 0 2009-02-13 23:31 dir/\n-rw-rw-r-- root/root 0 2009-02-13 23:31 dir/file\n" "" ""
+ "drwxrwxr-x root/sys 0 2009-02-13 23:31 dir/\n-rw-rw-r-- root/sys 0 2009-02-13 23:31 dir/file\n" "" ""
echo boing > dir/that
testing "tar C" "$TAR -C dir that | SUM 3" \
- "f0deff71bf4858eb0c5f49d99d052f12f1831feb\n" "" ""
-
-# / and .. only stripped from name, not symlink target.
-ln -s ../name.././.. dir/link
-testing "create symlink" "$TAR dir/link | SUM 3" \
- "7324cafbd9aeec5036b6efc54d741f11528aeb10\n" "" ""
+ "d469d4bc06def2d8808400ba30025ca295d05e4f\n" "" ""
-# Also two explicit targets
ln dir/file dir/hardlink
-testing "create hardlink" "$TAR dir/file dir/hardlink | SUM 3" \
- "c5383651f8c03ec0fe15e8a9e28a4e8e5273990d\n" "" ""
-
-ln dir/link dir/hlink
-testing "create hardlink to symlink" "$TAR dir/link dir/hlink | SUM 3" \
- "3bc16f8fb6fc8b05f691da8caf989a70ee99284a\n" "" ""
+testing "store hardlink" "$TAR dir/file dir/hardlink | SUM 3" \
+ "519de8abd1b32debd495a0fc1d96082184abbdcc\n" "" ""
skipnot mkfifo dir/fifo 2>/dev/null
testing "create dir/fifo" "$TAR dir/fifo | SUM 3" \
- "bd1365db6e8ead4c813333f9666994c1899924d9\n" "" ""
+ "cad477bd0fc5173d0a43f4774f514035456960e6\n" "" ""
# test L and K records
# 4+96=100 (biggest short name), 4+97=101 (shortest long name)
touch dir/${LONG:1:96} dir/${LONG:1:97}
testing "create long fname" "$TAR dir/${LONG:1:97} dir/${LONG:1:96} | SUM 3" \
- "99348686fe9c9bf80f5740f1fc0c6f32f2021e3d\n" "" ""
+ "d70018505fa5df19ae73498cfc74d0281601e42e\n" "" ""
+
+# MacOS X has different symlink permissions, skip these tests there
+[ "$(uname)" == Darwin ] && SKIP=999
+
+ # / and .. only stripped from name, not symlink target.
+ ln -s ../name.././.. dir/link
+ testing "create symlink" "$TAR dir/link | SUM 3" \
+ "f841bf9d757c655c5d37f30be62acb7ae24f433c\n" "" ""
+
+ ln dir/link dir/hlink
+ testing "create hardlink to symlink" "$TAR dir/link dir/hlink | SUM 3" \
+ "de571a6dbf09e1485e513ad13a178b1729267452\n" "" ""
-ln -s dir/${LONG:1:96} dir/lshort
-ln -s dir/${LONG:1:97} dir/llong
-testing "create long symlnk" "$TAR dir/lshort dir/llong | SUM 3" \
- "8a5d652dc85f252a2e3b3f47d1ecd699e98a5f4b\n" "" ""
+ ln -s dir/${LONG:1:96} dir/lshort
+ ln -s dir/${LONG:1:97} dir/llong
+ testing "create long symlink" "$TAR dir/lshort dir/llong | SUM 3" \
+ "07eaf397634b5443dbf2d3ec38a4302150fcfe82\n" "" ""
-ln -s $LONG dir/${LONG:5}
-testing "create long->long" "$TAR dir/${LONG:5} | SUM 7" \
- "543116b8e690a116a559ab5b673f9b6d6601c925\n" "" ""
-# absolute and relative link names, broken and not
+ ln -s $LONG dir/${LONG:5}
+ testing "create long->long" "$TAR dir/${LONG:5} | SUM 7" \
+ "b9e24f53e27496c5125445230d201b4a36ff7398\n" "" ""
-ln -s file dir/linkok
-testing "create symlink" "$TAR dir/linkok | SUM 3" \
- "55652846506cf0a9d43b3ef03ccf9e98123befaf\n" "" ""
+ # absolute and relative link names, broken and not
+ ln -s file dir/linkok
+ testing "create symlink" "$TAR dir/linkok | SUM 3" \
+ "f5669cfd179ddcdd5ca9f8a1561a99e11e0a08b1\n" "" ""
+
+SKIP=0 # End of tests that don't match MacOS symlink permissions
+
+symlink_perms=lrwxrwxrwx
+[ "$(uname)" == "Darwin" ] && symlink_perms=lrwxrwxr-x
ln -s /dev/null dir/linknull
testing "pass absolute symlink" "$TAR dir/linknull | LST" \
- "lrwxrwxrwx root/root 0 2009-02-13 23:31 dir/linknull -> /dev/null\n" "" ""
+ "$symlink_perms root/sys 0 2009-02-13 23:31 dir/linknull -> /dev/null\n" "" ""
ln -s rel/broken dir/relbrok
testing "pass broken symlink" "$TAR dir/relbrok | LST" \
- "lrwxrwxrwx root/root 0 2009-02-13 23:31 dir/relbrok -> rel/broken\n" "" ""
+ "$symlink_perms root/sys 0 2009-02-13 23:31 dir/relbrok -> rel/broken\n" "" ""
ln -s /does/not/exist dir/linkabsbrok
testing "pass broken absolute symlink" "$TAR dir/linkabsbrok | LST" \
- "lrwxrwxrwx root/root 0 2009-02-13 23:31 dir/linkabsbrok -> /does/not/exist\n" \
+ "$symlink_perms root/sys 0 2009-02-13 23:31 dir/linkabsbrok -> /does/not/exist\n" \
"" ""
-# this expects devtmpfs values
+nulldev=1,3 # devtmpfs values
+[ "$(uname)" == "Darwin" ] && nulldev=3,2
testing "pass /dev/null" \
- "tar c --mtime @0 /dev/null 2>/dev/null | LST" \
- "crw-rw-rw- root/root 1,3 1970-01-01 00:00 dev/null\n" "" ""
+ "tar c --mtime @0 --group sys /dev/null 2>/dev/null | LST" \
+ "crw-rw-rw- root/sys $nulldev 1970-01-01 00:00 dev/null\n" "" ""
testing "--absolute-names" \
- "tar c --mtime @0 --absolute-names /dev/null 2>/dev/null | LST" \
- "crw-rw-rw- root/root 1,3 1970-01-01 00:00 /dev/null\n" "" ""
+ "tar c --mtime @0 --group sys --absolute-names /dev/null 2>/dev/null | LST" \
+ "crw-rw-rw- root/sys $nulldev 1970-01-01 00:00 /dev/null\n" "" ""
# compression types
testing "autodetect gzip" 'LST -f "$FILES"/tar/tar.tgz' \
@@ -163,22 +176,24 @@ testing "-I gzip t" 'LST -Igzip -f "$FILES"/tar/tar.tgz' \
"drwxr-x--- enh/eng 0 2017-05-13 01:05 dir/\n-rw-r----- enh/eng 12 2017-05-13 01:05 dir/file\n" \
"" ""
-skipnot mknod dir/char c 12 34 2>/dev/null
-testing "character special" "tar --mtime @0 -cf test.tar dir/char && rm -f dir/char && tar xf test.tar && ls -l dir/char" \
- "crw-rw---- 1 root root 12, 34 1970-01-01 00:00 dir/char\n" "" ""
+skipnot mknod -m 660 dir/char c 12 34 2>/dev/null && chgrp sys dir/char
+NOSPACE=1 testing "character special" "tar --mtime @0 -cf test.tar dir/char && rm -f dir/char && tar xf test.tar && ls -l --full-time dir/char" \
+ "crw-rw---- 1 root sys 12, 34 1970-01-01 00:00:00.000000000 +0000 dir/char\n"\
+ "" ""
-skipnot mknod dir/block b 23 45 2>/dev/null
-testing "block special" "tar --mtime @0 -cf test.tar dir/block && rm -f dir/block && tar xf test.tar && ls -l dir/block" \
- "brw-rw---- 1 root root 23, 45 1970-01-01 00:00 dir/block\n" "" ""
+skipnot mknod -m 660 dir/block b 23 45 2>/dev/null && chgrp sys dir/block
+NOSPACE=1 testing "block special" "tar --mtime @0 -cf test.tar dir/block && rm -f dir/block && tar xf test.tar && ls -l --full-time dir/block" \
+ "brw-rw---- 1 root sys 23, 45 1970-01-01 00:00:00.000000000 +0000 dir/block\n"\
+ "" ""
-skipnot chown nobody dir/file 2>/dev/null
+skipnot chown nobody:nogroup dir/file 2>/dev/null
testing "ownership" "$TAR dir/file | SUM 3" \
"2d7b96c7025987215f5a41f10eaa84311160afdb\n" "" ""
mkdir -p dd/sub/blah &&
tar cf test.tar dd/sub/blah &&
rm -rf dd/sub &&
-ln -s ../.. dd/sub || SKIPNEXT=1
+skipnot ln -s ../.. dd/sub
toyonly testing "symlink out of cwd" \
"tar xf test.tar 2> /dev/null || echo yes ; [ ! -e dd/sub/blah ] && echo yes" \
"yes\nyes\n" "" ""
@@ -210,48 +225,59 @@ toyonly testing "cat tbz | extract dir/file (autodetect)" \
"dir/\ndir/file\ndrwxr-x--- 1494637555 dd/dir\n-rw-r----- 1494637555 dd/dir/file\n" \
"" ""
-yes | head -n $((1<<18)) > bang
-{ dd bs=$((1<<16)) count=1 status=none; dd bs=8192 seek=14 count=1 status=none; dd bs=4096 seek=64 count=5 status=none; } < bang > fweep
-testing "sparse without overflow" "$TAR --sparse fweep | SUM 3" \
- "e1560110293247934493626d564c8f03c357cec5\n" "" ""
-rm bang fweep
-
-for i in 1 3 5 7 9 14 27 36 128 256 300 304
-do
- dd if=/dev/zero of=fweep bs=65536 seek=$i count=1 2>/dev/null
-done
-
-testing "sparse single overflow" "$TAR --sparse fweep | SUM 6" \
- "063fc6519ea2607763bc591cc90dd15ac2b43eb8\n" "" ""
-
-rm fweep
-for i in $(seq 8 3 200)
-do
- dd if=/dev/zero of=fweep bs=65536 seek=$i count=1 2>/dev/null
- dd if=/dev/zero of=fweep2 bs=65536 seek=$i count=1 2>/dev/null
-done
-truncate -s 20m fweep2
-
-testing "sparse double overflow" "$TAR --sparse fweep | SUM 7" \
- "f1fe57f8313a9d682ec9013a80f3798910b6ff51\n" "" ""
-
-tar c --sparse fweep > fweep.tar
-rm fweep
-testing "sparse extract" "tar xf fweep.tar && $TAR --sparse fweep | SUM 4" \
- "38dc57b8b95632a287db843c214b5c96d1cfe415\n" "" ""
-testing "sparse tvf" "tar tvf fweep.tar | grep -wq 13172736 && echo right size"\
- "right size\n" "" ""
-rm fweep fweep.tar
-
-tar c --sparse fweep2 > fweep2.tar
-rm fweep2
-testing "sparse extract hole at end" \
- "tar xf fweep2.tar && $TAR --sparse fweep2 | SUM 4" \
- "791060574c569e5c059e2b90c1961a3575898f97\n" "" ""
-rm fweep2 fweep2.tar
-
-testcmd "longname" "tf $FILES/tar/long_path.tar" \
- "$(printf 'long file name%86cTRAILING' ' ' | tr ' ' _)\n" "" ""
+mkdir path && ln -s "$(which gzip)" "$(which tar)" path/ && [ -x path/gzip ] ||
+ ((++SKIP))
+toyonly testing "autodetect falls back to gzip -d when no zcat" \
+ "PATH=path; tar tf $FILES/tar/tar.tgz" "dir/\ndir/file\n" "" ""
+rm -rf path
+
+# Tests that don't produce the same results on MacOS X as Linux
+[ "$(uname)" == Darwin ] && SKIP=999
+
+ yes | head -n $((1<<18)) > bang
+ {
+ dd bs=$((1<<16)) count=1 status=none
+ dd bs=8192 seek=14 count=1 status=none
+ dd bs=4096 seek=64 count=5 status=none
+ } < bang > fweep
+ testing "sparse without overflow" "$TAR --sparse fweep | SUM 3" \
+ "50dc56c3c7eed163f0f37c0cfc2562852a612ad0\n" "" ""
+ rm bang fweep
+
+ for i in 1 3 5 7 9 14 27 36 128 256 300 304
+ do
+ dd if=/dev/zero of=fweep bs=65536 seek=$i count=1 2>/dev/null
+ done
+ testing "sparse single overflow" "$TAR --sparse fweep | SUM 6" \
+ "81d59c3a7470201f92d60e63a43318ddde893f6d\n" "" ""
+ rm fweep
+
+ for i in $(seq 8 3 200)
+ do
+ dd if=/dev/zero of=fweep bs=65536 seek=$i count=1 2>/dev/null
+ dd if=/dev/zero of=fweep2 bs=65536 seek=$i count=1 2>/dev/null
+ done
+ truncate -s 20m fweep2
+ testing "sparse double overflow" "$TAR --sparse fweep | SUM 7" \
+ "024aacd955e45f89bafedb3f37c8d39b4d556471\n" "" ""
+
+ tar c --sparse fweep > fweep.tar
+ rm fweep
+ testing "sparse extract" "tar xf fweep.tar && $TAR --sparse fweep | SUM 4" \
+ "b949d3a3b4c6457c873f1ea9918fd9029c5ed4b3\n" "" ""
+ testing "sparse tvf" \
+ "tar tvf fweep.tar | grep -wq 13172736 && echo right size" "right size\n" \
+ "" ""
+ rm fweep fweep.tar
+
+ tar c --sparse fweep2 > fweep2.tar
+ rm fweep2
+ testing "sparse extract hole at end" \
+ "tar xf fweep2.tar && $TAR --sparse fweep2 | SUM 4" \
+ "807664bcad0e827793318ff742991d6f006b2127\n" "" ""
+ rm fweep2 fweep2.tar
+
+SKIP=0 # End of tests that don't work on MacOS X
mkdir -p links
touch links/orig
@@ -278,14 +304,125 @@ rm -rf one test.tar
mkdir ..dotsdir
testing "create ..dotsdir" "$TAR ..dotsdir | SUM 3" \
- "de99091a91c74ef6b90093e9165b413670730572\n" "" ""
+ "62ff23c9b427020331992b9bc71f082099c1411f\n" "" ""
testing "pass ..dotsdir" "$TAR ..dotsdir | LST" \
- "drwxrwxr-x root/root 0 2009-02-13 23:31 ..dotsdir/\n" "" ""
+ "drwxrwxr-x root/sys 0 2009-02-13 23:31 ..dotsdir/\n" "" ""
rmdir ..dotsdir
+mkdir -p one/two/three/four/five
+touch one/two/three/four/five/six
+testing "--strip" "$TAR one | tar t --strip=2 --show-transformed | grep six" \
+ "three/four/five/six\n" "" ""
+
+# toybox tar --xform depends on toybox sed
+[ -z "$TEST_HOST" ] && ! sed --tarxform '' </dev/null 2>/dev/null && SKIP=99
+
+mkdir uno
+ln -s tres uno/dos
+touch uno/tres
+ln uno/tres uno/quatro
+LL() { LST --show-transformed-names $XX | sed 's/^.* 23:31 //'; }
+TT() { $TAR --no-recursion uno uno/{dos,tres,quatro} "$@" | LL; }
+testing 'xform S' \
+ "TT --xform 's/uno/one/S;s/dos/two/S;s/tres/three/S;s/quatro/four/S'" \
+ "one/\none/two -> tres\none/three\none/four link to one/three\n" "" ""
+
+testing 'xform flags=rh starts with all disabled' \
+ "TT --xform 's/uno/one/;flags=rh;s/dos/two/;s/tres/three/;s/quatro/four/'" \
+ "one/\none/two -> tres\none/three\none/four link to one/three\n" "" ""
+
+testing 'xform flags=rHhsS toggles' \
+ "TT --xform 's/uno/one/;flags=rHhsS;s/dos/two/;s/tres/three/;s/quatro/four/'"\
+ "one/\none/two -> tres\none/three\none/four link to one/three\n" "" ""
+
+testing 'xform flags= is not a delta from previous' \
+ "TT --xform 'flags=s;flags=rh;s/uno/one/;s/dos/two/;s/tres/three/;s/quatro/four/'" \
+ "one/\none/two -> tres\none/three\none/four link to one/three\n" "" ""
+
+testing 'xform H' \
+ "TT --xform 'flags=rsH;s/uno/one/;s/dos/two/;s/tres/three/;s/quatro/four/'" \
+ "one/\none/two -> three\none/three\none/four link to uno/tres\n" "" ""
+
+testing 'xform R' \
+ "TT --xform 'flags=rshR;s/uno/one/;s/dos/two/;s/tres/three/;s/quatro/four/'" \
+ "uno/\nuno/dos -> three\nuno/tres\nuno/quatro link to one/three\n" "" ""
+
+testing "xform path" "$TAR one --xform=s@three/four/@zero@ | tar t | grep six" \
+ "one/two/zerofive/six\n" "" ""
+
+testing "xform trailing slash special case" \
+ "$TAR --xform 's#^.+/##x' one/two/three/four/five | tar t" 'five/\nsix\n' '' ''
+
+# The quoting works because default IFS splits on whitepace not ;
+testing "xform extract all" \
+ "XX='--xform s/uno/one/;s/dos/two/;s/tres/three/;s/quatro/four/' TT" \
+ 'one/\none/two -> three\none/three\none/four link to one/three\n' '' ''
+
+testing 'xform extract S' \
+ "XX='--xform s/uno/one/S;s/dos/two/S;s/tres/three/S;s/quatro/four/S' TT" \
+ "one/\none/two -> tres\none/three\none/four link to one/three\n" "" ""
+
+testing 'xform extract H' \
+ "XX='--xform flags=rs;s/uno/one/;s/dos/two/;s/tres/three/;s/quatro/four/' TT"\
+ "one/\none/two -> three\none/three\none/four link to uno/tres\n" "" ""
+
+testing 'xform extract R' \
+ "XX='--xform flags=sh;s/uno/one/;s/dos/two/;s/tres/three/;s/quatro/four/' TT"\
+ "uno/\nuno/dos -> three\nuno/tres\nuno/quatro link to one/three\n" "" ""
+
+rm -rf uno
+SKIP=0
+rm -rf one
+
+testing '-P' "$TAR -P --no-recursion -C / /// .. | SUM 3" \
+ "a3e94211582da121845d823374d8f41ead62d7bd\n" "" ""
+
+testing 'without -P' "$TAR --no-recursion -C / /// .. 2>/dev/null | SUM 3" \
+ "077d03243e247b074806904885e6da272fd5857a\n" "" ""
+
+# Wildcards: --exclude, include (create/extract * cmdline/recursive)
+# --anchored, --wildcards, --wildcards-match-slash
+# --no-* versions of each. Span coverage, switching on/off...
+
+#pattern a.c
+# abcd dabc a/c da/c
+# top/*
+
+mkdir sub && cd sub && mkdir -p a da top/a top/da &&
+touch abcd dabc a/c da/c top/abcd top/dabc top/a/c top/da/c &&
+$TAR -f ../sub.tar abcd dabc a da top && cd .. || exit 1
+
+# TODO I have not made wildcard state changes positional.
+
+testing 'wildcards do not affect creation cmdline args' \
+ '$TAR -C sub --wildcards a.cd abcd dabc a da top 2>/dev/null | cmp - sub.tar' \
+ '' '' ''
+
+testing 'creation --exclude --no-wildcards'\
+ '$TAR -C sub --no-wildcards --exclude=d?bc abcd dabc | LL' \
+ 'abcd\ndabc\n' '' ''
+
+
+testing 'creation --wildcards --exclude'\
+ '$TAR -C sub --wildcards --exclude=d?bc abcd dabc | LL' \
+ 'abcd\n' '' ''
+
+# TODO: do we need to set DIRTREE_BREADTH at top level? Come up with test if so.
+mkdir sub2
+touch sub2/{ephebe,klatch,djelibeybi}
+testing 'tsort' '$TAR -c sub2 --sort=name | tar t' \
+ 'sub2/\nsub2/djelibeybi\nsub2/ephebe\nsub2/klatch\n' '' ''
+
+touch file
+testing './file bug' 'tar c ./file > tar.tar && tar t ./file < tar.tar' \
+ './file\n' '' ''
+
if false
then
+# Sequencing issues that leak implementation details out the interface
+testing "what order are --xform, --strip, and --exclude processed in?"
+testing "--xform vs ../ removal and adding / to dirs"
chmod 700 dir
tar cpf tar.tgz dir/file
@@ -322,8 +459,4 @@ tar cpf tar.tgz dir/file
fi
-TZ="$OLDTZ"
-umask $OLDUMASK
-unset LONG TAR SUM OLDUMASK OLDTZ
-unset -f LST
-rm save.dat
+rm -f save.dat