epugh       2003/10/25 11:33:14

  Modified:    src/plugins-build/changelog/xdocs changes.xml
               src/plugins-build/changelog project.xml project.properties
               src/plugins-build/changelog/src/test/org/apache/maven/cvslib
                        CvsChangeLogGeneratorTest.java
               src/plugins-build/changelog/src/main/org/apache/maven/cvslib
                        CvsChangeLogGenerator.java
  Added:       src/plugins-build/changelog/src/test/org/apache/maven/cvslib
                        CvsLogListenerTest.java
               src/plugins-build/changelog/src/main/org/apache/maven/cvslib
                        CvsConnection.java CvsLogListener.java
  Log:
  Integrate cvslib to provide java based access to CVS.  Requires jar file attached
  to JIRA issue MAVEN-968.
  
  http://jira.codehaus.org/secure/ViewIssue.jspa?key=MAVEN-968
  
  
  Revision  Changes    Path
  1.12      +6 -0      maven/src/plugins-build/changelog/xdocs/changes.xml
  
  Index: changes.xml
  ===================================================================
  RCS file: /home/cvs/maven/src/plugins-build/changelog/xdocs/changes.xml,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- changes.xml       29 Sep 2003 06:09:54 -0000      1.11
  +++ changes.xml       25 Oct 2003 18:33:13 -0000      1.12
  @@ -7,6 +7,12 @@
     </properties>
   
     <body>
  +     <release version="1.4-dev" date="in cvs">
  +      <action dev="epugh" type="update">
  +        Added java based CVS library using cvslib.  Removed
  +        requirement for cvs executable.
  +      </action>
  +    </release>
       <release version="1.3" date="2003-09-29">
         <action dev="dion" type="update">
           MAVEN-811. Add support of IBM Rational ClearCase SCM.
  
  
  
  1.21      +16 -2     maven/src/plugins-build/changelog/project.xml
  
  Index: project.xml
  ===================================================================
  RCS file: /home/cvs/maven/src/plugins-build/changelog/project.xml,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- project.xml       29 Sep 2003 05:19:11 -0000      1.20
  +++ project.xml       25 Oct 2003 18:33:13 -0000      1.21
  @@ -5,7 +5,7 @@
     <pomVersion>3</pomVersion>
     <id>maven-changelog-plugin</id>
     <name>Maven Changelog Plug-in</name>
  -  <currentVersion>1.3</currentVersion>
  +  <currentVersion>1.4-dev</currentVersion>
     <description/>
     <shortDescription>Produce SCM changelog reports</shortDescription>
     <url>http://maven.apache.org/reference/plugins/changelog/</url>
  @@ -35,6 +35,15 @@
           <role>Java Developer</role>
         </roles>
       </developer>
  +     <developer>
  +      <name>Eric Pugh</name>
  +      <id>epugh</id>
  +      <email>[EMAIL PROTECTED]</email>
  +      <organization/>
  +      <roles>
  +        <role>Java Developer</role>
  +      </roles>
  +    </developer>    
       <developer>
         <name>Emmanuel Venisse</name>
         <id>evenisse</id>
  @@ -55,7 +64,7 @@
         </roles>
       </developer>
     </developers>
  -  <dependencies>
  +  <dependencies>     
       <dependency>
         <id>ant</id>
         <version>1.5.3-1</version>
  @@ -78,6 +87,11 @@
       <dependency>
         <id>junit</id>
         <version>3.8.1</version>
  +    </dependency>
  +    <dependency>
  +      <groupId>netbeans</groupId>
  +      <artifactId>cvslib</artifactId>
  +      <version>200310240100</version>
       </dependency>
       <dependency>
         <id>regexp</id>
  
  
  
  1.5       +1 -0      maven/src/plugins-build/changelog/project.properties
  
  Index: project.properties
  ===================================================================
  RCS file: /home/cvs/maven/src/plugins-build/changelog/project.properties,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- project.properties        7 Sep 2003 15:40:25 -0000       1.4
  +++ project.properties        25 Oct 2003 18:33:13 -0000      1.5
  @@ -6,3 +6,4 @@
   maven.license.licenseFile=${basedir}/../../../LICENSE.txt
   maven.checkstyle.header.file=${basedir}/../../../LICENSE.txt
   maven.checkstyle.format = turbine
  +maven.junit.fork=true
  
  
  
  1.6       +2 -4      
