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}"/>
+
+
+
+Description:
+
+Lists files under Perforce control and files not under Perforce control in one or several filesets
+
+Parameters
+
+
+ Attribute |
+ Description |
+ Required |
+
+
+ showfilter |
+ should be one of
+
+ value | description |
+ "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 |
+
+
+ fileset |
+ one 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>
+
+
+
+
@@ -588,10 +639,11 @@ and submit
Refactored exec'ing code
- Nov 2002 |
+ Jan 2003 |
V1.2 |
- Added 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);
+ }
+
+}