001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: /*
019: * Portions of this software are based upon public domain software
020: * originally written at the National Center for Supercomputing Applications,
021: * University of Illinois, Urbana-Champaign.
022: */
023:
024: package org.apache.tools.ant.taskdefs.optional.perforce;
025:
026: import org.apache.tools.ant.BuildException;
027: import org.apache.tools.ant.Project;
028: import java.util.Vector;
029:
030: /** Submits a numbered changelist to Perforce.
031: *
032: * <B>Note:</B> P4Submit cannot (yet) submit the default changelist.
033: * This shouldn't be a problem with the ANT task as the usual flow is
034: * P4Change to create a new numbered change followed by P4Edit then P4Submit.
035: *
036: * Example Usage:-<br>
037: * <p4submit change="${p4.change}" />
038: *
039: * @ant.task category="scm"
040: */
041: public class P4Submit extends P4Base {
042:
043: // CheckStyle:VisibilityModifier OFF - bc
044: //ToDo: If dealing with default cl need to parse out <enter description here>
045: /**
046: * change list number
047: */
048: public String change;
049: // CheckStyle:VisibilityModifier ON
050: /**
051: * change property
052: */
053: private String changeProperty;
054: /**
055: * needsresolveproperty
056: */
057: private String needsResolveProperty;
058:
059: /**
060: * set the change list number to submit
061: * @param change The changelist number to submit; required.
062: */
063: public void setChange(String change) {
064: this .change = change;
065: }
066:
067: /**
068: * property defining the change number if the change number gets renumbered
069: * @param changeProperty name of a new property to which the change number
070: * will be assigned if it changes
071: * @since ant 1.6.1
072: */
073: public void setChangeProperty(String changeProperty) {
074: this .changeProperty = changeProperty;
075: }
076:
077: /**
078: * property defining the need to resolve the change list
079: * @param needsResolveProperty a property which will be set if the change needs resolve
080: * @since ant 1.6.1
081: */
082: public void setNeedsResolveProperty(String needsResolveProperty) {
083: this .needsResolveProperty = needsResolveProperty;
084: }
085:
086: /**
087: * do the work
088: * @throws BuildException if no change list specified
089: */
090: public void execute() throws BuildException {
091: if (change != null) {
092: execP4Command("submit -c " + change,
093: (P4HandlerAdapter) new P4SubmitAdapter(this ));
094: } else {
095: //here we'd parse the output from change -o into submit -i
096: //in order to support default change.
097: throw new BuildException(
098: "No change specified (no support for default change yet....");
099: }
100: }
101:
102: /**
103: * internal class used to process the output of p4 submit
104: */
105: public class P4SubmitAdapter extends SimpleP4OutputHandler {
106: /**
107: * Constructor.
108: * @param parent a P4Base instance.
109: */
110: public P4SubmitAdapter(P4Base parent) {
111: super (parent);
112: }
113:
114: /**
115: * process a line of stdout/stderr coming from Perforce
116: * @param line line of stdout or stderr coming from Perforce
117: */
118: public void process(String line) {
119: super .process(line);
120: getProject().setProperty("p4.needsresolve", "0");
121: // this type of output might happen
122: // Change 18 renamed change 20 and submitted.
123: if (util.match("/renamed/", line)) {
124: try {
125: Vector myarray = new Vector();
126: util.split(myarray, line);
127: boolean found = false;
128: for (int counter = 0; counter < myarray.size(); counter++) {
129: if (found) {
130: String chnum = (String) myarray
131: .elementAt(counter + 1);
132: int changenumber = Integer.parseInt(chnum);
133: log("Perforce change renamed "
134: + changenumber, Project.MSG_INFO);
135: getProject().setProperty("p4.change",
136: "" + changenumber);
137: if (changeProperty != null) {
138: getProject().setNewProperty(
139: changeProperty, chnum);
140: }
141: found = false;
142: }
143: if (((myarray.elementAt(counter)))
144: .equals("renamed")) {
145: found = true;
146: }
147: }
148: // NumberFormatException or ArrayOutOfBondsException could happen here
149: } catch (Exception e) {
150: String msg = "Failed to parse " + line + "\n"
151: + " due to " + e.getMessage();
152: throw new BuildException(msg, e, getLocation());
153: }
154: }
155: if (util.match("/p4 submit -c/", line)) {
156: getProject().setProperty("p4.needsresolve", "1");
157: if (needsResolveProperty != null) {
158: getProject().setNewProperty(needsResolveProperty,
159: "true");
160: }
161: }
162:
163: }
164: }
165:
166: }
|