From 45844b22e688a57fac1af39aaf7d6fe62d3a111c Mon Sep 17 00:00:00 2001
From: Steven Knight <knight@baldmt.com>
Date: Wed, 1 Dec 2004 03:27:20 +0000
Subject: More command-line customizability:   and .

---
 doc/man/scons.1              |  19 +++++
 src/CHANGES.txt              |   4 +-
 src/engine/SCons/Tool/tar.py |   5 +-
 src/engine/SCons/Tool/zip.py |   2 +-
 test/TAR.py                  | 164 ----------------------------------------
 test/TAR/TAR.py              | 164 ++++++++++++++++++++++++++++++++++++++++
 test/TAR/TARCOM.py           |  68 +++++++++++++++++
 test/TAR/TARCOMSTR.py        |  67 +++++++++++++++++
 test/TAR/TARFLAGS.py         | 137 ++++++++++++++++++++++++++++++++++
 test/TARFLAGS.py             | 137 ----------------------------------
 test/ZIP.py                  | 173 -------------------------------------------
 test/ZIP/ZIP.py              | 173 +++++++++++++++++++++++++++++++++++++++++++
 test/ZIP/ZIPCOM.py           |  68 +++++++++++++++++
 test/ZIP/ZIPCOMSTR.py        |  67 +++++++++++++++++
 14 files changed, 770 insertions(+), 478 deletions(-)
 delete mode 100644 test/TAR.py
 create mode 100644 test/TAR/TAR.py
 create mode 100644 test/TAR/TARCOM.py
 create mode 100644 test/TAR/TARCOMSTR.py
 create mode 100644 test/TAR/TARFLAGS.py
 delete mode 100644 test/TARFLAGS.py
 delete mode 100644 test/ZIP.py
 create mode 100644 test/ZIP/ZIP.py
 create mode 100644 test/ZIP/ZIPCOM.py
 create mode 100644 test/ZIP/ZIPCOMSTR.py

diff --git a/doc/man/scons.1 b/doc/man/scons.1
index 870377e..f620a9f 100644
--- a/doc/man/scons.1
+++ b/doc/man/scons.1
@@ -6733,6 +6733,15 @@ The tar archiver.
 .IP TARCOM
 The command line used to call the tar archiver.
 
+.IP TARCOMSTR
+The string displayed when archiving files
+using the tar archiver.
+If this is not set, then $TARCOM (the command line) is displayed.
+
+.ES
+env = Environment(TARCOMSTR = "Archiving $TARGET")
+.EE
+
 .IP TARFLAGS
 General options passed to the tar archiver.
 
@@ -6807,6 +6816,16 @@ The command line used to call the zip utility,
 or the internal Python function used to create a
 zip archive.
 
+.IP ZIPCOMSTR
+The string displayed when archiving files
+using the zip utility.
+If this is not set, then $ZIPCOM
+(the command line or internal Python function) is displayed.
+
+.ES
+env = Environment(ZIPCOMSTR = "Zipping $TARGET")
+.EE
+
 .IP ZIPCOMPRESSION
 The
 .I compression
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 48483d1..b163ec6 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -136,8 +136,8 @@ RELEASE 0.97 - XXX
     $F77COMSTR, $F90COMSTR, $F95COMSTR, $FORTRANCOMSTR, $JARCOMSTR,
     $JAVACCOMSTR, $JAVAHCOMSTR, $LEXCOMSTR, $LINKCOMSTR, $RCSCOMSTR,
     $RMICCOMSTR, $SCCSCOMSTR, $SHCCCOMSTR, $SHCXXCOMSTR, $SHF77COMSTR,
-    $SHF90COMSTR, $SHF95COMSTR, $SHFORTRANCOMSTR, $SHLINKCOMSTR and
-    $YACCCOMSTR.
+    $SHF90COMSTR, $SHF95COMSTR, $SHFORTRANCOMSTR, $SHLINKCOMSTR,
+    $TARCOMSTR, $YACCCOMSTR and $ZIPCOMSTR.
 
   - Add an optional "map" keyword argument to ListOption() that takes a
     dictionary to map user-specified values to legal values from the list
diff --git a/src/engine/SCons/Tool/tar.py b/src/engine/SCons/Tool/tar.py
index 83fb7d3..75d2038 100644
--- a/src/engine/SCons/Tool/tar.py
+++ b/src/engine/SCons/Tool/tar.py
@@ -33,13 +33,16 @@ selection method.
 
 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
+import SCons.Action
 import SCons.Builder
 import SCons.Node.FS
 import SCons.Util
 
 tars = ['tar', 'gtar']
 
