Author: bodewig
Date: Fri Oct 17 08:16:28 2008
New Revision: 705639

URL: http://svn.apache.org/viewvc?rev=705639&view=rev
Log:
add remote option to use rlog instead of log to cvschangelog.  Submitted by Rob 
van Oostrum.  PR 27419.

Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/docs/manual/CoreTasks/changelog.html
    
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogParser.java
    
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogTask.java
    ant/core/trunk/src/main/org/apache/tools/ant/util/CollectionUtils.java
    ant/core/trunk/src/tests/antunit/taskdefs/cvs/cvs.xml
    ant/core/trunk/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/history

Modified: ant/core/trunk/WHATSNEW
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=705639&r1=705638&r2=705639&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Fri Oct 17 08:16:28 2008
@@ -469,6 +469,10 @@
    behavior of Ant 1.7.0.
    Bugzilla Report 46010.
 
+ * If the new remote attribute is set to true, <cvschangelog> can now
+   work against a remote repository without any working copy.
+   Bugzilla Report 27419.
+
 Changes from Ant 1.7.0 TO Ant 1.7.1
 =============================================
 

Modified: ant/core/trunk/docs/manual/CoreTasks/changelog.html
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/CoreTasks/changelog.html?rev=705639&r1=705638&r2=705639&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/CoreTasks/changelog.html (original)
+++ ant/core/trunk/docs/manual/CoreTasks/changelog.html Fri Oct 17 08:16:28 2008
@@ -125,6 +125,13 @@
      included in the report.</td>
     <td align="center" valign="top">No</td>
   </tr>
+  <tr>
+    <td valign="top">remote</td>
+    <td valign="top">If set to true, works against the repository
+      (using rlog) without a working copy.  Default is
+      false.  <em>Since Ant 1.8.0</em></td>
+    <td align="center" valign="top">No</td>
+  </tr>
 </table>
 
 <h3>Parameters specified as nested elements</h3>

Modified: 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogParser.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogParser.java?rev=705639&r1=705638&r2=705639&view=diff
==============================================================================
--- 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogParser.java
 (original)
+++ 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogParser.java
 Fri Oct 17 08:16:28 2008
@@ -22,8 +22,12 @@
 import java.util.Date;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Locale;
 import java.util.TimeZone;
+import org.apache.tools.ant.taskdefs.AbstractCvsTask;
+import org.apache.tools.ant.util.CollectionUtils;
 
 /**
  * A class used to parse the output of the CVS log command.
@@ -67,6 +71,30 @@
     /** rcs entries */
     private final Hashtable entries = new Hashtable();
 
