From f7c9d087d97941b17a7c6695c4aa9b46d91954b4 Mon Sep 17 00:00:00 2001 From: Conor MacNeill Date: Thu, 30 Jan 2003 14:42:03 +0000 Subject: [PATCH] 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 --- docs/manual/OptionalTasks/perforce.html | 60 ++++- .../perforce/FStatP4OutputHandler.java | 97 ++++++++ .../taskdefs/optional/perforce/P4Fstat.java | 212 ++++++++++++++++++ 3 files changed, 365 insertions(+), 4 deletions(-) create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/perforce/FStatP4OutputHandler.java create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java diff --git a/docs/manual/OptionalTasks/perforce.html b/docs/manual/OptionalTasks/perforce.html index d70f683b7..328089f9b 100644 --- a/docs/manual/OptionalTasks/perforce.html +++ b/docs/manual/OptionalTasks/perforce.html @@ -75,10 +75,15 @@ You will also need the Perforce client executable (p4 or p4.exe but not p4win.ex Revert files - + P4Add Add files + + + P4Fstat + Show differences between local repository and p4 repository +

General P4 Properties

@@ -566,6 +571,52 @@ and submit <p4add> <p4submit change="${p4.change}"/> +
+ +

P4Fstat

+

Description:

+

+Lists files under Perforce control and files not under Perforce control in one or several filesets +

+

Parameters

+ + + + + + + + + + + + + + + + +
AttributeDescriptionRequired
showfiltershould be one of + + + + +
valuedescription
"all"list all files, first the ones which are under Perforce control, then the others
"existing"list only files under Perforce control
"non-existing"list only files which are not under Perforce control
+
Yes
filesetone or several fileset(s)yes (at least one fileset is needed)
+Several nested filesets can be used with P4Fstat, one should be there at least. +

Examples

+will list all the files under C:\dev\gnu\depot, sorted by under Perforce or not under Perforce
+
+<project name="p4fstat" default="p4fstat" basedir="C:\dev\gnu">
+    <target name="p4fstat" >
+        <p4fstat showfilter="all">
+            <fileset dir="depot" includes="**/*"/>
+        </p4fstat>
+    </target>
+</project>

+
+ + +

Change History

@@ -588,10 +639,11 @@ and submit Refactored exec'ing code - + - +
Nov 2002Jan 2003 V1.2Added globalopts to P4Base to allow
- additional global options to be set.
Added globalopts to P4Base to allow + additional global options to be set.
+ Added p4fstat task

diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/FStatP4OutputHandler.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/FStatP4OutputHandler.java new file mode 100644 index 000000000..cef794912 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/FStatP4OutputHandler.java @@ -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 + * . + */ +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 Miha + */ +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; + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java new file mode 100644 index 000000000..4c80948be --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java @@ -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 + * . + */ +/* + * 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. + * + *
Example Usage:
+ *
+ * <project name="p4fstat" default="p4fstat" basedir="C:\dev\gnu">
+ *     <target name="p4fstat" >
+ *         <p4fstat showfilter="all">
+ *             <fileset dir="depot" includes="**\/*"/>
+ *         </p4fstat>
+ *     </target>
+ * </project>
+ * 
+ * + * @author Miha + * @author Les Hughes + * @author Anli Shundi + */ +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); + } + +}