maven/src/plugins-build/changelog/src/test/org/apache/maven/cvslib/CvsChangeLogGeneratorTest.java
  
  Index: CvsChangeLogGeneratorTest.java
  ===================================================================
  RCS file: 
/home/cvs/maven/src/plugins-build/changelog/src/test/org/apache/maven/cvslib/CvsChangeLogGeneratorTest.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- CvsChangeLogGeneratorTest.java    11 Apr 2003 18:53:19 -0000      1.5
  +++ CvsChangeLogGeneratorTest.java    25 Oct 2003 18:33:13 -0000      1.6
  @@ -56,8 +56,6 @@
    * ====================================================================
    */
   
  -import java.util.ArrayList;
  -import java.util.List;
   
   import org.apache.maven.project.Repository;
   import org.apache.maven.util.EnhancedStringTokenizer;
  
  
  
  1.1                  
maven/src/plugins-build/changelog/src/test/org/apache/maven/cvslib/CvsLogListenerTest.java
  
  Index: CvsLogListenerTest.java
  ===================================================================
  package org.apache.maven.cvslib;
  
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 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 acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Maven" 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",
   *    "Apache Maven", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * 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/>.
   */
  
  import junit.framework.TestCase;
  
  import org.netbeans.lib.cvsclient.event.MessageEvent;
  
  
  /**
   * Test cases for [EMAIL PROTECTED] CvsLogListener}
   * @author <a href="mailto:[EMAIL PROTECTED]">Eric Pugh</a>
   * @version $Id: CvsLogListenerTest.java,v 1.1 2003/10/25 18:33:13 epugh Exp $
   */
  public class CvsLogListenerTest extends TestCase
  {
  
  
      /**
       * Create a test with the given name
       * @param testName the name of the test
       */
      public CvsLogListenerTest(String testName)
      {
          super(testName);
      }
  
      /**
       * Test of listening to a regular output
       * @throws Exception when there is an unexpected problem
       */
      public void testNormalEvent() throws Exception
      {
          String MESSAGE = "I am a message";
          CvsLogListener listener = new CvsLogListener();
                MessageEvent me = new MessageEvent("souce",MESSAGE,false);
          listener.messageSent(me);
          assertTrue(listener.getStdout().indexOf(MESSAGE)>-1);
  
      }
      
        /**
         * Test of listening to an error
         * @throws Exception when there is an unexpected problem
         */
        public void testErrorEvent() throws Exception
        {
                String MESSAGE = "I am a message";
                CvsLogListener listener = new CvsLogListener();
                MessageEvent me = new MessageEvent("souce",MESSAGE,true);
                listener.messageSent(me);
                assertTrue(listener.getStdout().indexOf(MESSAGE)==-1);
  
        }    
  
     
  
  }
  
  
  
  1.7       +150 -111  
maven/src/plugins-build/changelog/src/main/org/apache/maven/cvslib/CvsChangeLogGenerator.java
  
  Index: CvsChangeLogGenerator.java
  ===================================================================
  RCS file: 
