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>