diff --git a/docs/manual/OptionalTasks/perforce.html b/docs/manual/OptionalTasks/perforce.html index 1a8c73d6e..2dbf0d34f 100644 --- a/docs/manual/OptionalTasks/perforce.html +++ b/docs/manual/OptionalTasks/perforce.html @@ -339,8 +339,19 @@ although P4Edit can open files to the default change, P4Submit cannot yet submi

P4Counter

Description:

-

Obtain or set the value of a counter +

+Obtain or set the value of a counter. When used in its base form +(where only the counter name is provided), the counter value will be +printed to the output stream. When the value is provided, the counter +will be set to the value provided. When a property name is provided, +the property will be filled with the value of the counter. You may +not specify to both get and set the value of the counter in the same +Task.

+

+The user performing this task must have Perforce "review" permissions +as defined by Perforce protections in order for this task to succeed. +

Parameters

@@ -358,12 +369,26 @@ although P4Edit can open files to the default change, P4Submit cannot yet submi + + + + +
The new value for the counter No
propertyThe property to be set with the value of the counterNo

Examples

+Print the value of the counter named "last-clean-build" to the output stream:
 <p4counter name="last-clean-build" />
+
+Set the value of the counter based on the value of the "TSTAMP" property: +
 <p4counter name="last-clean-build" value="${TSTAMP}" />
+
+Set the value of the "p4.last.clean.build" property to the current +value of the "last-clean-build" counter: +
+<p4counter name="last-clean-build" property="${p4.last.clean.build}" />
 

diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Counter.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Counter.java index f92189be9..de6c29653 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Counter.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Counter.java @@ -60,21 +60,23 @@ package org.apache.tools.ant.taskdefs.optional.perforce; import org.apache.tools.ant.*; -/** P4Counter - Obtain the value of a counter. +/** P4Counter - Obtain or set the value of a counter. + * P4Counter can be used to either print the value of a counter + * to the output stream for the project (by setting the "name" + * attribute only), to set a property based on the value of + * a counter (by setting the "property" attribute) or to set the counter + * on the perforce server (by setting the "value" attribute). * * Example Usage:
- * <p4counter name="${p4.change}"/> + * <p4counter name="${p4.counter}" property=${p4.change}"/> * @author Kirk Wylie - * - * ToDo: Should be able to write the counter value to a property. - * I've left that out of the first version here because it involves - * changing the P4OutputHandler fairly substantially, and thus - * shouldn't be the second thing that I do here. */ public class P4Counter extends P4Base { public String counter = null; + public String property = null; public boolean shouldSetValue = false; + public boolean shouldSetProperty = false; public int value = 0; public void setName(String counter) { @@ -86,17 +88,51 @@ public class P4Counter extends P4Base { shouldSetValue = true; } + public void setProperty(String property) { + this.property = property; + shouldSetProperty = true; + } + public void execute() throws BuildException { if((counter == null) || counter.length() == 0) { throw new BuildException("No counter specified to retrieve"); } - String command = "-s counter " + P4CmdOpts + " " + counter; + if(shouldSetValue && shouldSetProperty) { + throw new BuildException("Cannot both set the value of the property and retrieve the value of the property."); + } + + String command = "counter " + P4CmdOpts + " " + counter; + if(!shouldSetProperty) { + // NOTE kirk@radik.com 04-April-2001 -- If you put in the -s, you + // have to start running through regular expressions here. Much easier + // to just not include the scripting information than to try to add it + // and strip it later. + command = "-s " + command; + } if(shouldSetValue) { command += " " + value; } - execP4Command(command, new SimpleP4OutputHandler(this)); + if(shouldSetProperty) { + final Project myProj = project; + + P4Handler handler = new P4HandlerAdapter() { + public void process(String line) { + log("P4Counter retrieved line \""+ line + "\"", Project.MSG_VERBOSE); + try { + value = Integer.parseInt(line); + myProj.setProperty(property, ""+value); + } catch (NumberFormatException nfe) { + throw new BuildException("Perforce error. Could not retrieve counter value."); + } + } + }; + + execP4Command(command, handler); + } else { + execP4Command(command, new SimpleP4OutputHandler(this)); + } } }