svn commit: r1934020 - in subversion/branches/javahl-1.15: . subversion/bindings/javahl/native subversion/bindings/javahl/src/org/apache/subversion/javahl subversion/bindings/javahl/tests/org/apache/subversion/javahl

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <177839174338.871396.15344058119931723616@svn03-he-fi>
Author: brane
Date: Sun May 10 05:42:23 2026
New Revision: 1934020

Log:
On the javahl-1.15 branch: Upgrade the native implementation to use
svn_client_upgrade2 and add WC upgrade tests.

* BRANCH-README: Update TODO and DONE lists.

[in subversion/bindings/javahl/native/]

* SVNClient.h  (SVNClient::upgrade): Update the prototype.
* SVNClient.cpp (SVNClient::upgrade): Update the implementation.
* org_apache_subversion_javahl_SVNClient.cpp
  (Java_org_apache_subversion_javahl_SVNClient_upgrade):
   Update the native method.

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

* ISVNClient.java
  (ISVNClient.upgrade): Declare new version, deprecate the old one.
  (SVNClient.upgrade): Declare new native method and add a compatibility
   wrapper for the deprecated variant.

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

* BasicTests.java
  (BasicTests.testBasicUpgrade, BasicTests.testLatestUpgrade): New tests.
* SVNTests.java
  (SVNTests.OneTest.OneTest): Add a new option to check out the working copy
   at its oldest compatible version. Add compatibility wrapper.
  (SVNTests.OneTest.createInitialWorkingCopy): Add the same new option.

Modified:
   subversion/branches/javahl-1.15/BRANCH-README
   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
   subversion/branches/javahl-1.15/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
   subversion/branches/javahl-1.15/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java

Modified: subversion/branches/javahl-1.15/BRANCH-README
==============================================================================
--- subversion/branches/javahl-1.15/BRANCH-README	Sun May 10 05:02:15 2026	(r1934019)
+++ subversion/branches/javahl-1.15/BRANCH-README	Sun May 10 05:42:23 2026	(r1934020)
@@ -5,7 +5,6 @@ This is a temporary working branch to up
 
 TODO:
   * Update use of deprecated Subversion APIs:
-    - svn_client_upgrade -> svn_client_upgrade2
     - svn_client_diff6 -> svn_client_diff7
     - svn_client_diff_peg6 -> svn_client_diff_peg7
     - svn_client_revert3 -> svn_client_revert4
@@ -16,6 +15,7 @@ TODO:
 DONE:
   * Update use of deprecated Subversion APIs:
     - svn_client_checkout3 -> svn_client_checkout4
+    - svn_client_upgrade -> svn_client_upgrade2
   * Add Java wrappers for some new functionality
     - .types.VersionNumber extends Version (package scope)
     - .types.Version::getInstance(int major, int minor, int patch)

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 05:02:15 2026	(r1934019)
+++ subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.cpp	Sun May 10 05:42:23 2026	(r1934020)
@@ -1470,19 +1470,27 @@ jstring SVNClient::getVersionInfo(const
     return JNIUtil::makeJString(value.str().c_str());
 }
 
-void SVNClient::upgrade(const char *path)
+jobject SVNClient::upgrade(::Java::Env env, const char *path,
+                           const svn_version_t *targetWcVersion)
 {
     SVN::Pool subPool(pool);
-    SVN_JNI_NULL_PTR_EX(path, "path", );
+    SVN_JNI_NULL_PTR_EX(path, "path", NULL);
 
     svn_client_ctx_t *ctx = context.getContext(NULL, subPool);
     if (ctx == NULL)
-        return;
+        return NULL;
 
     Path checkedPath(path, subPool);
-    SVN_JNI_ERR(checkedPath.error_occurred(), );
+    SVN_JNI_ERR(checkedPath.error_occurred(), NULL);
 
-    SVN_JNI_ERR(svn_client_upgrade(path, ctx, subPool.getPool()), );
+    apr_pool_t *pool = subPool.getPool();
+    const svn_version_t *wc_version = NULL;
+    SVN_JNI_ERR(svn_client_upgrade2(&wc_version, path, targetWcVersion,
+                                    ctx, pool, pool),
+                NULL);
+    if (wc_version != NULL)
+      return ::JavaHL::Version::getInstance(env, *wc_version);
+    return NULL;
 }
 
 jobject SVNClient::revProperties(const char *path, Revision &revision)

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 05:02:15 2026	(r1934019)
+++ subversion/branches/javahl-1.15/subversion/bindings/javahl/native/SVNClient.h	Sun May 10 05:42:23 2026	(r1934020)
@@ -201,7 +201,8 @@ class SVNClient :public SVNBase
                       const char *original_value, bool force);
   jstring getVersionInfo(const char *path, const char *trailUrl,
                          bool lastChanged);
