conor 2003/01/30 06:42:03
Modified: docs/manual/OptionalTasks perforce.html
Added: src/main/org/apache/tools/ant/taskdefs/optional/perforce
FStatP4OutputHandler.java P4Fstat.java
Log:
Perforce task to show differences between local source repository and
p4 repository and report on files that still not under revision control.
PR: 13928
Submitted by: Miha
Revision Changes Path
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/FStatP4OutputHandler.java
Index: FStatP4OutputHandler.java
===================================================================
/*
* 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 [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.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:[EMAIL PROTECTED]">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;
}
}
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java
Index: P4Fstat.java
===================================================================
/*
* 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 [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/>.
*/
/*
* 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:[EMAIL PROTECTED]">Miha</A>
* @author <A HREF="mailto:[EMAIL PROTECTED]">Les Hughes</A>
* @author <A HREF="mailto:[EMAIL PROTECTED]">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);
}
}
1.19 +57 -5 jakarta-ant/docs/manual/OptionalTasks/perforce.html
Index: perforce.html
===================================================================
RCS file: /home/cvs/jakarta-ant/docs/manual/OptionalTasks/perforce.html,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -w -u -r1.18 -r1.19
--- perforce.html 30 Jan 2003 09:09:53 -0000 1.18
+++ perforce.html 30 Jan 2003 14:42:03 -0000 1.19
@@ -79,6 +79,11 @@
<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 @@
<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 @@
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>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]