Return-Path:
Mailing-List: contact ant-dev-help@jakarta.apache.org; run by ezmlm
Delivered-To: mailing list ant-dev@jakarta.apache.org
Received: (qmail 82205 invoked by uid 500); 4 Oct 2000 04:34:05 -0000
Delivered-To: apmail-jakarta-ant-cvs@apache.org
Received: (qmail 82193 invoked by uid 1192); 4 Oct 2000 04:34:03 -0000
Date: 4 Oct 2000 04:34:03 -0000
Message-ID: <20001004043403.82192.qmail@locus.apache.org>
From: glennm@locus.apache.org
To: jakarta-ant-cvs@apache.org
Subject: cvs commit: jakarta-ant/src/main/org/apache/tools/ant/taskdefs
Copy.java Move.java Copydir.java Copyfile.java defaults.properties
Delete.java Deltree.java Rename.java
glennm 00/10/03 21:34:02
Modified: src/main/org/apache/tools/ant/taskdefs Copydir.java
Copyfile.java defaults.properties Delete.java
Deltree.java Rename.java
Added: src/main/org/apache/tools/ant/taskdefs Copy.java Move.java
Log:
Consolidation of Copyfile, Copydir, Delete, Deltree, and Rename into
Copy, Move, and Delete tasks.
Revision Changes Path
1.15 +2 -0 jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Copydir.java
Index: Copydir.java
===================================================================
RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Copydir.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- Copydir.java 2000/09/21 07:42:48 1.14
+++ Copydir.java 2000/10/04 04:33:57 1.15
@@ -95,6 +95,8 @@
}
public void execute() throws BuildException {
+ log("DEPRECATED - The copydir task is deprecated. Use copy instead.");
+
if (srcDir == null) {
throw new BuildException("src attribute must be set!",
location);
1.7 +2 -0 jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Copyfile.java
Index: Copyfile.java
===================================================================
RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Copyfile.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Copyfile.java 2000/09/18 07:54:59 1.6
+++ Copyfile.java 2000/10/04 04:33:58 1.7
@@ -89,6 +89,8 @@
}
public void execute() throws BuildException {
+ log("DEPRECATED - The copyfile task is deprecated. Use copy instead.");
+
if (srcFile == null) {
throw new BuildException("The src attribute must be present.", location);
}
1.43 +2 -0 jakarta-ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties
Index: defaults.properties
===================================================================
RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- defaults.properties 2000/09/21 09:00:34 1.42
+++ defaults.properties 2000/10/04 04:33:58 1.43
@@ -4,6 +4,8 @@
chmod=org.apache.tools.ant.taskdefs.Chmod
deltree=org.apache.tools.ant.taskdefs.Deltree
delete=org.apache.tools.ant.taskdefs.Delete
+copy=org.apache.tools.ant.taskdefs.Copy
+move=org.apache.tools.ant.taskdefs.Move
jar=org.apache.tools.ant.taskdefs.Jar
copydir=org.apache.tools.ant.taskdefs.Copydir
copyfile=org.apache.tools.ant.taskdefs.Copyfile
1.8 +182 -51 jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Delete.java
Index: Delete.java
===================================================================
RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Delete.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- Delete.java 2000/09/21 07:42:48 1.7
+++ Delete.java 2000/10/04 04:33:58 1.8
@@ -54,26 +54,39 @@
package org.apache.tools.ant.taskdefs;
import org.apache.tools.ant.*;
+import org.apache.tools.ant.types.*;
import java.io.*;
+import java.util.*;
/**
- * Deletes a single file or a set of files defined by a pattern.
+ * Deletes a file or directory, or set of files defined by a fileset.
+ * The original delete task would delete a file, or a set of files
+ * using the include/exclude syntax. The deltree task would delete a
+ * directory tree. This task combines the functionality of these two
+ * originally distinct tasks.
+ * Currently Delete extends MatchingTask. This is intend only
+ * to provide backwards compatibility for a release. The future position
+ * is to use nested filesets exclusively.
*
* @author stefano@apache.org
* @author Tom Dimock tad1@cornell.edu
+ * @author Glenn McAllister glennm@ca.ibm.com
*/
public class Delete extends MatchingTask {
- private File delDir = null;
+ protected File file = null;
+ protected File dir = null;
+ protected Vector filesets = new Vector();
+ protected boolean usedMatchingTask = false;
+
private int verbosity = Project.MSG_VERBOSE;
- private File f = null;
/**
* Set the name of a single file to be removed.
*
* @param file the file to be deleted
*/
- public void setFile(String file) {
- f = project.resolveFile(file);
+ public void setFile(File file) {
+ this.file = file;
}
/**
@@ -81,8 +94,8 @@
*
* @param dir the directory path.
*/
- public void setDir(String dir) {
- delDir = project.resolveFile(dir);
+ public void setDir(File dir) {
+ this.dir = dir;
}
/**
@@ -90,8 +103,8 @@
*
* @param verbose "true" or "on"
*/
- public void setVerbose(String verbose) {
- if ("true".equalsIgnoreCase(verbose.trim()) || "on".equalsIgnoreCase(verbose.trim())) {
+ public void setVerbose(boolean verbose) {
+ if (verbose) {
this.verbosity = Project.MSG_INFO;
} else {
this.verbosity = Project.MSG_VERBOSE;
@@ -99,60 +112,178 @@
}
/**
- * Make it so. Delete the file(s).
- *
- * @throws BuildException
+ * Adds a set of files (nested fileset attribute).
*/
- public void execute() throws BuildException {
- if (f == null && delDir == null) {
- throw new BuildException(" or attribute must be set!");
- }
-
- // old functionality must still work
- if (f != null) {
- if (f.exists()) {
- if (f.isDirectory()) {
- log("Directory: " + f.getAbsolutePath() + " cannot be removed with delete. Use Deltree instead.");
- } else {
- log("Deleting: " + f.getAbsolutePath());
+ public void addFileset(FileSet set) {
+ filesets.addElement(set);
+ }
+
+ /**
+ * add a name entry on the include list
+ */
+ public PatternSet.NameEntry createInclude() {
+ usedMatchingTask = true;
+ return super.createInclude();
+ }
+
+ /**
+ * add a name entry on the exclude list
+ */
+ public PatternSet.NameEntry createExclude() {
+ usedMatchingTask = true;
+ return super.createExclude();
+ }
- if (!f.delete()) {
- throw new BuildException("Unable to delete file " + f.getAbsolutePath());
- }
- }
- }
- }
+ /**
+ * add a set of patterns
+ */
+ public PatternSet createPatternSet() {
+ usedMatchingTask = true;
+ return super.createPatternSet();
+ }
- // now we'll do the fancy pattern-driven deletes
- if (delDir == null) {
- return;
- }
+ /**
+ * Sets the set of include patterns. Patterns may be separated by a comma
+ * or a space.
+ *
+ * @param includes the string containing the include patterns
+ */
+ public void setIncludes(String includes) {
+ usedMatchingTask = true;
+ super.setIncludes(includes);
+ }
- if (!delDir.exists()) {
- throw new BuildException("dir does not exist!");
- }
+ /**
+ * Sets the set of exclude patterns. Patterns may be separated by a comma
+ * or a space.
+ *
+ * @param excludes the string containing the exclude patterns
+ */
+ public void setExcludes(String excludes) {
+ usedMatchingTask = true;
+ super.setExcludes(excludes);
+ }
- DirectoryScanner ds = super.getDirectoryScanner(delDir);
- String[] files = ds.getIncludedFiles();
+ /**
+ * Sets whether default exclusions should be used or not.
+ *
+ * @param useDefaultExcludes "true"|"on"|"yes" when default exclusions
+ * should be used, "false"|"off"|"no" when they
+ * shouldn't be used.
+ */
+ public void setDefaultexcludes(boolean useDefaultExcludes) {
+ usedMatchingTask = true;
+ super.setDefaultexcludes(useDefaultExcludes);
+ }
- if (files.length > 0) {
- log("Deleting " + files.length + " file"
- + (files.length == 1 ? "" : "s")
- + " from " + delDir.getAbsolutePath());
+ /**
+ * Sets the name of the file containing the includes patterns.
+ *
+ * @param includesfile A string containing the filename to fetch
+ * the include patterns from.
+ */
+ public void setIncludesfile(File includesfile) {
+ usedMatchingTask = true;
+ super.setIncludesfile(includesfile);
+ }
- for (int i = 0; i < files.length; i++) {
- File f = new File(delDir, files[i]);
+ /**
+ * Sets the name of the file containing the includes patterns.
+ *
+ * @param excludesfile A string containing the filename to fetch
+ * the include patterns from.
+ */
+ public void setExcludesfile(File excludesfile) {
+ usedMatchingTask = true;
+ super.setExcludesfile(excludesfile);
+ }
- if (f.exists()) {
- log("Deleting: " + f.getAbsolutePath(), verbosity);
+ /**
+ * Delete the file(s).
+ */
+ public void execute() throws BuildException {
+ if (usedMatchingTask) {
+ log("DEPRECATED - Use of the implicit FileSet is deprecated. Use a nested fileset element instead.");
+ }
+
+ if (file == null && dir == null && filesets.size() == 0) {
+ throw new BuildException("At least one of the file or dir attributes, or a fileset element, must be set.");
+ }
- if (!f.delete()) {
- throw new BuildException("Unable to delete " + f.getAbsolutePath());
+ // delete the single file
+ if (file != null) {
+ if (file.exists()) {
+ if (file.isDirectory()) {
+ log("Directory " + file.getAbsolutePath() + " cannot be removed using the file attribute. Use dir instead.");
+ } else {
+ log("Deleting: " + file.getAbsolutePath());
+
+ if (!file.delete()) {
+ throw new BuildException("Unable to delete file " + file.getAbsolutePath());
}
}
- }
- }
+ } else {
+ log("Could not find file " + file.getAbsolutePath() + " to delete.");
+ }
+ }
+
+ // delete the directory
+ if (dir != null && !usedMatchingTask) {
+ log("Deleting directory " + dir.getAbsolutePath());
+ removeDir(dir);
+ }
+
+ // delete the files in the filesets
+ for (int i=0; i 0) {
+ log("Deleting " + files.length + " files from " + d.getAbsolutePath());
+ for (int j=0; j.
*/
package org.apache.tools.ant.taskdefs;
import org.apache.tools.ant.*;
import org.apache.tools.ant.types.*;
import java.io.*;
import java.util.*;
/**
* A consolidated copy task. Copies a file or directory to a new file
* or directory. Files are only copied if the source file is newer
* than the destination file, or when the destination file does not
* exist. It is possible to explicitly overwrite existing files.
*
* This implementation is based on Arnout Kuiper's initial design
* document, the following mailing list discussions, and the
* copyfile/copydir tasks.
*
* @author Glenn McAllister glennm@ca.ibm.com
*/
public class Copy extends Task {
protected File file = null; // the source file
protected File dir = null; // the source directory
protected File destFile = null; // the destination file
protected File destDir = null; // the destination directory
protected Vector filesets = new Vector();
protected boolean filtering = false;
protected boolean forceOverwrite = false;
protected boolean flatten = false;
protected int verbosity = Project.MSG_VERBOSE;
protected Hashtable fileCopyMap = new Hashtable();
/**
* Sets a single source file to copy.
*/
public void setFile(File file) {
this.file = file;
}
/**
* Sets a directory to copy.
*/
public void setDir(File dir) {
this.dir = dir;
}
/**
* Sets the destination file.
*/
public void setTofile(File destFile) {
this.destFile = destFile;
}
/**
* Sets the destination directory.
*/
public void setTodir(File destDir) {
this.destDir = destDir;
}
/**
* Sets filtering.
*/
public void setFiltering(boolean filtering) {
this.filtering = filtering;
}
/**
* Overwrite any existing destination file(s).
*/
public void setOverwrite(boolean overwrite) {
this.forceOverwrite = overwrite;
}
/**
* When copying directory trees, the files can be "flattened"
* into a single directory. If there are multiple files with
* the same name in the source directory tree, only the first
* file will be copied into the "flattened" directory, unless
* the forceoverwrite attribute is true.
*/
public void setFlatten(boolean flatten) {
this.flatten = flatten;
}
/**
* Used to force listing of all names of copied files.
*/
public void setVerbose(boolean verbose) {
if (verbose) {
this.verbosity = Project.MSG_INFO;
} else {
this.verbosity = Project.MSG_VERBOSE;
}
}
/**
* Adds a set of files (nested fileset attribute).
*/
public void addFileset(FileSet set) {
filesets.addElement(set);
}
/**
* Performs the copy operation.
*/
public void execute() throws BuildException {
// make sure we don't have an illegal set of options
validateAttributes();
// deal with the single file
if (file != null) {
if (destFile == null) {
destFile = new File(destDir, file.getName());
}
if (forceOverwrite ||
(file.lastModified() > destFile.lastModified())) {
fileCopyMap.put(file.getAbsolutePath(), destFile.getAbsolutePath());
}
}
// deal with the directory
if (dir != null) {
DirectoryScanner ds = new DirectoryScanner();
ds.setBasedir(dir);
ds.scan(); // include EVERYTHING
String[] srcFiles = ds.getIncludedFiles();
scan(dir, destDir, srcFiles); // add to fileCopyMap
}
// deal with the filesets
for (int i=0; i 0) {
throw new BuildException("Cannot concatenate multple files into a single file.");
}
if (destFile != null) {
destDir = new File(destFile.getParent()); // be 1.1 friendly
}
}
/**
* Compares source files to destination files to see if they should be
* copied.
*/
protected void scan(File fromDir, File toDir, String[] files) {
for (int i = 0; i < files.length; i++) {
String filename = files[i];
File src = new File(fromDir, filename);
File dest;
if (flatten) {
dest = new File(toDir, new File(filename).getName());
} else {
dest = new File(toDir, filename);
}
if (forceOverwrite ||
(src.lastModified() > dest.lastModified())) {
fileCopyMap.put(src.getAbsolutePath(),
dest.getAbsolutePath());
}
}
}
protected void doFileOperations() {
if (fileCopyMap.size() > 0) {
log("Copying " + fileCopyMap.size() + " files to " +
destDir.getAbsolutePath() );
Enumeration e = fileCopyMap.keys();
while (e.hasMoreElements()) {
String fromFile = (String) e.nextElement();
String toFile = (String) fileCopyMap.get(fromFile);
try {
log("Copying " + fromFile + " to " + toFile, verbosity);
project.copyFile(fromFile,
toFile,
filtering,
forceOverwrite);
} catch (IOException ioe) {
String msg = "Failed to copy " + fromFile + " to " + toFile
+ " due to " + ioe.getMessage();
throw new BuildException(msg, ioe, location);
}
}
}
}
}
1.1 jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Move.java
Index: Move.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* 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
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* 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", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* .
*/
package org.apache.tools.ant.taskdefs;
import org.apache.tools.ant.*;
import org.apache.tools.ant.types.*;
import java.io.*;
import java.util.*;
/**
* Moves a file or directory to a new file or directory. By default,
* the destination is overwriten when existing. When overwrite is
* turned off, then files are only moved if the source file is
* newer than the destination file, or when the destination file does
* not exist.
*
* Source files and directories are only deleted when the file or
* directory has been copied to the destination successfully. Filtering
* also works.
*
* This implementation is based on Arnout Kuiper's initial design
* document, the following mailing list discussions, and the
* copyfile/copydir tasks.
*
* @author Glenn McAllister glennm@ca.ibm.com
*/
public class Move extends Copy {
public Move() {
super();
forceOverwrite = true;
}
public void execute() throws BuildException {
super.execute();
// take care of the source directory
if (dir != null && dir.exists()) {
deleteDir(dir);
}
}
//************************************************************************
// protected and private methods
//************************************************************************
protected void doFileOperations() {
if (fileCopyMap.size() > 0) {
log("Moving " + fileCopyMap.size() + " files to " +
destDir.getAbsolutePath() );
Enumeration e = fileCopyMap.keys();
while (e.hasMoreElements()) {
String fromFile = (String) e.nextElement();
String toFile = (String) fileCopyMap.get(fromFile);
try {
log("Moving " + fromFile + " to " + toFile, verbosity);
project.copyFile(fromFile,
toFile,
filtering,
forceOverwrite);
File f = new File(fromFile);
if (!f.delete()) {
throw new BuildException("Unable to delete file " + f.getAbsolutePath());
}
} catch (IOException ioe) {
String msg = "Failed to copy " + fromFile + " to " + toFile
+ " due to " + ioe.getMessage();
throw new BuildException(msg, ioe, location);
}
}
}
}
protected void deleteDir(File d) {
String[] list = d.list();
for (int i = 0; i < list.length; i++) {
String s = list[i];
File f = new File(d, s);
if (f.isDirectory()) {
deleteDir(f);
} else {
throw new BuildException("UNEXPECTED ERROR - The file " + f.getAbsolutePath() + " should not exist!");
}
}
log("Deleting directory " + d.getAbsolutePath(), verbosity);
if (!d.delete()) {
throw new BuildException("Unable to delete directory " + dir.getAbsolutePath());
}
}
}