-  void upgrade(const char *path);
+  jobject upgrade(::Java::Env env, const char *path,
+                  const svn_version_t *targetWcVersion);
   jbyteArray propertyGet(const char *path, const char *name,
                          Revision &revision, Revision &pegRevision,
                          StringArray &changelists);

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 05:02:15 2026	(r1934019)
+++ subversion/branches/javahl-1.15/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp	Sun May 10 05:42:23 2026	(r1934020)
@@ -1582,21 +1582,32 @@ Java_org_apache_subversion_javahl_SVNCli
   return cl->getVersionInfo(path, trailUrl, jlastChanged ? true:false);
 }
 
-JNIEXPORT void JNICALL Java_org_apache_subversion_javahl_SVNClient_upgrade
-  (JNIEnv *env, jobject jthis, jstring jpath)
+JNIEXPORT jobject JNICALL Java_org_apache_subversion_javahl_SVNClient_upgrade
+(JNIEnv *env, jobject jthis, jstring jpath, jobject jtargetWcVersion)
 {
   JNIEntry(SVNClient, upgrade);
   SVNClient *cl = SVNClient::getCppObject(jthis);
   if (cl == NULL)
     {
       JNIUtil::throwError(_("bad C++ this"));
-      return;
+      return NULL;
     }
   JNIStringHolder path(jpath);
   if (JNIUtil::isExceptionThrown())
-    return;
+    return NULL;
 
-  cl->upgrade(path);
+  svn_version_t target_version_data;
+  const svn_version_t *target_version_ptr = NULL;
+  if (jtargetWcVersion != NULL)
+    {
+      ::JavaHL::Version targetWcVersion(::Java::Env(env), jtargetWcVersion);
+      if (JNIUtil::isExceptionThrown())
+        return NULL;
+      targetWcVersion.getVersion(target_version_data);
+      target_version_ptr = &target_version_data;
+    }
+
+  return cl->upgrade(::Java::Env(env), path, target_version_ptr);
 }
 
 JNIEXPORT void JNICALL

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 05:02:15 2026	(r1934019)
+++ subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java	Sun May 10 05:42:23 2026	(r1934020)
@@ -1619,10 +1619,22 @@ public interface ISVNClient
 
     /**
      * Recursively upgrade a working copy to a new metadata storage format.
-     * @param path                  path of the working copy
+     * <p>
+     * Behaves like the 1.15 version with <code>targetWcVersion = null</code>.
+     * @deprecated
+     */
+    @Deprecated
+    void upgrade(String path) throws ClientException;
+
+
+    /**
+     * Recursively upgrade a working copy to a new metadata storage format.
+     * @param path             the working copy path
+     * @param targetWcVersion  the working copy version to upgrade to
      * @throws ClientException
+     * @since 1.15
      */
-    void upgrade(String path)
+    Version upgrade(String path, Version targetWcVersion)
             throws ClientException;
 
     /**

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 05:02:15 2026	(r1934019)
+++ subversion/branches/javahl-1.15/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java	Sun May 10 05:42:23 2026	(r1934020)
@@ -789,7 +789,15 @@ public class SVNClient implements ISVNCl
                                         boolean lastChanged)
             throws ClientException;
 
-    public native void upgrade(String path)
+    @Deprecated
+    @Override
+    public void upgrade(String path) throws ClientException
+    {
+        upgrade(path, (Version) null);
+    }
+
+    @Override
+    public native Version upgrade(String path, Version targetWcVersion)
             throws ClientException;
 
     /**

Modified: subversion/branches/javahl-1.15/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
==============================================================================
--- subversion/branches/javahl-1.15/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java	Sun May 10 05:02:15 2026	(r1934019)
+++ subversion/branches/javahl-1.15/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java	Sun May 10 05:42:23 2026	(r1934020)
@@ -941,6 +941,42 @@ public class BasicTests extends SVNTests
     }
 
     /**
+     * Test the basic SVNClient.upgrade functionality.
+     * @throws Throwable
+     */
+    public void testBasicUpgrade() throws Throwable
+    {
+        OneTest thisTest = new OneTest(true, true, true);
+        Version oldestVersion = SVNClient.oldestWcVersion();
+        Version defaultVersion = client.defaultWcVersion();
+
+        Version upgradedVersion =
+            client.upgrade(thisTest.getWCPath(), null);
+
+        assertNotNull(upgradedVersion);
+        assertTrue(upgradedVersion.isAtLeast(oldestVersion));
+        assertTrue(upgradedVersion.isAtLeast(defaultVersion));
+        assertTrue(defaultVersion.isAtLeast(upgradedVersion));
+    }
+
+    /**
+     * Test SVNClient.upgrade to the latest version.
+     * @throws Throwable
+     */
+    public void testLatestUpgrade() throws Throwable
+    {
+        OneTest thisTest = new OneTest(true, true, true);
+        Version latestVersion = SVNClient.latestWcVersion();
+
+        Version upgradedVersion =
+            client.upgrade(thisTest.getWCPath(), latestVersion);
+
+        assertNotNull(upgradedVersion);
+        assertTrue(upgradedVersion.isAtLeast(latestVersion));
+        assertTrue(latestVersion.isAtLeast(upgradedVersion));
+    }
+
+    /**
      * Test the basic SVNClient.commit functionality.
      * @throws Throwable
      */

