p4 repository and report on files that still not under revision control. PR: 13928 Submitted by: Miha git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273928 13f79535-47bb-0310-9956-ffa450edef68master
@@ -75,10 +75,15 @@ You will also need the Perforce client executable (p4 or p4.exe but not p4win.ex | |||
<td>Revert files</td> | |||
</tr> | |||
<tr> | |||
<tr> | |||
<td><a href="#p4add">P4Add</a></td> | |||
<td>Add files</td> | |||
</tr> | |||
<tr> | |||
<td><a href="#p4fstat">P4Fstat</a></td> | |||
<td>Show differences between local repository and p4 repository</td> | |||
</tr> | |||
</table> | |||
<h3>General P4 Properties</h3> | |||
@@ -566,6 +571,52 @@ and submit | |||
<p4add> | |||
<p4submit change="${p4.change}"/> | |||
</pre> | |||
<hr> | |||
<h2><a name="p4fstat">P4Fstat</a></h2> | |||
<h3>Description:</h3> | |||
<p> | |||
Lists files under Perforce control and files not under Perforce control in one or several filesets | |||
</p> | |||
<h3>Parameters</h3> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
<td valign="top"><b>Attribute</b></td> | |||
<td valign="top"><b>Description</b></td> | |||
<td align="center" valign="top"><b>Required</b></td> | |||
</tr> | |||
<tr> | |||
<td valign="top">showfilter</td> | |||
<td valign="top">should be one of | |||
<table border="1"> | |||
<tr><td>value</td><td>description</td></tr> | |||
<tr><td>"all"</td><td>list all files, first the ones which are under Perforce control, then the others</td></tr> | |||
<tr><td>"existing"</td><td>list only files under Perforce control</td></tr> | |||
<tr><td>"non-existing"</td><td>list only files which are not under Perforce control</td></tr></table> | |||
</td> | |||
<td valign="top" align="center">Yes</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">fileset</td> | |||
<td valign="top">one or several <a href="../CoreTypes/fileset.html">fileset(s)</a></td> | |||
<td valign="top" align="center">yes (at least one fileset is needed)</td> | |||
</tr> | |||
</table> | |||
Several nested filesets can be used with P4Fstat, one should be there at least. | |||
<h3>Examples</h3> | |||
will list all the files under C:\dev\gnu\depot, sorted by under Perforce or not under Perforce<br> | |||
<pre> | |||
<project name="p4fstat" default="p4fstat" basedir="C:\dev\gnu"> | |||
<target name="p4fstat" > | |||
<p4fstat showfilter="all"> | |||
<fileset dir="depot" includes="**/*"/> | |||
</p4fstat> | |||
</target> | |||
</project></p> | |||
</pre> | |||
<h2><a name="changes">Change History</a></h2> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
@@ -588,10 +639,11 @@ and submit | |||
Refactored exec'ing code</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">Nov 2002</td> | |||
<td valign="top">Jan 2003</td> | |||
<td valign="top">V1.2</td> | |||
<td valign="top">Added globalopts to P4Base to allow<br> | |||
additional global options to be set.</td> | |||
<td valign="top">Added globalopts to P4Base to allow | |||
additional global options to be set.<br> | |||
Added p4fstat task</td> | |||
</tr> | |||
</table> | |||
<hr> | |||
@@ -0,0 +1,97 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2003 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 | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs.optional.perforce; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.oro.text.perl.Perl5Util; | |||
import java.util.ArrayList; | |||
/** | |||
* FStatP4OutputHandler - spezialied Perforce output handler | |||
* able to sort files recognized as managed by Perforce and files not | |||
* managed by Perforce in the output | |||
* | |||
* @author <A HREF="mailto:miha@softhome.net">Miha</A> | |||
*/ | |||
class FStatP4OutputHandler extends P4HandlerAdapter { | |||
private P4Fstat parent; | |||
private ArrayList existing = new ArrayList(); | |||
private ArrayList nonExisting = new ArrayList(); | |||
private static Perl5Util util = new Perl5Util(); | |||
public FStatP4OutputHandler(P4Fstat parent) { | |||
this.parent = parent; | |||
} | |||
public void process(String line) throws BuildException { | |||
if (util.match("/^... clientFile (.+)$/", line)) { | |||
String f = util.group(1); | |||
existing.add(f); | |||
} else if (util.match("/^(.+) - no such file/", line)) { | |||
String f = util.group(1); | |||
nonExisting.add(f); | |||
} | |||
parent.log(parent.util.substitute("s/^.*: //", line), | |||
Project.MSG_VERBOSE); | |||
} | |||
public ArrayList getExisting() { | |||
return existing; | |||
} | |||
public ArrayList getNonExisting() { | |||
return nonExisting; | |||
} | |||
} |
@@ -0,0 +1,212 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2003 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 | |||
* <http://www.apache.org/>. | |||
*/ | |||
/* | |||
* Portions of this software are based upon public domain software | |||
* originally written at the National Center for Supercomputing Applications, | |||
* University of Illinois, Urbana-Champaign. | |||
*/ | |||
package org.apache.tools.ant.taskdefs.optional.perforce; | |||
import java.io.File; | |||
import java.util.Vector; | |||
import java.util.ArrayList; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.DirectoryScanner; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.types.FileSet; | |||
/** | |||
* P4Fstat - find out which files are under Perforce control and which are not. | |||
* | |||
* <br><b>Example Usage:</b><br> | |||
* <pre> | |||
* <project name="p4fstat" default="p4fstat" basedir="C:\dev\gnu"> | |||
* <target name="p4fstat" > | |||
* <p4fstat showfilter="all"> | |||
* <fileset dir="depot" includes="**\/*"/> | |||
* </p4fstat> | |||
* </target> | |||
* </project> | |||
* </pre> | |||
* | |||
* @author <A HREF="mailto:miha@softhome.net">Miha</A> | |||
* @author <A HREF="mailto:leslie.hughes@rubus.com">Les Hughes</A> | |||
* @author <A HREF="mailto:ashundi@tibco.com">Anli Shundi</A> | |||
*/ | |||
public class P4Fstat extends P4Base { | |||
private int changelist; | |||
private String addCmd = ""; | |||
private Vector filesets = new Vector(); | |||
private int cmdLength = 300; | |||
private static final int SHOW_ALL = 0; | |||
private static final int SHOW_EXISTING = 1; | |||
private static final int SHOW_NON_EXISTING = 2; | |||
private int show = SHOW_NON_EXISTING; | |||
private FStatP4OutputHandler handler; | |||
private StringBuffer filelist; | |||
private int fileNum = 0; | |||
private int doneFileNum = 0; | |||
private boolean debug = false; | |||
private static final String EXISTING_HEADER | |||
= "Following files exist in perforce"; | |||
private static final String NONEXISTING_HEADER | |||
= "Following files do not exist in perforce"; | |||
public void setShowFilter(String filter) { | |||
if (filter.equalsIgnoreCase("all")) { | |||
show = SHOW_ALL; | |||
} else if (filter.equalsIgnoreCase("existing")) { | |||
show = SHOW_EXISTING; | |||
} else if (filter.equalsIgnoreCase("non-existing")) { | |||
show = SHOW_NON_EXISTING; | |||
} else { | |||
throw new BuildException("P4Fstat: ShowFilter should be one of: " | |||
+ "all, existing, non-existing"); | |||
} | |||
} | |||
public void setChangelist(int changelist) throws BuildException { | |||
if (changelist <= 0) { | |||
throw new BuildException("P4FStat: Changelist# should be a " | |||
+ "positive number"); | |||
} | |||
this.changelist = changelist; | |||
} | |||
public void addFileset(FileSet set) { | |||
filesets.addElement(set); | |||
} | |||
public void execute() throws BuildException { | |||
handler = new FStatP4OutputHandler(this); | |||
if (P4View != null) { | |||
addCmd = P4View; | |||
} | |||
P4CmdOpts = (changelist > 0) ? ("-c " + changelist) : ""; | |||
filelist = new StringBuffer(); | |||
for (int i = 0; i < filesets.size(); i++) { | |||
FileSet fs = (FileSet) filesets.elementAt(i); | |||
DirectoryScanner ds = fs.getDirectoryScanner(getProject()); | |||
//File fromDir = fs.getDir(project); | |||
String[] srcFiles = ds.getIncludedFiles(); | |||
fileNum = srcFiles.length; | |||
if (srcFiles != null) { | |||
for (int j = 0; j < srcFiles.length; j++) { | |||
File f = new File(ds.getBasedir(), srcFiles[j]); | |||
filelist.append(" ").append('"').append(f.getAbsolutePath()).append('"'); | |||
doneFileNum++; | |||
if (filelist.length() > cmdLength) { | |||
execP4Fstat(filelist); | |||
filelist.setLength(0); | |||
} | |||
} | |||
if (filelist.length() > 0) { | |||
execP4Fstat(filelist); | |||
} | |||
} else { | |||
log("No files specified to add!", Project.MSG_WARN); | |||
} | |||
} | |||
if (show == SHOW_ALL || show == SHOW_EXISTING) { | |||
printRes(handler.getExisting(), EXISTING_HEADER); | |||
} | |||
if (show == SHOW_ALL || show == SHOW_NON_EXISTING) { | |||
printRes(handler.getNonExisting(), NONEXISTING_HEADER); | |||
} | |||
} | |||
public int getLengthOfTask() { | |||
return fileNum; | |||
} | |||
int getPasses() { | |||
return filesets.size(); | |||
} | |||
private void printRes(ArrayList ar, String header) { | |||
log(header, Project.MSG_INFO); | |||
for (int i = 0; i < ar.size(); i++) { | |||
log((String) ar.get(i), Project.MSG_INFO); | |||
} | |||
} | |||
private void execP4Fstat(StringBuffer list) { | |||
if (debug) { | |||
log("Executing fstat " + P4CmdOpts + " " + addCmd + list + "\n", | |||
Project.MSG_INFO); | |||
} | |||
execP4Command("fstat " + P4CmdOpts + " " + addCmd + list, handler); | |||
} | |||
} |