bodewig 2005/02/04 00:08:59
Modified: . build.xml
src/etc/testcases/taskdefs sync.xml
src/main/org/apache/tools/ant/taskdefs Sync.java
src/main/org/apache/tools/ant/types AbstractFileSet.java
CommandlineJava.java
src/main/org/apache/tools/ant/types/selectors
NotSelector.java
src/main/org/apache/tools/ant/util LeadPipeInputStream.java
src/testcases/org/apache/tools/ant ProjectTest.java
src/testcases/org/apache/tools/ant/taskdefs SyncTest.java
Log:
Turn <deleteFromTarget> into <preserveInTarget> in <sync>
Revision Changes Path
1.453 +1 -10 ant/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/ant/build.xml,v
retrieving revision 1.452
retrieving revision 1.453
diff -u -r1.452 -r1.453
--- build.xml 1 Feb 2005 07:50:21 -0000 1.452
+++ build.xml 4 Feb 2005 08:08:58 -0000 1.453
@@ -158,14 +158,6 @@
</or>
</selector>
- <!-- classes that should be present in Sun based JVMs, but not in
- Kaffe for example -->
- <selector id="needs.sun.tools">
- <or>
- <filename name="${optional.package}/Javah*"/>
- </or>
- </selector>
-
<selector id="needs.sun.uue">
<filename name="${ant.package}/taskdefs/email/UUMailer*"/>
</selector>
@@ -647,7 +639,6 @@
<selector refid="needs.jdk1.3+" unless="jdk1.3+"/>
<selector refid="needs.jdk1.4+" unless="jdk1.4+"/>
<selector refid="needs.jdk1.5+" unless="jdk1.5+"/>
- <selector refid="needs.sun.tools" unless="sun.tools.present"/>
<selector refid="needs.sun.uue" unless="sunuue.present"/>
<selector refid="needs.sun.b64" unless="base64.present"/>
@@ -1670,4 +1661,4 @@
description="--> creates a minimum distribution in ./dist"
depends="dist-lite"/>
-</project>
+</project>
\ No newline at end of file
1.3 +27 -3 ant/src/etc/testcases/taskdefs/sync.xml
Index: sync.xml
===================================================================
RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/sync.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- sync.xml 20 Jan 2005 13:50:56 -0000 1.2
+++ sync.xml 4 Feb 2005 08:08:59 -0000 1.3
@@ -35,6 +35,17 @@
</sync>
</target>
+ <target name="copyandremove-emptypreserve" depends="setup">
+ <mkdir dir="${src}/a/b/c"/>
+ <touch file="${src}/a/b/c/d"/>
+ <mkdir dir="${dest}/e"/>
+ <touch file="${dest}/e/f"/>
+ <sync todir="${dest}">
+ <fileset dir="${src}"/>
+ <preserveintarget/>
+ </sync>
+ </target>
+
<target name="emptycopy" depends="setup">
<mkdir dir="${src}/a/b/c"/>
<touch file="${src}/a/b/c/d"/>
@@ -69,9 +80,22 @@
<touch file="${dest}/e/f"/>
<sync todir="${dest}">
<fileset dir="${src}"/>
- <deletefromtarget>
- <exclude name="e/f"/>
- </deletefromtarget>
+ <preserveintarget>
+ <include name="e/f"/>
+ </preserveintarget>
+ </sync>
+ </target>
+
+ <target name="copynoremove-selectors" depends="setup">
+ <mkdir dir="${src}/a/b/c"/>
+ <touch file="${src}/a/b/c/d"/>
+ <mkdir dir="${dest}/e"/>
+ <touch file="${dest}/e/f"/>
+ <sync todir="${dest}">
+ <fileset dir="${src}"/>
+ <preserveintarget>
+ <filename name="e/f"/>
+ </preserveintarget>
</sync>
</target>
1.21 +37 -14 ant/src/main/org/apache/tools/ant/taskdefs/Sync.java
Index: Sync.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Sync.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- Sync.java 20 Jan 2005 14:30:07 -0000 1.20
+++ Sync.java 4 Feb 2005 08:08:59 -0000 1.21
@@ -34,6 +34,9 @@
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.AbstractFileSet;
import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.PatternSet;
+import org.apache.tools.ant.types.selectors.FileSelector;
+import org.apache.tools.ant.types.selectors.NoneSelector;
/**
* Synchronize a local target directory from the files defined
@@ -163,8 +166,33 @@
DirectoryScanner ds = null;
if (syncTarget != null) {
- syncTarget.setTargetDir(toDir);
- ds = syncTarget.getDirectoryScanner(getProject());
+ FileSet fs = new FileSet();
+ fs.setDir(toDir);
+ fs.setCaseSensitive(syncTarget.isCaseSensitive());
+ fs.setFollowSymlinks(syncTarget.isFollowSymlinks());
+
+ // preserveInTarget would find all files we want to keep,
+ // but we need to find all that we want to delete - so the
+ // meaning of all patterns and selectors must be inverted
+ PatternSet ps = syncTarget.mergePatterns(getProject());
+ String[] excludes = ps.getExcludePatterns(getProject());
+ fs.appendExcludes(ps.getIncludePatterns(getProject()));
+ fs.appendIncludes(ps.getExcludePatterns(getProject()));
+ fs.setDefaultexcludes(!syncTarget.getDefaultexcludes());
+
+ // selectors are implicitly ANDed in DirectoryScanner. To
+ // revert their logic we wrap them into a <none> selector
+ // instead.
+ FileSelector[] s = syncTarget.getSelectors(getProject());
+ if (s.length > 0) {
+ NoneSelector ns = new NoneSelector();
+ for (int i = 0; i < s.length; i++) {
+ ns.appendSelector(s[i]);
+ }
+ fs.appendSelector(ns);
+ }
+
+ ds = fs.getDirectoryScanner(getProject());
} else {
ds = new DirectoryScanner();
ds.setBasedir(toDir);
@@ -180,7 +208,7 @@
++removedCount[1];
}
String[] dirs = ds.getIncludedDirectories();
- // ds returns the directories as it has visited them.
+ // ds returns the directories in lexicographic order.
// iterating through the array backwards means we are deleting
// leaves before their parent nodes - thus making sure (well,
// more likely) that the directories are empty when we try to
@@ -306,13 +334,13 @@
* are not present in any source directory.
*
* <p>You must not invoke this method more than once.</p>
- * @param s a deletefromtarget nested element
+ * @param s a preserveintarget nested element
* @since Ant 1.7
*/
- public void addDeleteFromTarget(SyncTarget s) {
+ public void addPreserveInTarget(SyncTarget s) {
if (syncTarget != null) {
throw new BuildException("you must not specify multiple "
- + "deletefromtaget elements.");
+ + "preserveintarget elements.");
}
syncTarget = s;
}
@@ -381,24 +409,19 @@
*/
public SyncTarget() {
super();
- setDefaultexcludes(false);
}
/**
* Override AbstractFileSet#setDir(File) to disallow
- * setting the directory. This is now set by #setTargetDir(File).
+ * setting the directory.
* @param dir ignored
* @throws BuildException always
*/
public void setDir(File dir) throws BuildException {
- throw new BuildException("synctarget doesn't support the dir "
+ throw new BuildException("preserveintarget doesn't support the
dir "
+ "attribute");
}
- private void setTargetDir(File dir) throws BuildException {
- super.setDir(dir);
- }
-
}
/**
1.37 +108 -14
ant/src/main/org/apache/tools/ant/types/AbstractFileSet.java
Index: AbstractFileSet.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/types/AbstractFileSet.java,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- AbstractFileSet.java 10 Dec 2004 21:49:32 -0000 1.36
+++ AbstractFileSet.java 4 Feb 2005 08:08:59 -0000 1.37
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2004 The Apache Software Foundation
+ * Copyright 2002-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -63,7 +63,7 @@
private File dir;
private boolean useDefaultExcludes = true;
- private boolean isCaseSensitive = true;
+ private boolean caseSensitive = true;
private boolean followSymlinks = true;
/**
@@ -84,7 +84,7 @@
this.additionalPatterns = fileset.additionalPatterns;
this.selectors = fileset.selectors;
this.useDefaultExcludes = fileset.useDefaultExcludes;
- this.isCaseSensitive = fileset.isCaseSensitive;
+ this.caseSensitive = fileset.caseSensitive;
this.followSymlinks = fileset.followSymlinks;
setProject(fileset.getProject());
}
@@ -216,6 +216,24 @@
}
/**
+ * Appends <code>includes</code> to the current list of include
+ * patterns.
+ *
+ * @param includes array containing the include patterns.
+ * @since Ant 1.7
+ */
+ public void appendIncludes(String[] includes) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ if (includes != null) {
+ for (int i = 0; i < includes.length; i++) {
+ defaultPatterns.createInclude().setName(includes[i]);
+ }
+ }
+ }
+
+ /**
* Appends <code>excludes</code> to the current list of exclude
* patterns.
*
@@ -231,6 +249,24 @@
}
/**
+ * Appends <code>excludes</code> to the current list of include
+ * patterns.
+ *
+ * @param excludes array containing the exclude patterns.
+ * @since Ant 1.7
+ */
+ public void appendExcludes(String[] excludes) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ if (excludes != null) {
+ for (int i = 0; i < excludes.length; i++) {
+ defaultPatterns.createExclude().setName(excludes[i]);
+ }
+ }
+ }
+
+ /**
* Sets the <code>File</code> containing the includes patterns.
*
* @param incl <code>File</code> instance.
@@ -267,15 +303,37 @@
}
/**
+ * Whether default exclusions should be used or not.
+ * @since Ant 1.7
+ */
+ public boolean getDefaultexcludes() {
+ return (isReference())
+ ? getRef(getProject()).getDefaultexcludes() : useDefaultExcludes;
+ }
+
+ /**
* Sets case sensitivity of the file system.
*
* @param isCaseSensitive <code>boolean</code>.
*/
- public void setCaseSensitive(boolean isCaseSensitive) {
+ public void setCaseSensitive(boolean caseSensitive) {
if (isReference()) {
throw tooManyAttributes();
}
- this.isCaseSensitive = isCaseSensitive;
+ this.caseSensitive = caseSensitive;
+ }
+
+ /**
+ * Find out if the fileset is case sensitive.
+ *
+ * @return <code>boolean</code> indicating whether the fileset is
+ * case sensitive.
+ *
+ * @since Ant 1.7
+ */
+ public boolean isCaseSensitive() {
+ return (isReference())
+ ? getRef(getProject()).isCaseSensitive() : caseSensitive;
}
/**
@@ -365,16 +423,12 @@
}
ds.setBasedir(dir);
- final int count = additionalPatterns.size();
- for (int i = 0; i < count; i++) {
- Object o = additionalPatterns.elementAt(i);
- defaultPatterns.append((PatternSet) o, p);
- }
+ PatternSet ps = mergePatterns(p);
p.log(getDataTypeName() + ": Setup scanner in dir " + dir
- + " with " + defaultPatterns, Project.MSG_DEBUG);
+ + " with " + ps, Project.MSG_DEBUG);
- ds.setIncludes(defaultPatterns.getIncludePatterns(p));
- ds.setExcludes(defaultPatterns.getExcludePatterns(p));
+ ds.setIncludes(ps.getIncludePatterns(p));
+ ds.setExcludes(ps.getExcludePatterns(p));
if (ds instanceof SelectorScanner) {
SelectorScanner ss = (SelectorScanner) ds;
ss.setSelectors(getSelectors(p));
@@ -382,7 +436,7 @@
if (useDefaultExcludes) {
ds.addDefaultExcludes();
}
- ds.setCaseSensitive(isCaseSensitive);
+ ds.setCaseSensitive(caseSensitive);
}
/**
@@ -683,4 +737,44 @@
}
}
+ /**
+ * @return the include patterns of the default pattern set and all
+ * nested patternsets.
+ *
+ * @since Ant 1.7
+ */
+ public String[] mergeIncludes(Project p) {
+ return mergePatterns(p).getIncludePatterns(p);
+ }
+
+ /**
+ * @return the exclude patterns of the default pattern set and all
+ * nested patternsets.
+ *
+ * @since Ant 1.7
+ */
+ public String[] mergeExcludes(Project p) {
+ return mergePatterns(p).getExcludePatterns(p);
+ }
+
+ /**
+ * @return the default patternset merged with the additional sets
+ * in a new PatternSet instance.
+ *
+ * @since Ant 1.7
+ */
+ public PatternSet mergePatterns(Project p) {
+ if (isReference()) {
+ return getRef(p).mergePatterns(p);
+ }
+ PatternSet ps = new PatternSet();
+ ps.append(defaultPatterns, p);
+ final int count = additionalPatterns.size();
+ for (int i = 0; i < count; i++) {
+ Object o = additionalPatterns.elementAt(i);
+ ps.append((PatternSet) o, p);
+ }
+ return ps;
+ }
+
}
1.67 +1 -1
ant/src/main/org/apache/tools/ant/types/CommandlineJava.java
Index: CommandlineJava.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/types/CommandlineJava.java,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -r1.66 -r1.67
--- CommandlineJava.java 2 Feb 2005 12:52:49 -0000 1.66
+++ CommandlineJava.java 4 Feb 2005 08:08:59 -0000 1.67
@@ -74,7 +74,7 @@
* Specialized Environment class for System properties
*/
public static class SysProperties extends Environment implements
Cloneable {
- private Properties sys = null;
+ Properties sys = null;
private Vector propertySets = new Vector();
/**
1.10 +11 -1
ant/src/main/org/apache/tools/ant/types/selectors/NotSelector.java
Index: NotSelector.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/types/selectors/NotSelector.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- NotSelector.java 9 Mar 2004 16:48:47 -0000 1.9
+++ NotSelector.java 4 Feb 2005 08:08:59 -0000 1.10
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2004 The Apache Software Foundation
+ * Copyright 2002-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,16 @@
}
/**
+ * Constructor that inverts the meaning of its argument.
+ * @param other the selector to invert
+ * @since Ant 1.7
+ */
+ public NotSelector(FileSelector other) {
+ this();
+ appendSelector(other);
+ }
+
+ /**
* @return a string representation of the selector
*/
public String toString() {
1.4 +45 -0
ant/src/main/org/apache/tools/ant/util/LeadPipeInputStream.java
Index: LeadPipeInputStream.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/util/LeadPipeInputStream.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LeadPipeInputStream.java 2 Feb 2005 12:52:50 -0000 1.3
+++ LeadPipeInputStream.java 4 Feb 2005 08:08:59 -0000 1.4
@@ -28,6 +28,7 @@
/**
* Special <CODE>PipedInputStream</CODE> that will not die
* when the writing <CODE>Thread</CODE> is no longer alive.
+ * @since Ant 1.6.2
*/
public class LeadPipeInputStream extends PipedInputStream {
private ProjectComponent managingPc;
@@ -40,6 +41,16 @@
}
/**
+ * Construct a new <CODE>LeadPipeInputStream</CODE>
+ * with the specified buffer size.
+ * @param size the size of the circular buffer.
+ */
+ public LeadPipeInputStream(int size) {
+ super();
+ setBufferSize(size);
+ }
+
+ /**
* Construct a new <CODE>LeadPipeInputStream</CODE> to pull
* from the specified <CODE>PipedOutputStream</CODE>.
* @param src the <CODE>PipedOutputStream</CODE> source.
@@ -49,6 +60,18 @@
super(src);
}
+ /**
+ * Construct a new <CODE>LeadPipeInputStream</CODE> to pull
+ * from the specified <CODE>PipedOutputStream</CODE>, using a
+ * circular buffer of the specified size.
+ * @param src the <CODE>PipedOutputStream</CODE> source.
+ * @param size the size of the circular buffer.
+ */
+ public LeadPipeInputStream(PipedOutputStream src, int size) throws
IOException {
+ super(src);
+ setBufferSize(size);
+ }
+
//inherit doc
public synchronized int read() throws IOException {
int result = -1;
@@ -69,6 +92,28 @@
}
/**
+ * Set the size of the buffer.
+ * @param size the new buffer size. Ignored if <= current size.
+ */
+ public synchronized void setBufferSize(int size) {
+ if (size > buffer.length) {
+ byte[] newBuffer = new byte[size];
+ if (in >= 0) {
+ if (in > out) {
+ System.arraycopy(buffer, out, newBuffer, out, in - out);
+ } else {
+ int outlen = buffer.length - out;
+ System.arraycopy(buffer, out, newBuffer, 0, outlen);
+ System.arraycopy(buffer, 0, newBuffer, outlen, in);
+ in+= outlen;
+ out = 0;
+ }
+ }
+ buffer = newBuffer;
+ }
+ }
+
+ /**
* Set a managing <CODE>Task</CODE> for
* this <CODE>LeadPipeInputStream</CODE>.
* @param task the managing <CODE>Task</CODE>.
1.28 +1 -1 ant/src/testcases/org/apache/tools/ant/ProjectTest.java
Index: ProjectTest.java
===================================================================
RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/ProjectTest.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- ProjectTest.java 7 Jan 2005 15:04:09 -0000 1.27
+++ ProjectTest.java 4 Feb 2005 08:08:59 -0000 1.28
@@ -34,7 +34,7 @@
/**
* Very limited test class for Project. Waiting to be extended.
*
-*/
+ */
public class ProjectTest extends TestCase {
private Project p;
1.4 +20 -0
ant/src/testcases/org/apache/tools/ant/taskdefs/SyncTest.java
Index: SyncTest.java
===================================================================
RCS file:
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/SyncTest.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SyncTest.java 20 Jan 2005 13:50:57 -0000 1.3
+++ SyncTest.java 4 Feb 2005 08:08:59 -0000 1.4
@@ -70,6 +70,17 @@
assertDebuglogContaining("Removed 1 dangling directory from");
}
+ public void testCopyAndRemoveEmptyPreserve() {
+ executeTarget("copyandremove-emptypreserve");
+ String d = getProject().getProperty("dest") + "/a/b/c/d";
+ assertFileIsPresent(d);
+ String f = getProject().getProperty("dest") + "/e/f";
+ assertFileIsNotPresent(f);
+ assertTrue(getFullLog().indexOf("Removing orphan file:") > -1);
+ assertDebuglogContaining("Removed 1 dangling file from");
+ assertDebuglogContaining("Removed 1 dangling directory from");
+ }
+
public void testEmptyDirCopyAndRemove() {
executeTarget("emptydircopyandremove");
String d = getProject().getProperty("dest") + "/a/b/c/d";
@@ -92,6 +103,15 @@
assertTrue(getFullLog().indexOf("Removing orphan file:") == -1);
}
+ public void testCopyNoRemoveSelectors() {
+ executeTarget("copynoremove-selectors");
+ String d = getProject().getProperty("dest") + "/a/b/c/d";
+ assertFileIsPresent(d);
+ String f = getProject().getProperty("dest") + "/e/f";
+ assertFileIsPresent(f);
+ assertTrue(getFullLog().indexOf("Removing orphan file:") == -1);
+ }
+
public void assertFileIsPresent(String f) {
assertTrue("Expected file " + f,
getProject().resolveFile(f).exists());
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]