conor 2003/02/04 04:23:52
Modified: docs/manual/OptionalTasks perforce.html
src/main/org/apache/tools/ant/taskdefs defaults.properties
src/main/org/apache/tools/ant/taskdefs/optional/perforce
P4Submit.java
Added: src/main/org/apache/tools/ant/taskdefs/optional/perforce
P4Integrate.java P4Resolve.java
src/testcases/org/apache/tools/ant/taskdefs/optional/perforce
build1.xml build2.xml p4integrate.xml
Log:
New perforce functionality
PR: 15707
Submitted by: Antoine Levy-Lambert
Revision Changes Path
1.20 +231 -3 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.19
retrieving revision 1.20
diff -u -w -u -r1.19 -r1.20
--- perforce.html 30 Jan 2003 14:42:03 -0000 1.19
+++ perforce.html 4 Feb 2003 12:23:50 -0000 1.20
@@ -79,7 +79,18 @@
<td><a href="#p4add">P4Add</a></td>
<td>Add files</td>
</tr>
-
+ <tr>
+ <td><a href="#p4delete">P4Delete</a></td>
+ <td>Delete files</td>
+ </tr>
+ <tr>
+ <td><a href="#p4integrate">P4Integrate</a></td>
+ <td>Integrate files</td>
+ </tr>
+ <tr>
+ <td><a href="#p4resolve">P4Resolve</a></td>
+ <td>Resolve files</td>
+ </tr>
<tr>
<td><a href="#p4fstat">P4Fstat</a></td>
<td>Show differences between local repository and p4 repository</td>
@@ -204,6 +215,9 @@
<taskdef name="p4reopen"
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Reopen"/>
<taskdef name="p4revert"
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Revert"/>
<taskdef name="p4add"
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Add"/>
+ <taskdef name="p4delete"
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Delete"/>
+ <taskdef name="p4integrate"
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Integrate"/>
+ <taskdef name="p4resolve"
classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Resolve"/>
</pre>
<hr>
@@ -245,7 +259,8 @@
<h3>Description:</h3>
<p>Request a new changelist from the Perforce server.
This task sets the ${p4.change} property which can then be passed to <A
HREF="#p4submit">P4Submit</A>,
-<A HREF="#p4edit">P4Edit</A>, or <a HREF="#p4add">P4Add</A>.
+<A HREF="#p4edit">P4Edit</A>, or <a HREF="#p4add">P4Add</A>, or <a
HREF="#p4delete">P4Delete</A>,
+then to <A HREF="#p4submit">P4Submit</A>.
</p>
<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
@@ -309,6 +324,11 @@
<h2><a name="p4submit">P4Submit</a></h2>
<h3>Description:</h3>
<p>Submit a changelist, usually obtained from P4Change.
+<p>P4Submit will also change the value of the property p4.change if the
change list is renamed by the Perforce server.
+<p>P4Submit will set a property p4.needsresolve to 1 if the change could not
be submitted due to files needing resolving.
+<p>Files will need resolve if at the time of checking in, the revision that
was checked out to do the current edit
+is not the latest any more.
+<p>If no files need resolve, the p4.needsresolve will be set to 0.
</p>
<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
@@ -617,6 +637,214 @@
+
+<h2><a name="p4delete">P4Delete</a></h2>
+<h3>Description:</h3>
+<p>Open file(s) for delete. P4Change should be used to obtain a new
changelist for P4Delete as,
+although P4Delete can open files to the default change, P4Submit cannot yet
submit it.
+</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">view</td>
+ <td valign="top">The filespec to request to delete</td>
+ <td valign="top" align="center">Yes</td>
+ </tr>
+ <tr>
+ <td valign="top">change</td>
+ <td valign="top">An existing changelist number to assign files to.</td>
+ <td valign="top" align="center">No, but see above.</td>
+ </tr>
+
+</table>
+
+<h3>Examples</h3>
+<pre>
+<p4delete
+ view="//depot/projects/projectfoo/main/src/Blah.java..."
+ change="${p4.change}"/>
+</pre>
+<hr>
+<h2><a name="p4integrate">P4Integrate</a></h2>
+<h3>Description:</h3>
+<p>Open file(s) for integrate. P4Change should be used to obtain a new
changelist for P4Integrate as,
+although P4Integrate can open files to the default change, P4Submit cannot
yet submit it.
+</p>
+<h3>Parameters</h3>
+<p>If this task is used without using a branch definition, both fromfile and
tofile must be supplied.
+If a branch definition is supplied, at least one of fromfile or tofile
should be supplied.
+Both fromfile and tofile can be supplied together with a branch
definition.</p>
+<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>
+ <td align="center" valign="top"><b>Perforce command line flag</b></td>
+ </tr>
+ <tr>
+ <td valign="top">fromfile</td>
+ <td valign="top">Original file or view</td>
+ <td valign="top" align="center">required if a branch is not
specified</td>
+ <td valign="top" align="center"></td>
+ </tr>
+ <tr>
+ <td valign="top">tofile</td>
+ <td valign="top">Target file or view.</td>
+ <td valign="top" align="center">required if a branch is not
specified</td>
+ <td valign="top" align="center"></td>
+ </tr>
+ <tr>
+ <td valign="top">branch</td>
+ <td valign="top">Name of branch specification</td>
+ <td valign="center">No</td>
+ <td valign="top" align="center">-b</td>
+ </tr>
+ <tr>
+ <td valign="top">change</td>
+ <td valign="top">An existing changelist number to assign files to.</td>
+ <td valign="top" align="center">No, but see above.</td>
+ <td valign="top" align="center">-c</td>
+ </tr>
+ <tr>
+ <td valign="top">forceintegrate</td>
+ <td valign="top">Forces integration regardless of previous integration
history (*)</td>
+ <td valign="center">No</td>
+ <td valign="top" align="center">-f</td>
+ </tr>
+ <tr>
+ <td valign="top">restoredeletedrevisions</td>
+ <td valign="top">Enables integration around deleted revisions (*)</td>
+ <td valign="center">No</td>
+ <td valign="top" align="center">-d</td>
+ </tr>
+ <tr>
+ <td valign="top">leavetargetrevision</td>
+ <td valign="top">Prevents target files from being synced to head
revision before integration (*)</td>
+ <td valign="center">No</td>
+ <td valign="top" align="center">-h</td>
+ </tr>
+ <tr>
+ <td valign="top">enablebaselessmerges</td>
+ <td valign="top">Forces integration to existing target files which have
no integration history relative to the source files (*)</td>
+ <td valign="center">No</td>
+ <td valign="top" align="center">-i</td>
+ </tr>
+ <tr>
+ <td valign="top">simulationmode</td>
+ <td valign="top">Displays which integrations are necessary but do not
actually schedule them (*)</td>
+ <td valign="center">No</td>
+ <td valign="top" align="center">-n</td>
+ </tr>
+ <tr>
+ <td valign="top">reversebranchmappings</td>
+ <td valign="top">Reverses mappings in the branch view, with source and
target files exchanging place (*)</td>
+ <td valign="center">No</td>
+ <td valign="top" align="center">-r</td>
+ </tr>
+ <tr>
+ <td valign="top">propagatesourcefiletype</td>
+ <td valign="top">Makes source file type propagate to existing target
files (*)</td>
+ <td valign="center">No</td>
+ <td valign="top" align="center">-t</td>
+ </tr>
+ <tr>
+ <td valign="top">nocopytargetfiles</td>
+ <td valign="top">Prevents the physical delivery on disk of new target
files (*)</td>
+ <td valign="center">No</td>
+ <td valign="top" align="center">-v</td>
+ </tr>
+</table>
+<br>
+(*) The following applies for a number of flags. The default is false. To
set the flag, use "true"
+
+<h3>Examples</h3>
+<pre>
+<p4integrate
+ fromfile="//depot/projects/projectfoo/main/src/Blah.java..."
+ tofile="//depot/projects/projectfoo/release/src/Blah.java..."
+ change="${p4.change}"/>
+</pre>
+<hr>
+<h2><a name="p4resolve">P4Resolve</a></h2>
+<h3>Description:</h3>
+<p>Resolves files. You want to do this if :
+<ul>
+<li>
+there have been or there may be concurrent edits of the same file. For
instance, you have begun to edit a file, and while you were working on it,
somebody has submitted a new version of the same file. When you first attempt
to submit your file(s), you will get a message (property p4.needsresolve set).
+</li>
+<li>
+you have just been doing an integration to existing target files
+</li>
+</ul>
+P4Resolve does not use a change list number (it takes it from the files it
is working on).
+</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>
+ <td align="center" valign="top"><b>Perforce command line flag</b></td>
+ </tr>
+ <tr>
+ <td valign="top">view</td>
+ <td valign="top">The filespec to request to delete</td>
+ <td valign="top" align="center">Yes</td>
+ <td valign="top" align="center"></td>
+ </tr>
+ <tr>
+ <td valign="top">resolvemode</td>
+ <td valign="top">Should have one of these values :
+ <ul>
+ <li>"automatic"</li>
+ <li>"force"</li>
+ <li>"safe"</li>
+ <li>"theirs"</li>
+ <li>"yours"</li>
+ </ul></td>
+ <td valign="top" align="center">Yes</td>
+ <td valign="top" align="center">corresponds to one of -am -af -as -at
-ay </td>
+ </tr>
+ <tr>
+ <td valign="top">redoall</td>
+ <td valign="top">allows previously resolved files to be resolved again
(*)</td>
+ <td valign="top" align="center">No</td>
+ <td valign="top" align="center">-f</td>
+ </tr>
+ <tr>
+ <td valign="top">simulationmode</td>
+ <td valign="top">Lists the integrations which would be performed,
without actually doing them. (*)</td>
+ <td valign="top" align="center">No</td>
+ <td valign="top" align="center">-n</td>
+ </tr>
+ <tr>
+ <td valign="top">forcetextmode</td>
+ <td valign="top">Attempts a textual merge, even for binary files (*)</td>
+ <td valign="top" align="center">No</td>
+ <td valign="top" align="center">-t</td>
+ </tr>
+ <tr>
+ <td valign="top">markersforall</td>
+ <td valign="top">Puts in markers for all changes, conflicting or not
(*)</td>
+ <td valign="top" align="center">No</td>
+ <td valign="top" align="center">-v</td>
+ </tr>
+</table>
+<br>
+(*) The following applies for a number of flags. The default is false. To
set the flag, use "true"
+
+<h3>Examples</h3>
+<pre>
+<p4resolve
+ view="//depot/projects/projectfoo/main/src/Blah.java..."
+ change="${p4.change}"
+ resolvemode="automatic"/>
+</pre>
<h2><a name="changes">Change History</a></h2>
<table border="1" cellpadding="2" cellspacing="0">
1.139 +2 -0
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties
Index: defaults.properties
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties,v
retrieving revision 1.138
retrieving revision 1.139
diff -u -w -u -r1.138 -r1.139
--- defaults.properties 31 Jan 2003 06:48:49 -0000 1.138
+++ defaults.properties 4 Feb 2003 12:23:50 -0000 1.139
@@ -128,6 +128,8 @@
p4have=org.apache.tools.ant.taskdefs.optional.perforce.P4Have
p4sync=org.apache.tools.ant.taskdefs.optional.perforce.P4Sync
p4edit=org.apache.tools.ant.taskdefs.optional.perforce.P4Edit
+p4integrate=org.apache.tools.ant.taskdefs.optional.perforce.P4Integrate
+p4resolve=org.apache.tools.ant.taskdefs.optional.perforce.P4Resolve
p4submit=org.apache.tools.ant.taskdefs.optional.perforce.P4Submit
p4counter=org.apache.tools.ant.taskdefs.optional.perforce.P4Counter
p4revert=org.apache.tools.ant.taskdefs.optional.perforce.P4Revert
1.11 +40 -7
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Submit.java
Index: P4Submit.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Submit.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -w -u -r1.10 -r1.11
--- P4Submit.java 9 Jul 2002 21:06:10 -0000 1.10
+++ P4Submit.java 4 Feb 2003 12:23:51 -0000 1.11
@@ -61,6 +61,7 @@
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
+import java.util.Vector;
/** Submits a numbered changelist to Perforce.
*
@@ -80,7 +81,7 @@
public String change;
/**
- * The changelist number to submit; required.
+ * @param change The changelist number to submit; required.
*/
public void setChange(String change) {
this.change = change;
@@ -88,16 +89,48 @@
public void execute() throws BuildException {
if (change != null) {
- execP4Command("submit -c " + change,
- new P4HandlerAdapter() {
- public void process(String line) {
- log(line, Project.MSG_VERBOSE);
- }
- });
+ execP4Command("submit -c " + change, (P4HandlerAdapter) new
P4SubmitAdapter());
} else {
//here we'd parse the output from change -o into submit -i
//in order to support default change.
throw new BuildException("No change specified (no support for
default change yet....");
+ }
+ }
+
+ public class P4SubmitAdapter extends P4HandlerAdapter {
+ public void process(String line) {
+ log(line, Project.MSG_VERBOSE);
+ getProject().setProperty("p4.needsresolve","0");
+ // this type of output might happen
+ // Change 18 renamed change 20 and submitted.
+ if (util.match("/renamed/", line)) {
+ try {
+ Vector myarray = new Vector();
+ util.split(myarray, line);
+ boolean found = false;
+ for (int counter = 0; counter < myarray.size();
counter++) {
+ if (found == true) {
+ int changenumber = Integer.parseInt((String)
myarray.elementAt(counter + 1));
+ log("Perforce change renamed " + changenumber,
Project.MSG_INFO);
+ getProject().setProperty("p4.change", "" +
changenumber);
+ found = false;
+ }
+ if (((String)
(myarray.elementAt(counter))).equals("renamed")) {
+ found = true;
+ }
+ }
+ }
+ // NumberFormatException or ArrayOutOfBondsException
could happen here
+ catch (Exception e) {
+ String msg = "Failed to parse " + line + "\n"
+ + " due to " + e.getMessage();
+ throw new BuildException(msg, e, getLocation());
+ }
+ }
+ if (util.match("/p4 submit -c/",line)) {
+ getProject().setProperty("p4.needsresolve","1");
+ }
+
}
}
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Integrate.java
Index: P4Integrate.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 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 org.apache.tools.ant.BuildException;
/**
* Integrate file(s).
* P4Change should be used to obtain a new changelist for P4Integrate,
* although P4Integrate can open files to the default change,
* P4Submit cannot yet submit to it.
* Example Usage:<br>
* <p4integrate change="${p4.change}"
fromfile="//depot/project/dev/foo.txt" tofile="//depot/project/main/foo.txt"
/>
*
* @author <A HREF="mailto:[EMAIL PROTECTED]">Antoine Levy-Lambert</A>
*
*/
public class P4Integrate extends P4Base {
private String change = null;
private String fromfile = null;
private String tofile = null;
private String branch = null;
private boolean restoredeletedrevisions = false;
private boolean forceintegrate = false;
private boolean leavetargetrevision = false;
private boolean enablebaselessmerges = false;
private boolean simulationmode = false;
private boolean reversebranchmappings = false;
private boolean propagatesourcefiletype = false;
private boolean nocopynewtargetfiles = false;
/**
* get the changelist number
*
* @returns the changelist number set for this task
*/
public String getChange() {
return change;
}
/**
* set the changelist number for the operation
*
* @param change An existing changelist number to assign files to;
optional
* but strongly recommended.
*/
public void setChange(String change) {
this.change = change;
}
/**
* get the from file specification
*
* @returns the from file specification
*/
public String getFromfile() {
return fromfile;
}
/**
* sets the from file specification
*
* @param fromf the from file specification
*/
public void setFromfile(String fromf) {
this.fromfile = fromf;
}
/**
* get the to file specification
*
* @returns the to file specification
*/
public String getTofile() {
return tofile;
}
/**
* sets the to file specification
*
* @param tof the to file specification
*/
public void setTofile(String tof) {
this.tofile = tof;
}
/**
* get the branch
*
* @returns the name of the branch
*/
public String getBranch() {
return branch;
}
/**
* sets the branch
*
* @param br the name of the branch to use
*/
public void setBranch(String br) {
this.branch = br;
}
/**
* gets the restoredeletedrevisions flag
*
* @returns restore deleted revisions
*/
public boolean isRestoreDeletedRevisions() {
return restoredeletedrevisions;
}
/**
* sets the restoredeletedrevisions flag
*
* @param setrest value chosen for restoredeletedrevisions
*/
public void setRestoreDeletedRevisions(boolean setrest) {
this.restoredeletedrevisions = setrest;
}
/**
* gets the forceintegrate flag
*
* @returns restore deleted revisions
*/
public boolean isForceIntegrate() {
return forceintegrate;
}
/**
* sets the forceintegrate flag
*
* @param setrest value chosen for forceintegrate
*/
public void setForceIntegrate(boolean setrest) {
this.forceintegrate = setrest;
}
/**
* gets the leavetargetrevision flag
*
* @returns flag indicating if the target revision should be preserved
*/
public boolean isLeaveTargetRevision() {
return leavetargetrevision;
}
/**
* sets the leavetargetrevision flag
*
* @param setrest value chosen for leavetargetrevision
*/
public void setLeaveTargetRevision(boolean setrest) {
this.leavetargetrevision = setrest;
}
/**
* gets the enablebaselessmerges flag
*
* @returns boolean indicating if baseless merges are desired
*/
public boolean isEnableBaselessMerges() {
return enablebaselessmerges;
}
/**
* sets the enablebaselessmerges flag
*
* @param setrest value chosen for enablebaselessmerges
*/
public void setEnableBaselessMerges(boolean setrest) {
this.enablebaselessmerges = setrest;
}
/**
* gets the simulationmode flag
*
* @returns simulation mode flag
*/
public boolean isSimulationMode() {
return simulationmode;
}
/**
* sets the simulationmode flag
*
* @param setrest value chosen for simulationmode
*/
public void setSimulationMode(boolean setrest) {
this.simulationmode = setrest;
}
/**
* returns the flag indicating if reverse branch mappings are sought
*
* @returns reversebranchmappings flag
*/
public boolean isReversebranchmappings() {
return reversebranchmappings;
}
/**
* sets the reversebranchmappings flag
*
* @param reversebranchmappings flag indicating if reverse branch
mappings are sought
*/
public void setReversebranchmappings(boolean reversebranchmappings) {
this.reversebranchmappings = reversebranchmappings;
}
/**
* returns flag indicating if propagation of source file type is sought
*
* @returns flag set to true if you want to propagate source file type
for existing target files
*/
public boolean isPropagatesourcefiletype() {
return propagatesourcefiletype;
}
/**
* sets flag indicating if one wants to propagate the source file type
*
* @param propagatesourcefiletype set it to true if you want to change
the type of existing target files according to type of source file.
*/
public void setPropagatesourcefiletype(boolean propagatesourcefiletype) {
this.propagatesourcefiletype = propagatesourcefiletype;
}
/**
* returns flag indicating if one wants to suppress the copying on the
local hard disk of new target files
*
* @returns flag indicating if one wants to suppress the copying on the
local hard disk of new target files
*/
public boolean isNocopynewtargetfiles() {
return nocopynewtargetfiles;
}
/**
* sets nocopynewtargetfiles flag
*
* @param nocopynewtargetfiles set it to true to gain speed in
integration by not copying on the local Perforce client new target files
*/
public void setNocopynewtargetfiles(boolean nocopynewtargetfiles) {
this.nocopynewtargetfiles = nocopynewtargetfiles;
}
/**
* execute the p4 integrate
*/
public void execute() throws BuildException {
if (change != null) {
P4CmdOpts = "-c " + change;
}
if (this.forceintegrate) {
P4CmdOpts = P4CmdOpts + " -f";
}
if (this.restoredeletedrevisions) {
P4CmdOpts = P4CmdOpts + " -d";
}
if ( this.leavetargetrevision) {
P4CmdOpts = P4CmdOpts + " -h";
}
if ( this.enablebaselessmerges ) {
P4CmdOpts = P4CmdOpts + " -i";
}
if (this.simulationmode ) {
P4CmdOpts = P4CmdOpts + " -n";
}
if ( this.reversebranchmappings ) {
P4CmdOpts = P4CmdOpts + " -r";
}
if ( this.propagatesourcefiletype ) {
P4CmdOpts = P4CmdOpts + " -t";
}
if ( this.nocopynewtargetfiles ) {
P4CmdOpts = P4CmdOpts + "-v";
}
String command;
if (branch == null && fromfile != null && tofile != null) {
command = P4CmdOpts + " " + fromfile + " " + tofile;
}
else if ( branch != null && fromfile == null && tofile != null )
{
command = P4CmdOpts + " -b " + branch + " " + tofile;
}
else if ( branch != null && fromfile != null )
{
command = P4CmdOpts + " -b " + branch + " -s "+ fromfile + " " +
tofile;
}
else {
throw new BuildException("you need to specify fromfile and
tofile, or branch and tofile, or branch and fromfile, or branch and fromfile
and tofile ");
}
execP4Command("-s integrate " + command, new
SimpleP4OutputHandler(this));
}
}
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Resolve.java
Index: P4Resolve.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 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 org.apache.tools.ant.BuildException;
public class P4Resolve extends P4Base{
private String resolvemode = null;
private boolean redoall; /* -f */
private boolean simulationmode; /* -n */
private boolean forcetextmode; /* -t */
private boolean markersforall; /* -v */
private static final String AUTOMATIC = "automatic";
private static final String FORCE = "force";
private static final String SAFE = "safe";
private static final String THEIRS = "theirs";
private static final String YOURS = "yours";
private static final String[] resolvemodes = {
AUTOMATIC,
FORCE,
SAFE,
THEIRS,
YOURS
};
public String getResolvemode() {
return resolvemode;
}
/**
* values for resolvemode
* <ul>
* <li> automatic -am</li>
* <li> force -af </li>
* <li> safe -as </li>
* <li> theirs -at </li>
* <li> yours -ay </li>
* </ul>
*/
public void setResolvemode(String resolvemode) {
boolean found=false;
for (int counter=0; counter < resolvemodes.length; counter++)
{
if (resolvemode.equals(resolvemodes[counter])) {
found=true;
break;
}
}
if (found==false) {
throw new BuildException("Unacceptable value for resolve mode");
}
this.resolvemode = resolvemode;
}
public boolean isRedoall() {
return redoall;
}
public void setRedoall(boolean redoall) {
this.redoall = redoall;
}
public boolean isSimulationmode() {
return simulationmode;
}
public void setSimulationmode(boolean simulationmode) {
this.simulationmode = simulationmode;
}
public boolean isForcetextmode() {
return forcetextmode;
}
public void setForcetextmode(boolean forcetextmode) {
this.forcetextmode = forcetextmode;
}
public boolean isMarkersforall() {
return markersforall;
}
public void setMarkersforall(boolean markersforall) {
this.markersforall = markersforall;
}
/**
* execute the p4 resolve
*/
public void execute() throws BuildException {
if (this.resolvemode.equals(AUTOMATIC)) {
P4CmdOpts = P4CmdOpts + " -am";
}
else if (this.resolvemode.equals(FORCE)) {
P4CmdOpts = P4CmdOpts + " -af";
}
else if (this.resolvemode.equals(SAFE)) {
P4CmdOpts = P4CmdOpts + " -as";
}
else if (this.resolvemode.equals(THEIRS)) {
P4CmdOpts = P4CmdOpts + " -at";
}
else if (this.resolvemode.equals(YOURS)) {
P4CmdOpts = P4CmdOpts + " -ay";
}
else
{
throw new BuildException("unsupported or absent resolve mode");
}
if (P4View==null) {
throw new BuildException("please specify a view");
}
if ( this.isRedoall() ) {
P4CmdOpts = P4CmdOpts + " -f";
}
if ( this.isSimulationmode() ) {
P4CmdOpts = P4CmdOpts + " -n";
}
if ( this.isForcetextmode() ) {
P4CmdOpts = P4CmdOpts + " -t";
}
if ( this.isMarkersforall() ) {
P4CmdOpts = P4CmdOpts + " -v";
}
execP4Command("-s resolve " + P4CmdOpts + " " + P4View, new
SimpleP4OutputHandler(this));
}
}
1.1
jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/optional/perforce/build1.xml
Index: build1.xml
===================================================================
<!-- author Antoine Levy-Lambert [EMAIL PROTECTED] -->
<!-- this file demonstrates that p4.change will be modified by p4submit -->
<!-- if the change number is modified by the Perforce daemon during the
submission -->
<project name="build1" default="runtest">
<target name="runtest">
<p4change/>
<property name="change1" value="${p4.change}" />
<echo>
doing a first change ${change1}
</echo>
<p4change/>
<property name="change2" value="${p4.change}" />
<echo>
doing a second change ${change2}
</echo>
<p4edit view="//depot/foobar" change="${change1}" />
<p4edit view="//depot/hello" change="${change2}" />
<echo>
before submitting of hello change ${change2} p4.change is now ${p4.change}
</echo>
<p4submit change="${change2}"/>
<echo>
after submitting of hello p4.change is now ${p4.change}
</echo>
<echo>
before submitting of foobar change ${change1}
</echo>
<p4submit change="${change1}"/>
<echo>
after submitting of foobar p4.change is now ${p4.change}
</echo>
</target>
</project>
1.1
jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/optional/perforce/build2.xml
Index: build2.xml
===================================================================
<!-- author Antoine Levy-Lambert [EMAIL PROTECTED] -->
<!-- this test shows that p4 submit can now indicate that a file needs to be
resolved -->
<!-- before running the test, edit this xml and change the 5 properties at
the top to values which make sense on your system-->
<!-- the test uses two Perforce client specs which must exist beforehand -->
<!-- also using both client specs you should be able to edit the file
${depot_file_spec} -->
<project name="testresolve" default= "test">
<property name="first_client" value="levyant_dev_ant"/>
<property name="first_client_root" value="C:\dev\gnu"/>
<property name="second_client" value="levyant_cygwin_test"/>
<property name="second_client_root" value="C:\dev\test"/>
<property name="depot_file_spec" value="//depot/foobar"/>
<target name="test">
<p4change client="${first_client}"/>
<property name="change1" value="${p4.change}" />
<p4change client="${second_client}"/>
<property name="change2" value="${p4.change}" />
<sequential>
<antcall target="edit">
<param name="p4.client" value="${first_client}"/>
<param name="client_root" value="${first_client_root}"/>
<param name="change" value="${change1}"/>
</antcall>
<antcall target="edit">
<param name="p4.client" value="${second_client}"/>
<param name="client_root" value="${second_client_root}"/>
<param name="change" value="${change2}"/>
</antcall>
<antcall target="submit">
<param name="p4.client" value="${first_client}"/>
<param name="change" value="${change1}"/>
</antcall>
<antcall target="submit">
<param name="p4.client" value="${second_client}"/>
<param name="change" value="${change2}"/>
</antcall>
</sequential>
</target>
<target name="edit">
<echo>
doing a change ${change} on client ${p4.client}
</echo>
<p4edit change="${change}" view="${depot_file_spec}"/>
<echo file="${depot_file_spec}">
hello ${p4.client} ${change}
</echo>
</target>
<target name="submit">
<p4submit change="${change}"/>
<echo>
p4.needsresolve ${p4.needsresolve} after submit
</echo>
</target>
</project>
1.1
jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/optional/perforce/p4integrate.xml
Index: p4integrate.xml
===================================================================
<!-- author Antoine Levy-Lambert [EMAIL PROTECTED] -->
<!-- this test demonstrates p4integrate -->
<project name="integrate" default= "testintegrate">
<property name="second_client" value="levyant_cygwin_test"/>
<property name="second_client_root" value="C:\dev\test"/>
<property name="depot_file_spec" value="//depot/foobar"/>
<property name="depot_file_spec_2" value="//depot/hello"/>
<target name="testintegrate">
<p4change client="${second_client}"/>
<property name="change1" value="${p4.change}" />
<p4integrate client="${second_client}" change="${p4.change}"
fromfile="${depot_file_spec}" tofile="${depot_file_spec_2}"
forceintegrate="true" />
<p4resolve client="${second_client}" view="${depot_file_spec_2}"
resolvemode="theirs"/>
<p4submit client="${second_client}" change="${p4.change}"/>
</target>
</project>