/home/cvs/maven/src/plugins-build/changelog/src/main/org/apache/maven/cvslib/CvsChangeLogGenerator.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- CvsChangeLogGenerator.java        11 Apr 2003 18:53:19 -0000      1.6
  +++ CvsChangeLogGenerator.java        25 Oct 2003 18:33:14 -0000      1.7
  @@ -1,94 +1,87 @@
   package org.apache.maven.cvslib;
   
  -/* ====================================================================
  - * The Apache Software License, Version 1.1
  - *
  - * Copyright (c) 2002 The Apache Software Foundation.  All rights
  - * reserved.
  - *
  +/*
  + * ==================================================================== The
  + * Apache Software License, Version 1.1
  + * 
  + * Copyright (c) 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 acknowledgment:
  - *       "This product includes software developed by the
  - *        Apache Software Foundation (http://www.apache.org/)."
  - *    Alternately, this acknowledgment may appear in the software itself,
  - *    if and wherever such third-party acknowledgments normally appear.
  - *
  - * 4. The names "Apache" and "Apache Software Foundation" and
  - *    "Apache Maven" 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",
  - *    "Apache Maven", nor may "Apache" appear in their name, without
  - *    prior written permission of the Apache Software Foundation.
  - *
  - * 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.
  + * 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 acknowledgment: "This product includes software
  + * developed by the Apache Software Foundation (http://www.apache.org/)."
  + * Alternately, this acknowledgment may appear in the software itself, if and
  + * wherever such third-party acknowledgments normally appear.
  + *  4. The names "Apache" and "Apache Software Foundation" and "Apache Maven"
  + * 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", "Apache
  + * Maven", nor may "Apache" appear in their name, without prior written
  + * permission of the Apache Software Foundation.
  + * 
  + * 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/>.
  - *
  + * 
  + * 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/> .
  + * 
    * ====================================================================
    */
   
  -import java.io.InputStream;
  +import java.io.FileNotFoundException;
   import java.io.IOException;
  -import java.util.Date;
  +import java.io.InputStream;
  +import java.io.StringBufferInputStream;
   import java.text.SimpleDateFormat;
  -// commons imports
  +import java.util.Collection;
  +import java.util.Date;
  +
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
  -// maven imports
   import org.apache.maven.changelog.AbstractChangeLogGenerator;
  +import org.apache.maven.changelog.ChangeLogParser;
   import org.apache.maven.project.Repository;
   import org.apache.maven.util.AsyncStreamReader;
  -// ant imports
   import org.apache.tools.ant.types.Commandline;
   
   /**
    * A CVS implementation of the [EMAIL PROTECTED] 
org.apache.maven.changelog.ChangeLog}
    * interface.
  - *
  - * @task Check CVS exists first by running cvs -version instead of current hack
  + * 
  + * 
    * @author Glenn McAllister
  + * @author <a href="mailto:[EMAIL PROTECTED]">Eric Pugh</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Jeff Martin</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Jason van Zyl</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">dIon Gillard</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Stefan Bodewig</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Pete Kazmier</a>
  - * @version 
  - * $Id$
  + * @version $Id: CvsChangeLogGenerator.java,v 1.6 2003/04/11 18:53:19 bwalding
  + *          Exp $
    */
   class CvsChangeLogGenerator extends AbstractChangeLogGenerator
   {
       /** Log */
  -    private static final Log LOG = LogFactory.getLog(CvsChangeLogGenerator.class);
  +    private static final Log LOG =
  +        LogFactory.getLog(CvsChangeLogGenerator.class);
   
       public static final int POS_SCM = 0;
       public static final int POS_SCM_TYPE = 1;
  @@ -97,19 +90,59 @@
       public static final int POS_SCM_PATH = 4;
       public static final int POS_SCM_MODULE = 5;
   
  +    /**
  +      * Execute cvslib client driving the given parser.
  +      * 
  +      * @param parser A [EMAIL PROTECTED] ChangeLogParser parser}to process the scm
  +      *            output.
  +      * @return A collection of [EMAIL PROTECTED] ChangeLogEntry entries}parsed 
from the
  +      *         scm output.
  +      * @throws IOException When there are issues executing scm.
  +      * @see ChangeLogGenerator#getEntries(ChangeLogParser)
  +      */
  +    public Collection getEntries(ChangeLogParser parser) throws IOException
  +    {
  +        if (parser == null)
  +        {
  +            throw new NullPointerException("parser cannot be null");
  +        }
  +
  +        if (base == null)
  +        {
  +            throw new NullPointerException("basedir must be set");
  +        }
  +
  +        if (!base.exists())
  +        {
  +            throw new FileNotFoundException(
  +                "Cannot find base dir " + base.getAbsolutePath());
  +        }
   
  +        clParser = parser;
  +        CvsConnection connection = new CvsConnection();
  +        String[] args = getScmLogCommand().getArguments();
  +        CvsLogListener ml = new CvsLogListener();
  +       
  +        CvsConnection.processCommand(args, 
this.changeLogExecutor.getBasedir().toString(), ml);
  +        
  +             entries = clParser.parse(new 
StringBufferInputStream(ml.getStdout().toString()));
  +             
  +        return entries;
  +    }
       /**
  -     * @return the cvs command line to be executed.
  -     */
  +      * @return the cvs command line to be executed.
  +      */
       protected Commandline getScmLogCommand()
       {
           String tokens[] = Repository.splitSCMConnection(getConnection());
  -        
  +
           if (!tokens[POS_SCM_TYPE].equals("cvs"))
           {
  -            throw new IllegalArgumentException("repository connection string" + " 
does not specify 'cvs' as the scm");
  +            throw new IllegalArgumentException(
  +                "repository connection string"
  +                    + " does not specify 'cvs' as the scm");
           }
  -        
  +
           Commandline command = new Commandline();
   
           command.setExecutable("cvs");
  @@ -120,26 +153,30 @@
           // :pserver:[EMAIL PROTECTED]:/home/cvspublic
           // use tokens 3+4+5
           String connectionBuffer = "";
  -        
  +
           if (tokens[POS_SCM_SUBTYPE].equalsIgnoreCase("local"))
           {
               // use the local repository directory eg. '/home/cvspublic'
               connectionBuffer = tokens[POS_SCM_PATH];
           }
  -        else 
  -        {         
  -            if (tokens[POS_SCM_SUBTYPE].equalsIgnoreCase("lserver")) 
  +        else
  +        {
  +            if (tokens[POS_SCM_SUBTYPE].equalsIgnoreCase("lserver"))
               {
                   //create the cvsroot as the local socket cvsroot
  -                connectionBuffer = tokens[POS_SCM_USERHOST] + ":" + 
tokens[POS_SCM_PATH];
  +                connectionBuffer =
  +                    tokens[POS_SCM_USERHOST] + ":" + tokens[POS_SCM_PATH];
               }
  -            else 
  +            else
               {
                   //create the cvsroot as the remote cvsroot
                   connectionBuffer =
  -                  ":" + tokens[POS_SCM_SUBTYPE] 
  -                + ":" + tokens[POS_SCM_USERHOST] 
  -                + ":" + tokens[POS_SCM_PATH];
  +                    ":"
  +                        + tokens[POS_SCM_SUBTYPE]
  +                        + ":"
  +                        + tokens[POS_SCM_USERHOST]
  +                        + ":"
  +                        + tokens[POS_SCM_PATH];
               }
           }
   
  @@ -154,36 +191,37 @@
           return command;
       }
   
  -    /** 
  -     * Construct the CVS command-line argument that is used to specify
  -     * the appropriate date range.
  -     * 
  -     * @param before The starting point.
  -     * @param to The ending point.
  -     * @return A string that can be used to specify a date to a scm
  -     * system.
  -     */
  +    /**
  +      * Construct the CVS command-line argument that is used to specify the
  +      * appropriate date range.
  +      * 
  +      * @param before The starting point.
  +      * @param to The ending point.
  +      * @return A string that can be used to specify a date to a scm system.
  +      */
       protected String getScmDateArgument(Date before, Date to)
       {
           SimpleDateFormat outputDate = new SimpleDateFormat("yyyy-MM-dd");
           return "-d " + outputDate.format(before) + "<" + outputDate.format(to);
       }
   
  -    /** 
  -     * Handle ChangeLogParser IOExceptions.  
  -     * 
  -     * @param ioe The IOException thrown.
  -     * @throws IOException If the handler doesn't wish to handle the
  -     * exception.
  -     */
  +    /**
  +      * Handle ChangeLogParser IOExceptions.
  +      * 
  +      * @param ioe The IOException thrown.
  +      * @throws IOException If the handler doesn't wish to handle the exception.
  +      */
       protected void handleParserException(IOException ioe) throws IOException
       {
  -        if (ioe.getMessage().indexOf("CreateProcess") != -1 || 
ioe.getMessage().indexOf("cvs: not found") != -1)
  +        if (ioe.getMessage().indexOf("CreateProcess") != -1
  +            || ioe.getMessage().indexOf("cvs: not found") != -1)
           {
               // can't find CVS on Win32 or Linux...
               if (LOG.isWarnEnabled())
               {
  -                LOG.warn("Unable to find cvs executable. " + "Changelog will be 
empty");
  +                LOG.warn(
  +                    "Unable to find cvs executable. "
  +                        + "Changelog will be empty");
               }
           }
           else
  @@ -193,39 +231,40 @@
       }
   
       /**
  -     * Set the error stream for reading from cvs log. This stream will be read
  -     * on a separate thread.
  -     * @param is - an [EMAIL PROTECTED] java.io.InputStream}
  -     */
  +      * Set the error stream for reading from cvs log. This stream will be read
  +      * on a separate thread.
  +      * 
  +      * @param is - an [EMAIL PROTECTED] java.io.InputStream}
  +      */
       public void setProcessErrorStream(InputStream is)
       {
           errorReader = new CvsAsyncErrorReader(is);
       }
   
       /**
  -     * A private AsyncStreamReader class that "swallows" the "cvs server:
  -     * Logging" lines.
  -     */
  +      * A private AsyncStreamReader class that "swallows" the "cvs server:
  +      * Logging" lines.
  +      */
       private static class CvsAsyncErrorReader extends AsyncStreamReader
       {
           /**
  -         * The obvious constructor.
  -         *
  -         * @param anInputStream the input stream to consume
  -         */
  +              * The obvious constructor.
  +              * 
  +              * @param anInputStream the input stream to consume
  +              */
           public CvsAsyncErrorReader(InputStream anInputStream)
           {
               super(anInputStream);
           }
   
           /**
  -         * If the line does not start with "cvs server: Logging", it's ok to
  -         * consume it.
  -         *
  -         * @param line the line to check
  -         * @return <code>true</code> if the line does not start with "cvs
  -         * server: Logging"
  -         */
  +              * If the line does not start with "cvs server: Logging", it's ok to
  +              * consume it.
  +              * 
  +              * @param line the line to check
  +              * @return <code>true</code> if the line does not start with "cvs
  +              *         server: Logging"
  +              */
           protected boolean okToConsume(String line)
           {
               return !line.startsWith("cvs server: Logging");
  
  
  
  1.1                  
maven/src/plugins-build/changelog/src/main/org/apache/maven/cvslib/CvsConnection.java
  
  Index: CvsConnection.java
  ===================================================================
  package org.apache.maven.cvslib;
  
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 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 acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Maven" 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",
   *    "Apache Maven", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * 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/>.
   *
   * ====================================================================
   */
  
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.FileReader;
  import java.io.IOException;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  import org.netbeans.lib.cvsclient.CVSRoot;
  import org.netbeans.lib.cvsclient.Client;
  import org.netbeans.lib.cvsclient.admin.StandardAdminHandler;
  import org.netbeans.lib.cvsclient.command.Command;
  import org.netbeans.lib.cvsclient.command.CommandException;
  import org.netbeans.lib.cvsclient.command.GlobalOptions;
  import org.netbeans.lib.cvsclient.commandLine.CommandFactory;
  import org.netbeans.lib.cvsclient.commandLine.GetOpt;
  import org.netbeans.lib.cvsclient.connection.AuthenticationException;
  import org.netbeans.lib.cvsclient.connection.Connection;
  import org.netbeans.lib.cvsclient.connection.ConnectionFactory;
  import org.netbeans.lib.cvsclient.connection.PServerConnection;
  import org.netbeans.lib.cvsclient.connection.StandardScrambler;
  import org.netbeans.lib.cvsclient.event.CVSListener;
  
  /**
   * A Cvs connection that simulates a command line interface.
   * 
   * @author <a href="mailto:[EMAIL PROTECTED]">Eric Pugh</a>
   */
  public class CvsConnection
  {
  
      /** Log */
      private static final Log LOG =
          LogFactory.getLog(CvsConnection.class);
      /**
         * The path to the repository on the server
         */
      private String repository;
  
      /**
         * The local path to use to perform operations (the top level)
         */
      private String localPath;
  
      /**
         * The connection to the server
         */
      private Connection connection;
  
      /**
         * The client that manages interactions with the server
         */
      private Client client;
  
      /**
         * The global options being used. GlobalOptions are only global for a
         * particular command.
         */
      private GlobalOptions globalOptions;
  
      /**
         * Execute a configured CVS command
         * 
         * @param command the command to execute
         * @throws CommandException if there is an error running the command
         */
      public void executeCommand(Command command)
          throws CommandException, AuthenticationException
      {
          client.executeCommand(command, globalOptions);
      }
  
      public void setRepository(String repository)
      {
          this.repository = repository;
      }
  
      public void setLocalPath(String localPath)
      {
          this.localPath = localPath;
      }
  
      public void setGlobalOptions(GlobalOptions globalOptions)
      {
          this.globalOptions = globalOptions;
      }
  
      /**
         * Creates the connection and the client and connects.
         */
      private void connect(CVSRoot root, String password)
          throws IllegalArgumentException, AuthenticationException
      {
          connection = ConnectionFactory.getConnection(root);
          if (CVSRoot.METHOD_PSERVER.equals(root.getMethod()))
          {
              ((PServerConnection) connection).setEncodedPassword(password);
          }
          connection.open();
  
          client = new Client(connection, new StandardAdminHandler());
          client.setLocalPath(localPath);
      }
  
      private void addListener(CVSListener listener)
      {
          if (client != null)
          {
              // add a listener to the client
              client.getEventManager().addCVSListener(listener);
          }
      }
  
  
      /**
         * Obtain the CVS root, either from the -D option cvs.root or from the CVS
         * directory
         * 
         * @return the CVSRoot string
         */
      private static String getCVSRoot(String workingDir)
      {
          String root = null;
          BufferedReader r = null;
          if (workingDir == null)
          {
              workingDir = System.getProperty("user.dir");
          }
          try
          {
              File f = new File(workingDir);
              File rootFile = new File(f, "CVS/Root");
              if (rootFile.exists())
              {
                  r = new BufferedReader(new FileReader(rootFile));
                  root = r.readLine();
              }
          }
          catch (IOException e)
          {
              // ignore
          }
          finally
          {
              try
              {
                  if (r != null)
                      r.close();
              }
              catch (IOException e)
              {
                  System.err.println("Warning: could not close CVS/Root file!");
              }
          }
          if (root == null)
          {
              root = System.getProperty("cvs.root");
          }
          return root;
      }
  
      /**
         * Process global options passed into the application
         * 
         * @param args the argument list, complete
         * @param globalOptions the global options structure that will be passed to
         *            the command
         */
      private static int processGlobalOptions(
          String[] args,
          GlobalOptions globalOptions)
      {
          final String getOptString = globalOptions.getOptString();
          GetOpt go = new GetOpt(args, getOptString);
          int ch = -1;
          boolean usagePrint = false;
          while ((ch = go.getopt()) != GetOpt.optEOF)
          {
              //System.out.println("Global option '"+((char) ch)+"',
                        // '"+go.optArgGet()+"'");
              boolean success =
                  globalOptions.setCVSCommand((char) ch, go.optArgGet());
              if (!success)
                  usagePrint = true;
          }
  
          return go.optIndexGet();
      }
  
      /**
         * Lookup the password in the .cvspass file. This file is looked for in the
         * user.home directory if the option cvs.passfile is not set
         * 
         * @param CVSRoot the CVS root for which the password is being searched
         * @return the password, scrambled
         */
      private static String lookupPassword(String CVSRoot)
      {
          File passFile =
              new File(
                  System.getProperty(
                      "cvs.passfile",
                      System.getProperty("user.home") + "/.cvspass"));
  
          BufferedReader reader = null;
          String password = null;
  
          try
          {
              reader = new BufferedReader(new FileReader(passFile));
              String line;
              while ((line = reader.readLine()) != null)
              {
                  if (line.startsWith(CVSRoot))
                  {
                      password = line.substring(CVSRoot.length() + 1);
                      break;
                  }
              }
          }
          catch (IOException e)
          {
              LOG.error("Could not read password for host: " + e);
              return null;
          }
          finally
          {
              if (reader != null)
              {
                  try
                  {
                      reader.close();
                  }
                  catch (IOException e)
                  {
                      LOG.error("Warning: could not close password file.");
                  }
              }
          }
          if (password == null)
          {
              LOG.error(
                  "Didn't find password for CVSROOT '" + CVSRoot + "'.");
          }
          return password;
      }
  
      /**
         * Process the CVS command passed in args[] array with all necessary
         * options. The only difference from main() method is, that this method
         * does not exit the JVM and provides command output.
         * 
         * @param args The command with options
         * @param files The files to execute the command on.
         * @param stdout The standard output of the command
         */
      public static boolean processCommand(
          String[] args,
          String localPath,
          CVSListener listener)
      {
  
          // Set up the CVSRoot. Note that it might still be null after this
          // call if the user has decided to set it with the -d command line
          // global option
          GlobalOptions globalOptions = new GlobalOptions();
          globalOptions.setCVSRoot(getCVSRoot(localPath));
  
          // Set up any global options specified. These occur before the
          // name of the command to run
          int commandIndex = -1;
          try
          {
              commandIndex = processGlobalOptions(args, globalOptions);
  
          }
          catch (IllegalArgumentException e)
          {
              LOG.error("Invalid argument: " + e);
              return false;
          }
  
          // if we don't have a CVS root by now, the user has messed up
          if (globalOptions.getCVSRoot() == null)
          {
              LOG.error(
                  "No CVS root is set. Use the cvs.root "
                      + "property, e.g. java -Dcvs.root=\":pserver:[EMAIL 
PROTECTED]:/usr/cvs\""
                      + " or start the application in a directory containing a CVS 
subdirectory"
                      + " or use the -d command switch.");
              return false;
          }
  
          // parse the CVS root into its constituent parts
          CVSRoot root = null;
          final String cvsRoot = globalOptions.getCVSRoot();
          try
          {
              root = CVSRoot.parse(cvsRoot);
          }
          catch (IllegalArgumentException e)
          {
              LOG.error(
                  "Incorrect format for CVSRoot: "
                      + cvsRoot
                      + "\nThe correct format is: "
                      + "[:method:][[user][:[EMAIL 
PROTECTED]:[port]]/path/to/repository"
                      + "\nwhere \"method\" is pserver.");
              return false;
          }
  
          final String command = args[commandIndex];
  
          // this is not login, but a 'real' cvs command, so construct it,
          // set the options, and then connect to the server and execute it
  
          Command c = null;
          try
          {
              c =
                  CommandFactory.getDefault().createCommand(
                      command,
                      args,
                      ++commandIndex,
                      globalOptions,
                      localPath);
          }
          catch (IllegalArgumentException e)
          {
              LOG.error("Illegal argument: " + e.getMessage());
              return false;
          }
  
  
          String password = null;
  
          if (CVSRoot.METHOD_PSERVER.equals(root.getMethod()))
          {
              password = root.getPassword();
              if (password != null)
              {
                  password = StandardScrambler.getInstance().scramble(password);
              }
              else
              {
                  password = lookupPassword(cvsRoot);
                  if (password == null)
                  {
                      password = StandardScrambler.getInstance().scramble("");
                      // an empty password
                  }
              }
          }
          CvsConnection cvsCommand = new CvsConnection();
          cvsCommand.setGlobalOptions(globalOptions);
          cvsCommand.setRepository(root.getRepository());
          // the local path is just the path where we executed the
          // command. This is the case for command-line CVS but not
          // usually for GUI front-ends
          cvsCommand.setLocalPath(localPath);
          try
          {
              cvsCommand.connect(root, password);
  
              
              cvsCommand.addListener(listener);
              cvsCommand.executeCommand(c);
  
          }
          catch (Exception t)
          {
              LOG.error("Error: " + t,t);
              
              return false;
          }
          finally
          {
            
          }
          return true;
      }
  
  
  
  }
  
  
  
  1.1                  
maven/src/plugins-build/changelog/src/main/org/apache/maven/cvslib/CvsLogListener.java
  
  Index: CvsLogListener.java
  ===================================================================
  package org.apache.maven.cvslib;
  
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 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 acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Maven" 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",
   *    "Apache Maven", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * 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/>.
   *
   * ====================================================================
   */
  
  import org.netbeans.lib.cvsclient.event.CVSAdapter;
  import org.netbeans.lib.cvsclient.event.MessageEvent;
  
  /**
   * A basic implementation of a CVS listener. It merely saves up
   * into StringBuffers the stdout and stderr printstreams.
   * 
   * @author <a href="mailto:[EMAIL PROTECTED]">Eric Pugh</a>
   */
  public class CvsLogListener extends CVSAdapter
  {
      private final StringBuffer taggedLine = new StringBuffer();
      private StringBuffer stdout = new StringBuffer();
      private StringBuffer stderr = new StringBuffer();
  
      /**
         * Called when the server wants to send a message to be displayed to the
         * user. The message is only for information purposes and clients can
         * choose to ignore these messages if they wish.
         * 
         * @param e the event
         */
      public void messageSent(MessageEvent e)
      {
          String line = e.getMessage();
          StringBuffer stream = e.isError() ? stderr : stdout;
  
          if (e.isTagged())
          {
              String message =
                  MessageEvent.parseTaggedMessage(taggedLine, e.getMessage());
              if (message != null)
              {
                  //stream.println(message);
                  stream.append(message+"\n");
  
              }
          }
          else
          {
              //stream.println(line);
              stream.append(line+"\n");
  
          }
      }
  
      /**
       * @return Returns the standard output from cvs as a StringBuffer..
       */
      public StringBuffer getStdout()
      {
          return stdout;
      }
  
  }
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to