Author: brane
Date: Sun May 10 12:09:41 2026
New Revision: 1934047

Log:
On the javahl-1.15 branch: Update diff wrappers to capture stderr.

* BRANCH-README: Update TODO and DONE lists.

[in subversion/bindings/javahl/src/org/apache/subversion/javahl/]

* ISVNClient.java (ISVNClient.diff): Add new overload.
* SVNClient.java (SVNClient.diff): Add new native method and update the
   compatibility wrappers.

[in subversion/bindings/javahl/native/]

* OutputStream.cpp
  (OutputStream::OutputStream): Use initializer list.
  (OutputStream::getStream): Return an empty stream when the Java object is 
NULL.
  (OutputStream::write, OutputStream::close): Rename 'that' to 'stream'.
   Use static_cast<> to cast from 'void*', reinterpret_cast<> is just
   so wrong in this context.

* SVNClient.h (SVNClient::diff),
  SVNClient.cpp (SVNClient::diff): Add errStream parameter and update the
   call into the native library.

* org_apache_subversion_javahl_SVNClient.cpp (ENAMETOOLONG): Update the
   native method implementations.

Modified:
   subversion/branches/javahl-1.15/BRANCH-README
   
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/OutputStream.cpp
   
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.cpp
   subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.h
   
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
   
subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
   
subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java

Modified: subversion/branches/javahl-1.15/BRANCH-README
==============================================================================
--- subversion/branches/javahl-1.15/BRANCH-README       Sun May 10 11:24:26 
2026        (r1934046)
+++ subversion/branches/javahl-1.15/BRANCH-README       Sun May 10 12:09:41 
2026        (r1934047)
@@ -4,7 +4,6 @@
 This is a temporary working branch to update JavaHL for 1.15.0.
 
 TODO:
-  * Update SVNClient.diff to capture stderr.
   * Fix Java warnings where possible without breaking the JRE ABI
 
 DONE:
@@ -23,3 +22,4 @@ DONE:
   * Use updated JavaHL APIs (in tests):
     - SVNClient.checkout
     - SVNClient.list, .callback.ListCallback
+  * Update SVNClient.diff to capture stderr.

Modified: 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/OutputStream.cpp
==============================================================================
--- 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/OutputStream.cpp
  Sun May 10 11:24:26 2026        (r1934046)
+++ 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/OutputStream.cpp
  Sun May 10 12:09:41 2026        (r1934047)
@@ -33,9 +33,8 @@
  * @param jthis the Java object to be stored
  */
 OutputStream::OutputStream(jobject jthis)
