diff --git a/src/main/org/apache/tools/ant/taskdefs/AbstractCvsTask.java b/src/main/org/apache/tools/ant/taskdefs/AbstractCvsTask.java
new file mode 100644
index 000000000..feb5c73d4
--- /dev/null
+++ b/src/main/org/apache/tools/ant/taskdefs/AbstractCvsTask.java
@@ -0,0 +1,494 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000-2001 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", "Ant", 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 java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Commandline;
+import org.apache.tools.ant.types.Environment;
+
+/**
+ * original Cvs.java 1.20
+ *
+ * NOTE: This implementation has been moved here from Cvs.java with the addition of
+ * some accessors for extensibility. Another task can extend this with
+ * some customized output processing.
+ *
+ * @author costin@dnt.ro
+ * @author stefano@apache.org
+ * @author Wolfgang Werner wwerner@picturesafe.de
+ * @author Kevin Ross kevin.ross@bredex.com
+ */
+public abstract class AbstractCvsTask extends Task {
+
+ private Commandline cmd = new Commandline();
+
+ /**
+ * the CVSROOT variable.
+ */
+ private String cvsRoot;
+
+ /**
+ * the CVS_RSH variable.
+ */
+ private String cvsRsh;
+
+ /**
+ * the package/module to check out.
+ */
+ private String cvsPackage;
+
+ /**
+ * the CVS command to execute.
+ */
+ private String command = "checkout";
+
+ /**
+ * suppress information messages.
+ */
+ private boolean quiet = false;
+
+ /**
+ * report only, don't change any files.
+ */
+ private boolean noexec = false;
+
+ /**
+ * CVS port
+ */
+ private int port = 0;
+
+ /**
+ * CVS password file
+ */
+ private File passFile = null;
+
+ /**
+ * the directory where the checked out files should be placed.
+ */
+ private File dest;
+
+ /** whether or not to append stdout/stderr to existing files */
+ private boolean append = false;
+
+ /**
+ * the file to direct standard output from the command.
+ */
+ private File output;
+
+ /**
+ * the file to direct standard error from the command.
+ */
+ private File error;
+
+ /**
+ * If true it will stop the build if cvs exits with error.
+ * Default is false. (Iulian)
+ */
+ private boolean failOnError = false;
+
+
+ /**
+ * Create accessors for the following, to allow different handling of
+ * the output.
+ */
+ private ExecuteStreamHandler executeStreamHandler;
+ private OutputStream outputStream;
+ private OutputStream errorStream;
+
+ public void setExecuteStreamHandler(ExecuteStreamHandler executeStreamHandler){
+
+ this.executeStreamHandler = executeStreamHandler;
+ }
+
+ protected ExecuteStreamHandler getExecuteStreamHandler(){
+
+ if(this.executeStreamHandler == null){
+
+ setExecuteStreamHandler(new PumpStreamHandler(getOutputStream(), getErrorStream()));
+ }
+
+ return this.executeStreamHandler;
+ }
+
+
+ protected void setOutputStream(OutputStream outputStream){
+
+ this.outputStream = outputStream;
+ }
+
+ protected OutputStream getOutputStream(){
+
+ if(this.outputStream == null){
+
+ if (output != null) {
+ try {
+ setOutputStream(new PrintStream(new BufferedOutputStream(new FileOutputStream(output.getPath(), append))));
+ }
+ catch (IOException e) {
+ throw new BuildException(e, location);
+ }
+ }
+ else {
+ setOutputStream(new LogOutputStream(this, Project.MSG_INFO));
+ }
+ }
+
+ return this.outputStream;
+ }
+
+ protected void setErrorStream(OutputStream errorStream){
+
+ this.errorStream = errorStream;
+ }
+
+ protected OutputStream getErrorStream(){
+
+ if(this.errorStream == null){
+
+ if (error != null) {
+
+ try {
+ setErrorStream(new PrintStream(new BufferedOutputStream(new FileOutputStream(error.getPath(), append))));
+ }
+ catch (IOException e) {
+ throw new BuildException(e, location);
+ }
+ }
+ else {
+ setErrorStream(new LogOutputStream(this, Project.MSG_WARN));
+ }
+ }
+
+ return this.errorStream;
+ }
+
+ public void execute() throws BuildException {
+
+ // XXX: we should use JCVS (www.ice.com/JCVS) instead of command line
+ // execution so that we don't rely on having native CVS stuff around (SM)
+
+ // We can't do it ourselves as jCVS is GPLed, a third party task
+ // outside of jakarta repositories would be possible though (SB).
+
+ Commandline toExecute = new Commandline();
+
+ toExecute.setExecutable("cvs");
+ if (cvsRoot != null) {
+ toExecute.createArgument().setValue("-d");
+ toExecute.createArgument().setValue(cvsRoot);
+ }
+ if (noexec) {
+ toExecute.createArgument().setValue("-n");
+ }
+ if (quiet) {
+ toExecute.createArgument().setValue("-q");
+ }
+
+ toExecute.createArgument().setLine(command);
+
+ //
+ // get the other arguments.
+ //
+ toExecute.addArguments(cmd.getCommandline());
+
+ if (cvsPackage != null) {
+ toExecute.createArgument().setLine(cvsPackage);
+ }
+
+ Environment env = new Environment();
+
+ if(port>0){
+ Environment.Variable var = new Environment.Variable();
+ var.setKey("CVS_CLIENT_PORT");
+ var.setValue(String.valueOf(port));
+ env.addVariable(var);
+ }
+
+ /**
+ * Need a better cross platform integration with , so use the same filename.
+ */
+ /* But currently we cannot because 'cvs log' is not working with a pass file.
+ if(passFile == null){
+
+ File defaultPassFile = new File(System.getProperty("user.home") + File.separatorChar + ".cvspass");
+
+ if(defaultPassFile.exists())
+ this.setPassfile(defaultPassFile);
+ }
+ */
+
+ if(passFile!=null){
+ Environment.Variable var = new Environment.Variable();
+ var.setKey("CVS_PASSFILE");
+ var.setValue(String.valueOf(passFile));
+ env.addVariable(var);
+ log("Using cvs passfile: " + String.valueOf(passFile), Project.MSG_INFO);
+ }
+
+ if(cvsRsh!=null){
+ Environment.Variable var = new Environment.Variable();
+ var.setKey("CVS_RSH");
+ var.setValue(String.valueOf(cvsRsh));
+ env.addVariable(var);
+ }
+
+
+ //
+ // Just call the getExecuteStreamHandler() and let it handle
+ // the semantics of instantiation or retrieval.
+ //
+ Execute exe = new Execute(getExecuteStreamHandler(), null);
+
+ exe.setAntRun(project);
+ if (dest == null) {
+ dest = project.getBaseDir();
+ }
+
+ exe.setWorkingDirectory(dest);
+ exe.setCommandline(toExecute.getCommandline());
+ exe.setEnvironment(env.getVariables());
+
+ try {
+ log("Executing: " + executeToString(exe), Project.MSG_DEBUG);
+
+ int retCode = exe.execute();
+ /*Throw an exception if cvs exited with error. (Iulian)*/
+ if(failOnError && retCode != 0) {
+ throw new BuildException("cvs exited with error code "+ retCode);
+ }
+ }
+ catch (IOException e) {
+ throw new BuildException(e, location);
+ }
+ finally {
+ //
+ // condition used to be if(output == null) outputStream.close(). This is
+ // not appropriate. Check if the stream itself is not null, then close().
+ //
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ } catch (IOException e) {}
+ }
+
+ if (errorStream != null) {
+ try {
+ errorStream.close();
+ } catch (IOException e) {}
+ }
+ }
+ }
+
+ private String executeToString(Execute execute){
+
+ StringBuffer stringBuffer = new StringBuffer(250);
+ String[] commandLine = execute.getCommandline();
+ for(int i=0; i set it to null
+ if (root != null) {
+ if (root.trim().equals("")) {
+ root = null;
+ }
+ }
+
+ this.cvsRoot = root;
+ }
+
+ public String getCvsRoot(){
+
+ return this.cvsRoot;
+ }
+
+ public void setCvsRsh(String rsh) {
+ // Check if not real cvsrsh => set it to null
+ if (rsh != null) {
+ if (rsh.trim().equals("")) {
+ rsh = null;
+ }
+ }
+
+ this.cvsRsh = rsh;
+ }
+
+ public String getCvsRsh(){
+
+ return this.cvsRsh;
+ }
+
+ public void setPort(int port){
+ this.port = port;
+ }
+
+ public int getPort(){
+
+ return this.port;
+ }
+
+ public void setPassfile(File passFile){
+ this.passFile = passFile;
+ }
+
+ public File getPassFile(){
+
+ return this.passFile;
+ }
+
+ public void setDest(File dest) {
+ this.dest = dest;
+ }
+
+ public File getDest(){
+
+ return this.dest;
+ }
+
+ public void setPackage(String p) {
+ this.cvsPackage = p;
+ }
+
+ public String getPackage(){
+
+ return this.cvsPackage;
+ }
+
+ public void setTag(String p) {
+ // Check if not real tag => set it to null
+ if (p != null && p.trim().length() > 0) {
+ addCommandArgument("-r");
+ addCommandArgument(p);
+ }
+ }
+
+ /**
+ * This needs to be public to allow configuration
+ * of commands externally.
+ */
+ public void addCommandArgument(String arg){
+
+ this.cmd.createArgument().setValue(arg);
+ }
+
+ public void setDate(String p) {
+ if(p != null && p.trim().length() > 0) {
+ addCommandArgument("-D");
+ addCommandArgument(p);
+ }
+ }
+
+ public void setCommand(String c) {
+ this.command = c;
+ }
+
+ public void setQuiet(boolean q) {
+ quiet = q;
+ }
+
+ public void setNoexec(boolean ne) {
+ noexec = ne;
+ }
+
+ public void setOutput(File output) {
+ this.output = output;
+ }
+
+ public void setError(File error) {
+ this.error = error;
+ }
+
+ public void setAppend(boolean value){
+ this.append = value;
+ }
+
+ public void setFailOnError(boolean failOnError) {
+ this.failOnError = failOnError;
+ }
+}
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/Cvs.java b/src/main/org/apache/tools/ant/taskdefs/Cvs.java
index 9a7d446cf..0428f3c70 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Cvs.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Cvs.java
@@ -53,291 +53,23 @@
*/
package org.apache.tools.ant.taskdefs;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.types.Commandline;
-import org.apache.tools.ant.types.Environment;
-
/**
+ * original 1.20
+ *
+ * NOTE: This implementation has been moved to AbstractCvsTask with the addition of
+ * some accessors for extensibility.
*
*
* @author costin@dnt.ro
* @author stefano@apache.org
* @author Wolfgang Werner wwerner@picturesafe.de
+ * @author Kevin Ross kevin.ross@bredex.com
*/
-
-public class Cvs extends Task {
-
- private Commandline cmd = new Commandline();
+public class Cvs extends AbstractCvsTask {
- /**
- * the CVSROOT variable.
- */
- private String cvsRoot;
-
- /**
- * the CVS_RSH variable.
- */
- private String cvsRsh;
-
- /**
- * the package/module to check out.
- */
- private String pack;
-
- /**
- * the CVS command to execute.
- */
- private String command = "checkout";
-
- /**
- * suppress information messages.
- */
- private boolean quiet = false;
-
- /**
- * report only, don't change any files.
- */
- private boolean noexec = false;
-
- /**
- * CVS port
- */
- private int port = 0;
-
- /**
- * CVS password file
- */
- private File passFile = null;
-
- /**
- * the directory where the checked out files should be placed.
- */
- private File dest;
-
- /** whether or not to append stdout/stderr to existing files */
- private boolean append = false;
-
- /**
- * the file to direct standard output from the command.
- */
- private File output;
-
- /**
- * the file to direct standard error from the command.
- */
- private File error;
-
- /**
- * If true it will stop the build if cvs exits with error.
- * Default is false. (Iulian)
- */
- private boolean failOnError = false;
-
-
- public void execute() throws BuildException {
-
- // XXX: we should use JCVS (www.ice.com/JCVS) instead of command line
- // execution so that we don't rely on having native CVS stuff around (SM)
-
- // We can't do it ourselves as jCVS is GPLed, a third party task
- // outside of jakarta repositories would be possible though (SB).
-
- Commandline toExecute = new Commandline();
-
- toExecute.setExecutable("cvs");
- if (cvsRoot != null) {
- toExecute.createArgument().setValue("-d");
- toExecute.createArgument().setValue(cvsRoot);
- }
- if (noexec) {
- toExecute.createArgument().setValue("-n");
- }
- if (quiet) {
- toExecute.createArgument().setValue("-q");
- }
- toExecute.createArgument().setLine(command);
- toExecute.addArguments(cmd.getCommandline());
-
- if (pack != null) {
- toExecute.createArgument().setLine(pack);
- }
-
- Environment env = new Environment();
-
- if(port>0){
- Environment.Variable var = new Environment.Variable();
- var.setKey("CVS_CLIENT_PORT");
- var.setValue(String.valueOf(port));
- env.addVariable(var);
- }
-
- if(passFile!=null){
- Environment.Variable var = new Environment.Variable();
- var.setKey("CVS_PASSFILE");
- var.setValue(String.valueOf(passFile));
- env.addVariable(var);
- }
-
- if(cvsRsh!=null){
- Environment.Variable var = new Environment.Variable();
- var.setKey("CVS_RSH");
- var.setValue(String.valueOf(cvsRsh));
- env.addVariable(var);
- }
-
- ExecuteStreamHandler streamhandler = null;
- OutputStream outputstream = null;
- OutputStream errorstream = null;
- if (error == null && output == null) {
- streamhandler = new LogStreamHandler(this, Project.MSG_INFO,
- Project.MSG_WARN);
- }
- else {
- if (output != null) {
- try {
- outputstream = new PrintStream(new BufferedOutputStream(new FileOutputStream(output.getPath(), append)));
- } catch (IOException e) {
- throw new BuildException(e, location);
- }
- }
- else {
- outputstream = new LogOutputStream(this, Project.MSG_INFO);
- }
- if (error != null) {
- try {
- errorstream = new PrintStream(new BufferedOutputStream(new FileOutputStream(error.getPath(), append)));
- } catch (IOException e) {
- throw new BuildException(e, location);
- }
- }
- else {
- errorstream = new LogOutputStream(this, Project.MSG_WARN);
- }
- streamhandler = new PumpStreamHandler(outputstream, errorstream);
- }
-
- Execute exe = new Execute(streamhandler,
- null);
-
- exe.setAntRun(project);
- if (dest == null) {
- dest = project.getBaseDir();
- }
- exe.setWorkingDirectory(dest);
-
- exe.setCommandline(toExecute.getCommandline());
- exe.setEnvironment(env.getVariables());
- try {
- int retCode = exe.execute();
- /*Throw an exception if cvs exited with error. (Iulian)*/
- if(failOnError && retCode != 0) {
- throw new BuildException("cvs exited with error code "+ retCode);
- }
- } catch (IOException e) {
- throw new BuildException(e, location);
- } finally {
- if (output != null) {
- try {
- outputstream.close();
- } catch (IOException e) {}
- }
- if (error != null) {
- try {
- errorstream.close();
- } catch (IOException e) {}
- }
- }
- }
-
- public void setCvsRoot(String root) {
- // Check if not real cvsroot => set it to null
- if (root != null) {
- if (root.trim().equals("")) {
- root = null;
- }
- }
-
- this.cvsRoot = root;
- }
-
- public void setCvsRsh(String rsh) {
- // Check if not real cvsrsh => set it to null
- if (rsh != null) {
- if (rsh.trim().equals("")) {
- rsh = null;
- }
- }
-
- this.cvsRsh = rsh;
- }
-
- public void setPort(int port){
- this.port = port;
- }
-
- public void setPassfile(File passFile){
- this.passFile = passFile;
- }
-
- public void setDest(File dest) {
- this.dest = dest;
- }
-
- public void setPackage(String p) {
- this.pack = p;
- }
-
- public void setTag(String p) {
- // Check if not real tag => set it to null
- if (p != null && p.trim().length() > 0) {
- cmd.createArgument().setValue("-r");
- cmd.createArgument().setValue(p);
- }
- }
-
-
- public void setDate(String p) {
- if(p != null && p.trim().length() > 0) {
- cmd.createArgument().setValue("-D");
- cmd.createArgument().setValue(p);
- }
- }
-
- public void setCommand(String c) {
- this.command = c;
- }
-
- public void setQuiet(boolean q) {
- quiet = q;
- }
-
- public void setNoexec(boolean ne) {
- noexec = ne;
- }
-
- public void setOutput(File output) {
- this.output = output;
- }
-
- public void setError(File error) {
- this.error = error;
- }
-
- public void setAppend(boolean value){
- this.append = value;
- }
-
- public void setFailOnError(boolean failOnError) {
- this.failOnError = failOnError;
+ public Cvs(){
+
+ setTaskName("cvs");
}
}