-TarBuilder = SCons.Builder.Builder(action = '$TARCOM',
+TarAction = SCons.Action.Action('$TARCOM', '$TARCOMSTR')
+
+TarBuilder = SCons.Builder.Builder(action = TarAction,
                                    source_factory = SCons.Node.FS.default_fs.Entry,
 				   suffix = '$TARSUFFIX',
                                    multi = 1)
diff --git a/src/engine/SCons/Tool/zip.py b/src/engine/SCons/Tool/zip.py
index c81a4f3..b32f024 100644
--- a/src/engine/SCons/Tool/zip.py
+++ b/src/engine/SCons/Tool/zip.py
@@ -68,7 +68,7 @@ else:
 
 zipAction = SCons.Action.Action(zip, varlist=['ZIPCOMPRESSION'])
 
-ZipBuilder = SCons.Builder.Builder(action = '$ZIPCOM',
+ZipBuilder = SCons.Builder.Builder(action = SCons.Action.Action('$ZIPCOM', '$ZIPCOMSTR'),
                                    source_factory = SCons.Node.FS.default_fs.Entry,
                                    suffix = '$ZIPSUFFIX',
                                    multi = 1)
diff --git a/test/TAR.py b/test/TAR.py
deleted file mode 100644
index abd86ba..0000000
--- a/test/TAR.py
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env python
-#
-# __COPYRIGHT__
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
-
-import os
-import os.path
-import string
-import sys
-import TestSCons
-
-python = TestSCons.python
-
-test = TestSCons.TestSCons()
-
-test.subdir('sub1')
-
-test.write('mytar.py', r"""
-import getopt
-import os
-import os.path
-import sys
-opts, args = getopt.getopt(sys.argv[1:], 'cf:')
-for opt, arg in opts:
-    if opt == '-f': out = arg
-def process(outfile, name):
-    if os.path.isdir(name):
-        list = os.listdir(name)
-        list.sort()
-        for entry in list:
-	    process(outfile, os.path.join(name, entry))
-    else:
-        outfile.write(open(name, 'rb').read())
-outfile = open(out, 'wb')
-for infile in args:
-    process(outfile, infile)
-outfile.close()
-sys.exit(0)
-""")
-
-test.write('SConstruct', """
-env = Environment(tools = ['tar'], TAR = r'%s mytar.py')
-env.Tar(target = 'aaa.tar', source = ['file1', 'file2'])
-env.Tar(target = 'aaa.tar', source = 'file3')
-env.Tar(target = 'bbb', source = 'sub1')
-env.Tar(target = 'bbb', source = 'file4')
-""" % python)
-
-test.write('file1', "file1\n")
-test.write('file2', "file2\n")
-test.write('file3', "file3\n")
-test.write('file4', "file4\n")
-
-test.write(['sub1', 'file5'], "sub1/file5\n")
-test.write(['sub1', 'file6'], "sub1/file6\n")
-
-test.run(arguments = 'aaa.tar', stderr = None)
-
-test.fail_test(test.read('aaa.tar') != "file1\nfile2\nfile3\n")
-
-test.run(arguments = 'bbb.tar', stderr = None)
-
-test.fail_test(test.read('bbb.tar') != "sub1/file5\nsub1/file6\nfile4\n")
-
-
-tar = test.detect('TAR', 'tar')
-
-if tar:
-
-    test.write("wrapper.py", """import os
-import string
-import sys
-open('%s', 'wb').write("wrapper.py\\n")
-os.system(string.join(sys.argv[1:], " "))
-""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\'))
-
-    test.write('SConstruct', """
-foo = Environment()
-tar = foo.Dictionary('TAR')
-bar = Environment(TAR = r'%s wrapper.py ' + tar)
-f3 = Environment(TARFLAGS = '-c -z', TARSUFFIX = '.tar.gz')
-f4 = Environment(TARFLAGS = '-c -z', TARSUFFIX = '.tgz')
-f5 = Environment(TARFLAGS = '-c -z')
-foo.Tar(target = 'foo.tar', source = ['file10', 'file11'])
-foo.Tar(target = 'foo.tar', source = 'file12')
-bar.Tar(target = 'bar.tar', source = ['file13', 'file14'])
-bar.Tar(target = 'bar.tar', source = 'file15')
-f3.Tar(target = 'f3', source = 'file16')
-f3.Tar(target = 'f3', source = ['file17', 'file18'])
-f4.Tar(target = 'f4', source = 'file19')
-f4.Tar(target = 'f4', source = ['file20', 'file21'])
-f5.Tar(target = 'f5.tgz', source = 'file22')
-f5.Tar(target = 'f5.tgz', source = ['file23', 'file24'])
-""" % python)
-
-    for f in ['file10', 'file11', 'file12',
-              'file13', 'file14', 'file15',
-              'file16', 'file17', 'file18',
-              'file19', 'file20', 'file21',
-              'file22', 'file23', 'file24']:
-        test.write(f, f + "\n")
-
-    test.run(arguments = 'foo.tar', stderr = None)
-
-    test.fail_test(os.path.exists(test.workpath('wrapper.out')))
-
-    test.fail_test(not os.path.exists(test.workpath('foo.tar')))
-
-    test.run(arguments = 'bar.tar', stderr = None)
-
-    test.fail_test(not os.path.exists(test.workpath('wrapper.out')))
-
-    test.fail_test(not os.path.exists(test.workpath('bar.tar')))
-
-    test.run(arguments = '.', stderr = None)
-
-    test.fail_test(os.path.exists(test.workpath('f3.tar')))
-    test.fail_test(not os.path.exists(test.workpath('f3.tar.gz')))
-
-    test.fail_test(os.path.exists(test.workpath('f4.tar')))
-    test.fail_test(os.path.exists(test.workpath('f4.tar.gz')))
-    test.fail_test(not os.path.exists(test.workpath('f4.tgz')))
-
-    test.fail_test(os.path.exists(test.workpath('f5.tar')))
-    test.fail_test(os.path.exists(test.workpath('f5.tar.gz')))
-    test.fail_test(not os.path.exists(test.workpath('f5.tgz')))
-
-    test.run(program = tar, arguments = "-t -f foo.tar", stderr = None)
-    test.fail_test(test.stdout() != "file10\nfile11\nfile12\n")
-
-    test.run(program = tar, arguments = "-t -f bar.tar", stderr = None)
-    test.fail_test(test.stdout() != "file13\nfile14\nfile15\n")
-
-    test.run(program = tar, arguments = "-t -z -f f3.tar.gz", stderr = None)
-    test.fail_test(test.stdout() != "file16\nfile17\nfile18\n")
-
-    test.run(program = tar, arguments = "-t -z -f f4.tgz", stderr = None)
-    test.fail_test(test.stdout() != "file19\nfile20\nfile21\n")
-
-    test.run(program = tar, arguments = "-t -z -f f5.tgz", stderr = None)
-    test.fail_test(test.stdout() != "file22\nfile23\nfile24\n")
-
-test.pass_test()
diff --git a/test/TAR/TAR.py b/test/TAR/TAR.py
new file mode 100644
index 0000000..abd86ba
--- /dev/null
+++ b/test/TAR/TAR.py
@@ -0,0 +1,164 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+import string
+import sys
+import TestSCons
+
+python = TestSCons.python
+
+test = TestSCons.TestSCons()
+
+test.subdir('sub1')
+
+test.write('mytar.py', r"""
+import getopt
+import os
+import os.path
+import sys
+opts, args = getopt.getopt(sys.argv[1:], 'cf:')
+for opt, arg in opts:
+    if opt == '-f': out = arg
+def process(outfile, name):
+    if os.path.isdir(name):
+        list = os.listdir(name)
+        list.sort()
+        for entry in list:
+	    process(outfile, os.path.join(name, entry))
+    else:
+        outfile.write(open(name, 'rb').read())
+outfile = open(out, 'wb')
+for infile in args:
+    process(outfile, infile)
+outfile.close()
+sys.exit(0)
+""")
+
+test.write('SConstruct', """
+env = Environment(tools = ['tar'], TAR = r'%s mytar.py')
+env.Tar(target = 'aaa.tar', source = ['file1', 'file2'])
+env.Tar(target = 'aaa.tar', source = 'file3')
+env.Tar(target = 'bbb', source = 'sub1')
+env.Tar(target = 'bbb', source = 'file4')
+""" % python)
+
+test.write('file1', "file1\n")
+test.write('file2', "file2\n")
+test.write('file3', "file3\n")
+test.write('file4', "file4\n")
+
+test.write(['sub1', 'file5'], "sub1/file5\n")
+test.write(['sub1', 'file6'], "sub1/file6\n")
+
+test.run(arguments = 'aaa.tar', stderr = None)
+
+test.fail_test(test.read('aaa.tar') != "file1\nfile2\nfile3\n")
+
+test.run(arguments = 'bbb.tar', stderr = None)
+
+test.fail_test(test.read('bbb.tar') != "sub1/file5\nsub1/file6\nfile4\n")
+
+
+tar = test.detect('TAR', 'tar')
+
+if tar:
+
+    test.write("wrapper.py", """import os
+import string
+import sys
+open('%s', 'wb').write("wrapper.py\\n")
+os.system(string.join(sys.argv[1:], " "))
+""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\'))
+
+    test.write('SConstruct', """
+foo = Environment()
+tar = foo.Dictionary('TAR')
+bar = Environment(TAR = r'%s wrapper.py ' + tar)
+f3 = Environment(TARFLAGS = '-c -z', TARSUFFIX = '.tar.gz')
+f4 = Environment(TARFLAGS = '-c -z', TARSUFFIX = '.tgz')
+f5 = Environment(TARFLAGS = '-c -z')
+foo.Tar(target = 'foo.tar', source = ['file10', 'file11'])
+foo.Tar(target = 'foo.tar', source = 'file12')
+bar.Tar(target = 'bar.tar', source = ['file13', 'file14'])
+bar.Tar(target = 'bar.tar', source = 'file15')
+f3.Tar(target = 'f3', source = 'file16')
+f3.Tar(target = 'f3', source = ['file17', 'file18'])
+f4.Tar(target = 'f4', source = 'file19')
+f4.Tar(target = 'f4', source = ['file20', 'file21'])
+f5.Tar(target = 'f5.tgz', source = 'file22')
+f5.Tar(target = 'f5.tgz', source = ['file23', 'file24'])
+""" % python)
+
+    for f in ['file10', 'file11', 'file12',
+              'file13', 'file14', 'file15',
+              'file16', 'file17', 'file18',
+              'file19', 'file20', 'file21',
+              'file22', 'file23', 'file24']:
+        test.write(f, f + "\n")
+
+    test.run(arguments = 'foo.tar', stderr = None)
+
+    test.fail_test(os.path.exists(test.workpath('wrapper.out')))
+
+    test.fail_test(not os.path.exists(test.workpath('foo.tar')))
+
+    test.run(arguments = 'bar.tar', stderr = None)
+
+    test.fail_test(not os.path.exists(test.workpath('wrapper.out')))
+
+    test.fail_test(not os.path.exists(test.workpath('bar.tar')))
+
+    test.run(arguments = '.', stderr = None)
+
+    test.fail_test(os.path.exists(test.workpath('f3.tar')))
+    test.fail_test(not os.path.exists(test.workpath('f3.tar.gz')))
+
+    test.fail_test(os.path.exists(test.workpath('f4.tar')))
+    test.fail_test(os.path.exists(test.workpath('f4.tar.gz')))
+    test.fail_test(not os.path.exists(test.workpath('f4.tgz')))
+
+    test.fail_test(os.path.exists(test.workpath('f5.tar')))
+    test.fail_test(os.path.exists(test.workpath('f5.tar.gz')))
+    test.fail_test(not os.path.exists(test.workpath('f5.tgz')))
+
+    test.run(program = tar, arguments = "-t -f foo.tar", stderr = None)
+    test.fail_test(test.stdout() != "file10\nfile11\nfile12\n")
+
+    test.run(program = tar, arguments = "-t -f bar.tar", stderr = None)
+    test.fail_test(test.stdout() != "file13\nfile14\nfile15\n")
+
+    test.run(program = tar, arguments = "-t -z -f f3.tar.gz", stderr = None)
+    test.fail_test(test.stdout() != "file16\nfile17\nfile18\n")
+
+    test.run(program = tar, arguments = "-t -z -f f4.tgz", stderr = None)
+    test.fail_test(test.stdout() != "file19\nfile20\nfile21\n")
+
+    test.run(program = tar, arguments = "-t -z -f f5.tgz", stderr = None)
+    test.fail_test(test.stdout() != "file22\nfile23\nfile24\n")
+
+test.pass_test()
diff --git a/test/TAR/TARCOM.py b/test/TAR/TARCOM.py
new file mode 100644
index 0000000..f6e36e7
--- /dev/null
+++ b/test/TAR/TARCOM.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test the ability to configure the $TARCOM construction variable.
+"""
+
+import os
+import string
+import sys
+import TestSCons
+
+python = TestSCons.python
+
+test = TestSCons.TestSCons()
+
+
+
+test.write('mytar.py', r"""
+import sys
+outfile = open(sys.argv[1], 'wb')
+infile = open(sys.argv[2], 'rb')
+for l in filter(lambda l: l != '/*tar*/\n', infile.readlines()):
+    outfile.write(l)
+sys.exit(0)
+""")
+
+test.write('SConstruct', """
+env = Environment(TOOLS = ['tar'],
+                  TARCOM = r'%(python)s mytar.py $TARGET $SOURCE')
+env.Tar('test1.tar', 'test1.in')
+""" % locals())
+
+test.write('test1.in', """\
+test1.in
+/*tar*/
+""")
+
+test.run()
+
+test.must_match('test1.tar', "test1.in\n")
+
+
+
+test.pass_test()
diff --git a/test/TAR/TARCOMSTR.py b/test/TAR/TARCOMSTR.py
new file mode 100644
index 0000000..2bd3813
--- /dev/null
+++ b/test/TAR/TARCOMSTR.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test that the $TARCOMSTR construction variable allows you to customize
+the displayed string when tar is called.
+"""
+
+import TestSCons
+
+python = TestSCons.python
+
+test = TestSCons.TestSCons()
+
+
+
+test.write('mytar.py', """
+import sys
+outfile = open(sys.argv[1], 'wb')
+for f in sys.argv[2:]:
+    infile = open(f, 'rb')
+    for l in filter(lambda l: l != '/*tar*/\\n', infile.readlines()):
+        outfile.write(l)
+sys.exit(0)
+""")
+
+test.write('SConstruct', """
+env = Environment(tools=['tar'],
+                  TARCOM = r'%s mytar.py $TARGET $SOURCES',
+                  TARCOMSTR = 'Taring $TARGET from $SOURCE')
+env.Tar('aaa.tar', 'aaa.in')
+""" % python)
+
+test.write('aaa.in', "aaa.in\n/*tar*/\n")
+
+test.run(stdout = test.wrap_stdout("""\
+Taring aaa.tar from aaa.in
+"""))
+
+test.must_match('aaa.tar', "aaa.in\n")
+
+
+
+test.pass_test()
diff --git a/test/TAR/TARFLAGS.py b/test/TAR/TARFLAGS.py
new file mode 100644
index 0000000..5864241
--- /dev/null
+++ b/test/TAR/TARFLAGS.py
@@ -0,0 +1,137 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+import string
+import sys
+import TestSCons
+
+python = TestSCons.python
+
+test = TestSCons.TestSCons()
+
+test.subdir('sub1')
+
+test.write('mytar.py', """
+import getopt
+import os
+import os.path
+import string
+import sys
+cmd_opts, args = getopt.getopt(sys.argv[1:], 'cf:x', [])
+opt_string = ''
+for opt, arg in cmd_opts:
+    if opt == '-f': out = arg
+    else: opt_string = opt_string + ' ' + opt
+def process(outfile, name):
+    if os.path.isdir(name):
+        for entry in os.listdir(name):
+	    process(outfile, os.path.join(name, entry))
+    else:
+        outfile.write(open(name, 'rb').read())
+outfile = open(out, 'wb')
+outfile.write('options: %s\\n' % opt_string)
+for infile in args:
+    process(outfile, infile)
+outfile.close()
+sys.exit(0)
+""")
+
+test.write('SConstruct', """
+env = Environment(tools = ['tar'], TAR = r'%s mytar.py', TARFLAGS = '-x')
+env.Tar(target = 'aaa.tar', source = ['file1', 'file2'])
+env.Tar(target = 'aaa.tar', source = 'file3')
+env.Tar(target = 'bbb', source = 'sub1')
+env.Tar(target = 'bbb', source = 'file4')
+""" % python)
+
+test.write('file1', "file1\n")
+test.write('file2', "file2\n")
+test.write('file3', "file3\n")
+test.write('file4', "file4\n")
+
+test.write(['sub1', 'file5'], "sub1/file5\n")
+test.write(['sub1', 'file6'], "sub1/file6\n")
+
+test.run(arguments = 'aaa.tar', stderr = None)
+
+test.fail_test(test.read('aaa.tar') != "options:  -x\nfile1\nfile2\nfile3\n")
+
+test.run(arguments = 'bbb.tar', stderr = None)
+
+test.fail_test(test.read('bbb.tar') != "options:  -x\nsub1/file5\nsub1/file6\nfile4\n")
+
+
+
+tar = test.detect('TAR', 'tar')
+
+if tar:
+
+    test.write("wrapper.py", """import os
+import string
+import sys
+open('%s', 'wb').write("wrapper.py\\n")
+os.system(string.join(sys.argv[1:], " "))
+""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\'))
+
+    test.write('SConstruct', """
+foo = Environment()
+tar = foo['TAR']
+bar = Environment(TAR = '',
+		  TARFLAGS = r'%s wrapper.py ' + tar + ' -c -b 1')
+foo.Tar(target = 'foo.tar', source = ['file10', 'file11'])
+foo.Tar(target = 'foo.tar', source = 'file12')
+bar.Tar(target = 'bar.tar', source = ['file13', 'file14'])
+bar.Tar(target = 'bar.tar', source = 'file15')
+""" % python)
+
+    test.write('file10', "file10\n")
+    test.write('file11', "file11\n")
+    test.write('file12', "file12\n")
+    test.write('file13', "file13\n")
+    test.write('file14', "file14\n")
+    test.write('file15', "file15\n")
+
+    test.run(arguments = 'foo.tar', stderr = None)
+
+    test.fail_test(os.path.exists(test.workpath('wrapper.out')))
+
+    test.fail_test(not os.path.exists(test.workpath('foo.tar')))
+
+    test.run(arguments = 'bar.tar', stderr = None)
+
+    test.fail_test(not os.path.exists(test.workpath('wrapper.out')))
+
+    test.fail_test(not os.path.exists(test.workpath('bar.tar')))
+
+    test.run(program = tar, arguments = "-t -f foo.tar", stderr = None)
+    test.fail_test(test.stdout() != "file10\nfile11\nfile12\n")
+
+    test.run(program = tar, arguments = "-t -f bar.tar", stderr = None)
+    test.fail_test(test.stdout() != "file13\nfile14\nfile15\n")
+
+test.pass_test()
diff --git a/test/TARFLAGS.py b/test/TARFLAGS.py
deleted file mode 100644
index 5864241..0000000
--- a/test/TARFLAGS.py
+++ /dev/null
@@ -1,137 +0,0 @@
-#!/usr/bin/env python
-#
-# __COPYRIGHT__
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
-
-import os
-import os.path
-import string
-import sys
-import TestSCons
-
-python = TestSCons.python
-
-test = TestSCons.TestSCons()
-
-test.subdir('sub1')
-
-test.write('mytar.py', """
-import getopt
-import os
-import os.path
-import string
-import sys
-cmd_opts, args = getopt.getopt(sys.argv[1:], 'cf:x', [])
-opt_string = ''
-for opt, arg in cmd_opts:
-    if opt == '-f': out = arg
-    else: opt_string = opt_string + ' ' + opt
-def process(outfile, name):
-    if os.path.isdir(name):
-        for entry in os.listdir(name):
-	    process(outfile, os.path.join(name, entry))
-    else:
-        outfile.write(open(name, 'rb').read())
-outfile = open(out, 'wb')
-outfile.write('options: %s\\n' % opt_string)
-for infile in args:
-    process(outfile, infile)
-outfile.close()
-sys.exit(0)
-""")
-
-test.write('SConstruct', """
-env = Environment(tools = ['tar'], TAR = r'%s mytar.py', TARFLAGS = '-x')
-env.Tar(target = 'aaa.tar', source = ['file1', 'file2'])
-env.Tar(target = 'aaa.tar', source = 'file3')
-env.Tar(target = 'bbb', source = 'sub1')
-env.Tar(target = 'bbb', source = 'file4')
-""" % python)
-
-test.write('file1', "file1\n")
-test.write('file2', "file2\n")
-test.write('file3', "file3\n")
-test.write('file4', "file4\n")
-
-test.write(['sub1', 'file5'], "sub1/file5\n")
-test.write(['sub1', 'file6'], "sub1/file6\n")
-
-test.run(arguments = 'aaa.tar', stderr = None)
-
-test.fail_test(test.read('aaa.tar') != "options:  -x\nfile1\nfile2\nfile3\n")
-
-test.run(arguments = 'bbb.tar', stderr = None)
-
-test.fail_test(test.read('bbb.tar') != "options:  -x\nsub1/file5\nsub1/file6\nfile4\n")
-
-
-
-tar = test.detect('TAR', 'tar')
-
-if tar:
-
-    test.write("wrapper.py", """import os
-import string
-import sys
-open('%s', 'wb').write("wrapper.py\\n")
-os.system(string.join(sys.argv[1:], " "))
-""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\'))
-
-    test.write('SConstruct', """
-foo = Environment()
-tar = foo['TAR']
-bar = Environment(TAR = '',
-		  TARFLAGS = r'%s wrapper.py ' + tar + ' -c -b 1')
-foo.Tar(target = 'foo.tar', source = ['file10', 'file11'])
-foo.Tar(target = 'foo.tar', source = 'file12')
-bar.Tar(target = 'bar.tar', source = ['file13', 'file14'])
-bar.Tar(target = 'bar.tar', source = 'file15')
-""" % python)
-
-    test.write('file10', "file10\n")
-    test.write('file11', "file11\n")
-    test.write('file12', "file12\n")
-    test.write('file13', "file13\n")
-    test.write('file14', "file14\n")
-    test.write('file15', "file15\n")
-
-    test.run(arguments = 'foo.tar', stderr = None)
-
-    test.fail_test(os.path.exists(test.workpath('wrapper.out')))
-
-    test.fail_test(not os.path.exists(test.workpath('foo.tar')))
-
-    test.run(arguments = 'bar.tar', stderr = None)
-
-    test.fail_test(not os.path.exists(test.workpath('wrapper.out')))
-
-    test.fail_test(not os.path.exists(test.workpath('bar.tar')))
-
-    test.run(program = tar, arguments = "-t -f foo.tar", stderr = None)
-    test.fail_test(test.stdout() != "file10\nfile11\nfile12\n")
-
-    test.run(program = tar, arguments = "-t -f bar.tar", stderr = None)
-    test.fail_test(test.stdout() != "file13\nfile14\nfile15\n")
-
-test.pass_test()
diff --git a/test/ZIP.py b/test/ZIP.py
deleted file mode 100644
index b2041e6..0000000
--- a/test/ZIP.py
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/usr/bin/env python
-#
-# __COPYRIGHT__
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
-
-import os
-import os.path
-import stat
-import string
-import sys
-import TestSCons
-
-python = TestSCons.python
-
-test = TestSCons.TestSCons()
-
-test.subdir('sub1')
-
-test.write('myzip.py', r"""\
-import os
-import os.path
-import sys
-def process(outfile, name):
-    if os.path.isdir(name):
-        list = os.listdir(name)
-        list.sort()
-        for entry in list:
-	    process(outfile, os.path.join(name, entry))
-    else:
-        outfile.write(open(name, 'rb').read())
-outfile = open(sys.argv[1], 'wb')
-for infile in sys.argv[2:]:
-    process(outfile, infile)
-outfile.close()
-sys.exit(0)
-""")
-
-test.write('SConstruct', """
-env = Environment(tools = ['zip'],
-                  ZIPCOM = r'%s myzip.py $TARGET $SOURCES')
-env.Zip(target = 'aaa.zip', source = ['file1', 'file2'])
-env.Zip(target = 'aaa.zip', source = 'file3')
-env.Zip(target = 'bbb', source = 'sub1')
-env.Zip(target = 'bbb', source = 'file4')
-""" % python)
-
-test.write('file1', "file1\n")
-test.write('file2', "file2\n")
-test.write('file3', "file3\n")
-test.write('file4', "file4\n")
-
-test.write(['sub1', 'file5'], "sub1/file5\n")
-test.write(['sub1', 'file6'], "sub1/file6\n")
-
-test.run(arguments = 'aaa.zip', stderr = None)
-
-test.fail_test(test.read('aaa.zip') != "file1\nfile2\nfile3\n")
-
-test.run(arguments = 'bbb.zip', stderr = None)
-
-test.fail_test(test.read('bbb.zip') != "sub1/file5\nsub1/file6\nfile4\n")
-
-try:
-    import zipfile
-    internal_zip = 1
-    zip = 1
-
-    def files(fname):
-        zf = zipfile.ZipFile(fname, 'r')
-        return map(lambda x: x.filename, zf.infolist())
-
-except ImportError:
-    internal_zip = 0
-    zip = test.detect('ZIP', 'zip')
-    unzip = test.where_is('unzip')
-
-    def files(fname, test=test, unzip=unzip):
-        test.run(program = unzip, arguments = "-l -qq %s" % fname)
-        lines = string.split(test.stdout(), "\n")[:-1]
-        def lastword(line):
-            return string.split(line)[-1]
-        return map(lastword, lines)
-
-if zip:
-
-    marker_out = string.replace(test.workpath('marker.out'), '\\', '\\\\')
-
-    test.write('SConstruct', """\
-def marker(target, source, env):
-    open(r'%s', 'wb').write("marker\\n")
-import types
-f1 = Environment()
-zipcom = f1.Dictionary('ZIPCOM')
-if not type(zipcom) is types.ListType:
-    zipcom = [zipcom]
-f2 = Environment(ZIPCOM = [Action(marker)] + zipcom)
-f3 = Environment(ZIPSUFFIX = '.xyzzy')
-f1.Zip(target = 'f1.zip', source = ['file10', 'file11'])
-f1.Zip(target = 'f1.zip', source = 'file12')
-f2.Zip(target = 'f2.zip', source = ['file13', 'file14'])
-f2.Zip(target = 'f2.zip', source = 'file15')
-f3.Zip(target = 'f3', source = 'file16')
-f3.Zip(target = 'f3', source = ['file17', 'file18'])
-try:
-    import zipfile
-    sources = ['file10', 'file11', 'file12', 'file13', 'file14', 'file15']
-    f1.Zip(target = 'f4.zip', source = sources)
-    f1.Zip(target = 'f4stored.zip', source = sources,
-           ZIPCOMPRESSION = zipfile.ZIP_STORED)
-    f1.Zip(target = 'f4deflated.zip', source = sources,
-           ZIPCOMPRESSION = zipfile.ZIP_DEFLATED)
-except ImportError:
-    pass
-""" % marker_out)
-
-    for f in ['file10', 'file11', 'file12',
-              'file13', 'file14', 'file15',
-              'file16', 'file17', 'file18']:
-        test.write(f, f + "\n")
-
-    test.run(arguments = 'f1.zip', stderr = None)
-
-    test.fail_test(os.path.exists(test.workpath('marker.out')))
-
-    test.fail_test(not os.path.exists(test.workpath('f1.zip')))
-
-    test.run(arguments = 'f2.zip', stderr = None)
-
-    test.fail_test(test.read('marker.out') != 'marker\n')
-
-    test.fail_test(not os.path.exists(test.workpath('f2.zip')))
-
-    test.run(arguments = '.', stderr = None)
-
-    test.fail_test(os.path.exists(test.workpath('f3.zip')))
-    test.fail_test(not os.path.exists(test.workpath('f3.xyzzy')))
-
-    test.fail_test(files("f1.zip") != ['file10', 'file11', 'file12'])
-
-    test.fail_test(files("f2.zip") != ['file13', 'file14', 'file15'])
-
-    test.fail_test(files("f3.xyzzy") != ['file16', 'file17', 'file18'])
-
-    if internal_zip:
-        f4_size = os.stat('f4.zip')[stat.ST_SIZE]
-        f4stored_size = os.stat('f4stored.zip')[stat.ST_SIZE]
-        f4deflated_size = os.stat('f4deflated.zip')[stat.ST_SIZE]
-
-        test.fail_test(f4_size != f4deflated_size)
-        test.fail_test(f4stored_size == f4deflated_size)
-
-test.pass_test()
diff --git a/test/ZIP/ZIP.py b/test/ZIP/ZIP.py
new file mode 100644
index 0000000..b2041e6
--- /dev/null
+++ b/test/ZIP/ZIP.py
@@ -0,0 +1,173 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+import stat
+import string
+import sys
+import TestSCons
+
+python = TestSCons.python
+
+test = TestSCons.TestSCons()
+
+test.subdir('sub1')
+
+test.write('myzip.py', r"""\
+import os
+import os.path
+import sys
+def process(outfile, name):
+    if os.path.isdir(name):
+        list = os.listdir(name)
+        list.sort()
+        for entry in list:
+	    process(outfile, os.path.join(name, entry))
+    else:
+        outfile.write(open(name, 'rb').read())
+outfile = open(sys.argv[1], 'wb')
+for infile in sys.argv[2:]:
+    process(outfile, infile)
+outfile.close()
+sys.exit(0)
+""")
+
+test.write('SConstruct', """
+env = Environment(tools = ['zip'],
+                  ZIPCOM = r'%s myzip.py $TARGET $SOURCES')
+env.Zip(target = 'aaa.zip', source = ['file1', 'file2'])
+env.Zip(target = 'aaa.zip', source = 'file3')
+env.Zip(target = 'bbb', source = 'sub1')
+env.Zip(target = 'bbb', source = 'file4')
+""" % python)
+
+test.write('file1', "file1\n")
+test.write('file2', "file2\n")
+test.write('file3', "file3\n")
+test.write('file4', "file4\n")
+
+test.write(['sub1', 'file5'], "sub1/file5\n")
+test.write(['sub1', 'file6'], "sub1/file6\n")
+
+test.run(arguments = 'aaa.zip', stderr = None)
+
+test.fail_test(test.read('aaa.zip') != "file1\nfile2\nfile3\n")
+
+test.run(arguments = 'bbb.zip', stderr = None)
+
+test.fail_test(test.read('bbb.zip') != "sub1/file5\nsub1/file6\nfile4\n")
+
+try:
+    import zipfile
+    internal_zip = 1
+    zip = 1
+
+    def files(fname):
+        zf = zipfile.ZipFile(fname, 'r')
+        return map(lambda x: x.filename, zf.infolist())
+
+except ImportError:
+    internal_zip = 0
+    zip = test.detect('ZIP', 'zip')
+    unzip = test.where_is('unzip')
+
+    def files(fname, test=test, unzip=unzip):
+        test.run(program = unzip, arguments = "-l -qq %s" % fname)
+        lines = string.split(test.stdout(), "\n")[:-1]
+        def lastword(line):
+            return string.split(line)[-1]
+        return map(lastword, lines)
+
+if zip:
+
+    marker_out = string.replace(test.workpath('marker.out'), '\\', '\\\\')
+
+    test.write('SConstruct', """\
+def marker(target, source, env):
+    open(r'%s', 'wb').write("marker\\n")
+import types
+f1 = Environment()
+zipcom = f1.Dictionary('ZIPCOM')
+if not type(zipcom) is types.ListType:
+    zipcom = [zipcom]
+f2 = Environment(ZIPCOM = [Action(marker)] + zipcom)
+f3 = Environment(ZIPSUFFIX = '.xyzzy')
+f1.Zip(target = 'f1.zip', source = ['file10', 'file11'])
+f1.Zip(target = 'f1.zip', source = 'file12')
+f2.Zip(target = 'f2.zip', source = ['file13', 'file14'])
+f2.Zip(target = 'f2.zip', source = 'file15')
+f3.Zip(target = 'f3', source = 'file16')
+f3.Zip(target = 'f3', source = ['file17', 'file18'])
+try:
+    import zipfile
+    sources = ['file10', 'file11', 'file12', 'file13', 'file14', 'file15']
+    f1.Zip(target = 'f4.zip', source = sources)
+    f1.Zip(target = 'f4stored.zip', source = sources,
+           ZIPCOMPRESSION = zipfile.ZIP_STORED)
+    f1.Zip(target = 'f4deflated.zip', source = sources,
+           ZIPCOMPRESSION = zipfile.ZIP_DEFLATED)
+except ImportError:
+    pass
+""" % marker_out)
+
+    for f in ['file10', 'file11', 'file12',
+              'file13', 'file14', 'file15',
+              'file16', 'file17', 'file18']:
+        test.write(f, f + "\n")
+
+    test.run(arguments = 'f1.zip', stderr = None)
+
+    test.fail_test(os.path.exists(test.workpath('marker.out')))
+
+    test.fail_test(not os.path.exists(test.workpath('f1.zip')))
+
+    test.run(arguments = 'f2.zip', stderr = None)
+
+    test.fail_test(test.read('marker.out') != 'marker\n')
+
+    test.fail_test(not os.path.exists(test.workpath('f2.zip')))
+
+    test.run(arguments = '.', stderr = None)
+
+    test.fail_test(os.path.exists(test.workpath('f3.zip')))
+    test.fail_test(not os.path.exists(test.workpath('f3.xyzzy')))
+
+    test.fail_test(files("f1.zip") != ['file10', 'file11', 'file12'])
+
+    test.fail_test(files("f2.zip") != ['file13', 'file14', 'file15'])
+
+    test.fail_test(files("f3.xyzzy") != ['file16', 'file17', 'file18'])
+
+    if internal_zip:
+        f4_size = os.stat('f4.zip')[stat.ST_SIZE]
+        f4stored_size = os.stat('f4stored.zip')[stat.ST_SIZE]
+        f4deflated_size = os.stat('f4deflated.zip')[stat.ST_SIZE]
+
+        test.fail_test(f4_size != f4deflated_size)
+        test.fail_test(f4stored_size == f4deflated_size)
+
+test.pass_test()
diff --git a/test/ZIP/ZIPCOM.py b/test/ZIP/ZIPCOM.py
new file mode 100644
index 0000000..42b8cff
--- /dev/null
+++ b/test/ZIP/ZIPCOM.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test the ability to configure the $ZIPCOM construction variable.
+"""
+
+import os
+import string
+import sys
+import TestSCons
+
+python = TestSCons.python
+
+test = TestSCons.TestSCons()
+
+
+
+test.write('myzip.py', r"""
+import sys
+outfile = open(sys.argv[1], 'wb')
+infile = open(sys.argv[2], 'rb')
+for l in filter(lambda l: l != '/*zip*/\n', infile.readlines()):
+    outfile.write(l)
+sys.exit(0)
+""")
+
+test.write('SConstruct', """
+env = Environment(TOOLS = ['zip'],
+                  ZIPCOM = r'%(python)s myzip.py $TARGET $SOURCE')
+env.Zip('test1.zip', 'test1.in')
+""" % locals())
+
+test.write('test1.in', """\
+test1.in
+/*zip*/
+""")
+
+test.run()
+
+test.must_match('test1.zip', "test1.in\n")
+
+
+
+test.pass_test()
diff --git a/test/ZIP/ZIPCOMSTR.py b/test/ZIP/ZIPCOMSTR.py
new file mode 100644
index 0000000..0ee90fd
--- /dev/null
+++ b/test/ZIP/ZIPCOMSTR.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test that the $ZIPCOMSTR construction variable allows you to customize
+the displayed string when zip is called.
+"""
+
+import TestSCons
+
+python = TestSCons.python
+
+test = TestSCons.TestSCons()
+
+
+
+test.write('myzip.py', """
+import sys
+outfile = open(sys.argv[1], 'wb')
+for f in sys.argv[2:]:
+    infile = open(f, 'rb')
+    for l in filter(lambda l: l != '/*zip*/\\n', infile.readlines()):
+        outfile.write(l)
+sys.exit(0)
+""")
+
+test.write('SConstruct', """
+env = Environment(tools=['zip'],
+                  ZIPCOM = r'%s myzip.py $TARGET $SOURCES',
+                  ZIPCOMSTR = 'Zipping $TARGET from $SOURCE')
+env.Zip('aaa.zip', 'aaa.in')
+""" % python)
+
+test.write('aaa.in', "aaa.in\n/*zip*/\n")
+
+test.run(stdout = test.wrap_stdout("""\
+Zipping aaa.zip from aaa.in
+"""))
+
+test.must_match('aaa.zip', "aaa.in\n")
+
+
+
+test.pass_test()
-- 
cgit v0.12