Hello,
My name is Oscar Forero, I am a Java Developer in germany and we are starting to use Ant in our development enviroment, this week I was ask to do a change that will involve change a lot of classe, and I try to do the script with ant. To say it short ... I hit some limitations, like for example the Clear Case tasks don�t work with file sets, which make very dificult to do any real work with them, I also see that the Fileset elements always create a new instance of a DirectoryScanner which mean that for every task a deepscan wil be performed, which leads to very poor performance, and that is not possible to use fileset in Replace ...
To solve this I propose:
Enhance CC tasks to use Filesets.
Add a setRecyclable property to the Abstract File set, that will reuse a directory scanner if true.
Add a setFileSetRef property to the MatchingTask class, and use a reference to a fileset instead of the internal fileset is is set.
I did this changes and tested in my machine, it works and enhnace the speed of script that have to perform different tasks on the same file sets, this also solve the problem that the selection for the check out probably will not return the same files, this is an example of the kind of script that will benefit:
Check out 1000 files Replace Check in 1000 files
I attached the changed files, I will really appreciate if those changes are accepted ... or taking into considerations.
Best regards,
Oscar Forero.
/* * The Apache Software License, Version 1.1 * * Copyright (c) 2000,2002 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 [EMAIL PROTECTED] * * 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 * <http://www.apache.org/>. */
package org.apache.tools.ant.taskdefs.optional.clearcase;
import java.util.Iterator;
import java.util.List;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Commandline;
import org.apache.tools.ant.types.FileSet;
/**
* Performs ClearCase checkout.
*
* <p>
* The following attributes are interpretted:
* <table border="1">
* <tr>
* <th>Attribute</th>
* <th>Values</th>
* <th>Required</th>
* </tr>
* <tr>
* <td>viewpath</td>
* <td>Path to the ClearCase view file or directory that the command will
operate on</td>
* <td>No</td>
* <tr>
* <tr>
* <td>reserved</td>
* <td>Specifies whether to check out the file as reserved or not</td>
* <td>Yes</td>
* <tr>
* <tr>
* <td>out</td>
* <td>Creates a writable file under a different filename</td>
* <td>No</td>
* <tr>
* <tr>
* <td>nodata</td>
* <td>Checks out the file but does not create an editable file containing
its data</td>
* <td>No</td>
* <tr>
* <tr>
* <td>branch</td>
* <td>Specify a branch to check out the file to</td>
* <td>No</td>
* <tr>
* <tr>
* <td>version</td>
* <td>Allows checkout of a version other than main latest</td>
* <td>No</td>
* <tr>
* <tr>
* <td>nowarn</td>
* <td>Suppress warning messages</td>
* <td>No</td>
* <tr>
* <tr>
* <td>comment</td>
* <td>Specify a comment. Only one of comment or cfile may be used.</td>
* <td>No</td>
* <tr>
* <tr>
* <td>commentfile</td>
* <td>Specify a file containing a comment. Only one of comment or cfile
may be used.</td>
* <td>No</td>
* <tr>
* </table>
*
* @author Curtis White
* @author Oscar Forero
*/
public class CCCheckout extends ClearCase {
private boolean m_Reserved = true;
private String m_Out = null;
private boolean m_Ndata = false;
private String m_Branch = null;
private boolean m_Version = false;
private boolean m_Nwarn = false;
private String m_Comment = null;
private String m_Cfile = null;
/**
* Check the command line options.
*/
protected void checkOptions(Commandline cmd) {
cmd.createArgument().setValue(COMMAND_CHECKOUT);
// ClearCase items
if (getReserved()) {
// -reserved
cmd.createArgument().setValue(FLAG_RESERVED);
} else {
// -unreserved
cmd.createArgument().setValue(FLAG_UNRESERVED);
}
if (getOut() != null) {
// -out
getOutCommand(cmd);
} else {
if (getNoData()) {
// -ndata
cmd.createArgument().setValue(FLAG_NODATA);
}
}
if (getBranch() != null) {
// -branch
getBranchCommand(cmd);
} else {
if (getVersion()) {
// -version
cmd.createArgument().setValue(FLAG_VERSION);
}
}
if (getNoWarn()) {
// -nwarn
cmd.createArgument().setValue(FLAG_NOWARN);
}
if (getComment() != null) {
// -c
getCommentCommand(cmd);
} else {
if (getCommentFile() != null) {
// -cfile
getCommentFileCommand(cmd);
} else {
cmd.createArgument().setValue(FLAG_NOCOMMENT);
}
}
// viewpath
cmd.createArgument().setValue(getViewPath());
}
/**
* If true, checks out the file as reserved.
*
* @param reserved the status to set the flag to
*/
public void setReserved(boolean reserved) {
m_Reserved = reserved;
}
/**
* Get reserved flag status
*
* @return boolean containing status of reserved flag
*/
public boolean getReserved() {
return m_Reserved;
}
/**
* Creates a writable file under a different filename.
*
* @param outf the path to the out file
*/
public void setOut(String outf) {
m_Out = outf;
}
/**
* Get out file
*
* @return String containing the path to the out file
*/
public String getOut() {
return m_Out;
}
/**
* If true, checks out the file but does not create an
* editable file containing its data.
*
* @param ndata the status to set the flag to
*/
public void setNoData(boolean ndata) {
m_Ndata = ndata;
}
/**
* Get nodata flag status
*
* @return boolean containing status of ndata flag
*/
public boolean getNoData() {
return m_Ndata;
}
/**
* Specify a branch to check out the file to.
*
* @param branch the name of the branch
*/
public void setBranch(String branch) {
m_Branch = branch;
}
/**
* Get branch name
*
* @return String containing the name of the branch
*/
public String getBranch() {
return m_Branch;
}
/**
* If true, allows checkout of a version other than main latest.
*
* @param version the status to set the flag to
*/
public void setVersion(boolean version) {
m_Version = version;
}
/**
* Get version flag status
*
* @return boolean containing status of version flag
*/
public boolean getVersion() {
return m_Version;
}
/**
* If true, warning messages are suppressed.
*
* @param nwarn the status to set the flag to
*/
public void setNoWarn(boolean nwarn) {
m_Nwarn = nwarn;
}
/**
* Get nowarn flag status
*
* @return boolean containing status of nwarn flag
*/
public boolean getNoWarn() {
return m_Nwarn;
}
/**
* Sets the comment string.
*
* @param comment the comment string
*/
public void setComment(String comment) {
m_Comment = comment;
}
/**
* Get comment string
*
* @return String containing the comment
*/
public String getComment() {
return m_Comment;
}
/**
* Specifies a file containing a comment.
*
* @param cfile the path to the comment file
*/
public void setCommentFile(String cfile) {
m_Cfile = cfile;
}
/**
* Get comment file
*
* @return String containing the path to the comment file
*/
public String getCommentFile() {
return m_Cfile;
}
/**
* Get the 'out' command
*
* @return the 'out' command if the attribute was specified, otherwise an
empty string
*
* @param CommandLine containing the command line string with or without
the out flag and path appended
*/
private void getOutCommand(Commandline cmd) {
if (getOut() != null) {
/* Had to make two separate commands here because if a space is
inserted between the flag and the value, it is treated as a
Windows filename with a space and it is enclosed in double
quotes ("). This breaks clearcase.
*/
cmd.createArgument().setValue(FLAG_OUT);
cmd.createArgument().setValue(getOut());
}
}
/**
* Get the 'branch' command
*
* @return the 'branch' command if the attribute was specified, otherwise
an empty string
*
* @param CommandLine containing the command line string with or without
the branch flag and name appended
*/
private void getBranchCommand(Commandline cmd) {
if (getBranch() != null) {
/* Had to make two separate commands here because if a space is
inserted between the flag and the value, it is treated as a
Windows filename with a space and it is enclosed in double
quotes ("). This breaks clearcase.
*/
cmd.createArgument().setValue(FLAG_BRANCH);
cmd.createArgument().setValue(getBranch());
}
}
/**
* Get the 'comment' command
*
* @return the 'comment' command if the attribute was specified, otherwise
an empty string
*
* @param CommandLine containing the command line string with or without
the comment flag and string appended
*/
private void getCommentCommand(Commandline cmd) {
if (getComment() != null) {
/* Had to make two separate commands here because if a space is
inserted between the flag and the value, it is treated as a
Windows filename with a space and it is enclosed in double
quotes ("). This breaks clearcase.
*/
cmd.createArgument().setValue(FLAG_COMMENT);
cmd.createArgument().setValue(getComment());
}
}
/**
* Get the 'cfile' command
*
* @return the 'cfile' command if the attribute was specified, otherwise an
empty string
*
* @param CommandLine containing the command line string with or without
the cfile flag and file appended
*/
private void getCommentFileCommand(Commandline cmd) {
if (getCommentFile() != null) {
/* Had to make two separate commands here because if a space is
inserted between the flag and the value, it is treated as a
Windows filename with a space and it is enclosed in double
quotes ("). This breaks clearcase.
*/
cmd.createArgument().setValue(FLAG_COMMENTFILE);
cmd.createArgument().setValue(getCommentFile());
}
}
/**
* -reserved flag -- check out the file as reserved
*/
public static final String FLAG_RESERVED = "-reserved";
/**
* -reserved flag -- check out the file as unreserved
*/
public static final String FLAG_UNRESERVED = "-unreserved";
/**
* -out flag -- create a writable file under a different filename
*/
public static final String FLAG_OUT = "-out";
/**
* -ndata flag -- checks out the file but does not create an editable file
containing its data
*/
public static final String FLAG_NODATA = "-ndata";
/**
* -branch flag -- checks out the file on a specified branch
*/
public static final String FLAG_BRANCH = "-branch";
/**
* -version flag -- allows checkout of a version that is not main latest
*/
public static final String FLAG_VERSION = "-version";
/**
* -nwarn flag -- suppresses warning messages
*/
public static final String FLAG_NOWARN = "-nwarn";
/**
* -c flag -- comment to attach to the file
*/
public static final String FLAG_COMMENT = "-c";
/**
* -cfile flag -- file containing a comment to attach to the file
*/
public static final String FLAG_COMMENTFILE = "-cfile";
/**
* -nc flag -- no comment is specified
*/
public static final String FLAG_NOCOMMENT = "-nc";
}
/* * The Apache Software License, Version 1.1 * * Copyright (c) 2000,2002 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 [EMAIL PROTECTED] * * 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 * <http://www.apache.org/>. */ package org.apache.tools.ant.taskdefs.optional.clearcase; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Commandline; /** * Performs ClearCase UnCheckout command. * * <p> * The following attributes are interpretted: * <table border="1"> * <tr> * <th>Attribute</th> * <th>Values</th> * <th>Required</th> * </tr> * <tr> * <td>viewpath</td> * <td>Path to the ClearCase view file or directory that the command will operate on</td> * <td>No</td> * <tr> * <tr> * <td>keepcopy</td> * <td>Specifies whether to keep a copy of the file with a .keep extension or not</td> * <td>No</td> * <tr> * </table> * * @author Curtis White * @author Oscar Forero */ public class CCUnCheckout extends ClearCase { private boolean m_Keep = false; /** * Check the command line options. */ protected void checkOptions(Commandline cmd) { cmd.createArgument().setValue(COMMAND_UNCHECKOUT); // ClearCase items if (getKeepCopy()) { // -keep cmd.createArgument().setValue(FLAG_KEEPCOPY); } else { // -rm cmd.createArgument().setValue(FLAG_RM); } // viewpath cmd.createArgument().setValue(getViewPath()); } /** * If true, keep a copy of the file with a .keep extension. * * @param keep the status to set the flag to */ public void setKeepCopy(boolean keep) { m_Keep = keep; } /** * Get keepcopy flag status * * @return boolean containing status of keep flag */ public boolean getKeepCopy() { return m_Keep; } /** * -keep flag -- keep a copy of the file with .keep extension */ public static final String FLAG_KEEPCOPY = "-keep"; /** * -rm flag -- remove the copy of the file */ public static final String FLAG_RM = "-rm"; }
/* * The Apache Software License, Version 1.1 * * Copyright (c) 2000,2002 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 [EMAIL PROTECTED] * * 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 * <http://www.apache.org/>. */ package org.apache.tools.ant.taskdefs.optional.clearcase; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Commandline; /** * Performs a ClearCase Update command. * * <p> * The following attributes are interpretted: * <table border="1"> * <tr> * <th>Attribute</th> * <th>Values</th> * <th>Required</th> * </tr> * <tr> * <td>viewpath</td> * <td>Path to the ClearCase view file or directory that the command will operate on</td> * <td>No</td> * <tr> * <tr> * <td>graphical</td> * <td>Displays a graphical dialog during the update</td> * <td>No</td> * <tr> * <tr> * <td>log</td> * <td>Specifies a log file for ClearCase to write to</td> * <td>No</td> * <tr> * <tr> * <td>overwrite</td> * <td>Specifies whether to overwrite hijacked files or not</td> * <td>No</td> * <tr> * <tr> * <td>rename</td> * <td>Specifies that hijacked files should be renamed with a .keep extension</td> * <td>No</td> * <tr> * <tr> * <td>currenttime</td> * <td>Specifies that modification time should be written as the current time. Either currenttime or preservetime can be specified.</td> * <td>No</td> * <tr> * <tr> * <td>preservetime</td> * <td>Specifies that modification time should preserved from the VOB time. Either currenttime or preservetime can be specified.</td> * <td>No</td> * <tr> * </table> * * @author Curtis White * @author Oscar Forero */ public class CCUpdate extends ClearCase { private boolean m_Graphical = false; private boolean m_Overwrite = false; private boolean m_Rename = false; private boolean m_Ctime = false; private boolean m_Ptime = false; private String m_Log = null; /** * Check the command line options. */ protected void checkOptions(Commandline cmd) { cmd.createArgument().setValue(COMMAND_UPDATE); // ClearCase items if (getGraphical()) { // -graphical cmd.createArgument().setValue(FLAG_GRAPHICAL); } else { if (getOverwrite()) { // -overwrite cmd.createArgument().setValue(FLAG_OVERWRITE); } else { if (getRename()) { // -rename cmd.createArgument().setValue(FLAG_RENAME); } else { // -noverwrite cmd.createArgument().setValue(FLAG_NOVERWRITE); } } if (getCurrentTime()) { // -ctime cmd.createArgument().setValue(FLAG_CURRENTTIME); } else { if (getPreserveTime()) { // -ptime cmd.createArgument().setValue(FLAG_PRESERVETIME); } } // -log logname getLogCommand(cmd); } // viewpath cmd.createArgument().setValue(getViewPath()); } /** * If true, displays a graphical dialog during the update. * * @param graphical the status to set the flag to */ public void setGraphical(boolean graphical) { m_Graphical = graphical; } /** * Get graphical flag status * * @return boolean containing status of graphical flag */ public boolean getGraphical() { return m_Graphical; } /** * If true, overwrite hijacked files. * * @param ow the status to set the flag to */ public void setOverwrite(boolean ow) { m_Overwrite = ow; } /** * Get overwrite hijacked files status * * @return boolean containing status of overwrite flag */ public boolean getOverwrite() { return m_Overwrite; } /** * If true, hijacked files are renamed with a .keep extension. * * @param ren the status to set the flag to */ public void setRename(boolean ren) { m_Rename = ren; } /** * Get rename hijacked files status * * @return boolean containing status of rename flag */ public boolean getRename() { return m_Rename; } /** * If true, modification time should be written as the current time. * Either currenttime or preservetime can be specified. * * @param ct the status to set the flag to */ public void setCurrentTime(boolean ct) { m_Ctime = ct; } /** * Get current time status * * @return boolean containing status of current time flag */ public boolean getCurrentTime() { return m_Ctime; } /** * If true, modification time should be preserved from the VOB time. * Either currenttime or preservetime can be specified. * * @param pt the status to set the flag to */ public void setPreserveTime(boolean pt) { m_Ptime = pt; } /** * Get preserve time status * * @return boolean containing status of preserve time flag */ public boolean getPreserveTime() { return m_Ptime; } /** * Sets the log file where cleartool records * the status of the command. * * @param log the path to the log file */ public void setLog(String log) { m_Log = log; } /** * Get log file * * @return String containing the path to the log file */ public String getLog() { return m_Log; } /** * Get the 'log' command * * @param cmd containing the command line string with or without the log flag and path appended */ private void getLogCommand(Commandline cmd) { if (getLog() == null) { return; } else { /* Had to make two separate commands here because if a space is inserted between the flag and the value, it is treated as a Windows filename with a space and it is enclosed in double quotes ("). This breaks clearcase. */ cmd.createArgument().setValue(FLAG_LOG); cmd.createArgument().setValue(getLog()); } } /** * -graphical flag -- display graphical dialog during update operation */ public static final String FLAG_GRAPHICAL = "-graphical"; /** * -log flag -- file to log status to */ public static final String FLAG_LOG = "-log"; /** * -overwrite flag -- overwrite hijacked files */ public static final String FLAG_OVERWRITE = "-overwrite"; /** * -noverwrite flag -- do not overwrite hijacked files */ public static final String FLAG_NOVERWRITE = "-noverwrite"; /** * -rename flag -- rename hijacked files with .keep extension */ public static final String FLAG_RENAME = "-rename"; /** * -ctime flag -- modified time is written as the current time */ public static final String FLAG_CURRENTTIME = "-ctime"; /** * -ptime flag -- modified time is written as the VOB time */ public static final String FLAG_PRESERVETIME = "-ptime"; }
/* * The Apache Software License, Version 1.1 * * Copyright (c) 2000,2002 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 [EMAIL PROTECTED] * * 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 * <http://www.apache.org/>. */ package org.apache.tools.ant.taskdefs.optional.clearcase; import java.io.File; import java.util.Iterator; import java.util.List; import java.util.Vector; import org.apache.tools.ant.Task; import org.apache.tools.ant.Project; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.taskdefs.Execute; import org.apache.tools.ant.taskdefs.LogStreamHandler; import org.apache.tools.ant.types.Commandline; import org.apache.tools.ant.types.FileSet; /** * A base class for creating tasks for executing commands on ClearCase. * <p> * The class extends the 'exec' task as it operates by executing the cleartool program * supplied with ClearCase. By default the task expects the cleartool executable to be * in the path, * you can override this be specifying the cleartooldir attribute. * </p> * <p> * This class provides set and get methods for the 'viewpath' attribute. It * also contains constants for the flags that can be passed to cleartool. * </p> * * @author Curtis White * @author Oscar Forero */ public abstract class ClearCase extends Task { private String m_ClearToolDir = ""; private String m_viewPath = null; protected Vector filesets = new Vector(); protected int verbosity = Project.MSG_VERBOSE; /** * Adds a set of files to copy. */ public void addFileset(FileSet set) { filesets.addElement(set); } /** * Set the directory where the cleartool executable is located. * * @param dir the directory containing the cleartool executable */ public final void setClearToolDir(String dir) { m_ClearToolDir = project.translatePath(dir); } /** * Builds and returns the command string to execute cleartool * * @return String containing path to the executable */ protected final String getClearToolCommand() { String toReturn = m_ClearToolDir; if (!toReturn.equals("") && !toReturn.endsWith("/")) { toReturn += "/"; } toReturn += CLEARTOOL_EXE; return toReturn; } /** * Set the path to the item in a ClearCase view to operate on. * * @param viewPath Path to the view directory or file */ public final void setViewPath(String viewPath) { m_viewPath = viewPath; } /** * Get the path to the item in a clearcase view * * @return m_viewPath */ public String getViewPath() { return m_viewPath; } /** * Used to force listing of all names of files. */ public void setVerbose(boolean verbose) { if (verbose) { this.verbosity = Project.MSG_INFO; } else { this.verbosity = Project.MSG_VERBOSE; } } protected int run(Commandline cmd) { try { Project aProj = getProject(); Execute exe = new Execute(new LogStreamHandler(this, Project.MSG_INFO, Project.MSG_WARN)); exe.setAntRun(aProj); exe.setWorkingDirectory(aProj.getBaseDir()); exe.setCommandline(cmd.getCommandline()); return exe.execute(); } catch (java.io.IOException e) { throw new BuildException(e, location); } } /** * Abstract to be defined by Subclasses it will have to determine the Clear * Case command to execute and the required parameters in every case. */ abstract protected void checkOptions(Commandline cmd); /** * Execute an Clear Case Command for a given file. * <p> * Builds a command line to execute cleartool and then calls Exec's run method * to execute the command line. */ private void execute(String sFile) { setViewPath(sFile); // build the command line from what we got the format is // cleartool checkout [options...] [viewpath ...] // as specified in the CLEARTOOL.EXE help Commandline commandLine = new Commandline(); int result = 0; commandLine.setExecutable(getClearToolCommand()); checkOptions(commandLine); // For debugging log(commandLine.toString(), verbosity); result = run(commandLine); if (result != 0) { String msg = "Failed executing: " + commandLine.toString(); throw new BuildException(msg, location); } } /** * Executes the task. * <p> * If the task contains FileSet elements will execute the task in all the * elements identified by they. If not will execute using the ViewPath * property. */ public void execute() throws BuildException { if( !hasFileSets() ) { if (getViewPath() == null) { execute(getProject().getBaseDir().getPath()); } else { execute(getViewPath()); } } else { List rClearObjects = getClearCaseObjects(); Iterator rIterator = rClearObjects.iterator(); while( rIterator.hasNext() ) { String sName = (String) rIterator.next(); execute(sName); } } } protected List getClearCaseObjects() { Vector rFiles = new Vector(); for (int i = 0; i < filesets.size(); i++) { System.out.println("Filesets present, processing files"); FileSet fs = (FileSet) filesets.elementAt(i); DirectoryScanner ds = fs.getDirectoryScanner(project); String[] srcFiles = ds.getIncludedFiles(); for(int j=0 ; j<srcFiles.length ; j++) { rFiles.add(fs.getDir(project).getAbsolutePath() + File.separator + srcFiles[j]); } String[] srcDirs = ds.getIncludedDirectories(); for(int j=0 ; j<srcDirs.length ; j++) { rFiles.add(srcDirs[j]); } } return rFiles; } protected boolean hasFileSets() { return (filesets.size() > 0); } /** * Constant for the thing to execute */ private static final String CLEARTOOL_EXE = "cleartool"; /** * The 'Update' command */ public static final String COMMAND_UPDATE = "update"; /** * The 'Checkout' command */ public static final String COMMAND_CHECKOUT = "checkout"; /** * The 'Checkin' command */ public static final String COMMAND_CHECKIN = "checkin"; /** * The 'UndoCheckout' command */ public static final String COMMAND_UNCHECKOUT = "uncheckout"; }
/* * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2002 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 [EMAIL PROTECTED] * * 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 * <http://www.apache.org/>. */ package org.apache.tools.ant.taskdefs; import org.apache.tools.ant.Task; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.PatternSet; import org.apache.tools.ant.types.selectors.*; import java.io.File; import java.util.StringTokenizer; import java.util.Enumeration; import org.apache.tools.ant.types.Reference; /** * This is an abstract task that should be used by all those tasks that * require to include or exclude files based on pattern matching. * * @author Arnout J. Kuiper * <a href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a> * @author Stefano Mazzocchi * <a href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a> * @author Sam Ruby <a href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a> * @author Jon S. Stevens <a href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a> * @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a> * @author <a href="mailto:[EMAIL PROTECTED]">Bruce Atherton</a> * @author Oscar Forero * @since Ant 1.1 */ public abstract class MatchingTask extends Task implements SelectorContainer { private String sFileSetRef = null; private FileSet internalFileset = null; protected boolean useDefaultExcludes = true; protected FileSet fileset = new FileSet(); /** * @see org.apache.tools.ant.ProjectComponent#setProject */ public void setProject(Project project) { super.setProject(project); fileset.setProject(project); } /** * add a name entry on the include list */ public PatternSet.NameEntry createInclude() { return fileset.createInclude(); } /** * add a name entry on the include files list */ public PatternSet.NameEntry createIncludesFile() { return fileset.createIncludesFile(); } /** * add a name entry on the exclude list */ public PatternSet.NameEntry createExclude() { return fileset.createExclude(); } /** * add a name entry on the include files list */ public PatternSet.NameEntry createExcludesFile() { return fileset.createExcludesFile(); } /** * add a set of patterns */ public PatternSet createPatternSet() { return fileset.createPatternSet(); } /** * 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) { fileset.setIncludes(includes); } /** * Set this to be the items in the base directory that you want to be * included. You can also specify "*" for the items (ie: items="*") * and it will include all the items in the base directory. * * @param itemString the string containing the files to include. */ public void XsetItems(String itemString) { log("The items attribute is deprecated. " + "Please use the includes attribute.", Project.MSG_WARN); if (itemString == null || itemString.equals("*") || itemString.equals(".")) { createInclude().setName("**"); } else { StringTokenizer tok = new StringTokenizer(itemString, ", "); while (tok.hasMoreTokens()) { String pattern = tok.nextToken().trim(); if (pattern.length() > 0) { createInclude().setName(pattern + "/**"); } } } } /** * 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) { fileset.setExcludes(excludes); } /** * List of filenames and directory names to not include. They should be * either , or " " (space) separated. The ignored files will be logged. * * @param ignoreString the string containing the files to ignore. */ public void XsetIgnore(String ignoreString) { log("The ignore attribute is deprecated." + "Please use the excludes attribute.", Project.MSG_WARN); if (ignoreString != null && ignoreString.length() > 0) { StringTokenizer tok = new StringTokenizer(ignoreString, ", ", false); while (tok.hasMoreTokens()) { createExclude().setName("**/" + tok.nextToken().trim() + "/**"); } } } /** * 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) { this.useDefaultExcludes = useDefaultExcludes; } /** * Returns the directory scanner needed to access the files to process. */ protected DirectoryScanner getDirectoryScanner(File baseDir) { if(this.internalFileset == null) { fileset.setDir(baseDir); fileset.setDefaultexcludes(useDefaultExcludes); return fileset.getDirectoryScanner(project); } else { return this.internalFileset.getDirectoryScanner(project); } } /** * Sets a reference to a FileSet element, if set will ignore internal * select elements. This allows to use the same FileSet on diferent tasks. */ public void setFileSetRef(String sFileSetRef) { this.sFileSetRef = sFileSetRef; this.internalFileset = new FileSet(); this.internalFileset.setRefid(new Reference(sFileSetRef)); } /** * Return the value of the Reference to a FileSet element. Null if is not set. */ public String getFileSetRef() { return this.sFileSetRef; } /** * 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) { fileset.setIncludesfile(includesfile); } /** * 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) { fileset.setExcludesfile(excludesfile); } /** * Sets case sensitivity of the file system * * @param isCaseSensitive "true"|"on"|"yes" if file system is case * sensitive, "false"|"off"|"no" when not. */ public void setCaseSensitive(boolean isCaseSensitive) { fileset.setCaseSensitive(isCaseSensitive); } /** * Sets whether or not symbolic links should be followed. * * @param followSymlinks whether or not symbolic links should be followed */ public void setFollowSymlinks(boolean followSymlinks) { fileset.setFollowSymlinks(followSymlinks); } /** * Indicates whether there are any selectors here. * * @return whether any selectors are in this container */ public boolean hasSelectors() { return fileset.hasSelectors(); } /** * Gives the count of the number of selectors in this container * * @return the number of selectors in this container */ public int selectorCount() { return fileset.selectorCount(); } /** * Returns the set of selectors as an array. * * @return an array of selectors in this container */ public FileSelector[] getSelectors(Project p) { return fileset.getSelectors(p); } /** * Returns an enumerator for accessing the set of selectors. * * @return an enumerator that goes through each of the selectors */ public Enumeration selectorElements() { return fileset.selectorElements(); } /** * Add a new selector into this container. * * @param selector the new selector to add * @return the selector that was added */ public void appendSelector(FileSelector selector) { fileset.appendSelector(selector); } /* Methods below all add specific selectors */ /** * add a "Select" selector entry on the selector list */ public void addSelector(SelectSelector selector) { fileset.addSelector(selector); } /** * add an "And" selector entry on the selector list */ public void addAnd(AndSelector selector) { fileset.addAnd(selector); } /** * add an "Or" selector entry on the selector list */ public void addOr(OrSelector selector) { fileset.addOr(selector); } /** * add a "Not" selector entry on the selector list */ public void addNot(NotSelector selector) { fileset.addNot(selector); } /** * add a "None" selector entry on the selector list */ public void addNone(NoneSelector selector) { fileset.addNone(selector); } /** * add a majority selector entry on the selector list */ public void addMajority(MajoritySelector selector) { fileset.addMajority(selector); } /** * add a selector date entry on the selector list */ public void addDate(DateSelector selector) { fileset.addDate(selector); } /** * add a selector size entry on the selector list */ public void addSize(SizeSelector selector) { fileset.addSize(selector); } /** * add a selector filename entry on the selector list */ public void addFilename(FilenameSelector selector) { fileset.addFilename(selector); } /** * add an extended selector entry on the selector list */ public void addCustom(ExtendSelector selector) { fileset.addCustom(selector); } /** * add a contains selector entry on the selector list */ public void addContains(ContainsSelector selector) { fileset.addContains(selector); } /** * add a present selector entry on the selector list */ public void addPresent(PresentSelector selector) { fileset.addPresent(selector); } /** * add a depth selector entry on the selector list */ public void addDepth(DepthSelector selector) { fileset.addDepth(selector); } /** * add a depends selector entry on the selector list */ public void addDepend(DependSelector selector) { fileset.addDepend(selector); } }
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="all" name="changeme">
<property name="Select" value="libertis/*.txt"/>
<property name="Base" value="L:/BDL000515-028_task/emis_java_files2"/>
<property name="from" value="test"/>
<property name="to" value="succesful test"/>
<fileset id="files" dir="${Base}" includes="${Select}">
<contains text="${from}"/>
</fileset>
<target name="all">
<sequential>
<cccheckout verbose="true">
<fileset refid="files"/>
</cccheckout>
<ccuncheckout verbose="true">
<fileset refid="files"/>
</ccuncheckout>
</sequential>
<sequential>
<cccheckout verbose="true">
<fileset refid="files"/>
</cccheckout>
<replace dir="${Base}" token="${from}" value="${to}">
<include name="${Select}" />
<contains text="${from}" />
</replace>
<cccheckin verbose="true">
<fileset refid="files"/>
</cccheckin>
</sequential>
</target>
</project>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