-{
-  m_jthis = jthis;
-}
+  : m_jthis(jthis)
+{}
 
 /**
  * Destroy an Inputer object.
@@ -54,6 +53,9 @@ OutputStream::~OutputStream()
  */
 svn_stream_t *OutputStream::getStream(const SVN::Pool &pool)
 {
+  if (m_jthis == NULL)
+    return svn_stream_empty(pool.getPool());
+
   // Create a stream with this as the baton and set the write and
   // close functions.
   svn_stream_t *ret = svn_stream_create(this, pool.getPool());
@@ -76,7 +78,7 @@ svn_error_t *OutputStream::write(void *b
   JNIEnv *env = JNIUtil::getEnv();
 
   // An object of our class is passed in as the baton.
-  OutputStream *that = static_cast<OutputStream *>(baton);
+  OutputStream *stream = static_cast<OutputStream *>(baton);
 
   // The method id will not change during the time this library is
   // loaded, so it can be cached.
@@ -100,7 +102,7 @@ svn_error_t *OutputStream::write(void *b
     return SVN_NO_ERROR;
 
   // write the data
-  env->CallObjectMethod(that->m_jthis, mid, data);
+  env->CallObjectMethod(stream->m_jthis, mid, data);
   if (JNIUtil::isJavaExceptionThrown())
     return SVN_NO_ERROR;
 
@@ -119,7 +121,7 @@ svn_error_t *OutputStream::close(void *b
   JNIEnv *env = JNIUtil::getEnv();
 
   // An object of our class is passed in as the baton
-  OutputStream *that = reinterpret_cast<OutputStream*>(baton);
+  OutputStream *stream = static_cast<OutputStream*>(baton);
 
   // The method id will not change during the time this library is
   // loaded, so it can be cached.
@@ -138,7 +140,7 @@ svn_error_t *OutputStream::close(void *b
     }
 
   // Call the Java object, to close the stream.
-  env->CallVoidMethod(that->m_jthis, mid);
+  env->CallVoidMethod(stream->m_jthis, mid);
   // No need to check for exception here because we return anyway.
 
   return SVN_NO_ERROR;

Modified: 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.cpp
==============================================================================
--- 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.cpp 
    Sun May 10 11:24:26 2026        (r1934046)
+++ 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.cpp 
    Sun May 10 12:09:41 2026        (r1934047)
@@ -1017,8 +1017,8 @@ void SVNClient::propertySetRemote(const
 void SVNClient::diff(const char *target1, Revision &revision1,
                      const char *target2, Revision &revision2,
                      Revision *pegRevision, const char *relativeToDir,
-                     OutputStream &outputStream, svn_depth_t depth,
-                     StringArray &changelists,
+                     OutputStream &outputStream, OutputStream &errorStream,
+                     svn_depth_t depth, StringArray &changelists,
                      bool ignoreAncestry, bool noDiffDelete, bool force,
                      bool showCopiesAsAdds, bool ignoreProps, bool propsOnly,
                      DiffOptions const& options)
@@ -1063,8 +1063,7 @@ void SVNClient::diff(const char *target1
                                    options.formatMergeinfo(),
                                    SVN_APR_LOCALE_CHARSET,
                                    outputStream.getStream(subPool),
-                                   // Discard stderr; TODO: Update JavaHL API
-                                   svn_stream_empty(subPool.getPool()),
+                                   errorStream.getStream(subPool),
                                    changelists.array(subPool),
                                    ctx,
                                    subPool.getPool()),
@@ -1094,8 +1093,7 @@ void SVNClient::diff(const char *target1
                                options.formatMergeinfo(),
                                SVN_APR_LOCALE_CHARSET,
                                outputStream.getStream(subPool),
-                               // Discard stderr; TODO: Update JavaHL API
-                               svn_stream_empty(subPool.getPool()),
+                               errorStream.getStream(subPool),
                                changelists.array(subPool),
                                ctx,
                                subPool.getPool()),
@@ -1105,27 +1103,30 @@ void SVNClient::diff(const char *target1
 
 void SVNClient::diff(const char *target1, Revision &revision1,
                      const char *target2, Revision &revision2,
-                     const char *relativeToDir, OutputStream &outputStream,
+                     const char *relativeToDir,
+                     OutputStream &outputStream, OutputStream &errorStream,
                      svn_depth_t depth, StringArray &changelists,
                      bool ignoreAncestry, bool noDiffDelete, bool force,
                      bool showCopiesAsAdds, bool ignoreProps, bool propsOnly,
                      DiffOptions const& options)
 {
     diff(target1, revision1, target2, revision2, NULL, relativeToDir,
-         outputStream, depth, changelists, ignoreAncestry, noDiffDelete, force,
-         showCopiesAsAdds, ignoreProps, propsOnly, options);
+         outputStream, errorStream, depth, changelists, ignoreAncestry,
+         noDiffDelete, force, showCopiesAsAdds, ignoreProps, propsOnly,
+         options);
 }
 
 void SVNClient::diff(const char *target, Revision &pegRevision,
                      Revision &startRevision, Revision &endRevision,
-                     const char *relativeToDir, OutputStream &outputStream,
+                     const char *relativeToDir,
+                     OutputStream &outputStream, OutputStream &errorStream,
                      svn_depth_t depth, StringArray &changelists,
                      bool ignoreAncestry, bool noDiffDelete, bool force,
                      bool showCopiesAsAdds, bool ignoreProps, bool propsOnly,
                      DiffOptions const& options)
 {
     diff(target, startRevision, NULL, endRevision, &pegRevision,
-         relativeToDir, outputStream, depth, changelists,
+         relativeToDir, outputStream, errorStream, depth, changelists,
          ignoreAncestry, noDiffDelete, force, showCopiesAsAdds,
          ignoreProps, propsOnly, options);
 }

Modified: 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.h
==============================================================================
--- 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.h   
    Sun May 10 11:24:26 2026        (r1934046)
+++ 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.h   
    Sun May 10 12:09:41 2026        (r1934047)
@@ -208,14 +208,16 @@ class SVNClient :public SVNBase
                          StringArray &changelists);
   void diff(const char *target1, Revision &revision1,
             const char *target2, Revision &revision2,
-            const char *relativeToDir, OutputStream &outputStream,
+            const char *relativeToDir,
+            OutputStream &outputStream, OutputStream &errorStream,
             svn_depth_t depth, StringArray &changelists,
             bool ignoreAncestry, bool noDiffDelete, bool force,
             bool showCopiesAsAdds, bool ignoreProps, bool propsOnly,
             DiffOptions const& options);
   void diff(const char *target, Revision &pegevision,
             Revision &startRevision, Revision &endRevision,
-            const char *relativeToDir, OutputStream &outputStream,
+            const char *relativeToDir,
+            OutputStream &outputStream, OutputStream &errorStream,
             svn_depth_t depth, StringArray &changelists,
             bool ignoreAncestry, bool noDiffDelete, bool force,
             bool showCopiesAsAdds, bool ignoreProps, bool propsOnly,
@@ -246,8 +248,8 @@ class SVNClient :public SVNBase
   void diff(const char *target1, Revision &revision1,
             const char *target2, Revision &revision2,
             Revision *pegRevision, const char *relativeToDir,
-            OutputStream &outputStream, svn_depth_t depth,
-            StringArray &changelists,
+            OutputStream &outputStream, OutputStream &errorStream,
+            svn_depth_t depth, StringArray &changelists,
             bool ignoreAncestry, bool noDiffDelete, bool force,
             bool showCopiesAsAdds, bool ignoreProps, bool propsOnly,
             DiffOptions const& options);

Modified: 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
==============================================================================
--- 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
        Sun May 10 11:24:26 2026        (r1934046)
+++ 
subversion/branches/javahl-1.15/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp
        Sun May 10 12:09:41 2026        (r1934047)
@@ -1330,10 +1330,10 @@ JNIEXPORT void JNICALL Java_org_apache_s
 }
 
 JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNClient_diff__Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2Ljava_io_OutputStream_2Lorg_apache_subversion_javahl_types_Depth_2Ljava_util_Collection_2ZZZZZZLorg_apache_subversion_javahl_types_DiffOptions_2
+Java_org_apache_subversion_javahl_SVNClient_diff__Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2Ljava_io_OutputStream_2Ljava_io_OutputStream_2Lorg_apache_subversion_javahl_types_Depth_2Ljava_util_Collection_2ZZZZZZLorg_apache_subversion_javahl_types_DiffOptions_2
 (JNIEnv *env, jobject jthis, jstring jtarget1, jobject jrevision1,
  jstring jtarget2, jobject jrevision2, jstring jrelativeToDir,
- jobject jstream, jobject jdepth, jobject jchangelists,
+ jobject joutStream, jobject jerrStream, jobject jdepth, jobject jchangelists,
  jboolean jignoreAncestry, jboolean jnoDiffDeleted, jboolean jforce,
  jboolean jcopiesAsAdds, jboolean jignoreProps, jboolean jpropsOnly,
  jobject jdiffOptions)
@@ -1365,7 +1365,11 @@ Java_org_apache_subversion_javahl_SVNCli
   if (JNIUtil::isExceptionThrown())
     return;
 
-  OutputStream dataOut(jstream);
+  OutputStream outStream(joutStream);
+  if (JNIUtil::isExceptionThrown())
+    return;
+
+  OutputStream errStream(jerrStream);
   if (JNIUtil::isExceptionThrown())
     return;
 
@@ -1377,7 +1381,8 @@ Java_org_apache_subversion_javahl_SVNCli
   if (JNIUtil::isExceptionThrown())
     return;
 
-  cl->diff(target1, revision1, target2, revision2, relativeToDir, dataOut,
+  cl->diff(target1, revision1, target2, revision2,
+           relativeToDir, outStream, errStream,
            EnumMapper::toDepth(jdepth), changelists,
            jignoreAncestry ? true:false,
            jnoDiffDeleted ? true:false, jforce ? true:false,
@@ -1386,10 +1391,10 @@ Java_org_apache_subversion_javahl_SVNCli
 }
 
 JNIEXPORT void JNICALL
-Java_org_apache_subversion_javahl_SVNClient_diff__Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Lorg_apache_subversion_javahl_types_Revision_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2Ljava_io_OutputStream_2Lorg_apache_subversion_javahl_types_Depth_2Ljava_util_Collection_2ZZZZZZLorg_apache_subversion_javahl_types_DiffOptions_2
+Java_org_apache_subversion_javahl_SVNClient_diff__Ljava_lang_String_2Lorg_apache_subversion_javahl_types_Revision_2Lorg_apache_subversion_javahl_types_Revision_2Lorg_apache_subversion_javahl_types_Revision_2Ljava_lang_String_2Ljava_io_OutputStream_2Ljava_io_OutputStream_2Lorg_apache_subversion_javahl_types_Depth_2Ljava_util_Collection_2ZZZZZZLorg_apache_subversion_javahl_types_DiffOptions_2
 (JNIEnv *env, jobject jthis, jstring jtarget, jobject jpegRevision,
  jobject jstartRevision, jobject jendRevision, jstring jrelativeToDir,
- jobject jstream, jobject jdepth, jobject jchangelists,
+ jobject joutStream, jobject jerrStream, jobject jdepth, jobject jchangelists,
  jboolean jignoreAncestry, jboolean jnoDiffDeleted, jboolean jforce,
  jboolean jcopiesAsAdds, jboolean jignoreProps, jboolean jpropsOnly,
  jobject jdiffOptions)
@@ -1417,7 +1422,11 @@ Java_org_apache_subversion_javahl_SVNCli
   if (JNIUtil::isExceptionThrown())
     return;
 
-  OutputStream dataOut(jstream);
+  OutputStream outStream(joutStream);
+  if (JNIUtil::isExceptionThrown())
+    return;
+
+  OutputStream errStream(jerrStream);
   if (JNIUtil::isExceptionThrown())
     return;
 
@@ -1434,7 +1443,7 @@ Java_org_apache_subversion_javahl_SVNCli
     return;
 
   cl->diff(target, pegRevision, startRevision, endRevision, relativeToDir,
-           dataOut, EnumMapper::toDepth(jdepth), changelists,
+           outStream, errStream, EnumMapper::toDepth(jdepth), changelists,
            jignoreAncestry ? true:false,
            jnoDiffDeleted ? true:false, jforce ? true:false,
            jcopiesAsAdds ? true:false, jignoreProps ? true:false,

Modified: 
subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
==============================================================================
--- 
subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
 Sun May 10 11:24:26 2026        (r1934046)
+++ 
subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java
 Sun May 10 12:09:41 2026        (r1934047)
@@ -951,6 +951,7 @@ public interface ISVNClient
      * @param revision2     second revision
      * @param relativeToDir index path is relative to this path
      * @param outStream     the stream to which difference are written
+     * @param errStream     the stream to which error messages are written
      * @param depth         how deep to traverse into subdirectories
      * @param ignoreAncestry ignore if files are not related
      * @param noDiffDeleted no output on deleted files
@@ -961,6 +962,23 @@ public interface ISVNClient
      * @param propsOnly     show property changes only
      * @param options       additional options for controlling the output
      * @throws ClientException
+     * @since 1.15
+     * @see svn_client_diff7
+     */
+    void diff(String target1, Revision revision1, String target2,
+              Revision revision2, String relativeToDir,
+              OutputStream outStream, OutputStream errStream,
+              Depth depth, Collection<String> changelists,
+              boolean ignoreAncestry, boolean noDiffDeleted, boolean force,
+              boolean copiesAsAdds, boolean ignoreProps, boolean propsOnly,
+              DiffOptions options)
+            throws ClientException;
+
+    /**
+     * Display the differences between two paths
+     * <p>
+     * Behaves exactly like the 1.15 version except that it discards stderr.
+     * @throws ClientException
      * @since 1.8
      */
     void diff(String target1, Revision revision1, String target2,
@@ -979,6 +997,7 @@ public interface ISVNClient
      * @param revision2     second revision
      * @param relativeToDir index path is relative to this path
      * @param outFileName   file name where difference are written
+     * @param errFileName   file name where error messages are written
      * @param depth         how deep to traverse into subdirectories
      * @param ignoreAncestry ignore if files are not related
      * @param noDiffDeleted no output on deleted files
@@ -989,6 +1008,23 @@ public interface ISVNClient
      * @param propsOnly     show property changes only
      * @param options       additional options for controlling the output
      * @throws ClientException
+     * @since 1.15
+     * @see svn_client_diff7
+     */
+    void diff(String target1, Revision revision1, String target2,
+              Revision revision2, String relativeToDir,
+              String outFileName, String errFileName,
+              Depth depth, Collection<String> changelists,
+              boolean ignoreAncestry, boolean noDiffDeleted, boolean force,
+              boolean copiesAsAdds, boolean ignoreProps, boolean propsOnly,
+              DiffOptions options)
+            throws ClientException;
+
+    /**
+     * Display the differences between two paths
+     * <p>
+     * Behaves exactly like the 1.15 version except that it discards stderr.
+     * @throws ClientException
      * @since 1.8
      */
     void diff(String target1, Revision revision1, String target2,
@@ -1057,6 +1093,7 @@ public interface ISVNClient
      * @param endRevision   second Revision to compare
      * @param relativeToDir index path is relative to this path
      * @param outStream     the stream to which difference are written
+     * @param errStream     the stream to which error messages are written
      * @param depth         how deep to traverse into subdirectories
      * @param changelists  if non-null, filter paths using changelists
      * @param ignoreAncestry ignore if files are not related
@@ -1068,6 +1105,23 @@ public interface ISVNClient
      * @param propsOnly     show property changes only
      * @param options       additional options for controlling the output
      * @throws ClientException
+     * @since 1.15
+     * @see svn_client_diff_peg7
+     */
+    void diff(String target, Revision pegRevision, Revision startRevision,
+              Revision endRevision, String relativeToDir,
+              OutputStream outStream, OutputStream errStream,
+              Depth depth, Collection<String> changelists,
+              boolean ignoreAncestry, boolean noDiffDeleted, boolean force,
+              boolean copiesAsAdds, boolean ignoreProps, boolean propsOnly,
+              DiffOptions options)
+            throws ClientException;
+
+    /**
+     * Display the differences between two paths
+     * <p>
+     * Behaves exactly like the 1.15 version except that it discards stderr.
+     * @throws ClientException
      * @since 1.8
      */
     void diff(String target, Revision pegRevision, Revision startRevision,
@@ -1086,6 +1140,7 @@ public interface ISVNClient
      * @param endRevision   second Revision to compare
      * @param relativeToDir index path is relative to this path
      * @param outFileName   file name where difference are written
+     * @param errFileName   file name where error messages are written
      * @param depth         how deep to traverse into subdirectories
      * @param changelists  if non-null, filter paths using changelists
      * @param ignoreAncestry ignore if files are not related
@@ -1097,6 +1152,23 @@ public interface ISVNClient
      * @param propsOnly     show property changes only
      * @param options       additional options for controlling the output
      * @throws ClientException
+     * @since 1.15
+     * @see svn_client_diff_peg7
+     */
+    void diff(String target, Revision pegRevision, Revision startRevision,
+              Revision endRevision, String relativeToDir,
+              String outFileName, String errFileName,
+              Depth depth, Collection<String> changelists,
+              boolean ignoreAncestry, boolean noDiffDeleted, boolean force,
+              boolean copiesAsAdds, boolean ignoreProps, boolean propsOnly,
+              DiffOptions options)
+            throws ClientException;
+
+    /**
+     * Display the differences between two paths
+     * <p>
+     * Behaves exactly like the 1.15 version except that it discards stderr.
+     * @throws ClientException
      * @since 1.8
      */
     void diff(String target, Revision pegRevision, Revision startRevision,

Modified: 
subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
==============================================================================
--- 
subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
  Sun May 10 11:24:26 2026        (r1934046)
+++ 
subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java
  Sun May 10 12:09:41 2026        (r1934047)
@@ -513,42 +513,87 @@ public class SVNClient implements ISVNCl
                         discoverChangedPaths, depth, revProps, callback);
     }
 
-    public void diff(String target1, Revision revision1, String target2,
-                     Revision revision2, String relativeToDir,
-                     String outFileName, Depth depth,
-                     Collection<String> changelists,
+    // svn_client_diff7
+
+    @Override
+    public void diff(String target1, Revision revision1,
+                     String target2, Revision revision2,
+                     String relativeToDir,
+                     String outFileName,
+                     Depth depth, Collection<String> changelists,
                      boolean ignoreAncestry, boolean noDiffDeleted,
                      boolean force, boolean copiesAsAdds)
             throws ClientException
     {
-        try {
-            OutputStream stream = new FileOutputStream(outFileName);
-            diff(target1, revision1, target2, revision2, relativeToDir,
-                 stream, depth, changelists, ignoreAncestry, noDiffDeleted,
-                 force, copiesAsAdds, false, false, null);
-        } catch (FileNotFoundException ex) {
-            throw ClientException.fromException(ex);
-        }
+        diff(target1, revision1, target2, revision2,
+             relativeToDir, outFileName, /*errFileName*/ null,
+             depth, changelists, ignoreAncestry, noDiffDeleted,
+             force, copiesAsAdds, /*ignoreProps*/ false, /*propsOnly*/ false,
+             /*options*/ null);
     }
 
-    public void diff(String target1, Revision revision1, String target2,
-                     Revision revision2, String relativeToDir,
-                     OutputStream stream, Depth depth,
-                     Collection<String> changelists,
+    @Override
+    public void diff(String target1, Revision revision1,
+                     String target2, Revision revision2,
+                     String relativeToDir,
+                     OutputStream outStream,
+                     Depth depth, Collection<String> changelists,
                      boolean ignoreAncestry, boolean noDiffDeleted,
                      boolean force, boolean copiesAsAdds,
                      boolean ignoreProps, boolean propsOnly)
             throws ClientException
     {
-        diff(target1, revision1, target2, revision2, relativeToDir,
-             stream, depth, changelists, ignoreAncestry, noDiffDeleted,
-             force, copiesAsAdds, ignoreProps, propsOnly, null);
+        diff(target1, revision1, target2, revision2,
+             relativeToDir, outStream, /*errStream*/ null,
+             depth, changelists, ignoreAncestry, noDiffDeleted,
+             force, copiesAsAdds, ignoreProps, propsOnly,
+             /*options*/ null);
     }
 
-    public void diff(String target1, Revision revision1, String target2,
-                     Revision revision2, String relativeToDir,
-                     String outFileName, Depth depth,
-                     Collection<String> changelists,
+    @Override
+    public void diff(String target1, Revision revision1,
+                     String target2, Revision revision2,
+                     String relativeToDir,
+                     String outFileName,
+                     Depth depth, Collection<String> changelists,
+                     boolean ignoreAncestry, boolean noDiffDeleted,
+                     boolean force, boolean copiesAsAdds,
+                     boolean ignoreProps, boolean propsOnly,
+                     DiffOptions options)
+            throws ClientException
+    {
+        diff(target1, revision1, target2, revision2,
+             relativeToDir, outFileName, /*errFileName*/ null,
+             depth, changelists, ignoreAncestry, noDiffDeleted,
+             force, copiesAsAdds, ignoreProps, propsOnly,
+             options);
+    }
+
+    @Override
+    public void diff(String target1, Revision revision1,
+                     String target2, Revision revision2,
+                     String relativeToDir,
+                     OutputStream outStream,
+                     Depth depth, Collection<String> changelists,
+                     boolean ignoreAncestry, boolean noDiffDeleted,
+                     boolean force, boolean copiesAsAdds,
+                     boolean ignoreProps, boolean propsOnly,
+                     DiffOptions options)
+            throws ClientException
+    {
+        diff(target1, revision1, target2, revision2,
+             relativeToDir, outStream, /*errStream*/ null,
+             depth, changelists, ignoreAncestry, noDiffDeleted,
+             force, copiesAsAdds, ignoreProps, propsOnly,
+             options);
+    }
+
+    @Override
+    public void diff(String target1, Revision revision1,
+                     String target2, Revision revision2,
+                     String relativeToDir,
+                     String outFileName, String errFileName,
+                     Depth depth, Collection<String> changelists,
                      boolean ignoreAncestry, boolean noDiffDeleted,
                      boolean force, boolean copiesAsAdds,
                      boolean ignoreProps, boolean propsOnly,
@@ -556,62 +601,112 @@ public class SVNClient implements ISVNCl
             throws ClientException
     {
         try {
-            OutputStream stream = new FileOutputStream(outFileName);
-            diff(target1, revision1, target2, revision2, relativeToDir,
-                 stream, depth, changelists, ignoreAncestry, noDiffDeleted,
-                 force, copiesAsAdds, ignoreProps, propsOnly, options);
+            OutputStream outStream = new FileOutputStream(outFileName);
+            OutputStream errStream = errFileName == null
+                ? null : new FileOutputStream(errFileName);
+
+            diff(target1, revision1, target2, revision2,
+                 relativeToDir, outStream, errStream,
+                 depth, changelists, ignoreAncestry, noDiffDeleted,
+                 force, copiesAsAdds, ignoreProps, propsOnly,
+                 options);
         } catch (FileNotFoundException ex) {
             throw ClientException.fromException(ex);
         }
     }
 
-    public native void diff(String target1, Revision revision1, String target2,
-                            Revision revision2, String relativeToDir,
-                            OutputStream stream, Depth depth,
-                            Collection<String> changelists,
+    @Override
+    public native void diff(String target1, Revision revision1,
+                            String target2, Revision revision2,
+                            String relativeToDir,
+                            OutputStream outStream, OutputStream errStream,
+                            Depth depth, Collection<String> changelists,
                             boolean ignoreAncestry, boolean noDiffDeleted,
                             boolean force, boolean copiesAsAdds,
                             boolean ignoreProps, boolean propsOnly,
                             DiffOptions options)
             throws ClientException;
 
+    // svn_client_diff_peg7
 
-
+    @Override
     public void diff(String target, Revision pegRevision,
                      Revision startRevision, Revision endRevision,
-                     String relativeToDir, String outFileName,
+                     String relativeToDir,
+                     String outFileName,
                      Depth depth, Collection<String> changelists,
                      boolean ignoreAncestry, boolean noDiffDeleted,
                      boolean force, boolean copiesAsAdds)
             throws ClientException
     {
-        try {
-            OutputStream stream = new FileOutputStream(outFileName);
-            diff(target, pegRevision, startRevision, endRevision,
-                 relativeToDir, stream, depth, changelists, ignoreAncestry,
-                 noDiffDeleted, force, copiesAsAdds, false, false, null);
-        } catch (FileNotFoundException ex) {
-            throw ClientException.fromException(ex);
-        }
+        diff(target, pegRevision, startRevision, endRevision,
+             relativeToDir, outFileName, /*errFileName*/ null,
+             depth, changelists, ignoreAncestry, noDiffDeleted,
+             force, copiesAsAdds, /*ignoreProps*/ false, /*propsOnly*/ false,
+             /*options*/ null);
     }
 
+    @Override
     public void diff(String target, Revision pegRevision,
                      Revision startRevision, Revision endRevision,
-                     String relativeToDir, OutputStream stream,
+                     String relativeToDir,
+                     OutputStream outStream,
                      Depth depth, Collection<String> changelists,
                      boolean ignoreAncestry, boolean noDiffDeleted,
                      boolean force, boolean copiesAsAdds,
                      boolean ignoreProps, boolean propsOnly)
             throws ClientException
     {
-        diff(target, pegRevision, startRevision, endRevision, relativeToDir,
-             stream, depth, changelists, ignoreAncestry, noDiffDeleted,
-             force, copiesAsAdds, ignoreProps, propsOnly, null);
+        diff(target, pegRevision, startRevision, endRevision,
+             relativeToDir, outStream, /*errStream*/ null,
+             depth, changelists, ignoreAncestry, noDiffDeleted,
+             force, copiesAsAdds, ignoreProps, propsOnly,
+             /*options*/ null);
+    }
+
+    @Override
+    public void diff(String target, Revision pegRevision,
+                     Revision startRevision, Revision endRevision,
+                     String relativeToDir,
+                     String outFileName,
+                     Depth depth, Collection<String> changelists,
+                     boolean ignoreAncestry, boolean noDiffDeleted,
+                     boolean force, boolean copiesAsAdds,
+                     boolean ignoreProps, boolean propsOnly,
+                     DiffOptions options)
+            throws ClientException
+    {
+        diff(target, pegRevision, startRevision, endRevision,
+             relativeToDir, outFileName, /*errFileName*/ null,
+             depth, changelists, ignoreAncestry, noDiffDeleted,
+             force, copiesAsAdds, ignoreProps, propsOnly,
+             options);
+    }
+
+    @Override
+    public void diff(String target, Revision pegRevision,
+                     Revision startRevision, Revision endRevision,
+                     String relativeToDir,
+                     OutputStream outStream,
+                     Depth depth, Collection<String> changelists,
+                     boolean ignoreAncestry, boolean noDiffDeleted,
+                     boolean force, boolean copiesAsAdds,
+                     boolean ignoreProps, boolean propsOnly,
+                     DiffOptions options)
+            throws ClientException
+    {
+        diff(target, pegRevision, startRevision, endRevision,
+             relativeToDir, outStream, /*errStream*/ null,
+             depth, changelists, ignoreAncestry, noDiffDeleted,
+             force, copiesAsAdds, ignoreProps, propsOnly,
+             options);
     }
 
+    @Override
     public void diff(String target, Revision pegRevision,
                      Revision startRevision, Revision endRevision,
-                     String relativeToDir, String outFileName,
+                     String relativeToDir,
+                     String outFileName, String errFileName,
                      Depth depth, Collection<String> changelists,
                      boolean ignoreAncestry, boolean noDiffDeleted,
                      boolean force, boolean copiesAsAdds,
@@ -620,18 +715,25 @@ public class SVNClient implements ISVNCl
             throws ClientException
     {
         try {
-            OutputStream stream = new FileOutputStream(outFileName);
-            diff(target, pegRevision, startRevision, endRevision, 
relativeToDir,
-                 stream, depth, changelists, ignoreAncestry, noDiffDeleted,
-                 force, copiesAsAdds, ignoreProps, propsOnly, options);
+            OutputStream outStream = new FileOutputStream(outFileName);
+            OutputStream errStream = errFileName == null
+                ? null : new FileOutputStream(errFileName);
+
+            diff(target, pegRevision, startRevision, endRevision,
+                 relativeToDir, outStream, errStream,
+                 depth, changelists, ignoreAncestry, noDiffDeleted,
+                 force, copiesAsAdds, ignoreProps, propsOnly,
+                 options);
         } catch (FileNotFoundException ex) {
             throw ClientException.fromException(ex);
         }
     }
 
+    @Override
     public native void diff(String target, Revision pegRevision,
                             Revision startRevision, Revision endRevision,
-                            String relativeToDir, OutputStream stream,
+                            String relativeToDir,
+                            OutputStream outStream, OutputStream errStream,
                             Depth depth, Collection<String> changelists,
                             boolean ignoreAncestry, boolean noDiffDeleted,
                             boolean force, boolean copiesAsAdds,


Reply via email to