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><a href="#p4add">P4Add</a></td> | ||||
| <td>Add files</td> | <td>Add files</td> | ||||
| </tr> | </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> | <tr> | ||||
| <td><a href="#p4fstat">P4Fstat</a></td> | <td><a href="#p4fstat">P4Fstat</a></td> | ||||
| <td>Show differences between local repository and p4 repository</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="p4reopen" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Reopen"/> | ||||
| <taskdef name="p4revert" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Revert"/> | <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="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> | </pre> | ||||
| <hr> | <hr> | ||||
| @@ -245,7 +259,8 @@ available from the <a href="http://www.perforce.com/" target="_top">Perforce web | |||||
| <h3>Description:</h3> | <h3>Description:</h3> | ||||
| <p>Request a new changelist from the Perforce server. | <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>, | 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> | </p> | ||||
| <h3>Parameters</h3> | <h3>Parameters</h3> | ||||
| <table border="1" cellpadding="2" cellspacing="0"> | <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> | <h2><a name="p4submit">P4Submit</a></h2> | ||||
| <h3>Description:</h3> | <h3>Description:</h3> | ||||
| <p>Submit a changelist, usually obtained from P4Change. | <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> | </p> | ||||
| <h3>Parameters</h3> | <h3>Parameters</h3> | ||||
| <table border="1" cellpadding="2" cellspacing="0"> | <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> | <h2><a name="changes">Change History</a></h2> | ||||
| <table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
| <tr> | <tr> | ||||
| @@ -128,6 +128,8 @@ p4label=org.apache.tools.ant.taskdefs.optional.perforce.P4Label | |||||
| p4have=org.apache.tools.ant.taskdefs.optional.perforce.P4Have | p4have=org.apache.tools.ant.taskdefs.optional.perforce.P4Have | ||||
| p4sync=org.apache.tools.ant.taskdefs.optional.perforce.P4Sync | p4sync=org.apache.tools.ant.taskdefs.optional.perforce.P4Sync | ||||
| p4edit=org.apache.tools.ant.taskdefs.optional.perforce.P4Edit | 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 | p4submit=org.apache.tools.ant.taskdefs.optional.perforce.P4Submit | ||||
| p4counter=org.apache.tools.ant.taskdefs.optional.perforce.P4Counter | p4counter=org.apache.tools.ant.taskdefs.optional.perforce.P4Counter | ||||
| p4revert=org.apache.tools.ant.taskdefs.optional.perforce.P4Revert | 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.BuildException; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import java.util.Vector; | |||||
| /** Submits a numbered changelist to Perforce. | /** Submits a numbered changelist to Perforce. | ||||
| * | * | ||||
| @@ -80,7 +81,7 @@ public class P4Submit extends P4Base { | |||||
| public String change; | public String change; | ||||
| /** | /** | ||||
| * The changelist number to submit; required. | |||||
| * @param change The changelist number to submit; required. | |||||
| */ | */ | ||||
| public void setChange(String change) { | public void setChange(String change) { | ||||
| this.change = change; | this.change = change; | ||||
| @@ -88,12 +89,7 @@ public class P4Submit extends P4Base { | |||||
| public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
| if (change != null) { | 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 { | } else { | ||||
| //here we'd parse the output from change -o into submit -i | //here we'd parse the output from change -o into submit -i | ||||
| //in order to support default change. | //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> | |||||