+    private final boolean remote;
+    private final String[] moduleNames;
+    private final int[] moduleNameLengths;
+
+    public ChangeLogParser() {
+        this(false, "", CollectionUtils.EMPTY_LIST);
+    }
+
+    public ChangeLogParser(boolean remote, String packageName, List modules) {
+        this.remote = remote;
+        moduleNames = new String[modules.size() + (packageName == null ? 0 : 
1)];
+        moduleNameLengths = new int[moduleNames.length];
+        int i = 0;
+        if (packageName != null) {
+            moduleNames[i] = packageName;
+            moduleNameLengths[i++] = packageName.length();
+        }
+        for (Iterator iter = modules.iterator(); iter.hasNext(); i++) {
+            AbstractCvsTask.Module m = (AbstractCvsTask.Module) iter.next();
+            moduleNames[i] = m.getName();
+            moduleNameLengths[i] = moduleNames[i].length();
+        }
+    }
+
     /**
      * Get a list of rcs entries as an array.
      *
@@ -148,11 +176,29 @@
      * @param line the line to process
      */
     private void processFile(final String line) {
-        if (line.startsWith("Working file:")) {
+        if (!remote && line.startsWith("Working file:")) {
             // CheckStyle:MagicNumber OFF
             file = line.substring(14, line.length());
             // CheckStyle:MagicNumber ON
             status = GET_REVISION;
+        } else if (remote && line.startsWith("RCS file:")) {
+            // exclude the part of the RCS filename up to and
+            // including the module name (and the path separator)
+            int startOfFileName = 0;
+            for (int i = 0; i < moduleNames.length; i++) {
+                int index = line.indexOf(moduleNames[i]);
+                if (index >= 0) {
+                    startOfFileName = index + moduleNameLengths[i] + 1;
+                    break;
+                }
+            }
+            int endOfFileName = line.indexOf(",v");
+            if (endOfFileName == -1) {
+                file = line.substring(startOfFileName);
+            } else {
+                file = line.substring(startOfFileName, endOfFileName);
+            }
+            status = GET_REVISION;
         }
     }
 

Modified: 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogTask.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogTask.java?rev=705639&r1=705638&r2=705639&view=diff
==============================================================================
--- 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogTask.java 
(original)
+++ 
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogTask.java 
Fri Oct 17 08:16:28 2008
@@ -95,6 +95,10 @@
     /** The latest date at which to stop processing entries.  */
     private Date endDate;
 
+    /** Determines whether log (false) or rlog (true) is used */
+    private boolean remote = false;
+
+
     /**
      * Filesets containing list of files against which the cvs log will be
      * performed. If empty then all files in the working directory will
@@ -177,6 +181,15 @@
         setStart(new Date(time));
     }
 
+    /**
+     * Whether to use rlog against a remote repository instead of log
+     * in a working copy's directory.
+     *
+     * @since Ant 1.8.0
+     */
+    public void setRemote(final boolean remote) {
+        this.remote = remote;
+    }
 
     /**
      * Adds a set of files about which cvs logs will be generated.
@@ -210,6 +223,7 @@
                 userList.put(user.getUserID(), user.getDisplayname());
             }
 
+            if (!remote) {
             setCommand("log");
 
             if (getTag() != null) {
@@ -225,6 +239,17 @@
                     addCommandArgument("-S");
                 }
             }
+            } else {
+                // supply 'rlog' as argument instead of command
+                setCommand("");
+                addCommandArgument("rlog");
+                // Do not print name/header if no revisions
+                // selected. This is quicker: less output to parse.
+                addCommandArgument("-S");
+                // Do not list tags. This is quicker: less output to
+                // parse.
+                addCommandArgument("-N");
+            }
             if (null != startDate) {
                 final SimpleDateFormat outputDate =
                     new SimpleDateFormat("yyyy-MM-dd");
@@ -253,7 +278,9 @@
                 }
             }
 
-            final ChangeLogParser parser = new ChangeLogParser();
+            final ChangeLogParser parser = new ChangeLogParser(remote,
+                                                               getPackage(),
+                                                               getModules());
             final RedirectingStreamHandler handler =
                 new RedirectingStreamHandler(parser);
 

Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/CollectionUtils.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/CollectionUtils.java?rev=705639&r1=705638&r2=705639&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/CollectionUtils.java 
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/CollectionUtils.java Fri 
Oct 17 08:16:28 2008
@@ -17,12 +17,15 @@
  */
 package org.apache.tools.ant.util;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Vector;
-import java.util.Iterator;
+import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
 import java.util.NoSuchElementException;
+import java.util.Vector;
 
 // CheckStyle:HideUtilityClassConstructorCheck OFF - bc
 
@@ -34,6 +37,12 @@
 public class CollectionUtils {
 
     /**
+     * Collections.emptyList() is Java5+.
+     */
+    public static final List EMPTY_LIST =
+        Collections.unmodifiableList(new ArrayList(0));
+
+    /**
      * Please use Vector.equals() or List.equals().
      * @param v1 the first vector.
      * @param v2 the second vector.

Modified: ant/core/trunk/src/tests/antunit/taskdefs/cvs/cvs.xml
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/cvs/cvs.xml?rev=705639&r1=705638&r2=705639&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/cvs/cvs.xml (original)
+++ ant/core/trunk/src/tests/antunit/taskdefs/cvs/cvs.xml Fri Oct 17 08:16:28 
2008
@@ -38,6 +38,28 @@
     <au:assertFileExists file="${output}/report.xml"/>
   </target>
 
+  <target name="testRemoteChangelog">
+    <mkdir dir="${output}"/>
+    <cvschangelog cvsroot="${cvsroot}" package="antmodule3"
+                  remote="true"
+                  destfile="${output}/report.xml"/>
+    <au:assertFileExists file="${output}/report.xml"/>
+    <au:assertResourceContains resource="${output}/report.xml"
+                               value="[yet another test.txt]"/>
+  </target>
+
+  <target name="testRemoteChangelogNestedModule">
+    <mkdir dir="${output}"/>
+    <cvschangelog cvsroot="${cvsroot}"
+                  remote="true"
+                  destfile="${output}/report.xml">
+      <module name="antmodule3"/>
+    </cvschangelog>
+    <au:assertFileExists file="${output}/report.xml"/>
+    <au:assertResourceContains resource="${output}/report.xml"
+                               value="[yet another test.txt]"/>
+  </target>
+
   <target name="testCvsWithSpaceInModule">
     <mkdir dir="${output}"/>
     <cvs cvsroot="${cvsroot}" dest="${output}">

Modified: 
ant/core/trunk/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/history
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/history?rev=705639&r1=705638&r2=705639&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/history 
(original)
+++ ant/core/trunk/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/history 
Fri Oct 17 08:16:28 2008
@@ -20,3 +20,11 @@
 O48f80395|stefan|/tmp/testoutput/*0|antmodule1||antmodule1
 O48f80ad6|stefan|/tmp/testoutput/*0|ant module 2||ant module 2
 O48f80ad7|stefan|/tmp/testoutput/*0|antmodule1||antmodule1
+O48f8a1d1|stefan|/tmp/testoutput/*0|ant module 2||ant module 2
+O48f8a1d2|stefan|/tmp/testoutput/*0|antmodule1||antmodule1
+O48f8a6a4|stefan|/tmp/testoutput/*0|ant module 2||ant module 2
+O48f8a6a6|stefan|/tmp/testoutput/*0|antmodule1||antmodule1
+O48f8a764|stefan|/tmp/testoutput/*0|ant module 2||ant module 2
+O48f8a766|stefan|/tmp/testoutput/*0|antmodule1||antmodule1
+O48f8abf0|stefan|/tmp/testoutput/*0|ant module 2||ant module 2
+O48f8abf2|stefan|/tmp/testoutput/*0|antmodule1||antmodule1


Reply via email to