Browse Source

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


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273928 13f79535-47bb-0310-9956-ffa450edef68
master
Conor MacNeill 22 years ago
parent
commit
f7c9d087d9
3 changed files with 365 additions and 4 deletions
  1. +56
    -4
      docs/manual/OptionalTasks/perforce.html
  2. +97
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/perforce/FStatP4OutputHandler.java
  3. +212
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java

+ 56
- 4
docs/manual/OptionalTasks/perforce.html View File

@@ -75,10 +75,15 @@ You will also need the Perforce client executable (p4 or p4.exe but not p4win.ex
<td>Revert files</td> <td>Revert files</td>
</tr> </tr>
<tr>
<tr>
<td><a href="#p4add">P4Add</a></td> <td><a href="#p4add">P4Add</a></td>
<td>Add files</td> <td>Add files</td>
</tr> </tr>

<tr>
<td><a href="#p4fstat">P4Fstat</a></td>
<td>Show differences between local repository and p4 repository</td>
</tr>
</table> </table>


<h3>General P4 Properties</h3> <h3>General P4 Properties</h3>
@@ -566,6 +571,52 @@ and submit
&lt;p4add&gt; &lt;p4add&gt;
&lt;p4submit change=&quot;${p4.change}&quot;/&gt; &lt;p4submit change=&quot;${p4.change}&quot;/&gt;
</pre> </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>&quot;all&quot;</td><td>list all files, first the ones which are under Perforce control, then the others</td></tr>
<tr><td>&quot;existing&quot;</td><td>list only files under Perforce control</td></tr>
<tr><td>&quot;non-existing&quot;</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>
&lt;project name=&quot;p4fstat&quot; default=&quot;p4fstat&quot; basedir=&quot;C:\dev\gnu&quot;&gt;
&lt;target name=&quot;p4fstat&quot; &gt;
&lt;p4fstat showfilter=&quot;all&quot;&gt;
&lt;fileset dir=&quot;depot&quot; includes=&quot;**/*&quot;/&gt;
&lt;/p4fstat&gt;
&lt;/target&gt;
&lt;/project&gt;</p>
</pre>





<h2><a name="changes">Change History</a></h2> <h2><a name="changes">Change History</a></h2>
<table border="1" cellpadding="2" cellspacing="0"> <table border="1" cellpadding="2" cellspacing="0">
@@ -588,10 +639,11 @@ and submit
Refactored exec'ing code</td> Refactored exec'ing code</td>
</tr> </tr>
<tr> <tr>
<td valign="top">Nov 2002</td>
<td valign="top">Jan 2003</td>
<td valign="top">V1.2</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> </tr>
</table> </table>
<hr> <hr>


+ 97
- 0
src/main/org/apache/tools/ant/taskdefs/optional/perforce/FStatP4OutputHandler.java View File

@@ -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;
}
}

+ 212
- 0
src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java View File

@@ -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>
* &lt;project name=&quot;p4fstat&quot; default=&quot;p4fstat&quot; basedir=&quot;C:\dev\gnu&quot;&gt;
* &lt;target name=&quot;p4fstat&quot; &gt;
* &lt;p4fstat showfilter=&quot;all&quot;&gt;
* &lt;fileset dir=&quot;depot&quot; includes=&quot;**\/*&quot;/&gt;
* &lt;/p4fstat&gt;
* &lt;/target&gt;
* &lt;/project&gt;
* </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);
}

}

Loading…
Cancel
Save