You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2013/07/31 22:55:36 UTC

svn commit: r1509025 - in /subversion/trunk/subversion/bindings/javahl: native/ src/org/apache/subversion/javahl/types/

Author: brane
Date: Wed Jul 31 20:55:36 2013
New Revision: 1509025

URL: http://svn.apache.org/r1509025
Log:
Expose the svn_rangelist operations in JavaHL.

[in subversion/bindings/javahl/src/org/apache/subversion/javahl]
* types/RevisionRangeList.java: New class; a wrapper for a List<RevisionRange>
   that adds methods for manipulating revision ranges.
* types/Mergeinfo.java
  (Mergeinfo.addRevisions): New overload for RevisionRangeList.
  (Mergeinfo.getRevisionRangeList): Like getRevisionRange, but returns a
   RevisionRangeList (effectively saving a bit of typing).

[in subversion/bindings/javahl/native]
* RevisionRangeList.h, RevisionRangeList.cpp: Helper for manipulating lists
   of revision ranges.
* RevisionRange.h: Include svn_opt.h for svn_opt_revision_range_t.
  (RevisionRange::toMergeRange): New method.
* RevisionRange.cpp (get_range_info): New helper function.
   Extracts implementation from RevisionRange::toRange.
  (RevisionRange::toRange, RevisionRange::toMergeRange):
   Implement using get_range_info.
* CreateJ.h, CreateJ.cpp (CreateJ::RevisionRangeList): Remove.
   Implementation moved to RevisionRangeList::toList.
  (CreateJ::Mergeinfo): Use RevisionRangeList::toList.

Added:
    subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp
    subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h
    subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java
Modified:
    subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp
    subversion/trunk/subversion/bindings/javahl/native/CreateJ.h
    subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp
    subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h
    subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java

Modified: subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp?rev=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp Wed Jul 31 20:55:36 2013
@@ -30,6 +30,7 @@
 #include "JNIStringHolder.h"
 #include "EnumMapper.h"
 #include "RevisionRange.h"
+#include "RevisionRangeList.h"
 #include "CreateJ.h"
 #include "../include/org_apache_subversion_javahl_types_Revision.h"
 #include "../include/org_apache_subversion_javahl_CommitItemStateFlags.h"
@@ -1073,58 +1074,6 @@ CreateJ::CommitInfo(const svn_commit_inf
 }
 
 jobject
