stevel 2004/10/30 12:44:02 Modified: docs/manual/CoreTasks unzip.html src/etc/testcases/taskdefs unzip.xml src/main/org/apache/tools/ant/taskdefs Expand.java Untar.java src/main/org/apache/tools/zip ZipFile.java src/testcases/org/apache/tools/ant/taskdefs UnzipTest.java Log: Patch in PR# 21996 add a flatten to unzip. I actually only patched in the mapper nested element support; with that the flatten attribute can only introduce inconsistency (what if you spec a mapper and flatten=true). And the patch was modified to keep the attributes private, with a getMapper() operation for subclasses (like untar) to get when needed. Did a bit of cleanup -especially of the unzip tests- while at it. Revision Changes Path 1.14 +14 -1 ant/docs/manual/CoreTasks/unzip.html Index: unzip.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/unzip.html,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- unzip.html 9 Feb 2004 21:50:06 -0000 1.13 +++ unzip.html 30 Oct 2004 19:44:02 -0000 1.14 @@ -15,9 +15,12 @@ <p><a href="../CoreTypes/patternset.html">PatternSet</a>s are used to select files to extract <I>from</I> the archive. If no patternset is used, all files are extracted. </p> -<p><a href="../CoreTypes/fileset.html">FileSet</a>s may be used used to select archived files +<p><a href="../CoreTypes/fileset.html">FileSet</a>s may be used to select archived files to perform unarchival upon. </p> +<p>You can define filename transformations by using a nested <a href="../CoreTypes/mapper.html">mapper</a> element. The default mapper is the +<a href="../CoreTypes/mapper.html#identity-mapper">identity mapper</a>. +</p> <p>File permissions will not be restored on extracted files.</p> <p>The untar task recognizes the long pathname entries used by GNU tar.<p> <h3>Parameters</h3> @@ -99,6 +102,16 @@ <include name="**/*.zip"/> <exclude name="**/tmp*.zip"/> </fileset> +</unzip> +</pre></p> +</blockquote> +<blockquote> +<p><pre> +<unzip src="apache-ant-bin.zip" dest="${tools.home}"> + <patternset> + <include name="apache-ant/lib/ant.jar"/> + </patternset> + <mapper type="flatten"/> </unzip> </pre></p> </blockquote> 1.10 +29 -0 ant/src/etc/testcases/taskdefs/unzip.xml Index: unzip.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/unzip.xml,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- unzip.xml 21 Aug 2003 17:45:12 -0000 1.9 +++ unzip.xml 30 Oct 2004 19:44:02 -0000 1.10 @@ -93,4 +93,33 @@ <unzip src="unziptest.zip" dest="unziptestout" encoding="UnicodeBig"/> </target> + <!-- Bugzilla Report 21996 --> + <target name="testFlattenMapper" depends="prepareTestZip"> + <unzip dest="unziptestout" src="unziptest.zip"> + <patternset> + <include name="1/**"/> + </patternset> + <mapper type="flatten"/> + </unzip> + </target> + + <!-- Bugzilla Report 21996 --> + <target name="testGlobMapper" depends="prepareTestZip"> + <unzip dest="unziptestout" src="unziptest.zip"> + <patternset> + <include name="1/**"/> + </patternset> + <mapper type="glob" from="*" to="*.txt"/> + </unzip> + </target> + + <target name="testTwoMappers" depends="prepareTestZip"> + <unzip dest="unziptestout" src="unziptest.zip"> + <patternset> + <include name="1/**"/> + </patternset> + <mapper type="glob" from="*" to="*.txt"/> + <mapper type="flatten"/> + </unzip> + </target> </project> 1.54 +62 -12 ant/src/main/org/apache/tools/ant/taskdefs/Expand.java Index: Expand.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Expand.java,v retrieving revision 1.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- Expand.java 9 Mar 2004 16:48:04 -0000 1.53 +++ Expand.java 30 Oct 2004 19:44:02 -0000 1.54 @@ -30,9 +30,13 @@ import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.Mapper; import org.apache.tools.ant.types.PatternSet; import org.apache.tools.ant.types.selectors.SelectorUtils; +import org.apache.tools.ant.util.FileNameMapper; import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.FlatFileNameMapper; +import org.apache.tools.ant.util.IdentityMapper; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; @@ -50,12 +54,14 @@ private File dest; //req private File source; // req private boolean overwrite = true; + private Mapper mapperElement = null; private Vector patternsets = new Vector(); private Vector filesets = new Vector(); private static final String NATIVE_ENCODING = "native-encoding"; private String encoding = "UTF8"; + public static final String ERROR_MULTIPLE_MAPPERS = "Cannot define more than one mapper"; /** * Do the work. @@ -106,12 +112,17 @@ } } - /* + /** * This method is to be overridden by extending unarchival tasks. + * + * @param fileUtils + * @param srcF + * @param dir */ protected void expandFile(FileUtils fileUtils, File srcF, File dir) { log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO); ZipFile zf = null; + FileNameMapper mapper = getMapper(); try { zf = new ZipFile(srcF, encoding); Enumeration e = zf.getEntries(); @@ -119,7 +130,7 @@ ZipEntry ze = (ZipEntry) e.nextElement(); extractFile(fileUtils, srcF, dir, zf.getInputStream(ze), ze.getName(), new Date(ze.getTime()), - ze.isDirectory()); + ze.isDirectory(), mapper); } log("expand complete", Project.MSG_VERBOSE); @@ -127,20 +138,40 @@ throw new BuildException("Error while expanding " + srcF.getPath(), ioe); } finally { - if (zf != null) { - try { - zf.close(); - } catch (IOException e) { - //ignore - } - } + ZipFile.closeQuietly(zf); + } + } + + /** + * get a mapper for a file + * @return + */ + protected FileNameMapper getMapper() { + FileNameMapper mapper = null; + if (mapperElement != null) { + mapper = mapperElement.getImplementation(); + } else { + mapper = new IdentityMapper(); } + return mapper; } + /** + * extract a file to a directory + * @param fileUtils + * @param srcF + * @param dir + * @param compressedInputStream + * @param entryName + * @param entryDate + * @param isDirectory + * @param mapper + * @throws IOException + */ protected void extractFile(FileUtils fileUtils, File srcF, File dir, InputStream compressedInputStream, - String entryName, - Date entryDate, boolean isDirectory) + String entryName, Date entryDate, + boolean isDirectory, FileNameMapper mapper) throws IOException { if (patternsets != null && patternsets.size() > 0) { @@ -194,7 +225,11 @@ return; } } - File f = fileUtils.resolveFile(dir, entryName); + String[] mappedNames = mapper.mapFileName(entryName); + if (mappedNames == null || mappedNames.length == 0) { + mappedNames = new String[] { entryName }; + } + File f = fileUtils.resolveFile(dir, mappedNames[0]); try { if (!overwrite && f.exists() && f.lastModified() >= entryDate.getTime()) { @@ -284,6 +319,21 @@ */ public void addFileset(FileSet set) { filesets.addElement(set); + } + + /** + * Defines the mapper to map source entries to destination files. + * @return a mapper to be configured + * @exception BuildException if more than one mapper is defined + * @since Ant1.7 + */ + public Mapper createMapper() throws BuildException { + if (mapperElement != null) { + throw new BuildException(ERROR_MULTIPLE_MAPPERS, + getLocation()); + } + mapperElement = new Mapper(getProject()); + return mapperElement; } /** 1.42 +7 -9 ant/src/main/org/apache/tools/ant/taskdefs/Untar.java Index: Untar.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Untar.java,v retrieving revision 1.41 retrieving revision 1.42 diff -u -r1.41 -r1.42 --- Untar.java 9 Mar 2004 16:48:06 -0000 1.41 +++ Untar.java 30 Oct 2004 19:44:02 -0000 1.42 @@ -26,7 +26,10 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.EnumeratedAttribute; +import org.apache.tools.ant.util.FileNameMapper; import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.FlatFileNameMapper; +import org.apache.tools.ant.util.IdentityMapper; import org.apache.tools.bzip2.CBZip2InputStream; import org.apache.tools.tar.TarEntry; import org.apache.tools.tar.TarInputStream; @@ -92,10 +95,11 @@ new BufferedInputStream( new FileInputStream(srcF)))); TarEntry te = null; - + FileNameMapper mapper = getMapper(); while ((te = tis.getNextEntry()) != null) { extractFile(fileUtils, srcF, dir, tis, - te.getName(), te.getModTime(), te.isDirectory()); + te.getName(), te.getModTime(), + te.isDirectory(), mapper); } log("expand complete", Project.MSG_VERBOSE); @@ -103,13 +107,7 @@ throw new BuildException("Error while expanding " + srcF.getPath(), ioe, getLocation()); } finally { - if (tis != null) { - try { - tis.close(); - } catch (IOException e) { - // ignore - } - } + FileUtils.close(tis); } } 1.14 +16 -1 ant/src/main/org/apache/tools/zip/ZipFile.java Index: ZipFile.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/zip/ZipFile.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- ZipFile.java 18 May 2004 08:14:48 -0000 1.13 +++ ZipFile.java 30 Oct 2004 19:44:02 -0000 1.14 @@ -161,6 +161,21 @@ } /** + * close a zipfile quietly; throw no io fault, do nothing + * on a null parameter + * @param zipfile file to close, can be null + */ + public static void closeQuietly(ZipFile zipfile) { + if (zipfile != null) { + try { + zipfile.close(); + } catch (IOException e) { + //ignore + } + } + } + + /** * Returns all entries. * @return all entries as [EMAIL PROTECTED] ZipEntry} instances */ 1.18 +66 -25 ant/src/testcases/org/apache/tools/ant/taskdefs/UnzipTest.java Index: UnzipTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/UnzipTest.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- UnzipTest.java 9 Mar 2004 16:48:57 -0000 1.17 +++ UnzipTest.java 30 Oct 2004 19:44:02 -0000 1.18 @@ -19,6 +19,8 @@ import org.apache.tools.ant.BuildFileTest; import org.apache.tools.ant.util.FileUtils; +import java.io.IOException; + /** */ public class UnzipTest extends BuildFileTest { @@ -49,24 +51,28 @@ public void testRealTest() throws java.io.IOException { - FileUtils fileUtils = FileUtils.newFileUtils(); executeTarget("realTest"); + assertLogoUncorrupted(); + } + + /** + * test that the logo gif file has not been corrupted + * @throws IOException + */ + private void assertLogoUncorrupted() throws IOException { + FileUtils fileUtils = FileUtils.newFileUtils(); assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), project.resolveFile("asf-logo.gif"))); } public void testTestZipTask() throws java.io.IOException { - FileUtils fileUtils = FileUtils.newFileUtils(); executeTarget("testZipTask"); - assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), - project.resolveFile("asf-logo.gif"))); + assertLogoUncorrupted(); } public void testTestUncompressedZipTask() throws java.io.IOException { - FileUtils fileUtils = FileUtils.newFileUtils(); executeTarget("testUncompressedZipTask"); - assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), - project.resolveFile("asf-logo.gif"))); + assertLogoUncorrupted(); } /* @@ -74,10 +80,8 @@ */ public void testPatternSetExcludeOnly() { executeTarget("testPatternSetExcludeOnly"); - assertTrue("1/foo is excluded", - !getProject().resolveFile("unziptestout/1/foo").exists()); - assertTrue("2/bar is not excluded", - getProject().resolveFile("unziptestout/2/bar").exists()); + assertFileMissing("1/foo is excluded", "unziptestout/1/foo"); + assertFileExists("2/bar is not excluded", "unziptestout/2/bar"); } /* @@ -85,10 +89,8 @@ */ public void testPatternSetIncludeOnly() { executeTarget("testPatternSetIncludeOnly"); - assertTrue("1/foo is not included", - !getProject().resolveFile("unziptestout/1/foo").exists()); - assertTrue("2/bar is included", - getProject().resolveFile("unziptestout/2/bar").exists()); + assertFileMissing("1/foo is not included", "unziptestout/1/foo"); + assertFileExists("2/bar is included", "unziptestout/2/bar"); } /* @@ -96,10 +98,8 @@ */ public void testPatternSetIncludeAndExclude() { executeTarget("testPatternSetIncludeAndExclude"); - assertTrue("1/foo is not included", - !getProject().resolveFile("unziptestout/1/foo").exists()); - assertTrue("2/bar is excluded", - !getProject().resolveFile("unziptestout/2/bar").exists()); + assertFileMissing("1/foo is not included", "unziptestout/1/foo"); + assertFileMissing("2/bar is excluded", "unziptestout/2/bar"); } /* @@ -115,19 +115,60 @@ */ public void testPatternSetSlashOnly() { executeTarget("testPatternSetSlashOnly"); - assertTrue("1/foo is not included", - !getProject().resolveFile("unziptestout/1/foo").exists()); - assertTrue("2/bar is included", - getProject().resolveFile("unziptestout/2/bar").exists()); + assertFileMissing("1/foo is not included", "unziptestout/1/foo"); + assertFileExists("\"2/bar is included", "unziptestout/2/bar"); } + /* * PR 10504 */ public void testEncoding() { executeTarget("encodingTest"); - assertTrue("foo has been properly named", - getProject().resolveFile("unziptestout/foo").exists()); + assertFileExists("foo has been properly named", "unziptestout/foo"); + } + + /* + * PR 21996 + */ + public void testFlattenMapper() { + executeTarget("testFlattenMapper"); + assertFileMissing("1/foo is not flattened", "unziptestout/1/foo"); + assertFileExists("foo is flattened", "unziptestout/foo"); + } + + /** + * assert that a file exists, relative to the project + * @param message message if there is no mpatch + * @param filename filename to resolve against the project + */ + private void assertFileExists(String message, String filename) { + assertTrue(message, + getProject().resolveFile(filename).exists()); + } + + /** + * assert that a file doesnt exist, relative to the project + * + * @param message message if there is no mpatch + * @param filename filename to resolve against the project + */ + private void assertFileMissing(String message, String filename) { + assertTrue(message, + !getProject().resolveFile(filename).exists()); + } + + /** + * PR 21996 + */ + public void testGlobMapper() { + executeTarget("testGlobMapper"); + assertFileMissing("1/foo is not mapped", "unziptestout/1/foo"); + assertFileExists("1/foo is mapped", "unziptestout/1/foo.txt"); + } + + public void testTwoMappers() { + expectBuildException("testTwoMappers",Expand.ERROR_MULTIPLE_MAPPERS); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]