diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Base.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Base.java new file mode 100644 index 000000000..9191d8b9f --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Base.java @@ -0,0 +1,173 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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 + * . + */ + +package org.apache.tools.ant.taskdefs.optional.perforce; + +import java.io.*; +import org.apache.tools.ant.*; +//import org.apache.tools.ant.util.regexp.*; +import org.apache.oro.text.perl.*; + +/** Base class for Perforce (P4) ANT tasks. See individual task for example usage. + * + * @see P4Sync + * @see P4Have + * @see P4Change + * @see P4Edit + * @see P4Submit + * @see P4Label + * @see org.apache.tools.ant.taskdefs.Exec + * @author Les Hughes + */ +public abstract class P4Base extends org.apache.tools.ant.Task { + + /**Perl5 regexp in Java - cool eh? */ + protected Perl5Util util = null; + /** The OS shell to use (cmd.exe or /bin/sh) */ + protected String shell; + + //P4 runtime directives + /** Perforce Server Port (eg KM01:1666) */ + protected String P4Port = ""; + /** Perforce Client (eg myclientspec) */ + protected String P4Client = ""; + /** Perforce User (eg fbloggs) */ + protected String P4User = ""; + /** Perforce view for commands (eg //projects/foobar/main/source/... ) */ + protected String P4View = ""; + + //P4 g-opts and cmd opts (rtfm) + /** Perforce 'global' opts. + * Forms half of low level API */ + protected String P4Opts = ""; + /** Perforce command opts. + * Forms half of low level API */ + protected String P4CmdOpts = ""; + + //Setters called by Ant + public void setPort(String P4Port) { this.P4Port = "-p"+P4Port; } + public void setClient(String P4Client) { this.P4Client = "-c"+P4Client; } + public void setUser(String P4User) { this.P4User = "-u"+P4User; } + public void setView(String P4View) { this.P4View = P4View; } + public void setCmdopts(String P4CmdOpts) { this.P4CmdOpts = P4CmdOpts; } + + public void init() { + + util = new Perl5Util(); + + // Not as comprehensive as Exec but Exec + // doesn't allow stdin and stdout/stderr processing + + String myOS = System.getProperty("os.name"); + if(myOS == null) throw new BuildException("Unable to determine OS"); + + if(myOS.toLowerCase().indexOf("nt") >= 0) { + shell = "cmd /c "; + } else { + shell = "/bin/sh "; //This needs testing on Unix!!!! + } + //Get default P4 settings from environment - Mark would have done something cool with + //introspection here.....:-) + String tmpprop; + if((tmpprop = project.getProperty("p4.port")) != null) setPort(tmpprop); + if((tmpprop = project.getProperty("p4.client")) != null) setClient(tmpprop); + if((tmpprop = project.getProperty("p4.user")) != null) setUser(tmpprop); + } + + protected void execP4Command(String command) throws BuildException { + execP4Command(command, null, null); + } + + protected void execP4Command(String command, P4OutputHandler handler) throws BuildException { + execP4Command(command, null, handler); + } + /** Execute P4 command assembled by subclasses. + @param command The command to run + @param p4input Input to be fed to command on stdin + @param handler A P4OutputHandler to process any output + */ + protected void execP4Command(String command, String p4input, P4OutputHandler handler) throws BuildException { + try{ + + P4Opts = P4Port+" "+P4User+" "+P4Client; + log("Execing "+shell+"p4 "+P4Opts+" "+command, Project.MSG_VERBOSE); + Process proc = Runtime.getRuntime().exec(shell+"p4 "+P4Opts+" "+command); + + if(p4input != null && p4input.length() >0) { + OutputStream out = proc.getOutputStream(); + out.write(p4input.getBytes()); + out.flush(); + out.close(); + } + + //Q: Do we need to read p4 output if we're not interested? + + BufferedReader input = new BufferedReader( + new InputStreamReader( + new SequenceInputStream(proc.getInputStream(),proc.getErrorStream()))); + + + //we check for a match on the input to save time on the substitution. + String line; + while((line = input.readLine()) != null) { + if(handler != null) handler.process(line); + } + + proc.waitFor(); + input.close(); + }catch(Exception e) { + throw new BuildException("Problem exec'ing P4 command: "+e.getMessage()); + } + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Change.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Change.java new file mode 100644 index 000000000..35cfdde3c --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Change.java @@ -0,0 +1,129 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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 + * . + */ + +package org.apache.tools.ant.taskdefs.optional.perforce; + +import java.io.*; + +import org.apache.tools.ant.*; + +/** P4Change - grab a new changelist from Perforce. + * + * P4Change creates a new changelist in perforce. P4Change sets the property + * ${p4.change} with the new changelist number. This should then be passed into + * p4edit and p4submit. + * + * @see P4Edit + * @see P4Submit + * @author Les Hughes + * + */ +public class P4Change extends P4Base { + + protected String emptyChangeList = null; + + public void execute() throws BuildException { + + if(emptyChangeList == null) emptyChangeList = getEmptyChangeList(); + final Project myProj = project; + execP4Command("change -i", emptyChangeList, new P4OutputHandler() { + public void process(String line) { + if (util.match("/Change/", line)) { + + //Remove any non-numerical chars - should leave the change number + line = util.substitute("s/[^0-9]//g", line); + + int changenumber = Integer.parseInt(line); + log("Change Number is "+changenumber, Project.MSG_INFO); + myProj.setProperty("p4.change", ""+changenumber); + + } else if(util.match("/error/", line)) { + throw new BuildException("Perforce Error, check client settings and/or server"); + } + + }}); + } + + + public String getEmptyChangeList() throws BuildException { + final StringBuffer stringbuf = new StringBuffer(); + + execP4Command("change -o", new P4OutputHandler() { + public void process(String line) { + if(!util.match("/^#/",line)){ + if(util.match("/error/", line)) { + + log("Client Error", Project.MSG_VERBOSE); + throw new BuildException("Perforce Error, check client settings and/or server"); + + } else if(util.match("//",line)) { + + line = util.substitute("s//AutoSubmit By Ant/", line); + + } else if(util.match("/\\/\\//", line)) { + //Match "//" for begining of depot filespec + return; + } + + stringbuf.append(line); + stringbuf.append("\n"); + + } + }}); + + return stringbuf.toString(); + } + + +} //EoF diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Edit.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Edit.java new file mode 100644 index 000000000..f3c9447f6 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Edit.java @@ -0,0 +1,81 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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 + * . + */ + +package org.apache.tools.ant.taskdefs.optional.perforce; + +import org.apache.tools.ant.*; + +/** P4Edit - checkout file(s) for edit. + * + * Example Usage:
+ * <p4edit change="${p4.change}" view="//depot/project/foo.txt" /> + * @author Les Hughes + * + * ToDo: Should call reopen if file is already open in one of our changelists perhaps? + */ + +public class P4Edit extends P4Base { + + public String change = null; + + public void setChange(String change) { + this.change = change; + } + + public void execute() throws BuildException { + if(change != null ) P4CmdOpts = "-c "+change; + if(P4View == null) throw new BuildException("No view specified to edit"); + execP4Command("-s edit "+P4CmdOpts+" "+P4View, new SimpleP4OutputHandler(this)); + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Have.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Have.java new file mode 100644 index 000000000..b6550a179 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Have.java @@ -0,0 +1,71 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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 + * . + */ + +package org.apache.tools.ant.taskdefs.optional.perforce; + +import org.apache.tools.ant.*; + + +/** P4Have - lists files currently on client. + * + * P4Have simply dumps the current file version info into + * the Ant log (or stdout). + * @author Les Hughes + */ +public class P4Have extends P4Base { + + public void execute() throws BuildException { + execP4Command("have "+P4CmdOpts+" "+P4View, new SimpleP4OutputHandler(this)); + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Label.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Label.java new file mode 100644 index 000000000..e6e443757 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Label.java @@ -0,0 +1,132 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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 + * . + */ + +package org.apache.tools.ant.taskdefs.optional.perforce; + +import org.apache.tools.ant.*; + +import java.util.Date; +import java.text.SimpleDateFormat; + + +/** P4Label - create a Perforce Label. + * + * P4Label inserts a label into perforce reflecting the + * current client contents. + * + * Label name defaults to AntLabel if none set. + * + * Example Usage: + * + * @author Les Hughes + */ +public class P4Label extends P4Base { + + protected String name; + protected String desc; + + public void setName(String name) { + this.name = name; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public void execute() throws BuildException { + log("P4Label exec:",Project.MSG_INFO); + + if(P4View == null || P4View.length() < 1) { + log("View not set, assuming //depot/...", Project.MSG_WARN); + P4View = "//depot/..."; + } + + if(desc == null || desc.length() < 1) { + log("Label Description not set, assuming 'AntLabel'", Project.MSG_WARN); + desc = "AntLabel"; + } + + + if(name == null || name.length() < 1) { + SimpleDateFormat formatter = new SimpleDateFormat ("yyyy.MM.dd-hh:mm"); + Date now = new Date(); + name = "AntLabel-"+formatter.format(now); + log("name not set, assuming '"+name+"'", Project.MSG_WARN); + } + + + String newLabel = + "Label: "+name+"\n"+ + "Description: "+desc+"\n"+ + "Options: unlocked\n"+ + "View: "+P4View+"\n"; + + execP4Command("label -i", newLabel, new P4OutputHandler() { + public void process(String line) { + log(line, Project.MSG_VERBOSE); + } + }); + + execP4Command("labelsync -l "+name, null, new P4OutputHandler() { + public void process(String line) { + log(line, Project.MSG_VERBOSE); + } + }); + + + log("Created Label "+name+" ("+desc+")", Project.MSG_INFO); + + } + +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4OutputHandler.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4OutputHandler.java new file mode 100644 index 000000000..f748f4210 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4OutputHandler.java @@ -0,0 +1,67 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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 + * . + */ + +package org.apache.tools.ant.taskdefs.optional.perforce; + +import org.apache.tools.ant.BuildException; + +/** Interface for p4 job output stream handler. Classes implementing this interface + * can be called back by P4Base.execP4Command(); + * + * @author Les Hughes + */ +public interface P4OutputHandler { + + public void process(String line) throws BuildException; +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Submit.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Submit.java new file mode 100644 index 000000000..934c5e2e0 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Submit.java @@ -0,0 +1,94 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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 + * . + */ + +package org.apache.tools.ant.taskdefs.optional.perforce; + +import org.apache.tools.ant.*; + +/** P4Submit - submit a numbered changelist to Perforce. + * + * Note: P4Submit cannot (yet) submit the default changelist. + * This shouldn't be a problem with the ANT API as the usual flow is + * P4Change to create a new numbered change followed by P4Edit then P4Submit. + * + * Example Usage:-
+ * <p4submit change="${p4.change}" /> + * + * @author Les Hughes + * + */ +public class P4Submit extends P4Base { + + //ToDo: If dealing with default cl need to parse out + public String change; + + public void setChange(String change) { + this.change = change; + } + public void execute() throws BuildException { + if(change != null) { + execP4Command("submit -c "+change, new P4OutputHandler(){ + public void process(String line) { + log(line, Project.MSG_VERBOSE); + } + }); + + } 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...."); + } + } + +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Sync.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Sync.java new file mode 100644 index 000000000..542e911af --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Sync.java @@ -0,0 +1,113 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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 + * . + */ + +package org.apache.tools.ant.taskdefs.optional.perforce; + +import org.apache.tools.ant.*; + +/** P4Sync - synchronise client space to a perforce depot view. + * The API allows additional functionality of the "p4 sync" command + * (such as "p4 sync -f //...#have" or other exotic invocations).

+ * + * Example Usage: + * + * + * + * + * + * + *
FunctionCommand
Sync to head using P4USER, P4PORT and P4CLIENT settings specified<P4Sync
P4view="//projects/foo/main/source/..."
P4User="fbloggs"
P4Port="km01:1666"
P4Client="fbloggsclient" />
Sync to head using P4USER, P4PORT and P4CLIENT settings defined in environment<P4Sync P4view="//projects/foo/main/source/..." />
Force a re-sync to head, refreshing all files<P4Sync force="yes" P4view="//projects/foo/main/source/..." />
Sync to a label<P4Sync label="myPerforceLabel" />
+ * + * ToDo: Add decent label error handling for non-exsitant labels + * + * @author Les Hughes + */ +public class P4Sync extends P4Base { + + String label; + private String syncCmd = ""; + + public void setLabel(String label) throws BuildException { + if(label == null && !label.equals("")) + throw new BuildException("P4Sync: Labels cannot be Null or Empty"); + + this.label = label; + + } + + + public void setForce(String force) throws BuildException { + if(force == null && !label.equals("")) + throw new BuildException("P4Sync: If you want to force, set force to non-null string!"); + P4CmdOpts = "-f"; + } + + public void execute() throws BuildException { + + + if (P4View != null) { + syncCmd = P4View; + } + + + if(label != null && !label.equals("")) { + syncCmd = syncCmd + "@" + label; + } + + + log("Execing sync "+P4CmdOpts+" "+syncCmd, Project.MSG_VERBOSE); + + execP4Command("-s sync "+P4CmdOpts+" "+syncCmd, new SimpleP4OutputHandler(this)); + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/SimpleP4OutputHandler.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/SimpleP4OutputHandler.java new file mode 100644 index 000000000..445e46ab9 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/SimpleP4OutputHandler.java @@ -0,0 +1,87 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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 + * . + */ + +package org.apache.tools.ant.taskdefs.optional.perforce; + +import org.apache.tools.ant.*; + +public class SimpleP4OutputHandler implements P4OutputHandler { + + P4Base parent; + public SimpleP4OutputHandler(P4Base parent) { + this.parent = parent; + } + + public void process(String line) throws BuildException { + if(parent.util.match("/^exit/",line)) return; + + //Throw exception on errors (except up-to-date) + //p4 -s is unpredicatable. For example a server down + //does not return error: markup + // + //Some forms producing commands (p4 -s change -o) do tag the output + //others don't..... + //Others mark errors as info, for example edit a file + //which is already open for edit..... + //Just look for error: - catches most things.... + + if(parent.util.match("/error:/", line) && !parent.util.match("/up-to-date/", line)) { + throw new BuildException(line); + + } + + parent.log(parent.util.substitute("s/^.*: //",line), Project.MSG_INFO); + + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/package.html b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/package.html new file mode 100644 index 000000000..99e31835e --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/package.html @@ -0,0 +1,25 @@ + +ANT Tasks for Perforce integration. + +These tasks provide basic P4 capabilities to automated ANT-based build systems. Note: +the tasks in this package are linked against the Jakarta ORO 2.0 library which +brings the power of Perl 5 regular expressions to Java. + +These tasks also require you to have the p4 (or p4.exe) client in your path. + +@see Jakarta Project +@see Perforce + +@see org.apache.tools.ant.taskdefs.optional.perforce.P4Sync +@see org.apache.tools.ant.taskdefs.optional.perforce.P4Label +@see org.apache.tools.ant.taskdefs.optional.perforce.P4Have +@see org.apache.tools.ant.taskdefs.optional.perforce.P4Change +@see org.apache.tools.ant.taskdefs.optional.perforce.P4Edit +@see org.apache.tools.ant.taskdefs.optional.perforce.P4Submit + + + +@author Les Hughes + + +