Hi,
I have refactored Untar such that it extends from Expand.
The reasons being:
1. Unzip, unjar, unwar and untar being so similar not
only in functionality, but also in the code that we have
right now.
2. For easier maintenance - I have added two new
attributes (outfile and verbose). It was easier for me
to consolidate these two tasks together so that input
validations, common functions, etc. need not be
maintained in parallel two places.
This patch also fixes the following bug -
The dest attribute wasn't being checked to see
if it was a directory (when it exists, ie).
The features provided are:
1. Untar's src attribute can now be a directory
similar to how unzip behaves now.
2. outfile can be specified: setting this causes the task
to list the files contained in the archive into outfile.
(Similar to the t flag in jar/tar commands).
3. When outfile is specified, if verbose is also set,
a detailed list of contents of the archive is output
into outfile.
(Similar to the v flag in jar/tar commands).
The motivations behind these new features:
1. To be able to view(list) the contents of the archive
without performing a full extract.
2. To provide basis for finding diff between two tars,
for example.
3. Consolidate near identical expand/untar tasks.
Magesh
Index: TarEntry.java
===================================================================
RCS file:
/home/cvspublic/jakarta-ant/src/main/org/apache/tools/tar/TarEntry.java,v
retrieving revision 1.8
diff -u -w -r1.8 TarEntry.java
--- TarEntry.java 2001/10/28 21:31:00 1.8
+++ TarEntry.java 2001/11/08 01:06:18
@@ -452,6 +452,15 @@
}
/**
+ * Get this entry's mode.
+ *
+ * @return This entry's mode.
+ */
+ public int getMode() {
+ return this.mode;
+ }
+
+ /**
* Get this entry's file size.
*
* @return This entry's file size.
*********************************************************************
Index: Untar.java
===================================================================
RCS file:
/home/cvspublic/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Untar.java,v
retrieving revision 1.14
diff -u -r1.14 Untar.java
--- Untar.java 2001/10/28 21:26:29 1.14
+++ Untar.java 2001/11/08 01:10:37
@@ -54,16 +54,15 @@
package org.apache.tools.ant.taskdefs;
-import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Expand;
import org.apache.tools.tar.TarInputStream;
import org.apache.tools.tar.TarEntry;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
import java.io.IOException;
+import java.util.Date;
/**
* Untar a file.
@@ -71,124 +70,119 @@
* Heavily based on the Expand task.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Magesh Umasankar</a>
*/
-public class Untar extends Task {
- private File dest; // req
- private File source; // req
-
- private boolean overwrite = true;
-
- /**
- * Do the work.
- *
- * @exception BuildException Thrown in unrecoverable error.
- */
- public void execute() throws BuildException {
-
- Touch touch = (Touch) project.createTask("touch");
- touch.setOwningTarget(target);
- touch.setTaskName(getTaskName());
- touch.setLocation(getLocation());
-
- File srcF = source;
+public class Untar extends Expand {
+ private final static int S_IFMT = 0170000;
+ private final static int S_IFSOCK = 0140000;
+ private final static int S_IFLNK = 0120000;
+ private final static int S_IFREG = 0100000;
+ private final static int S_IFBLK = 0060000;
+ private final static int S_IFDIR = 0040000;
+ private final static int S_IFCHR = 0020000;
+ private final static int S_IFIFO = 0010000;
+ private final static int S_ISUID = 0004000;
+ private final static int S_ISGID = 0002000;
+ private final static int S_ISVTX = 0001000;
+ private final static int S_IRWXU = 00700;
+ private final static int S_IRUSR = 00400;
+ private final static int S_IWUSR = 00200;
+ private final static int S_IXUSR = 00100;
+ private final static int S_IRWXG = 00070;
+ private final static int S_IRGRP = 00040;
+ private final static int S_IWGRP = 00020;
+ private final static int S_IXGRP = 00010;
+ private final static int S_IRWXO = 00007;
+ private final static int S_IROTH = 00004;
+ private final static int S_IWOTH = 00002;
+ private final static int S_IXOTH = 00001;
+ protected void expandFile(Touch touch, File srcF, File dir) {
TarInputStream tis = null;
try {
- if (source == null) {
- throw new BuildException("No source specified", location);
+ if (dest != null) {
+ log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO);
}
- if (!srcF.exists()) {
- throw new BuildException("source "+srcF+" doesn't exist",
- location);
+ if (outFile != null && includeFileName) {
+ pw.println("[[" + srcF + "]]");
}
- if (dest == null) {
- throw new BuildException("No destination specified", location);
- }
- File dir = dest;
-
- log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO);
tis = new TarInputStream(new FileInputStream(srcF));
TarEntry te = null;
while ((te = tis.getNextEntry()) != null) {
- try {
- File f = new File(dir,
project.translatePath(te.getName()));
- if (!overwrite && f.exists()
- && f.lastModified() >= te.getModTime().getTime()) {
- log("Skipping " + f + " as it is up-to-date",
- Project.MSG_DEBUG);
- continue;
- }
-
- log("expanding " + te.getName() + " to "+ f,
- Project.MSG_VERBOSE);
- File dirF=new File(f.getParent());
- dirF.mkdirs();
-
- if (te.isDirectory()) {
- f.mkdirs();
- } else {
- byte[] buffer = new byte[1024];
- int length = 0;
- FileOutputStream fos = new FileOutputStream(f);
-
- while ((length = tis.read(buffer)) >= 0) {
- fos.write(buffer, 0, length);
- }
-
- fos.close();
- }
-
- if (project.getJavaVersion() != Project.JAVA_1_1) {
- touch.setFile(f);
- touch.setMillis(te.getModTime().getTime());
- touch.touch();
- }
-
- } catch(FileNotFoundException ex) {
- log("FileNotFoundException: " + te.getName(),
- Project.MSG_WARN);
- }
+ extractFile(touch, srcF, dir, tis,
+ te.getName(), te.getSize(),
+ te.getModTime(), te.isDirectory(),
+ mode2str(te.getMode()),
+ te.getUserId() + "/" + te.getGroupId());
}
+ if (dest != null) {
+ log("expand complete", Project.MSG_VERBOSE );
+ }
+
} catch (IOException ioe) {
throw new BuildException("Error while expanding " + srcF.getPath(),
ioe, location);
- } finally {
- if (tis != null) {
- try {
- tis.close();
- }
- catch (IOException e) {}
- }
- }
- }
-
- /**
- * Set the destination directory. File will be untared into the
- * destination directory.
- *
- * @param d Path to the directory.
- */
- public void setDest(File d) {
- this.dest = d;
+ } finally {
+ if (tis != null) {
+ try {
+ tis.close();
+ }
+ catch (IOException e) {}
+ }
+ }
}
- /**
- * Set the path to tar-file.
- *
- * @param s Path to tar-file.
- */
- public void setSrc(File s) {
- this.source = s;
- }
+ private String mode2str(int mode) {
+ StringBuffer sb = new StringBuffer("----------");
+ if ((mode & S_IFREG ) == 0) {
+ if ((mode & S_IFDIR ) != 0) {
+ sb.setCharAt(0, 'd');
+ } else if ((mode & S_IFLNK) != 0) {
+ sb.setCharAt(0, 'l');
+ } else if ((mode & S_IFIFO) != 0) {
+ sb.setCharAt(0, 'p');
+ } else if ((mode & S_IFCHR) != 0) {
+ sb.setCharAt(0, 'c');
+ } else if ((mode & S_IFBLK) != 0) {
+ sb.setCharAt(0, 'b');
+ } else if ((mode & S_IFSOCK) != 0) {
+ sb.setCharAt(0, 's');
+ } else if ((mode & S_IFIFO) != 0) {
+ sb.setCharAt(0, 'p');
+ }
+ }
- /**
- * Should we overwrite files in dest, even if they are newer than
- * the corresponding entries in the archive?
- */
- public void setOverwrite(boolean b) {
- overwrite = b;
+ if ((mode & S_IRUSR ) != 0) {
+ sb.setCharAt(1, 'r');
+ }
+ if ((mode & S_IWUSR ) != 0) {
+ sb.setCharAt(2, 'w');
+ }
+ if ((mode & S_IXUSR ) != 0) {
+ sb.setCharAt(3, 'x');
+ }
+
+ if ((mode & S_IRGRP ) != 0) {
+ sb.setCharAt(4, 'r');
+ }
+ if ((mode & S_IWGRP ) != 0) {
+ sb.setCharAt(5, 'w');
+ }
+ if ((mode & S_IXGRP ) != 0) {
+ sb.setCharAt(6, 'x');
+ }
+
+ if ((mode & S_IROTH ) != 0) {
+ sb.setCharAt(7, 'r');
+ }
+ if ((mode & S_IWOTH ) != 0) {
+ sb.setCharAt(8, 'w');
+ }
+ if ((mode & S_IXOTH ) != 0) {
+ sb.setCharAt(9, 'x');
+ }
+ return new String(sb);
}
-
}
*********************************************************************
Index: Expand.java
===================================================================
RCS file:
/home/cvspublic/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Expand.java,v
retrieving revision 1.16
diff -u -r1.16 Expand.java
--- Expand.java 2001/10/28 21:26:29 1.16
+++ Expand.java 2001/11/08 01:12:14
@@ -1,7 +1,7 @@
/*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -9,7 +9,7 @@
* are met:
*
* 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
+ * notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
@@ -17,15 +17,15 @@
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
- * any, must include the following acknowlegement:
- * "This product includes software developed by the
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
- * from this software without prior written permission. For written
+ * from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
@@ -57,25 +57,37 @@
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
+import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.InputStream;
import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
+
/**
- * Unzip a file.
+ * Unzip a file.
*
* @author [EMAIL PROTECTED]
* @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Magesh Umasankar</a>
*/
public class Expand extends MatchingTask {
- private File dest; // req
- private File source; // req
+ protected File dest;
+ protected File source; // req
+ protected File outFile;
+ protected boolean overwrite = true;
+ protected boolean verbose;
+ protected boolean includeFileName;
+ protected PrintWriter pw = null;
+ protected BufferedWriter bw = null;
+ protected FileWriter fw = null;
- private boolean overwrite = true;
-
/**
* Do the work.
*
@@ -85,26 +97,60 @@
public void execute() throws BuildException {
if ("expand".equals(taskType)) {
log("!! expand is deprecated. Use unzip instead. !!");
+ }
+
+ if (source == null) {
+ throw new BuildException("Src attribute must be specified");
+ }
+
+ if (dest == null && outFile == null) {
+ throw new BuildException(
+ "Dest and/or the OutFile attribute " +
+ "must be specified");
+ }
+
+ if (dest != null && dest.exists() && !dest.isDirectory()) {
+ throw new BuildException("Dest must be a directory.", location);
+ }
+
+ if (verbose && outFile == null) {
+ throw new BuildException(
+ "Verbose can be set only when OutFile is " +
+ "specified");
}
-
Touch touch = (Touch) project.createTask("touch");
touch.setOwningTarget(target);
touch.setTaskName(getTaskName());
touch.setLocation(getLocation());
-
- if (source == null) {
- throw new BuildException("Source attribute must be specified");
- }
- if (dest == null) {
- throw new BuildException("Dest attribute must be specified");
+
+ try {
+ if (outFile != null) {
+ if (!outFile.exists()) {
+ File parent = new File(outFile.getParent());
+ if (!parent.exists()) {
+ if (!parent.mkdirs()) {
+ throw new BuildException("Unable to create "
+ + outFile);
+ }
+ }
+ }
+ fw = new FileWriter(outFile);
+ bw = new BufferedWriter(fw);
+ pw = new PrintWriter(bw, true);
+ }
+ } catch (IOException ioe) {
+ throw new BuildException(ioe.getMessage(), location);
}
if (source.isDirectory()) {
// get all the files in the descriptor directory
DirectoryScanner ds = super.getDirectoryScanner(source);
-
+
String[] files = ds.getIncludedFiles();
+ if (files.length > 0) {
+ includeFileName = true;
+ }
for (int i = 0; i < files.length; ++i) {
File file = new File(source, files[i]);
expandFile(touch, file, dest);
@@ -113,57 +159,43 @@
else {
expandFile(touch, source, dest);
}
+ try {
+ if (pw != null) {
+ pw.close();
+ }
+ if (bw != null) {
+ bw.close();
+ }
+ if (fw != null) {
+ fw.close();
+ }
+ } catch (IOException ioe1) {
+ //Oh, well! We did our best
+ }
}
+
+ /*
+ * This method is to be overridden by extending unarchival tasks.
+ */
- private void expandFile(Touch touch, File srcF, File dir) {
+ protected void expandFile(Touch touch, File srcF, File dir) {
ZipInputStream zis = null;
try {
- log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO);
// code from WarExpand
zis = new ZipInputStream(new FileInputStream(srcF));
ZipEntry ze = null;
while ((ze = zis.getNextEntry()) != null) {
- File f = new File(dir, project.translatePath(ze.getName()));
- try {
- if (!overwrite && f.exists()
- && f.lastModified() >= ze.getTime()) {
- log("Skipping " + f + " as it is up-to-date",
- Project.MSG_DEBUG);
- continue;
- }
-
- log("expanding " + ze.getName() + " to "+ f,
- Project.MSG_VERBOSE);
- // create intermediary directories - sometimes zip don't
add them
- File dirF=new File(f.getParent());
- dirF.mkdirs();
-
- if (ze.isDirectory()) {
- f.mkdirs();
- } else {
- byte[] buffer = new byte[1024];
- int length = 0;
- FileOutputStream fos = new FileOutputStream(f);
-
- while ((length = zis.read(buffer)) >= 0) {
- fos.write(buffer, 0, length);
- }
-
- fos.close();
- }
-
- if (project.getJavaVersion() != Project.JAVA_1_1) {
- touch.setFile(f);
- touch.setMillis(ze.getTime());
- touch.touch();
- }
-
- } catch( FileNotFoundException ex ) {
- log("Unable to expand to file " + f.getPath(),
Project.MSG_WARN);
- }
+ extractFile(touch, srcF, dir, zis,
+ ze.getName(), ze.getSize(),
+ new Date(ze.getTime()),
+ ze.isDirectory());
+ }
+
+ if (dest != null) {
+ log("expand complete", Project.MSG_VERBOSE );
}
- log("expand complete", Project.MSG_VERBOSE );
+
} catch (IOException ioe) {
throw new BuildException("Error while expanding " +
srcF.getPath(), ioe);
} finally {
@@ -175,7 +207,101 @@
}
}
}
-
+
+ protected void extractFile(Touch touch, File srcF, File dir,
+ InputStream compressedInputStream,
+ String entryName, long entrySize,
+ Date entryDate, boolean isDirectory)
+ throws IOException {
+ extractFile(touch, srcF, dir, compressedInputStream,
+ entryName, entrySize, entryDate, isDirectory,
+ null, null);
+
+ }
+
+ protected void extractFile(Touch touch, File srcF, File dir,
+ InputStream compressedInputStream,
+ String entryName, long entrySize,
+ Date entryDate, boolean isDirectory,
+ String modeStr, String userGroup)
+ throws IOException {
+ if (dest != null) {
+ log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO);
+ }
+ if (outFile != null && includeFileName) {
+ pw.println("[[" + srcF + "]]");
+ }
+
+ if (outFile != null) {
+ if (verbose) {
+ StringBuffer sb = new StringBuffer();
+ if (modeStr != null) {
+ sb.append(modeStr);
+ sb.append(' ');
+ }
+ if (userGroup != null) {
+ sb.append(userGroup);
+ sb.append(' ');
+ }
+ String s = Long.toString(entrySize);
+ int len = s.length();
+ for(int i = 6 - len; i > 0; i--) {
+ sb.append(' ');
+ }
+ sb.append(s)
+ .append(' ')
+ .append(entryDate.toString());
+ sb.append(' ')
+ .append(entryName);
+ pw.println(sb);
+ } else {
+ pw.println(entryName);
+ }
+ }
+ if (dest != null) {
+ File f = new File(dir, project.translatePath(entryName));
+ try {
+ if (!overwrite && f.exists()
+ && f.lastModified() >= entryDate.getTime()) {
+ log("Skipping " + f + " as it is up-to-date",
+ Project.MSG_DEBUG);
+ return;
+ }
+
+ log("expanding " + entryName + " to "+ f,
+ Project.MSG_VERBOSE);
+ // create intermediary directories - sometimes zip don't add
them
+ File dirF=new File(f.getParent());
+ dirF.mkdirs();
+
+ if (isDirectory) {
+ f.mkdirs();
+ } else {
+ byte[] buffer = new byte[1024];
+ int length = 0;
+ FileOutputStream fos = new FileOutputStream(f);
+
+ while ((length =
+ compressedInputStream.read(buffer)) >= 0) {
+ fos.write(buffer, 0, length);
+ }
+
+ fos.close();
+ }
+
+ if (project.getJavaVersion() != Project.JAVA_1_1) {
+ touch.setFile(f);
+ touch.setMillis(entryDate.getTime());
+ touch.touch();
+ }
+
+ } catch( FileNotFoundException ex ) {
+ log("Unable to expand to file " + f.getPath(),
Project.MSG_WARN);
+ }
+ }
+
+ }
+
/**
* Set the destination directory. File will be unzipped into the
* destination directory.
@@ -203,4 +329,20 @@
overwrite = b;
}
+ /**
+ * Set the output file to be used to store the list of the
+ * archive's contents.
+ *
+ * @param outFile the output file to be used.
+ */
+ public void setOutfile(File outFile) {
+ this.outFile = outFile;
+ }
+
+ /**
+ * Set the verbose mode for the contents-list file.
+ */
+ public void setVerbose(boolean verbose) {
+ this.verbose = verbose;
+ }
}
*********************************************************************
Index: coretasklist.html
===================================================================
RCS file: /home/cvspublic/jakarta-ant/docs/manual/coretasklist.html,v
retrieving revision 1.20
diff -u -r1.20 coretasklist.html
--- coretasklist.html 2001/09/08 01:05:17 1.20
+++ coretasklist.html 2001/11/08 01:14:17
@@ -74,7 +74,7 @@
<a href="CoreTasks/tstamp.html">TStamp</a><br>
<a href="CoreTasks/typedef.html">Typedef</a><br>
<a href="CoreTasks/unzip.html">Unjar</a><br>
-<a href="CoreTasks/untar.html">Untar</a><br>
+<a href="CoreTasks/unzip.html">Untar</a><br>
<a href="CoreTasks/unzip.html">Unwar</a><br>
<a href="CoreTasks/unzip.html">Unzip</a><br>
<a href="CoreTasks/uptodate.html">Uptodate</a><br>
*********************************************************************
Index: unzip.html
===================================================================
RCS file: /home/cvspublic/jakarta-ant/docs/manual/CoreTasks/unzip.html,v
retrieving revision 1.3
diff -u -r1.3 unzip.html
--- unzip.html 2001/07/27 06:52:50 1.3
+++ unzip.html 2001/11/08 01:15:04
@@ -7,12 +7,13 @@
<body>
-<h2><a name="unzip">Unjar/Unwar/Unzip</a></h2>
+<h2><a name="unzip">Unjar/Untar/Unwar/Unzip</a></h2>
<h3>Description</h3>
-<p>Unzips a zip-, war- or jarfile.</p>
-<p>For JDK 1.1 "last modified time" field is set to current time
instead of being
-carried from zipfile.</p>
+<p>Unzips a zip-, war-, tar- or jarfile.</p>
+<p>For JDK 1.1 "last modified time" field is set to current time
instead of being
+carried from the archive file.</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>
<table border="1" cellpadding="2" cellspacing="0">
<tr>
@@ -22,13 +23,13 @@
</tr>
<tr>
<td valign="top">src</td>
- <td valign="top">zipfile to expand.</td>
+ <td valign="top">archive file to expand.</td>
<td align="center" valign="top">Yes</td>
</tr>
<tr>
<td valign="top">dest</td>
<td valign="top">directory where to store the expanded files.</td>
- <td align="center" valign="top">Yes</td>
+ <td align="center" valign="top">Yes, if outfile is not specified.</td>
</tr>
<tr>
<td valign="top">overwrite</td>
@@ -37,11 +38,28 @@
true).</td>
<td align="center" valign="top">No</td>
</tr>
+ <tr>
+ <td valign="top">outfile</td>
+ <td valign="top">List the contents of the archive into this file.</td>
+ <td align="center" valign="top">Yes, if dest is not specified.</td>
+ </tr>
+ <tr>
+ <td valign="top">verbose</td>
+ <td valign="top">Include file details when listing contents of
+ the archive into outfile? Defaults to <I>false</I>.</td>
+ <td align="center" valign="top">No</td>
+ </tr>
</table>
<h3>Examples</h3>
<blockquote>
<p><code><unzip src="${tomcat_src}/tools-src.zip"
dest="${tools.home}"
/></code></p>
+</blockquote>
+<blockquote>
+ <p><code>
+<gunzip src="tools.tar.gz"/><br>
+<untar src="tools.tar" dest="${tools.home}"/>
+</code></p>
</blockquote>
<hr>
<p align="center">Copyright © 2000,2001 Apache Software Foundation. All
rights
*********************************************************************
cvs diff -u untar.html
Index: untar.html
===================================================================
RCS file: /home/cvspublic/jakarta-ant/docs/manual/CoreTasks/untar.html,v
retrieving revision 1.4
diff -u -r1.4 untar.html
--- untar.html 2001/07/27 08:24:59 1.4
+++ untar.html 2001/11/08 01:15:41
@@ -11,48 +11,7 @@
<h3>Description</h3>
<p>Untars a tarfile.</p>
-<p><strong>Note: </strong>File permissions will not be restored on extracted
files.</p>
-
-<p>For JDK 1.1 "last modified time" field is set to current time
instead of being
-carried from tarfile.</p>
-
-<p>The untar task recognizes the long pathname entries used by GNU tar.</p>
-
-<h3>Parameters</h3>
-<table border="1" cellpadding="2" cellspacing="0">
- <tr>
- <td valign="top"><b>Attribute</b></td>
- <td valign="top"><b>Description</b></td>
- <td align="center" valign="top"><b>Required</b></td>
- </tr>
- <tr>
- <td valign="top">src</td>
- <td valign="top">tarfile to expand.</td>
- <td align="center" valign="top">Yes</td>
- </tr>
- <tr>
- <td valign="top">dest</td>
- <td valign="top">directory where to store the expanded files.</td>
- <td align="center" valign="top">Yes</td>
- </tr>
- <tr>
- <td valign="top">overwrite</td>
- <td valign="top">Overwrite files, even if they are newer than the
- corresponding entries in the archive (true or false, default is
- true).</td>
- <td align="center" valign="top">No</td>
- </tr>
-</table>
-<h3>Examples</h3>
-<blockquote>
- <p><code>
-<gunzip src="tools.tar.gz"/><br>
-<untar src="tools.tar" dest="${tools.home}"/>
-</code></p>
-</blockquote>
-<hr>
-<p align="center">Copyright © 2000,2001 Apache Software Foundation. All
rights
-Reserved.</p>
+This document has moved <A HREF="unzip.html">here</A>
</body>
</html>
*********************************************************************
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>