Modified: subversion/branches/javahl-1.15/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java
==============================================================================
--- subversion/branches/javahl-1.15/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java	Sun May 10 05:02:15 2026	(r1934019)
+++ subversion/branches/javahl-1.15/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java	Sun May 10 05:42:23 2026	(r1934020)
@@ -676,12 +676,15 @@ class SVNTests extends TestCase
          * and initialize the expected working copy layout.
          * @param loadRepos Whether to load the sample repository, or
          * leave it with no initial revisions
+         * @param oldestVersion whether to create the working copy
+         * at the oldest instead of the default supported version.
          * @throws SubversionException If there is a problem
          * creating or loading the repository.
          * @throws IOException If there is a problem finding the
          * dump file.
          */
-        protected OneTest(boolean createWC, boolean loadRepos)
+        protected OneTest(boolean createWC, boolean loadRepos,
+                          boolean oldestVersion)
             throws SubversionException, IOException
         {
             this.testName = testBaseName + ++testCounter;
@@ -691,7 +694,8 @@ class SVNTests extends TestCase
 
             if (createWC)
             {
-                workingCopy = createInitialWorkingCopy(repository);
+              workingCopy = createInitialWorkingCopy(repository,
+                                                     oldestVersion);
             }
         }
 
@@ -702,13 +706,31 @@ class SVNTests extends TestCase
          *
          * @param createWC Whether to create the working copy on disk,
          * and initialize the expected working copy layout.
+         * @param loadRepos Whether to load the sample repository, or
+         * leave it with no initial revisions
+         *
+         * @see #OneTest
+         */
+        protected OneTest(boolean createWC, boolean loadRepos)
+            throws SubversionException, IOException
+        {
+            this(createWC, loadRepos, false);
+        }
+
+        /**
+         * Build a new test setup with a new repository.  Create a
+         * corresponding working copy and expected working copy
+         * layout.
+         *
+         * @param createWC Whether to create the working copy on disk,
+         * and initialize the expected working copy layout.
          *
          * @see #OneTest
          */
         protected OneTest(boolean createWC)
             throws SubversionException, IOException
         {
-            this(createWC,true);
+            this(createWC, true);
         }
         /**
          * Build a new test setup with a new repository.  Create a
@@ -750,7 +772,7 @@ class SVNTests extends TestCase
             repository = orig.getRepository();
             url = orig.getUrl();
             wc = orig.wc.copy();
-            workingCopy = createInitialWorkingCopy(repository);
+            workingCopy = createInitialWorkingCopy(repository, false);
         }
 
         /**
@@ -865,11 +887,12 @@ class SVNTests extends TestCase
          * Create the working copy for the beginning of the test.
          * Assumes that {@link #testName} has been set.
          *
-         * @param repos     the repository directory
+         * @param repos          the repository directory
+         * @param oldestVersion  create an oldest supported WC
          * @return the directory of the working copy
          * @throws Exception
          */
-        protected File createInitialWorkingCopy(File repos)
+        protected File createInitialWorkingCopy(File repos, boolean oldestVersion)
             throws SubversionException, IOException
         {
             // build a clean working directory
@@ -878,9 +901,11 @@ class SVNTests extends TestCase
             removeDirOrFile(workingCopy);
             trackDir(workingCopy);
             // checkout the repository
+            Version wcVersionFormat = oldestVersion
+                ? SVNClient.oldestWcVersion() : null;
             client.checkout(uri.toString(), workingCopy.getAbsolutePath(),
                             null, null, Depth.infinity, false, false,
-                            null, Tristate.Unknown);
+                            wcVersionFormat, Tristate.Unknown);
             // sanity check the working with its expected status
             checkStatus();
             return workingCopy;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.