-CreateJ::RevisionRangeList(svn_rangelist_t *ranges)
-{
-  JNIEnv *env = JNIUtil::getEnv();
-
-  // Create a local frame for our references
-  env->PushLocalFrame(LOCAL_FRAME_SIZE);
-  if (JNIUtil::isJavaExceptionThrown())
-    return NULL;
-
-  jclass clazz = env->FindClass("java/util/ArrayList");
-  if (JNIUtil::isJavaExceptionThrown())
-    POP_AND_RETURN_NULL;
-
-  static jmethodID init_mid = 0;
-  if (init_mid == 0)
-    {
-      init_mid = env->GetMethodID(clazz, "<init>", "()V");
-      if (JNIUtil::isJavaExceptionThrown())
-        POP_AND_RETURN_NULL;
-    }
-
-  static jmethodID add_mid = 0;
-  if (add_mid == 0)
-    {
-      add_mid = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
-      if (JNIUtil::isJavaExceptionThrown())
-        POP_AND_RETURN_NULL;
-    }
-
-  jobject jranges = env->NewObject(clazz, init_mid);
-
-  for (int i = 0; i < ranges->nelts; ++i)
-    {
-      // Convert svn_merge_range_t *'s to Java RevisionRange objects.
-      svn_merge_range_t *range =
-          APR_ARRAY_IDX(ranges, i, svn_merge_range_t *);
-
-      jobject jrange = RevisionRange::makeJRevisionRange(range);
-      if (JNIUtil::isJavaExceptionThrown())
-        POP_AND_RETURN_NULL;
-
-      env->CallBooleanMethod(jranges, add_mid, jrange);
-      if (JNIUtil::isJavaExceptionThrown())
-        POP_AND_RETURN_NULL;
-
-      env->DeleteLocalRef(jrange);
-    }
-
-  return env->PopLocalFrame(jranges);
-}
-
-jobject
 CreateJ::StringSet(const apr_array_header_t *strings)
 {
   std::vector<jobject> jstrs;
@@ -1370,7 +1319,7 @@ jobject CreateJ::Mergeinfo(svn_mergeinfo
       jstring jpath =
         JNIUtil::makeJString(static_cast<const char*>(path));
       jobject jranges =
-        RevisionRangeList(static_cast<svn_rangelist_t*>(val));
+        RevisionRangeList(static_cast<svn_rangelist_t*>(val)).toList();
 
       env->CallVoidMethod(jmergeinfo, addRevisions, jpath, jranges);
 

Modified: subversion/trunk/subversion/bindings/javahl/native/CreateJ.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/CreateJ.h?rev=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/CreateJ.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/CreateJ.h Wed Jul 31 20:55:36 2013
@@ -82,9 +82,6 @@ class CreateJ
   CommitInfo(const svn_commit_info_t *info);
 
   static jobject
-  RevisionRangeList(svn_rangelist_t *ranges);
-
-  static jobject
   StringSet(const apr_array_header_t *strings);
 
   static jobject

Modified: subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp?rev=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp Wed Jul 31 20:55:36 2013
@@ -44,60 +44,117 @@ RevisionRange::~RevisionRange()
     // explicitly destroyed.
 }
 
-const svn_opt_revision_range_t *RevisionRange::toRange(SVN::Pool &pool) const
+namespace {
+void get_range_info(jobject jrange,
+                    svn_opt_revision_t* range_start,
+                    svn_opt_revision_t* range_end,
+                    svn_boolean_t* range_inheritable)
 {
   JNIEnv *env = JNIUtil::getEnv();
 
   jclass clazz = env->FindClass(JAVA_PACKAGE"/types/RevisionRange");
   if (JNIUtil::isExceptionThrown())
-    return NULL;
+    return;
 
-  static jmethodID fmid = 0;
-  if (fmid == 0)
+  if (range_start)
     {
-      fmid = env->GetMethodID(clazz, "getFromRevision",
-                              "()L"JAVA_PACKAGE"/types/Revision;");
-      if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+
+      static jmethodID fmid = 0;
+      if (fmid == 0)
+        {
+          fmid = env->GetMethodID(clazz, "getFromRevision",
+                                  "()L"JAVA_PACKAGE"/types/Revision;");
+          if (JNIUtil::isJavaExceptionThrown())
+            return;
+        }
+
+      jobject jstartRevision = env->CallObjectMethod(jrange, fmid);
+      if (JNIUtil::isExceptionThrown())
+        return;
+
+      Revision startRevision(jstartRevision);
+      if (JNIUtil::isExceptionThrown())
+        return;
+
+      *range_start = *startRevision.revision();
+      if (JNIUtil::isExceptionThrown())
+        return;
     }
 
-  static jmethodID tmid = 0;
-  if (tmid == 0)
+  if (range_end)
     {
-      tmid = env->GetMethodID(clazz, "getToRevision",
-                              "()L"JAVA_PACKAGE"/types/Revision;");
-      if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
+      static jmethodID tmid = 0;
+      if (tmid == 0)
+        {
+          tmid = env->GetMethodID(clazz, "getToRevision",
+                                  "()L"JAVA_PACKAGE"/types/Revision;");
+          if (JNIUtil::isJavaExceptionThrown())
+            return;
+        }
+
+      jobject jendRevision = env->CallObjectMethod(jrange, tmid);
+      if (JNIUtil::isExceptionThrown())
+        return;
+
+      Revision endRevision(jendRevision);
+      if (JNIUtil::isExceptionThrown())
+        return;
+
+      *range_end = *endRevision.revision();
+      if (JNIUtil::isExceptionThrown())
+        return;
     }
 
-  jobject jstartRevision = env->CallObjectMethod(m_range, fmid);
-  if (JNIUtil::isExceptionThrown())
-    return NULL;
+  if (range_inheritable)
+    {
+      static jmethodID imid = 0;
+      if (imid == 0 && range_inheritable)
+        {
+          imid = env->GetMethodID(clazz, "isInheritable", "()Z");
+          if (JNIUtil::isJavaExceptionThrown())
+            return;
+        }
+
+      jboolean inheritable = env->CallBooleanMethod(jrange, imid);
+      if (JNIUtil::isExceptionThrown())
+        return;
+      *range_inheritable = inheritable;
+    }
+}
+} // anonymous namespace
 
-  Revision startRevision(jstartRevision);
+svn_merge_range_t* RevisionRange::toMergeRange(SVN::Pool &pool) const
+{
+  svn_opt_revision_t range_start, range_end;
+  svn_boolean_t range_inheritable;
+  get_range_info(m_range, &range_start, &range_end, &range_inheritable);
   if (JNIUtil::isExceptionThrown())
     return NULL;
 
-  jobject jendRevision = env->CallObjectMethod(m_range, tmid);
-  if (JNIUtil::isExceptionThrown())
-    return NULL;
+  if (range_start.kind != svn_opt_revision_number
+      || range_end.kind != svn_opt_revision_number)
+    JNIUtil::raiseThrowable("java.lang.InvalidStateException",
+                            "Revsision ranges must contain revision numbers");
 
-  Revision endRevision(jendRevision);
-  if (JNIUtil::isExceptionThrown())
-    return NULL;
+  svn_merge_range_t* range =
+    static_cast<svn_merge_range_t*>
+      (apr_palloc(pool.getPool(), sizeof(*range)));
+
+  range->start = range_start.value.number;
+  range->end = range_end.value.number;
+  range->inheritable = range_inheritable;
+  return range;
+}
 
+svn_opt_revision_range_t *RevisionRange::toRange(SVN::Pool &pool) const
+{
   svn_opt_revision_range_t *range =
-    reinterpret_cast<svn_opt_revision_range_t *>
+    static_cast<svn_opt_revision_range_t *>
       (apr_palloc(pool.getPool(), sizeof(*range)));
 
-  range->start = *startRevision.revision();
-  if (JNIUtil::isExceptionThrown())
-    return NULL;
-
-  range->end = *endRevision.revision();
+  get_range_info(m_range, &range->start, &range->end, NULL);
   if (JNIUtil::isExceptionThrown())
-    return NULL;
-
+    range = NULL;
   return range;
 }
 

Modified: subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h?rev=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h Wed Jul 31 20:55:36 2013
@@ -29,6 +29,7 @@
 
 #include <jni.h>
 #include "svn_types.h"
+#include "svn_opt.h"
 
 #include "Pool.h"
 
@@ -53,7 +54,12 @@ class RevisionRange
   /**
    * Return an svn_opt_revision_range_t.
    */
-  const svn_opt_revision_range_t *toRange(SVN::Pool &pool) const;
+  svn_opt_revision_range_t *toRange(SVN::Pool &pool) const;
+
+  /**
+   * Return an svn_merge_range_t.
+   */
+  svn_merge_range_t* toMergeRange(SVN::Pool &pool) const;
 
   /**
    * Make a (single) RevisionRange Java object.

Added: subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp?rev=1509025&view=auto
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp (added)
+++ subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp Wed Jul 31 20:55:36 2013
@@ -0,0 +1,100 @@
+/**
+ * @copyright
+ * ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file RevisionRangeList.cpp
+ * @brief Implementat of the class RevisionRangeList
+ */
+
+#include "Iterator.h"
+#include "RevisionRange.h"
+#include "RevisionRangeList.h"
+
+RevisionRangeList::RevisionRangeList(jobject jrangelist, SVN::Pool &pool)
+  : m_rangelist(NULL)
+{
+  if (!jrangelist)
+    return;
+
+  Iterator iter(jrangelist);
+  if (JNIUtil::isJavaExceptionThrown())
+    return;
+
+  m_rangelist = apr_array_make(pool.getPool(), 0, sizeof(svn_merge_range_t*));
+  while (iter.hasNext())
+    {
+      svn_merge_range_t* range = RevisionRange(iter.next()).toMergeRange(pool);
+      if (JNIUtil::isExceptionThrown())
+        return;
+      APR_ARRAY_PUSH(m_rangelist, svn_merge_range_t*) = range;
+    }
+}
+
+jobject RevisionRangeList::toList() const
+{
+  JNIEnv *env = JNIUtil::getEnv();
+
+  // Create a local frame for our references
+  env->PushLocalFrame(LOCAL_FRAME_SIZE);
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
+
+  jclass clazz = env->FindClass("java/util/ArrayList");
+  if (JNIUtil::isJavaExceptionThrown())
+    POP_AND_RETURN_NULL;
+
+  static jmethodID init_mid = 0;
+  if (init_mid == 0)
+    {
+      init_mid = env->GetMethodID(clazz, "<init>", "()V");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
+
+  static jmethodID add_mid = 0;
+  if (add_mid == 0)
+    {
+      add_mid = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+    }
+
+  jobject jranges = env->NewObject(clazz, init_mid);
+
+  for (int i = 0; i < m_rangelist->nelts; ++i)
+    {
+      // Convert svn_merge_range_t *'s to Java RevisionRange objects.
+      svn_merge_range_t *range =
+        APR_ARRAY_IDX(m_rangelist, i, svn_merge_range_t *);
+
+      jobject jrange = RevisionRange::makeJRevisionRange(range);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      env->CallBooleanMethod(jranges, add_mid, jrange);
+      if (JNIUtil::isJavaExceptionThrown())
+        POP_AND_RETURN_NULL;
+
+      env->DeleteLocalRef(jrange);
+    }
+
+  return env->PopLocalFrame(jranges);
+}

Added: subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h?rev=1509025&view=auto
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h (added)
+++ subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h Wed Jul 31 20:55:36 2013
@@ -0,0 +1,67 @@
+/**
+ * @copyright
+ * ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file RevisionRangeList.h
+ * @brief Interface of the class RevisionRangeList
+ */
+
+#ifndef REVISION_RANGE_LIST_H
+#define REVISION_RANGE_LIST_H
+
+#include <jni.h>
+#include "svn_mergeinfo.h"
+
+#include "Pool.h"
+
+/**
+ * A wrapper for svn_rangelist_t
+ */
+class RevisionRangeList
+{
+ public:
+  /**
+   * Create a RevisionRangeList object from a Java list of revision ranges.
+   */
+  RevisionRangeList(jobject jrangelist, SVN::Pool &pool);
+
+  /**
+   * Wrap an svn_rangelist_t.
+   */
+  RevisionRangeList(svn_rangelist_t* ranges)
+    : m_rangelist(ranges)
+  {}
+
+  /**
+   * Return an svn_rangelist_t.
+   */
+  const svn_rangelist_t* get() const { return m_rangelist; }
+
+  /**
+   * Make a Java list of reivison ranges.
+   */
+  jobject toList() const;
+
+ private:
+  svn_rangelist_t* m_rangelist;
+};
+
+#endif  // REVISION_RANGE_LIST_H

Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java?rev=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java Wed Jul 31 20:55:36 2013
@@ -108,6 +108,11 @@ public class Mergeinfo implements java.i
             addRevisionRange(mergeSrc, range);
     }
 
+    public void addRevisions(String mergeSrc, RevisionRangeList ranges)
+    {
+        addRevisions(mergeSrc, ranges.getRanges());
+    }
+
     /**
      * Add a revision range to the merged revisions for a path.  If
      * the merge source already has associated revision ranges, add
@@ -156,6 +161,14 @@ public class Mergeinfo implements java.i
     }
 
     /**
+     * Like {@link #getReivsionRange}, but returns a {@link RevisionRangeList}.
+     */
+    public RevisionRangeList getRevisionRangeList(String mergeSrc)
+    {
+        return new RevisionRangeList(getRevisionRange(mergeSrc));
+    }
+
+    /**
      * Parse the <code>svn:mergeinfo</code> property to populate the
      * merge source URLs and revision ranges of this instance.
      * @param mergeinfo <code>svn:mergeinfo</code> property value.

Added: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java?rev=1509025&view=auto
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java (added)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java Wed Jul 31 20:55:36 2013
@@ -0,0 +1,91 @@
+/**
+ * @copyright
+ * ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ * ====================================================================
+ * @endcopyright
+ */
+
+package org.apache.subversion.javahl.types;
+
+import org.apache.subversion.javahl.ClientException;
+
+import java.util.List;
+
+/**
+ * Object that describes a revision range list, including operations on it.
+ * Returned from new accessors in {@link Mergeinfo}.
+ * @since 1.9
+ */
+public class RevisionRangeList implements java.io.Serializable
+{
+    // Update the serialVersionUID when there is a incompatible change
+    // made to this class.  See any of the following, depending upon
+    // the Java release.
+    private static final long serialVersionUID = 1L;
+
+    private List<RevisionRange> ranges;
+
+    /**
+     * Wrap a list of revision ranges.
+     */
+    public RevisionRangeList(List<RevisionRange> ranges)
+    {
+        this.ranges = ranges;
+    }
+
+    /**
+     * @return The wrapped list of revision ranges.
+     */
+    public List<RevisionRange> getRanges()
+    {
+        return ranges;
+    }
+
+    /**
+     * Remove revisions in <code>eraser</code> from the current object
+     * and return the resulting difference.
+     * @param eraser The list of revisions to remoove.
+     * @param considerInheritance Determines how to account for the
+     *   {@link RevisionRange#isInherited} property when comparing
+     *   revision ranges for equality.
+     */
+    public /*native*/ RevisionRangeList remove(List<RevisionRange> eraser,
+                                               boolean considerInheritance)
+        throws ClientException
+    {
+        throw new RuntimeException("Not implemented: RevisionRangeListl.remove");
+    }
+
+    /**
+     * Remove revisions in <code>eraser</code> from the current object
+     * and return the resulting difference.
+     * @param eraser The list of revisions to remoove.
+     * @param considerInheritance Determines how to account for the
+     *   {@link RevisionRange#isInherited} property when comparing
+     *   revision ranges for equality.
+     */
+    public RevisionRangeList remove(RevisionRangeList eraser,
+                                    boolean considerInheritance)
+        throws ClientException
+    {
+        return remove(eraser.ranges, considerInheritance);
+    }
+
+    // TODO: More svn_rangelist_t operations
+}