PR: 15707 Submitted by: Antoine Levy-Lambert git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273968 13f79535-47bb-0310-9956-ffa450edef68master
@@ -79,7 +79,18 @@ You will also need the Perforce client executable (p4 or p4.exe but not p4win.ex | |||
<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 @@ available from the <a href="http://www.perforce.com/" target="_top">Perforce web | |||
<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 @@ available from the <a href="http://www.perforce.com/" target="_top">Perforce web | |||
<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 @@ although P4Edit can open files to the default change, P4Submit cannot yet submi | |||
<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"> | |||
@@ -618,6 +638,214 @@ will list all the files under C:\dev\gnu\depot, sorted by under Perforce or not | |||
<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"> | |||
<tr> | |||
@@ -128,6 +128,8 @@ p4label=org.apache.tools.ant.taskdefs.optional.perforce.P4Label | |||
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 | |||
@@ -0,0 +1,353 @@ | |||
/* | |||
* 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 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 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:levylambert@tiscali-dsl.de">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)); | |||
} | |||
} |
@@ -0,0 +1,185 @@ | |||
/* | |||
* 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 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 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)); | |||
} | |||
} |
@@ -61,6 +61,7 @@ package org.apache.tools.ant.taskdefs.optional.perforce; | |||
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 class P4Submit extends P4Base { | |||
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,12 +89,7 @@ public class P4Submit extends P4Base { | |||
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. | |||
@@ -101,4 +97,41 @@ public class P4Submit extends P4Base { | |||
} | |||
} | |||
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"); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
<!-- author Antoine Levy-Lambert levylambert@tiscali-dsl.de --> | |||
<!-- 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> |
@@ -0,0 +1,53 @@ | |||
<!-- author Antoine Levy-Lambert levylambert@tiscali-dsl.de --> | |||
<!-- 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> |
@@ -0,0 +1,15 @@ | |||
<!-- author Antoine Levy-Lambert levylambert@tiscali-dsl.de --> | |||
<!-- 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> |