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
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 |
+
+ property |
+ The property to be set with the value of the counter |
+ No |
+
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));
+ }
}
}