|
|
@@ -1,7 +1,7 @@ |
|
|
|
/* |
|
|
|
* The Apache Software License, Version 1.1 |
|
|
|
* |
|
|
|
* Copyright (c) 2000-2001 The Apache Software Foundation. All rights |
|
|
|
* Copyright (c) 2002 The Apache Software Foundation. All rights |
|
|
|
* reserved. |
|
|
|
* |
|
|
|
* Redistribution and use in source and binary forms, with or without |
|
|
@@ -69,8 +69,8 @@ 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 |
|
|
|
* 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 |
|
|
@@ -79,107 +79,107 @@ import org.apache.tools.ant.types.Environment; |
|
|
|
* @author Kevin Ross <a href="mailto:kevin.ross@bredex.com">kevin.ross@bredex.com</a> |
|
|
|
*/ |
|
|
|
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 |
|
|
|
* 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)))); |
|
|
@@ -192,21 +192,21 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
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)))); |
|
|
|
} |
|
|
@@ -218,20 +218,20 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
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"); |
|
|
@@ -243,40 +243,40 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
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 <cvspass>, 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"); |
|
|
@@ -284,21 +284,21 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
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(); |
|
|
@@ -310,16 +310,16 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
|
|
|
|
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 |
|
|
@@ -330,7 +330,7 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
outputStream.close(); |
|
|
|
} catch (IOException e) {} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (errorStream != null) { |
|
|
|
try { |
|
|
|
errorStream.close(); |
|
|
@@ -338,13 +338,13 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String executeToString(Execute execute){ |
|
|
|
|
|
|
|
|
|
|
|
StringBuffer stringBuffer = new StringBuffer(250); |
|
|
|
String[] commandLine = execute.getCommandline(); |
|
|
|
for(int i=0; i<commandLine.length; i++){ |
|
|
|
|
|
|
|
|
|
|
|
stringBuffer.append(commandLine[i]); |
|
|
|
stringBuffer.append(" "); |
|
|
|
} |
|
|
@@ -353,8 +353,8 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
stringBuffer.append(newLine); |
|
|
|
stringBuffer.append("environment:"); |
|
|
|
stringBuffer.append(newLine); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String[] variableArray = execute.getEnvironment(); |
|
|
|
|
|
|
|
if(variableArray != null){ |
|
|
@@ -368,24 +368,24 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
|
|
|
|
return stringBuffer.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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 String getCvsRoot(){ |
|
|
|
|
|
|
|
|
|
|
|
return this.cvsRoot; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setCvsRsh(String rsh) { |
|
|
|
// Check if not real cvsrsh => set it to null |
|
|
|
if (rsh != null) { |
|
|
@@ -393,51 +393,51 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
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) { |
|
|
@@ -445,47 +445,47 @@ public abstract class AbstractCvsTask extends Task { |
|
|
|
addCommandArgument(p); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* This needs to be public to allow configuration |
|
|
|
* 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; |
|
|
|
} |
|
|
|