Modified: subversion/trunk/subversion/libsvn_wc/wc_db.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.h?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.h Fri Feb 18 15:27:02 2022
@@ -278,7 +278,8 @@ svn_error_t *
 svn_wc__db_close(svn_wc__db_t *db);
 
 
-/* Initialize the SDB for LOCAL_ABSPATH, which should be a working copy path.
+/* Initialize the SDB with format TARGET_FORMAT for LOCAL_ABSPATH, which should
+   be a working copy path.
 
    A REPOSITORY row will be constructed for the repository identified by
    REPOS_ROOT_URL and REPOS_UUID. Neither of these may be NULL.
@@ -296,10 +297,13 @@ svn_wc__db_close(svn_wc__db_t *db);
    DEPTH is the initial depth of the working copy; it must be a definite
    depth, not svn_depth_unknown.
 
+   Create the working copy with the given TARGET_FORMAT.
+
    Use SCRATCH_POOL for temporary allocations.
 */
 svn_error_t *
 svn_wc__db_init(svn_wc__db_t *db,
+                int target_format,
                 const char *local_abspath,
                 const char *repos_relpath,
                 const char *repos_root_url,
@@ -308,6 +312,15 @@ svn_wc__db_init(svn_wc__db_t *db,
                 svn_depth_t depth,
                 apr_pool_t *scratch_pool);
 
+/* Return the working copy format for LOCAL_ABSPATH in DB in *FORMAT.
+
+   Use SCRATCH_POOL for temporary allocations.
+*/
+svn_error_t *
+svn_wc__db_get_format(int *format,
+                      svn_wc__db_t *db,
+                      const char *local_abspath,
+                      apr_pool_t *scratch_pool);
 
 /* Compute the LOCAL_RELPATH for the given LOCAL_ABSPATH, relative
    from wri_abspath.
@@ -2962,6 +2975,7 @@ svn_wc__db_upgrade_begin(svn_sqlite__db_
                          apr_int64_t *repos_id,
                          apr_int64_t *wc_id,
                          svn_wc__db_t *wc_db,
+                         int target_format,
                          const char *local_dir_abspath,
                          const char *repos_root_url,
                          const char *repos_uuid,
@@ -2982,7 +2996,7 @@ svn_wc__db_upgrade_insert_external(svn_w
                                    apr_pool_t *scratch_pool);
 
 /* Upgrade the metadata concerning the WC at WCROOT_ABSPATH, in DB,
- * to the SVN_WC__VERSION format.
+ * to the TARGET_FORMAT metadata format version.
  *
  * This function is used for upgrading wc-ng working copies to a newer
  * wc-ng format. If a pre-1.7 working copy is found, this function
@@ -3000,6 +3014,7 @@ svn_wc__db_bump_format(int *result_forma
                        svn_boolean_t *bumped_format,
                        svn_wc__db_t *db,
                        const char *wcroot_abspath,
+                       int target_format,
                        apr_pool_t *scratch_pool);
 
 /* @} */

Modified: subversion/trunk/subversion/libsvn_wc/wc_db_private.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db_private.h?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_private.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_private.h Fri Feb 18 15:27:02 
2022
@@ -155,7 +155,8 @@ svn_wc__db_verify_no_work(svn_sqlite__db
 /* Assert that the given WCROOT is usable.
    NOTE: the expression is multiply-evaluated!!  */
 #define VERIFY_USABLE_WCROOT(wcroot)  SVN_ERR_ASSERT(               \
-    (wcroot) != NULL && (wcroot)->format == SVN_WC__VERSION)
+    (wcroot) != NULL && (wcroot)->format <= SVN_WC__VERSION         \
+    && (wcroot)->format >= SVN_WC__SUPPORTED_VERSION)
 
 /* Check if the WCROOT is usable for light db operations such as path
    calculations */

Modified: subversion/trunk/subversion/libsvn_wc/wc_db_wcroot.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db_wcroot.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_wcroot.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_wcroot.c Fri Feb 18 15:27:02 
2022
@@ -31,6 +31,8 @@
 #include "svn_pools.h"
 #include "svn_version.h"
 
+#include "private/svn_sorts_private.h"
+
 #include "wc.h"
 #include "adm_files.h"
 #include "wc_db_private.h"
@@ -337,7 +339,7 @@ svn_wc__db_pdh_create_wcroot(svn_wc__db_
   /* Verify that no work items exists. If they do, then our integrity is
      suspect and, thus, we cannot upgrade this database.  */
   if (format >= SVN_WC__HAS_WORK_QUEUE &&
-      format < SVN_WC__VERSION && verify_format)
+      format < SVN_WC__SUPPORTED_VERSION && verify_format)
     {
       svn_error_t *err = svn_wc__db_verify_no_work(sdb);
       if (err)
@@ -345,7 +347,7 @@ svn_wc__db_pdh_create_wcroot(svn_wc__db_
           /* Special message for attempts to upgrade a 1.7-dev wc with
              outstanding workqueue items. */
           if (err->apr_err == SVN_ERR_WC_CLEANUP_REQUIRED
-              && format < SVN_WC__VERSION && verify_format)
+              && format < SVN_WC__SUPPORTED_VERSION && verify_format)
             err = svn_error_quick_wrap(err, _("Cleanup with an older 1.7 "
                                               "client before upgrading with "
                                               "this client"));
@@ -354,16 +356,27 @@ svn_wc__db_pdh_create_wcroot(svn_wc__db_
     }
 
   /* Auto-upgrade the SDB if possible.  */
-  if (format < SVN_WC__VERSION && verify_format)
+  if (format < SVN_WC__SUPPORTED_VERSION && verify_format)
     {
-      return svn_error_createf(SVN_ERR_WC_UPGRADE_REQUIRED, NULL,
-                               _("The working copy at '%s'\nis too old "
-                                 "(format %d) to work with client version "
-                                 "'%s' (expects format %d). You need to "
-                                 "upgrade the working copy first.\n"),
-                               svn_dirent_local_style(wcroot_abspath,
-                                                      scratch_pool),
-                               format, SVN_VERSION, SVN_WC__VERSION);
+      if (SVN_WC__SUPPORTED_VERSION == SVN_WC__VERSION)
+        return svn_error_createf(SVN_ERR_WC_UPGRADE_REQUIRED, NULL,
+                                 _("The working copy at '%s'\nis too old "
+                                   "(format %d) to work with client version "
+                                   "'%s' (expects format %d). You need "
+                                   "to upgrade the working copy first.\n"),
+                                 svn_dirent_local_style(wcroot_abspath,
+                                                        scratch_pool),
+                                 format, SVN_VERSION, SVN_WC__VERSION);
+      else
+        return svn_error_createf(SVN_ERR_WC_UPGRADE_REQUIRED, NULL,
+                                 _("The working copy at '%s'\nis too old "
+                                   "(format %d) to work with client version "
+                                   "'%s' (expects format %d to %d). You need "
+                                   "to upgrade the working copy first.\n"),
+                                 svn_dirent_local_style(wcroot_abspath,
+                                                        scratch_pool),
+                                 format, SVN_VERSION,
+                                 SVN_WC__SUPPORTED_VERSION, SVN_WC__VERSION);
     }
 
   *wcroot = apr_palloc(result_pool, sizeof(**wcroot));
@@ -1017,3 +1030,85 @@ svn_wc__db_drop_root(svn_wc__db_t *db,
 
   return SVN_NO_ERROR;
 }
+
+
+/*
+ * ### FIXME:
+ *
+ * There must surely be a better way to find the nearest enclosing wcroot of a
+ * path than by copying the hash keys to an array and sorting the array.
+ *
+ * TODO: Convert the svn_wc__db_t::dir_data hash to a sorted dictionary?.
+ */
+svn_error_t *
+svn_wc__format_from_context(int *format,
+                            svn_wc_context_t *wc_ctx,
+                            const char *local_abspath,
+                            apr_pool_t *scratch_pool)
+{
+  apr_hash_t *const dir_data = wc_ctx->db->dir_data;
+  apr_array_header_t *keys;
+  int index;
+
+  /* This is what we return if we don't find a concrete format version. */
+  SVN_ERR(svn_hash_keys(&keys, dir_data, scratch_pool));
+  if (0 == keys->nelts)
+    {
+      *format = SVN_WC__DEFAULT_VERSION;
+      return SVN_NO_ERROR;
+    }
+
+  svn_sort__array(keys, svn_sort_compare_paths);
+  index = svn_sort__bsearch_lower_bound(keys, &local_abspath,
+                                        svn_sort_compare_paths);
+
+  /* If the previous key is a parent of the local_abspath, use its format. */
+  {
+    const char *const here = (index >= keys->nelts ? NULL
+                              : APR_ARRAY_IDX(keys, index, const char*));
+    const char *const prev = (index == 0 ? NULL
+                              : APR_ARRAY_IDX(keys, index - 1, const char*));
+
+    if (here)
+      {
+        const char *const child = svn_dirent_skip_ancestor(here, 
local_abspath);
+        if (child && !*child)
+          {
+            /* Found an exact match in the WC context. */
+            svn_wc__db_wcroot_t *wcroot = svn_hash_gets(dir_data, here);
+            *format = wcroot->format;
+            return SVN_NO_ERROR;
+          }
+      }
+
+    if (prev)
+      {
+        const char *const child = svn_dirent_skip_ancestor(prev, 
local_abspath);
+        if (child)
+          {
+            /* Found the parent path in the WC context. */
+            svn_wc__db_wcroot_t *wcroot = svn_hash_gets(dir_data, prev);
+            *format = wcroot->format;
+            return SVN_NO_ERROR;
+          }
+      }
+  }
+
+  /* Find the oldest format recorded in the WC context. */
+  {
+    int oldest_format = SVN_WC__VERSION;
+    apr_hash_index_t *hi;
+
+    for (hi = apr_hash_first(scratch_pool, dir_data);
+         hi;
+         hi = apr_hash_next(hi))
+      {
+        svn_wc__db_wcroot_t *wcroot = apr_hash_this_val(hi);
+        if (wcroot->format < oldest_format)
+          oldest_format = wcroot->format;
+      }
+
+    *format = oldest_format;
+    return SVN_NO_ERROR;
+  }
+}

Modified: subversion/trunk/subversion/svn/checkout-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/checkout-cmd.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/checkout-cmd.c (original)
+++ subversion/trunk/subversion/svn/checkout-cmd.c Fri Feb 18 15:27:02 2022
@@ -165,13 +165,14 @@ svn_cl__checkout(apr_getopt_t *os,
           revision.kind = svn_opt_revision_head;
       }
 
-      SVN_ERR(svn_client_checkout3
+      SVN_ERR(svn_client_checkout4
               (NULL, true_url, target_dir,
                &peg_revision,
                &revision,
                opt_state->depth,
                opt_state->ignore_externals,
                opt_state->force,
+               opt_state->compatible_version,
                ctx, subpool));
     }
   svn_pool_destroy(subpool);

Modified: subversion/trunk/subversion/svn/cl.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/cl.h?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/cl.h (original)
+++ subversion/trunk/subversion/svn/cl.h Fri Feb 18 15:27:02 2022
@@ -275,6 +275,7 @@ typedef struct svn_cl__opt_state_t
       svn_cl__viewspec_classic,
       svn_cl__viewspec_svn11
   } viewspec;                     /* value of --x-viewspec */
+  svn_version_t *compatible_version; /* working copy compatibility version */
 } svn_cl__opt_state_t;
 
 /* Conflict stats for operations such as update and merge. */
@@ -374,6 +375,7 @@ typedef enum svn_cl__longopt_t {
   opt_vacuum_pristines,
   opt_drop,
   opt_viewspec,
+  opt_compatible_version,
 } svn_cl__longopt_t;
 
 /* Options for giving a log message.  (Some of these also have other uses.)

Modified: subversion/trunk/subversion/svn/help-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/help-cmd.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/help-cmd.c (original)
+++ subversion/trunk/subversion/svn/help-cmd.c Fri Feb 18 15:27:02 2022
@@ -32,6 +32,8 @@
 #include "svn_config.h"
 #include "svn_dirent_uri.h"
 #include "svn_error.h"
+#include "svn_version.h"
+#include "svn_client.h"
 #include "cl.h"
 
 #include "svn_private_config.h"
@@ -46,8 +48,11 @@ svn_cl__help(apr_getopt_t *os,
              apr_pool_t *pool)
 {
   svn_cl__opt_state_t *opt_state = NULL;
-  svn_stringbuf_t *version_footer = NULL;
+  svn_stringbuf_t *version_footer = svn_stringbuf_create_empty(pool);
   const char *config_path;
+  const svn_version_t* min_wc_version;
+  const svn_version_t* max_wc_version;
+  const char *wc_version_footer;
 
   char help_header[] =
   N_("usage: svn <subcommand> [options] [args]\n"
@@ -67,9 +72,6 @@ svn_cl__help(apr_getopt_t *os,
   N_("Subversion is a tool for version control.\n"
      "For additional information, see http://subversion.apache.org/\n";);
 
-  const char *ra_desc_start
-    = _("The following repository access (RA) modules are available:\n\n");
-
   if (baton)
     {
       svn_cl__cmd_baton_t *const cmd_baton = baton;
@@ -121,10 +123,9 @@ svn_cl__help(apr_getopt_t *os,
 
       if (store_plaintext_passwords && store_auth_creds && store_passwords)
         {
-          version_footer = svn_stringbuf_create(
-              _("WARNING: Plaintext password storage is enabled!\n\n"),
-              pool);
-          svn_stringbuf_appendcstr(version_footer, ra_desc_start);
+          svn_stringbuf_appendcstr(
+              version_footer,
+              _("WARNING: Plaintext password storage is enabled!\n\n"));
         }
 #  endif /* !WIN32 */
 #endif /* !SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE */
@@ -132,8 +133,30 @@ svn_cl__help(apr_getopt_t *os,
       opt_state = cmd_baton->opt_state;
     }
 
-  if (!version_footer)
-    version_footer = svn_stringbuf_create(ra_desc_start, pool);
+  min_wc_version = svn_client_supported_wc_version();
+  max_wc_version = svn_client_version();
+  if (min_wc_version->major == max_wc_version->major
+      && min_wc_version->minor == max_wc_version->minor)
+    {
+      wc_version_footer =
+        apr_psprintf(pool,
+                     _("Supported working copy (WC) version: %d.%d\n\n"),
+                     min_wc_version->major, min_wc_version->minor);
+    }
+  else
+    {
+      wc_version_footer =
+        apr_psprintf(
+            pool,
+            _("Supported working copy (WC) versions: from %d.%d to %d.%d\n\n"),
+            min_wc_version->major, min_wc_version->minor,
+            max_wc_version->major, max_wc_version->minor);
+    }
+  svn_stringbuf_appendcstr(version_footer, wc_version_footer);
+
+  svn_stringbuf_appendcstr(
+      version_footer,
+      _("The following repository access (RA) modules are available:\n\n"));
   SVN_ERR(svn_ra_print_modules(version_footer, pool));
 
   /*
@@ -144,8 +167,9 @@ svn_cl__help(apr_getopt_t *os,
                                                     : NULL,
                                           NULL,
                                           pool));
-  svn_stringbuf_appendcstr(version_footer,
-                           _("\nThe following authentication credential caches 
are available:\n\n"));
+  svn_stringbuf_appendcstr(
+      version_footer,
+      _("\nThe following authentication credential caches are 
available:\n\n"));
 
   /*### There is no API to query available providers at run time. */
   if (config_path)

Modified: subversion/trunk/subversion/svn/info-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/info-cmd.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/info-cmd.c (original)
+++ subversion/trunk/subversion/svn/info-cmd.c Fri Feb 18 15:27:02 2022
@@ -368,7 +368,10 @@ typedef enum
   info_item_wc_root,
   info_item_schedule,
   info_item_depth,
-  info_item_changelist
+  info_item_changelist,
+  info_item_wc_format,
+  info_item_wc_format_min,
+  info_item_wc_format_max
 } info_item_t;
 
 /* Mapping between option keywords and info_item_t. */
@@ -395,6 +398,9 @@ static const info_item_map_t info_item_m
     { SVN__STATIC_STRING("schedule"),            info_item_schedule },
     { SVN__STATIC_STRING("depth"),               info_item_depth },
     { SVN__STATIC_STRING("changelist"),          info_item_changelist },
+    { SVN__STATIC_STRING("wc-format"),           info_item_wc_format },
+    { SVN__STATIC_STRING("wc-format-min"),       info_item_wc_format_min },
+    { SVN__STATIC_STRING("wc-format-max"),       info_item_wc_format_max },
   };
 
 static const apr_size_t info_item_map_len =
@@ -1072,6 +1078,20 @@ print_info(void *baton,
 }
 
 
+/* Helper for print_info_item(): Print the value NUMBER for TARGET_PATH,
+   which may be NULL. Use POOL for temporary allocation. */
+static svn_error_t *
+print_info_item_int(int number, const char *target_path,
+                    apr_pool_t *pool)
+{
+  if (target_path)
+    SVN_ERR(svn_cmdline_printf(pool, "%-10d %s", number, target_path));
+  else
+    SVN_ERR(svn_cmdline_printf(pool, "%d", number));
+
+  return SVN_NO_ERROR;
+}
+
 /* Helper for print_info_item(): Print the value TEXT for TARGET_PATH,
    either of which may be NULL. Use POOL for temporary allocation. */
 static svn_error_t *
@@ -1225,6 +1245,24 @@ print_info_item(void *baton,
                   target_path, pool));
       break;
 
+    case info_item_wc_format:
+      SVN_ERR(print_info_item_int((info->wc_info
+                                   ? info->wc_info->wc_format : -1),
+                                  target_path, pool));
+      break;
+
+    case info_item_wc_format_min:
+      SVN_ERR(print_info_item_int((info->wc_info
+                                   ? info->wc_info->wc_format_min : -1),
+                                  target_path, pool));
+      break;
+
+    case info_item_wc_format_max:
+      SVN_ERR(print_info_item_int((info->wc_info
+                                   ? info->wc_info->wc_format_max : -1),
+                                  target_path, pool));
+      break;
+
     case info_item_changelist:
       SVN_ERR(print_info_item_string(
                   ((info->wc_info && info->wc_info->changelist)

Modified: subversion/trunk/subversion/svn/svn.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/svn.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/svn.c (original)
+++ subversion/trunk/subversion/svn/svn.c Fri Feb 18 15:27:02 2022
@@ -344,49 +344,7 @@ const apr_getopt_option_t svn_cl__option
                           "                             "
                           "current revision (recommended when tagging)")},
   {"show-item", opt_show_item, 1,
-                       N_("print only the item identified by ARG:\n"
-                          "                             "
-                          "   'kind'       node kind of TARGET\n"
-                          "                             "
-                          "   'url'        URL of TARGET in the repository\n"
-                          "                             "
-                          "   'relative-url'\n"
-                          "                             "
-                          "                repository-relative URL of TARGET\n"
-                          "                             "
-                          "   'repos-root-url'\n"
-                          "                             "
-                          "                root URL of repository\n"
-                          "                             "
-                          "   'repos-uuid' UUID of repository\n"
-                          "                             "
-                          "   'repos-size' for files, the size of TARGET\n"
-                          "                             "
-                          "                in the repository\n"
-                          "                             "
-                          "   'revision'   specified or implied revision\n"
-                          "                             "
-                          "   'last-changed-revision'\n"
-                          "                             "
-                          "                last change of TARGET at or 
before\n"
-                          "                             "
-                          "                'revision'\n"
-                          "                             "
-                          "   'last-changed-date'\n"
-                          "                             "
-                          "                date of 'last-changed-revision'\n"
-                          "                             "
-                          "   'last-changed-author'\n"
-                          "                             "
-                          "                author of 'last-changed-revision'\n"
-                          "                             "
-                          "   'wc-root'    root of TARGET's working copy\n"
-                          "                             "
-                          "   'schedule'   'normal','add','delete','replace'\n"
-                          "                             "
-                          "   'depth'      checkout depth of TARGET in WC\n"
-                          "                             "
-                          "   'changelist' changelist of TARGET in WC")},
+                       N_("print only the item identified by ARG")},
 
   {"adds-as-modification", opt_adds_as_modification, 0,
                        N_("Local additions are merged with incoming 
additions\n"
@@ -408,6 +366,11 @@ const apr_getopt_option_t svn_cl__option
                           "                             "
                           "to ARG: 'classic' or 'svn11'")},
 
+  {"compatible-version", opt_compatible_version, 1,
+                       N_("use working copy format compatible with 
Subversion\n"
+                       "                             "
+                       "version ARG (\"1.8\", \"1.9.5\", etc.)")},
+
   /* Long-opt Aliases
    *
    * These have NULL descriptions, but an option code that matches some
@@ -573,7 +536,8 @@ svn_cl__cmd_table_main[] =
      "  See also 'svn help update' for a list of possible characters\n"
      "  reporting the action taken.\n"
     )},
-    {'r', 'q', 'N', opt_depth, opt_force, opt_ignore_externals},
+    {'r', 'q', 'N', opt_depth, opt_force, opt_ignore_externals,
+     opt_compatible_version},
     {{'N', N_("obsolete; same as --depth=files")}} },
 
   { "cleanup", svn_cl__cleanup, {0}, {N_(
@@ -781,7 +745,56 @@ svn_cl__cmd_table_main[] =
               "                             "
               "and Petabyte), limiting the number of digits\n"
               "                             "
-              "to three or less")}}
+              "to three or less")},
+     {opt_show_item, N_("print only the item identified by ARG:\n"
+                        "                             "
+                        "   'kind'       node kind of TARGET\n"
+                        "                             "
+                        "   'url'        URL of TARGET in the repository\n"
+                        "                             "
+                        "   'relative-url'\n"
+                        "                             "
+                        "                repository-relative URL of TARGET\n"
+                        "                             "
+                        "   'repos-root-url'\n"
+                        "                             "
+                        "                root URL of repository\n"
+                        "                             "
+                        "   'repos-uuid' UUID of repository\n"
+                        "                             "
+                        "   'repos-size' for files, the size of TARGET\n"
+                        "                             "
+                        "                in the repository\n"
+                        "                             "
+                        "   'revision'   specified or implied revision\n"
+                        "                             "
+                        "   'last-changed-revision'\n"
+                        "                             "
+                        "                last change of TARGET at or before\n"
+                        "                             "
+                        "                'revision'\n"
+                        "                             "
+                        "   'last-changed-date'\n"
+                        "                             "
+                        "                date of 'last-changed-revision'\n"
+                        "                             "
+                        "   'last-changed-author'\n"
+                        "                             "
+                        "                author of 'last-changed-revision'\n"
+                        "                             "
+                        "   'wc-root'    root of TARGET's working copy\n"
+                        "                             "
+                        "   'schedule'   'normal','add','delete','replace'\n"
+                        "                             "
+                        "   'depth'      checkout depth of TARGET in WC\n"
+                        "                             "
+                        "   'wc-format'  TARGET's working copy format\n"
+                        "                             "
+                        "   'wc-format-min'   oldest supported WC format\n"
+                        "                             "
+                        "   'wc-format-min'   newest supported WC format\n"
+                        "                             "
+                        "   'changelist' changelist of TARGET in WC")}},
   },
 
   { "list", svn_cl__list, {"ls"},
@@ -1898,7 +1911,7 @@ svn_cl__cmd_table_main[] =
      "\n"), N_(
      "  Local modifications are preserved.\n"
     )},
-    { 'q' } },
+    { 'q', opt_compatible_version } },
 
   { NULL, NULL, {0}, {NULL}, {0} }
 };
@@ -2010,6 +2023,84 @@ add_commands(const svn_opt_subcommand_de
   svn_cl__cmd_table = cmds_new;
 }
 
+static svn_error_t *
+parse_compatible_version(svn_cl__opt_state_t* opt_state,
+                         const char *opt_arg,
+                         apr_pool_t *result_pool)
+{
+  const char *utf8_opt_arg;
+  svn_version_t *target;
+
+  /* Get the the latest and oldest supported version from the current
+     libsvn_client versions. WC formats are always defined by a X.Y.0
+     release, and svn_client_supported_wc_version() should return such
+     a value. */
+  const svn_version_t *supported = svn_client_supported_wc_version();
+  const svn_version_t *current = svn_client_version();
+  const svn_version_t latest = {current->major, current->minor, 0, NULL};
+
+  /* Double check that the oldest supported version is sane. */
+  SVN_ERR_ASSERT(supported->patch == 0);
+  SVN_ERR_ASSERT(svn_version__at_least(&latest,
+                                       supported->major,
+                                       supported->minor,
+                                       supported->patch));
+
+  /* Parse the requested version. */
+  SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, result_pool));
+  SVN_ERR(svn_version__parse_version_string(&target, utf8_opt_arg,
+                                            result_pool));
+
+  /* Check the earliest supported version. */
+  if (!svn_version__at_least(target,
+                             supported->major,
+                             supported->minor,
+                             supported->patch))
+    {
+      return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+                               _("Cannot create working copies older "
+                                 "than version %d.%d.%d"),
+                               supported->major,
+                               supported->minor,
+                               supported->patch);
+    }
+
+  /* Check the latest supported version. */
+  /* FIXME: ### Should we return an error here instead? It seems
+            ### more friendly to issue a warning and continue with
+            ### the latest supported format. */
+  if (svn_version__at_least(target,
+                            latest.major,
+                            latest.minor,
+                            latest.patch)
+      && (target->major != latest.major
+          || target->minor != latest.minor
+          || target->patch != latest.patch))
+    {
+      svn_error_t *w1 = svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+                                          _("Cannot create working copies "
+                                            "for version %s"),
+                                          opt_arg);
+      svn_error_t *w2 = svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+                                          _("Creating working copy version "
+                                            "%d.%d instead"),
+                                          latest.major,
+                                          latest.minor);
+
+      svn_handle_warning2(stderr, w1, "svn: ");
+      svn_handle_warning2(stderr, w2, "svn: ");
+      svn_error_clear(w1);
+      svn_error_clear(w2);
+
+      target->major = latest.major;
+      target->minor = latest.minor;
+      target->patch = latest.patch;
+    }
+
+  opt_state->compatible_version = target;
+  return SVN_NO_ERROR;
+}
+
 
 /*** Main. ***/
 
@@ -2643,6 +2734,9 @@ sub_main(int *exit_code, int argc, const
         SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
         SVN_ERR(viewspec_from_word(&opt_state.viewspec, utf8_opt_arg));
         break;
+      case opt_compatible_version:
+        SVN_ERR(parse_compatible_version(&opt_state, opt_arg, pool));
+        break;
       default:
         /* Hmmm. Perhaps this would be a good place to squirrel away
            opts that commands like svn diff might need. Hmmm indeed. */

Modified: subversion/trunk/subversion/svn/upgrade-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/upgrade-cmd.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/upgrade-cmd.c (original)
+++ subversion/trunk/subversion/svn/upgrade-cmd.c Fri Feb 18 15:27:02 2022
@@ -70,7 +70,9 @@ svn_cl__upgrade(apr_getopt_t *os,
 
       svn_pool_clear(iterpool);
       SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
-      SVN_ERR(svn_client_upgrade(target, ctx, scratch_pool));
+      SVN_ERR(svn_client_upgrade2(target,
+                                  opt_state->compatible_version,
+                                  ctx, scratch_pool));
     }
   svn_pool_destroy(iterpool);
 

Modified: subversion/trunk/subversion/tests/cmdline/basic_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/basic_tests.py?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/basic_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/basic_tests.py Fri Feb 18 
15:27:02 2022
@@ -2541,33 +2541,35 @@ def basic_auth_test(sbox):
   # Set up a custom config directory
   config_dir = sbox.create_config_dir()
 
+  common_opts = ('--config-dir', config_dir)
+  if svntest.main.options.wc_format_version:
+    common_opts += ('--compatible-version',
+                    svntest.main.options.wc_format_version)
+
   # Checkout with jrandom
   exit_code, output, errput = svntest.main.run_command(
     svntest.main.svn_binary, None, True, 'co', sbox.repo_url, wc_dir,
-    '--username', 'jrandom', '--password', 'rayjandom',
-    '--config-dir', config_dir)
+    '--username', 'jrandom', '--password', 'rayjandom', *common_opts)
 
   exit_code, output, errput = svntest.main.run_command(
     svntest.main.svn_binary, None, True, 'co', sbox.repo_url, wc_dir,
-    '--username', 'jrandom', '--non-interactive', '--config-dir', config_dir)
+    '--username', 'jrandom', '--non-interactive', *common_opts)
 
   # Checkout with jconstant
   exit_code, output, errput = svntest.main.run_command(
     svntest.main.svn_binary, None, True, 'co', sbox.repo_url, wc_dir,
-    '--username', 'jconstant', '--password', 'rayjandom',
-    '--config-dir', config_dir)
+    '--username', 'jconstant', '--password', 'rayjandom', *common_opts)
 
   exit_code, output, errput = svntest.main.run_command(
     svntest.main.svn_binary, None, True, 'co', sbox.repo_url, wc_dir,
-    '--username', 'jconstant', '--non-interactive',
-    '--config-dir', config_dir)
+    '--username', 'jconstant', '--non-interactive', *common_opts)
 
   # Checkout with jrandom which should fail since we do not provide
   # a password and the above cached password belongs to jconstant
   expected_err = ["authorization failed: Could not authenticate to server:"]
   exit_code, output, errput = svntest.main.run_command(
     svntest.main.svn_binary, expected_err, True, 'co', sbox.repo_url, wc_dir,
-    '--username', 'jrandom', '--non-interactive', '--config-dir', config_dir)
+    '--username', 'jrandom', '--non-interactive', *common_opts)
 
 def basic_add_svn_format_file(sbox):
   'test add --parents .svn/format'

Modified: subversion/trunk/subversion/tests/cmdline/getopt_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/getopt_tests.py?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/getopt_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/getopt_tests.py Fri Feb 18 
15:27:02 2022
@@ -60,7 +60,7 @@ def load_expected_output(basename):
   return exp_stdout, exp_stderr
 
 # With plaintext password storage enabled, `svn --version' emits a warning:
-warn_line_re = re.compile("WARNING: Plaintext password storage")
+warn_line_re = re.compile("^WARNING: Plaintext password storage")
 
 # This is a list of lines to delete.
 del_lines_res = [
@@ -99,6 +99,10 @@ rep_lines_res = [
                  # In 'svn --version --quiet', we print only the version
                  # number in a single line.
                  (re.compile(r'^\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?$'), 'X.Y.Z\n'),
+
+                 # In svn --version, the supported WC versions vary.
+                 (re.compile(r'^Supported working copy (WC) version.*$'),
+                  'Supported working copy (WC) versions: from X.Y to X.Y')
                 ]
 
 # This is a trigger pattern that selects the secondary set of

Modified: 
subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn--version--verbose_stdout
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn--version--verbose_stdout?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- 
subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn--version--verbose_stdout
 (original)
+++ 
subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn--version--verbose_stdout
 Fri Feb 18 15:27:02 2022
@@ -6,6 +6,8 @@ This software consists of contributions
 see the NOTICE file for more information.
 Subversion is open source software, see http://subversion.apache.org/
 
+Supported working copy (WC) versions: from 1.8 to 1.15
+
 The following repository access (RA) modules are available:
 
 * ra_svn : Module for accessing a repository using the svn network protocol.

Modified: 
subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn--version_stdout
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn--version_stdout?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- 
subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn--version_stdout 
(original)
+++ 
subversion/trunk/subversion/tests/cmdline/getopt_tests_data/svn--version_stdout 
Fri Feb 18 15:27:02 2022
@@ -6,6 +6,8 @@ This software consists of contributions
 see the NOTICE file for more information.
 Subversion is open source software, see http://subversion.apache.org/
 
+Supported working copy (WC) versions: from 1.8 to 1.15
+
 The following repository access (RA) modules are available:
 
 * ra_svn : Module for accessing a repository using the svn network protocol.

Modified: subversion/trunk/subversion/tests/cmdline/svntest/main.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svntest/main.py?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svntest/main.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svntest/main.py Fri Feb 18 
15:27:02 2022
@@ -58,6 +58,17 @@ from svntest import Skip
 from svntest.wc import StateItem as Item
 
 SVN_VER_MINOR = 15
+DEFAULT_COMPATIBLE_VERSION = "1.8"
+
+def svn_wc__min_supported_format_version():
+  return '1.8'
+
+def svn_wc__max_supported_format_version():
+  return '1.15'
+
+def svn_wc__is_supported_format_version(v):
+  major, minor = v.split('.')
+  return int(major) == 1 and int(minor) in range(8, 15+1)
 
 ######################################################################
 #
@@ -789,6 +800,16 @@ def copy_trust(dst_cfgdir, src_cfgdir):
   for f in os.listdir(src_ssl_dir):
     shutil.copy(os.path.join(src_ssl_dir, f), os.path.join(dst_ssl_dir, f))
 
+def _with_wc_format_version(args):
+  if '--wc-format-version' in args or options.wc_format_version is None:
+    return args
+  non_opt_args = [a for a in args if not str(a).startswith('-')]
+  if non_opt_args:
+    subcommand = non_opt_args[0]
+    if subcommand in ['co', 'checkout', 'upgrade']:
+      return args + ('--compatible-version', options.wc_format_version)
+  return args
+
 def _with_config_dir(args):
   if '--config-dir' in args:
     return args
@@ -824,7 +845,7 @@ def run_svn(error_expected, *varargs):
   you're just checking that something does/doesn't come out of
   stdout/stderr, you might want to use actions.run_and_verify_svn()."""
   return run_command(svn_binary, error_expected, False,
-                     *(_with_auth(_with_config_dir(varargs))))
+                     
*(_with_wc_format_version(_with_auth(_with_config_dir(varargs)))))
 
 # For running svnadmin.  Ignores the output.
 def run_svnadmin(*varargs):
@@ -1725,6 +1746,16 @@ def is_httpd_authz_provider_enabled():
 def is_remote_http_connection_allowed():
   return options.allow_remote_http_connection
 
+def wc_format():
+  ver = (options.wc_format_version or DEFAULT_COMPATIBLE_VERSION)
+  minor = int(ver.split('.')[1])
+  if minor >= 15 and minor <= SVN_VER_MINOR:
+    return 32
+  if minor >= 8 and minor <= 14:
+    return 31
+  raise Exception("Unrecognized wc_format_version '%s'" %
+                  options.wc_format_version)
+
 
 ######################################################################
 
@@ -1774,6 +1805,8 @@ class TestSpawningThread(threading.Threa
       args.append('--http-library=' + options.http_library)
     if options.server_minor_version:
       args.append('--server-minor-version=' + 
str(options.server_minor_version))
+    if options.wc_format_version:
+      args.append('--wc-format-version=' + options.wc_format_version)
     if options.mode_filter:
       args.append('--mode-filter=' + options.mode_filter)
     if options.milestone_filter:
@@ -2191,6 +2224,10 @@ def _create_parser(usage=None):
   parser.add_option('--server-minor-version', type='int', action='store',
                     help="Set the minor version for the server ('3'..'%d')."
                     % SVN_VER_MINOR)
+  parser.add_option('--wc-format-version', action='store',
+                    help="Set the WC format version for all tests 
('%s'..'%s')."
+                    % (svn_wc__min_supported_format_version(),
+                       svn_wc__max_supported_format_version()))
   parser.add_option('--fsfs-packing', action='store_true',
                     help="Run 'svnadmin pack' automatically")
   parser.add_option('--fsfs-sharding', action='store', type='int',
@@ -2317,6 +2354,13 @@ def parse_options(arglist=sys.argv[1:],
     parser.error("test harness only supports server minor versions 3-%d"
                  % SVN_VER_MINOR)
 
+  if not (options.wc_format_version is None or
+          svn_wc__is_supported_format_version(options.wc_format_version)):
+    parser.error("test harness only supports WC formats %s to %s, not '%s'"
+                 % (svn_wc__min_supported_format_version(),
+                    svn_wc__max_supported_format_version(),
+                    options.wc_format_version))
+
   pass
 
   return (parser, args)

Modified: subversion/trunk/subversion/tests/cmdline/upgrade_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/upgrade_tests.py?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/upgrade_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/upgrade_tests.py Fri Feb 18 
15:27:02 2022
@@ -55,9 +55,8 @@ wc_is_too_old_regex = (".*is too old \(f
 
 
 def get_current_format():
-  # Get current format from subversion/libsvn_wc/wc.h
-  format_file = open(os.path.join(os.path.dirname(__file__), "..", "..", 
"libsvn_wc", "wc.h")).read()
-  return int(re.search("\n#define SVN_WC__VERSION (\d+)\n", 
format_file).group(1))
+  """Get the expected WC format."""
+  return svntest.main.wc_format()
 
 
 def replace_sbox_with_tarfile(sbox, tar_filename,

Modified: subversion/trunk/subversion/tests/libsvn_client/client-test.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_client/client-test.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_client/client-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_client/client-test.c Fri Feb 18 
15:27:02 2022
@@ -389,9 +389,10 @@ test_patch(const svn_test_opts_t *opts,
   rev.kind = svn_opt_revision_head;
   peg_rev.kind = svn_opt_revision_unspecified;
   SVN_ERR(svn_client_create_context(&ctx, pool));
-  SVN_ERR(svn_client_checkout3(NULL, repos_url, wc_path,
+  SVN_ERR(svn_client_checkout4(NULL, repos_url, wc_path,
                                &peg_rev, &rev, svn_depth_infinity,
-                               TRUE, FALSE, ctx, pool));
+                               TRUE, FALSE,
+                               opts->wc_format_version, ctx, pool));
 
   /* Create the patch file. */
   patch_file_path = svn_dirent_join_many(
@@ -463,14 +464,15 @@ test_wc_add_scenarios(const svn_test_opt
   peg_rev.kind = svn_opt_revision_unspecified;
   SVN_ERR(svn_client_create_context(&ctx, pool));
   /* Checkout greek tree as wc_path */
-  SVN_ERR(svn_client_checkout3(NULL, repos_url, wc_path, &peg_rev, &rev,
-                               svn_depth_infinity, FALSE, FALSE, ctx, pool));
+  SVN_ERR(svn_client_checkout4(NULL, repos_url, wc_path, &peg_rev, &rev,
+                               svn_depth_infinity, FALSE, FALSE,
+                               opts->wc_format_version, ctx, pool));
 
   /* Now checkout again as wc_path/NEW */
   new_dir_path = svn_dirent_join(wc_path, "NEW", pool);
-  SVN_ERR(svn_client_checkout3(NULL, repos_url, new_dir_path, &peg_rev, &rev,
+  SVN_ERR(svn_client_checkout4(NULL, repos_url, new_dir_path, &peg_rev, &rev,
                                svn_depth_infinity, FALSE, FALSE,
-                               ctx, pool));
+                               opts->wc_format_version, ctx, pool));
 
   ex_dir_path = svn_dirent_join(wc_path, "NEW_add", pool);
   ex2_dir_path = svn_dirent_join(wc_path, "NEW_add2", pool);
@@ -627,9 +629,10 @@ test_16k_add(const svn_test_opts_t *opts
   rev.kind = svn_opt_revision_head;
   peg_rev.kind = svn_opt_revision_unspecified;
   SVN_ERR(svn_client_create_context(&ctx, pool));
-  SVN_ERR(svn_client_checkout3(NULL, repos_url, wc_path,
+  SVN_ERR(svn_client_checkout4(NULL, repos_url, wc_path,
                                &peg_rev, &rev, svn_depth_infinity,
-                               TRUE, FALSE, ctx, pool));
+                               TRUE, FALSE,
+                               opts->wc_format_version, ctx, pool));
 
   for (i = 0; i < 16384; i++)
     {
@@ -757,8 +760,10 @@ test_foreign_repos_copy(const svn_test_o
   peg_rev.kind = svn_opt_revision_unspecified;
   SVN_ERR(svn_client_create_context(&ctx, pool));
   /* Checkout greek tree as wc_path */
-  SVN_ERR(svn_client_checkout3(NULL, repos_url, wc_path, &peg_rev, &rev,
-                               svn_depth_infinity, FALSE, FALSE, ctx, pool));
+  SVN_ERR(svn_client_checkout4(NULL, repos_url, wc_path, &peg_rev, &rev,
+                               svn_depth_infinity,
+                               FALSE, FALSE,
+                               opts->wc_format_version, ctx, pool));
 
   SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &loc,
                                             repos2_url, NULL, &peg_rev, &rev,
@@ -822,12 +827,12 @@ test_suggest_mergesources(const svn_test
   SVN_ERR(svn_io_remove_dir2(wc_path, TRUE, NULL, NULL, pool));
 
   head_rev.kind = svn_opt_revision_head;
-  SVN_ERR(svn_client_checkout3(NULL,
+  SVN_ERR(svn_client_checkout4(NULL,
                                svn_path_url_add_component2(repos_url, "AA", 
pool),
                                wc_path,
                                &head_rev, &head_rev, svn_depth_empty,
-                               FALSE, FALSE, ctx, pool));
-
+                               FALSE, FALSE,
+                               opts->wc_format_version, ctx, pool));
 
   SVN_ERR(svn_client_suggest_merge_sources(&results,
                                            wc_path,
@@ -970,10 +975,11 @@ test_remote_only_status(const svn_test_o
 
   rev.kind = svn_opt_revision_number;
   rev.value.number = 1;
-  SVN_ERR(svn_client_checkout3(NULL,
+  SVN_ERR(svn_client_checkout4(NULL,
                                apr_pstrcat(pool, repos_url, "/A", SVN_VA_NULL),
                                wc_path, &rev, &rev, svn_depth_immediates,
-                               FALSE, FALSE, ctx, pool));
+                               FALSE, FALSE,
+                               opts->wc_format_version, ctx, pool));
 
   /* Add a local file; this is a double-check to make sure that
      remote-only status ignores local changes. */

Modified: subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c Fri Feb 18 
15:27:02 2022
@@ -6113,10 +6113,11 @@ test_file_vs_dir_move_merge_assertion_fa
   opt_rev.value.number = SVN_INVALID_REVNUM;
   peg_rev.kind = svn_opt_revision_unspecified;
   SVN_ERR(svn_test__create_client_ctx(&ctx, b, pool));
-  SVN_ERR(svn_client_checkout3(NULL, svn_path_url_add_component2(b->repos_url,
+  SVN_ERR(svn_client_checkout4(NULL, svn_path_url_add_component2(b->repos_url,
                                                                  "A1", pool),
                                wc_path, &peg_rev, &opt_rev, svn_depth_infinity,
-                               TRUE, FALSE, ctx, pool));
+                               TRUE, FALSE,
+                               opts->wc_format_version, ctx, pool));
 
   SVN_ERR(svn_client_merge_peg5(svn_path_url_add_component2(b->repos_url, "A",
                                                             pool),

Modified: subversion/trunk/subversion/tests/libsvn_wc/db-test.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_wc/db-test.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_wc/db-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_wc/db-test.c Fri Feb 18 15:27:02 
2022
@@ -292,6 +292,7 @@ static svn_error_t *
 create_open(svn_wc__db_t **db,
             const char **local_abspath,
             const char *subdir,
+            const svn_test_opts_t *opts,
             apr_pool_t *pool)
 {
   SVN_ERR(svn_dirent_get_absolute(local_abspath,
@@ -304,7 +305,8 @@ create_open(svn_wc__db_t **db,
 
   SVN_ERR(svn_wc__db_open(db, NULL, FALSE, TRUE, pool, pool));
   SVN_ERR(svn_test__create_fake_wc(*local_abspath, TESTING_DATA,
-                                   nodes_init_data, actual_init_data, pool));
+                                   nodes_init_data, actual_init_data,
+                                   opts->wc_format_version, pool));
 
   svn_test_add_dir_cleanup(*local_abspath);
 
@@ -339,7 +341,8 @@ validate_abspath(const char *wcroot_absp
 
 
 static svn_error_t *
-test_getting_info(apr_pool_t *pool)
+test_getting_info(const svn_test_opts_t *opts,
+                  apr_pool_t *pool)
 {
   const char *local_abspath;
   svn_node_kind_t kind;
@@ -361,7 +364,7 @@ test_getting_info(apr_pool_t *pool)
   svn_wc__db_t *db;
   svn_error_t *err;
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_getting_info", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_getting_info", opts, pool));
 
   /* Test: basic fetching of data. */
   SVN_ERR(svn_wc__db_base_get_info(
@@ -596,7 +599,8 @@ validate_node(svn_wc__db_t *db,
 
 
 static svn_error_t *
-test_inserting_nodes(apr_pool_t *pool)
+test_inserting_nodes(const svn_test_opts_t *opts,
+                     apr_pool_t *pool)
 {
   const char *local_abspath;
   svn_checksum_t *checksum;
@@ -604,7 +608,7 @@ test_inserting_nodes(apr_pool_t *pool)
   apr_hash_t *props;
   const apr_array_header_t *children;
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_insert_nodes", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_insert_nodes", opts, pool));
 
   props = apr_hash_make(pool);
   set_prop(props, "p1", "v1", pool);
@@ -721,14 +725,15 @@ test_inserting_nodes(apr_pool_t *pool)
 
 
 static svn_error_t *
-test_children(apr_pool_t *pool)
+test_children(const svn_test_opts_t *opts,
+              apr_pool_t *pool)
 {
   const char *local_abspath;
   svn_wc__db_t *db;
   const apr_array_header_t *children;
   int i;
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_children", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_children", opts, pool));
 
   SVN_ERR(svn_wc__db_base_get_children(&children,
                                        db, local_abspath,
@@ -773,7 +778,8 @@ test_children(apr_pool_t *pool)
 
 
 static svn_error_t *
-test_working_info(apr_pool_t *pool)
+test_working_info(const svn_test_opts_t *opts,
+                  apr_pool_t *pool)
 {
   const char *local_abspath;
   svn_node_kind_t kind;
@@ -805,7 +811,7 @@ test_working_info(apr_pool_t *pool)
   svn_wc__db_lock_t *lock;
   svn_wc__db_t *db;
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_working_info", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_working_info", opts, pool));
 
   /* Test: basic fetching of data. */
   SVN_ERR(svn_wc__db_read_info(
@@ -880,12 +886,13 @@ test_working_info(apr_pool_t *pool)
 
 
 static svn_error_t *
-test_pdh(apr_pool_t *pool)
+test_pdh(const svn_test_opts_t *opts,
+         apr_pool_t *pool)
 {
   const char *local_abspath;
   svn_wc__db_t *db;
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_pdh", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_pdh", opts, pool));
 
   /* NOTE: this test doesn't do anything apparent -- it simply exercises
      some internal functionality of wc_db.  This is a handy driver for
@@ -917,7 +924,8 @@ test_pdh(apr_pool_t *pool)
 
 
 static svn_error_t *
-test_scan_addition(apr_pool_t *pool)
+test_scan_addition(const svn_test_opts_t *opts,
+                   apr_pool_t *pool)
 {
   const char *local_abspath;
   svn_wc__db_t *db;
@@ -935,7 +943,7 @@ test_scan_addition(apr_pool_t *pool)
   const char *move_op_root_src;
   const char *delete_op_root_abspath;
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_scan_addition", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_scan_addition", opts, pool));
 
   /* Simple addition of a directory. */
   SVN_ERR(svn_wc__db_scan_addition(
@@ -1069,7 +1077,8 @@ test_scan_addition(apr_pool_t *pool)
 
 
 static svn_error_t *
-test_scan_deletion(apr_pool_t *pool)
+test_scan_deletion(const svn_test_opts_t *opts,
+                   apr_pool_t *pool)
 {
   const char *local_abspath;
   svn_wc__db_t *db;
@@ -1078,7 +1087,7 @@ test_scan_deletion(apr_pool_t *pool)
   const char *moved_to_abspath;
   const char *copy_op_root_abspath;
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_scan_deletion", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_scan_deletion", opts, pool));
 
   /* Node was moved elsewhere. */
   SVN_ERR(svn_wc__db_scan_deletion(
@@ -1248,7 +1257,8 @@ test_scan_deletion(apr_pool_t *pool)
 
 
 static svn_error_t *
-test_global_relocate(apr_pool_t *pool)
+test_global_relocate(const svn_test_opts_t *opts,
+                     apr_pool_t *pool)
 {
   const char *local_abspath;
   svn_wc__db_t *db;
@@ -1256,7 +1266,7 @@ test_global_relocate(apr_pool_t *pool)
   const char *repos_root_url;
   const char *repos_uuid;
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_global_relocate", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_global_relocate", opts, 
pool));
 
   /* Initial sanity check. */
   SVN_ERR(svn_wc__db_read_info(NULL, NULL, NULL,
@@ -1338,7 +1348,8 @@ detect_work_item(const svn_skel_t *work_
 
 
 static svn_error_t *
-test_work_queue(apr_pool_t *pool)
+test_work_queue(const svn_test_opts_t *opts,
+                apr_pool_t *pool)
 {
   svn_wc__db_t *db;
   const char *local_abspath;
@@ -1347,7 +1358,7 @@ test_work_queue(apr_pool_t *pool)
   int fetches = 0;
   apr_int64_t last_id = 0;
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_work_queue", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_work_queue", opts, pool));
 
   /* Create three work items.  */
   work_item = svn_skel__make_empty_list(pool);
@@ -1403,7 +1414,8 @@ test_work_queue(apr_pool_t *pool)
 }
 
 static svn_error_t *
-test_externals_store(apr_pool_t *pool)
+test_externals_store(const svn_test_opts_t *opts,
+                     apr_pool_t *pool)
 {
   svn_wc__db_t *db;
   const char *local_abspath;
@@ -1416,7 +1428,7 @@ test_externals_store(apr_pool_t *pool)
 
   apr_hash_set(props, "key", APR_HASH_KEY_STRING, value);
 
-  SVN_ERR(create_open(&db, &local_abspath, "test_externals_store", pool));
+  SVN_ERR(create_open(&db, &local_abspath, "test_externals_store", opts, 
pool));
 
   /* Directory I exists in the standard test db */
   subdir = svn_dirent_join(local_abspath, "I", pool);
@@ -1530,26 +1542,26 @@ static int max_threads = 2;
 static struct svn_test_descriptor_t test_funcs[] =
   {
     SVN_TEST_NULL,
-    SVN_TEST_PASS2(test_getting_info,
-                   "get information from wc.db"),
-    SVN_TEST_PASS2(test_inserting_nodes,
-                   "insert different nodes into wc.db"),
-    SVN_TEST_PASS2(test_children,
-                   "getting the list of BASE or WORKING children"),
-    SVN_TEST_PASS2(test_working_info,
-                   "reading information about the WORKING tree"),
-    SVN_TEST_PASS2(test_pdh,
-                   "creation of per-directory handles"),
-    SVN_TEST_PASS2(test_scan_addition,
-                   "scanning added working nodes"),
-    SVN_TEST_PASS2(test_scan_deletion,
-                   "deletion introspection functions"),
-    SVN_TEST_PASS2(test_global_relocate,
-                   "relocating a node"),
-    SVN_TEST_PASS2(test_work_queue,
-                   "work queue processing"),
-    SVN_TEST_PASS2(test_externals_store,
-                   "externals store"),
+    SVN_TEST_OPTS_PASS(test_getting_info,
+                       "get information from wc.db"),
+    SVN_TEST_OPTS_PASS(test_inserting_nodes,
+                       "insert different nodes into wc.db"),
+    SVN_TEST_OPTS_PASS(test_children,
+                       "getting the list of BASE or WORKING children"),
+    SVN_TEST_OPTS_PASS(test_working_info,
+                       "reading information about the WORKING tree"),
+    SVN_TEST_OPTS_PASS(test_pdh,
+                       "creation of per-directory handles"),
+    SVN_TEST_OPTS_PASS(test_scan_addition,
+                       "scanning added working nodes"),
+    SVN_TEST_OPTS_PASS(test_scan_deletion,
+                       "deletion introspection functions"),
+    SVN_TEST_OPTS_PASS(test_global_relocate,
+                       "relocating a node"),
+    SVN_TEST_OPTS_PASS(test_work_queue,
+                       "work queue processing"),
+    SVN_TEST_OPTS_PASS(test_externals_store,
+                       "externals store"),
     SVN_TEST_NULL
   };
 

Modified: subversion/trunk/subversion/tests/libsvn_wc/entries-compat.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_wc/entries-compat.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_wc/entries-compat.c (original)
+++ subversion/trunk/subversion/tests/libsvn_wc/entries-compat.c Fri Feb 18 
15:27:02 2022
@@ -287,7 +287,9 @@ static const char * const M_TESTING_DATA
 
 
 static svn_error_t *
-create_fake_wc(const char *subdir, apr_pool_t *pool)
+create_fake_wc(const char *subdir,
+               const svn_test_opts_t *opts,
+               apr_pool_t *pool)
 {
   const char *root;
   const char *wc_abspath;
@@ -298,7 +300,7 @@ create_fake_wc(const char *subdir, apr_p
 
   SVN_ERR(svn_dirent_get_absolute(&wc_abspath, root, pool));
   SVN_ERR(svn_test__create_fake_wc(wc_abspath, TESTING_DATA, nodes, actuals,
-                                   pool));
+                                   opts->wc_format_version, pool));
 
   return SVN_NO_ERROR;
 }
@@ -308,9 +310,10 @@ static svn_error_t *
 create_open(svn_wc__db_t **db,
             const char **local_abspath,
             const char *subdir,
+            const svn_test_opts_t *opts,
             apr_pool_t *pool)
 {
-  SVN_ERR(create_fake_wc(subdir, pool));
+  SVN_ERR(create_fake_wc(subdir, opts, pool));
 
   SVN_ERR(svn_dirent_get_absolute(local_abspath,
                                   svn_dirent_join("fake-wc", subdir, pool),
@@ -328,7 +331,8 @@ create_open(svn_wc__db_t **db,
 
 
 static svn_error_t *
-test_entries_alloc(apr_pool_t *pool)
+test_entries_alloc(const svn_test_opts_t *opts,
+                   apr_pool_t *pool)
 {
   svn_wc__db_t *db;
   const char *local_abspath;
@@ -340,7 +344,7 @@ test_entries_alloc(apr_pool_t *pool)
 #undef WC_NAME
 #define WC_NAME "test_entries_alloc"
 
-  SVN_ERR(create_open(&db, &local_abspath, WC_NAME, pool));
+  SVN_ERR(create_open(&db, &local_abspath, WC_NAME, opts, pool));
 
   SVN_ERR(svn_wc_adm_open3(&adm_access,
                            NULL /* associated */,
@@ -375,7 +379,8 @@ test_entries_alloc(apr_pool_t *pool)
 
 
 static svn_error_t *
-test_stubs(apr_pool_t *pool)
+test_stubs(const svn_test_opts_t *opts,
+           apr_pool_t *pool)
 {
   svn_wc__db_t *db;
   const char *local_abspath;
@@ -391,10 +396,11 @@ test_stubs(apr_pool_t *pool)
 #undef WC_NAME
 #define WC_NAME "test_stubs"
 
-  SVN_ERR(create_open(&db, &local_abspath, WC_NAME, pool));
+  SVN_ERR(create_open(&db, &local_abspath, WC_NAME, opts, pool));
 
   M_dir = svn_dirent_join(local_abspath, "M", pool);
-  SVN_ERR(svn_test__create_fake_wc(M_dir, M_TESTING_DATA, NULL, NULL, pool));
+  SVN_ERR(svn_test__create_fake_wc(M_dir, M_TESTING_DATA, NULL, NULL,
+                                   opts->wc_format_version, pool));
 
   /* The "M" entry is a subdir. Let's ensure we can reach its stub,
      and the actual contents.  */
@@ -454,7 +460,8 @@ test_stubs(apr_pool_t *pool)
 }
 
 static svn_error_t *
-test_access_baton_like_locking(apr_pool_t *pool)
+test_access_baton_like_locking(const svn_test_opts_t *opts,
+                               apr_pool_t *pool)
 {
   svn_wc__db_t *db;
   svn_wc_context_t *wc_ctx, *wc_ctx2;
@@ -466,7 +473,7 @@ test_access_baton_like_locking(apr_pool_
 
 #undef WC_NAME
 #define WC_NAME "test_access_batons"
-  SVN_ERR(create_open(&db, &local_abspath, WC_NAME, pool));
+  SVN_ERR(create_open(&db, &local_abspath, WC_NAME, opts, pool));
 
   D = svn_dirent_join(local_abspath, "DD", pool);
 
@@ -595,6 +602,7 @@ test_access_baton_like_locking(apr_pool_
   {
     const char *url, *repos_root_url, *repos_uuid;
     const char *subdir = svn_dirent_join(local_abspath, "sub-wc", pool);
+    int target_format;
     const char *repos_relpath;
 
     svn_boolean_t is_root;
@@ -605,9 +613,13 @@ test_access_baton_like_locking(apr_pool_
     url = svn_path_url_add_component2(repos_root_url, repos_relpath, pool);
 
     SVN_ERR(svn_io_make_dir_recursively(subdir, pool));
-    SVN_ERR(svn_wc_ensure_adm3(subdir, repos_uuid,
+    SVN_ERR(svn_wc__format_from_version(&target_format, 
opts->wc_format_version,
+                                        pool));
+    SVN_ERR(svn_wc__ensure_adm(wc_ctx, target_format,
+                               subdir,
                                svn_path_url_add_component2(url, "sub-wc", 
pool),
-                               repos_root_url, 0, svn_depth_infinity,
+                               repos_root_url, repos_uuid,
+                               0, svn_depth_infinity,
                                pool));
 
     SVN_ERR(svn_wc__db_is_switched(&is_root, NULL, NULL, wc_ctx->db, subdir,
@@ -635,12 +647,12 @@ static int max_threads = -1;
 static struct svn_test_descriptor_t test_funcs[] =
   {
     SVN_TEST_NULL,
-    SVN_TEST_PASS2(test_entries_alloc,
-                   "entries are allocated in access baton"),
-    SVN_TEST_PASS2(test_stubs,
-                   "access baton mojo can return stubs"),
-    SVN_TEST_PASS2(test_access_baton_like_locking,
-                   "access baton like locks must work with wc-ng"),
+    SVN_TEST_OPTS_PASS(test_entries_alloc,
+                       "entries are allocated in access baton"),
+    SVN_TEST_OPTS_PASS(test_stubs,
+                       "access baton mojo can return stubs"),
+    SVN_TEST_OPTS_PASS(test_access_baton_like_locking,
+                       "access baton like locks must work with wc-ng"),
     SVN_TEST_NULL
   };
 

Modified: subversion/trunk/subversion/tests/libsvn_wc/utils.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_wc/utils.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_wc/utils.c (original)
+++ subversion/trunk/subversion/tests/libsvn_wc/utils.c Fri Feb 18 15:27:02 2022
@@ -103,10 +103,11 @@ create_repos_and_wc(const char **repos_u
 
     SVN_ERR(svn_test__create_client_ctx(&ctx, NULL, subpool));
     SVN_ERR(svn_dirent_get_absolute(wc_abspath, wc_path, pool));
-    SVN_ERR(svn_client_checkout3(NULL, *repos_url, *wc_abspath,
+    SVN_ERR(svn_client_checkout4(NULL, *repos_url, *wc_abspath,
                                  &head_rev, &head_rev, svn_depth_infinity,
                                  FALSE /* ignore_externals */,
                                  FALSE /* allow_unver_obstructions */,
+                                 opts->wc_format_version,
                                  ctx, subpool));
     svn_pool_destroy(subpool);
   }
@@ -124,7 +125,7 @@ svn_test__create_fake_wc(const char *wc_
                          const char *extra_statements,
                          const svn_test__nodes_data_t nodes[],
                          const svn_test__actual_data_t actuals[],
-
+                         const svn_version_t *wc_format_version,
                          apr_pool_t *scratch_pool)
 {
   const char *dotsvn_abspath = svn_dirent_join(wc_abspath, ".svn",
@@ -134,14 +135,21 @@ svn_test__create_fake_wc(const char *wc_
   int i;
   svn_sqlite__stmt_t *stmt;
   const apr_int64_t wc_id = 1;
+  int target_format;
+
+  SVN_ERR(svn_wc__format_from_version(&target_format, wc_format_version,
+                                      scratch_pool));
 
   /* Allocate MY_STATEMENTS in RESULT_POOL because the SDB will continue to
    * refer to it over its lifetime. */
   my_statements = apr_palloc(scratch_pool, 7 * sizeof(const char *));
-  my_statements[0] = statements[STMT_CREATE_SCHEMA];
-  my_statements[1] = statements[STMT_INSTALL_SCHEMA_STATISTICS];
-  my_statements[2] = extra_statements;
-  my_statements[3] = NULL;
+  i = 0;
+  my_statements[i++] = statements[STMT_CREATE_SCHEMA];
+  if (target_format >= 32)
+    my_statements[i++] = statements[STMT_UPGRADE_TO_32];
+  my_statements[i++] = statements[STMT_INSTALL_SCHEMA_STATISTICS];
+  my_statements[i++] = extra_statements;
+  my_statements[i++] = NULL;
 
   /* Create fake-wc/SUBDIR/.svn/ for placing the metadata. */
   SVN_ERR(svn_io_make_dir_recursively(dotsvn_abspath, scratch_pool));

Modified: subversion/trunk/subversion/tests/libsvn_wc/utils.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_wc/utils.h?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_wc/utils.h (original)
+++ subversion/trunk/subversion/tests/libsvn_wc/utils.h Fri Feb 18 15:27:02 2022
@@ -227,6 +227,7 @@ svn_test__create_fake_wc(const char *wc_
                          const char *extra_statements,
                          const svn_test__nodes_data_t nodes[],
                          const svn_test__actual_data_t actuals[],
+                         const svn_version_t *wc_format_version,
                          apr_pool_t *scratch_pool);
 
 

Modified: subversion/trunk/subversion/tests/libsvn_wc/wc-queries-test.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_wc/wc-queries-test.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_wc/wc-queries-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_wc/wc-queries-test.c Fri Feb 18 
15:27:02 2022
@@ -25,6 +25,8 @@
 #include "svn_hash.h"
 #include "svn_ctype.h"
 #include "private/svn_dep_compat.h"
+#include "private/svn_wc_private.h"
+#include "../../libsvn_wc/wc.h"
 
 #include "svn_private_config.h"
 
@@ -70,6 +72,8 @@ static const int schema_statements[] =
 {
   /* Usual tables */
   STMT_CREATE_SCHEMA,
+  /* (executing STMT_UPGRADE_TO_xx is conditional on desired WC format) */
+  STMT_UPGRADE_TO_32,
   STMT_INSTALL_SCHEMA_STATISTICS,
   /* Memory tables */
   STMT_CREATE_TARGETS_LIST,
@@ -149,10 +153,15 @@ in_list(const int list[], int stmt_idx)
 /* Create an in-memory db for evaluating queries */
 static svn_error_t *
 create_memory_db(sqlite3 **db,
+                 const svn_test_opts_t *opts,
                  apr_pool_t *pool)
 {
   sqlite3 *sdb;
   int i;
+  int target_format;
+
+  SVN_ERR(svn_wc__format_from_version(&target_format, opts->wc_format_version,
+                                      pool));
 
   /* Create an in-memory raw database */
   SVN_TEST_ASSERT(sqlite3_initialize() == SQLITE_OK);
@@ -163,6 +172,8 @@ create_memory_db(sqlite3 **db,
   /* Create schema */
   for (i = 0; schema_statements[i] != -1; i++)
     {
+      if (target_format < 32 && schema_statements[i] == STMT_UPGRADE_TO_32)
+        continue;
       SQLITE_ERR(sqlite3_exec(sdb, wc_queries[schema_statements[i]], NULL, 
NULL, NULL));
     }
 
@@ -207,12 +218,13 @@ test_sqlite_version(apr_pool_t *scratch_
 
 /* Parse all normal queries */
 static svn_error_t *
-test_parsable(apr_pool_t *scratch_pool)
+test_parsable(const svn_test_opts_t *opts,
+              apr_pool_t *scratch_pool)
 {
   sqlite3 *sdb;
   int i;
 
-  SVN_ERR(create_memory_db(&sdb, scratch_pool));
+  SVN_ERR(create_memory_db(&sdb, opts, scratch_pool));
 
   for (i=0; i < STMT_SCHEMA_FIRST; i++)
     {
@@ -631,7 +643,8 @@ is_result_table(const char *table_name)
 }
 
 static svn_error_t *
-test_query_expectations(apr_pool_t *scratch_pool)
+test_query_expectations(const svn_test_opts_t *opts,
+                        apr_pool_t *scratch_pool)
 {
   sqlite3 *sdb;
   int i;
@@ -639,7 +652,7 @@ test_query_expectations(apr_pool_t *scra
   svn_error_t *warnings = NULL;
   svn_boolean_t supports_query_info;
 
-  SVN_ERR(create_memory_db(&sdb, scratch_pool));
+  SVN_ERR(create_memory_db(&sdb, opts, scratch_pool));
 
   SVN_ERR(supported_explain_query_plan(&supports_query_info, sdb,
                                        scratch_pool));
@@ -829,7 +842,8 @@ test_query_expectations(apr_pool_t *scra
 }
 
 static svn_error_t *
-test_query_duplicates(apr_pool_t *scratch_pool)
+test_query_duplicates(const svn_test_opts_t *opts,
+                      apr_pool_t *scratch_pool)
 {
   sqlite3 *sdb;
   int i;
@@ -838,7 +852,7 @@ test_query_duplicates(apr_pool_t *scratc
   svn_boolean_t supports_query_info;
   apr_hash_t *sha_to_query = apr_hash_make(scratch_pool);
 
-  SVN_ERR(create_memory_db(&sdb, scratch_pool));
+  SVN_ERR(create_memory_db(&sdb, opts, scratch_pool));
 
   SVN_ERR(supported_explain_query_plan(&supports_query_info, sdb,
       scratch_pool));
@@ -964,12 +978,13 @@ parse_stat_data(const char *stat)
 }
 
 static svn_error_t *
-test_schema_statistics(apr_pool_t *scratch_pool)
+test_schema_statistics(const svn_test_opts_t *opts,
+                       apr_pool_t *scratch_pool)
 {
   sqlite3 *sdb;
   sqlite3_stmt *stmt;
 
-  SVN_ERR(create_memory_db(&sdb, scratch_pool));
+  SVN_ERR(create_memory_db(&sdb, opts, scratch_pool));
 
   SQLITE_ERR(
       sqlite3_exec(sdb,
@@ -1085,12 +1100,13 @@ static void relpath_depth_sqlite(sqlite3
 
 /* Parse all verify/check queries */
 static svn_error_t *
-test_verify_parsable(apr_pool_t *scratch_pool)
+test_verify_parsable(const svn_test_opts_t *opts,
+                     apr_pool_t *scratch_pool)
 {
   sqlite3 *sdb;
   int i;
 
-  SVN_ERR(create_memory_db(&sdb, scratch_pool));
+  SVN_ERR(create_memory_db(&sdb, opts, scratch_pool));
 
   SQLITE_ERR(sqlite3_create_function(sdb, "relpath_depth", 1, SQLITE_ANY, NULL,
                                      relpath_depth_sqlite, NULL, NULL));
@@ -1134,16 +1150,16 @@ static struct svn_test_descriptor_t test
     SVN_TEST_NULL,
     SVN_TEST_PASS2(test_sqlite_version,
                    "sqlite up-to-date"),
-    SVN_TEST_PASS2(test_parsable,
-                   "queries are parsable"),
-    SVN_TEST_PASS2(test_query_expectations,
-                   "test query expectations"),
-    SVN_TEST_PASS2(test_query_duplicates,
-                   "test query duplicates"),
-    SVN_TEST_PASS2(test_schema_statistics,
-                   "test schema statistics"),
-    SVN_TEST_PASS2(test_verify_parsable,
-                   "verify queries are parsable"),
+    SVN_TEST_OPTS_PASS(test_parsable,
+                       "queries are parsable"),
+    SVN_TEST_OPTS_PASS(test_query_expectations,
+                       "test query expectations"),
+    SVN_TEST_OPTS_PASS(test_query_duplicates,
+                       "test query duplicates"),
+    SVN_TEST_OPTS_PASS(test_schema_statistics,
+                       "test schema statistics"),
+    SVN_TEST_OPTS_PASS(test_verify_parsable,
+                       "verify queries are parsable"),
     SVN_TEST_NULL
   };
 

Modified: subversion/trunk/subversion/tests/svn_test.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/svn_test.h?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/svn_test.h (original)
+++ subversion/trunk/subversion/tests/svn_test.h Fri Feb 18 15:27:02 2022
@@ -216,6 +216,8 @@ typedef struct svn_test_opts_t
   /* Minor version to use for servers and FS backends, or zero to use
      the current latest version. */
   int server_minor_version;
+  /* WC format version to use for all tests (except tests for a specific 
format) */
+  const svn_version_t *wc_format_version;
   svn_boolean_t verbose;
   /* Add future "arguments" here. */
 } svn_test_opts_t;

Modified: subversion/trunk/subversion/tests/svn_test_main.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/svn_test_main.c?rev=1898187&r1=1898186&r2=1898187&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/svn_test_main.c (original)
+++ subversion/trunk/subversion/tests/svn_test_main.c Fri Feb 18 15:27:02 2022
@@ -51,6 +51,8 @@
 #include "private/svn_atomic.h"
 #include "private/svn_mutex.h"
 #include "private/svn_sqlite.h"
+#include "private/svn_wc_private.h"
+#include "private/svn_subr_private.h"
 
 #include "svn_private_config.h"
 
@@ -99,6 +101,7 @@ enum test_options_e {
   quiet_opt,
   config_opt,
   server_minor_version_opt,
+  wc_format_version_opt,
   allow_segfault_opt,
   srcdir_opt,
   reposdir_opt,
@@ -133,6 +136,9 @@ static const apr_getopt_option_t cl_opti
   {"server-minor-version", server_minor_version_opt, 1,
                     N_("set the minor version for the server ('3', '4', "
                        "'5', or '6')")},
+  {"wc-format-version", wc_format_version_opt, 1,
+                    N_("set the WC format version to use for all tests "
+                       "(1.8 to 1.15)")},
   {"quiet",         quiet_opt, 0,
                     N_("print only unexpected results")},
   {"allow-segfaults", allow_segfault_opt, 0,
@@ -802,6 +808,7 @@ svn_test_main(int argc, const char *argv
   svn_test_opts_t opts = { NULL };
 
   opts.fs_type = DEFAULT_FS_TYPE;
+  opts.wc_format_version = svn_wc__min_supported_format_version();
 
   /* Initialize APR (Apache pools) */
   if (apr_initialize() != APR_SUCCESS)
@@ -994,6 +1001,22 @@ svn_test_main(int argc, const char *argv
               }
             break;
           }
+        case wc_format_version_opt:
+          {
+            svn_version_t *ver;
+            SVN_INT_ERR(svn_version__parse_version_string(&ver, opt_arg, 
pool));
+            if (!svn_wc__is_supported_format_version(ver))
+              {
+                fprintf(stderr, "FAIL: Unsupported WC format version given 
(%s); "
+                                "supported format versions are 1.%d to 1.%d\n",
+                                opt_arg,
+                                svn_wc__min_supported_format_version()->minor,
+                                svn_wc__max_supported_format_version()->minor);
+                exit(1);
+              }
+            opts.wc_format_version = ver;
+            break;
+          }
         case sqlite_log_opt:
           svn_sqlite__dbg_enable_errorlog();
           break;

Propchange: subversion/trunk/tools/buildbot/slaves/win32-vcpkg/
------------------------------------------------------------------------------
  Merged 
/subversion/branches/ra_serf-digest-authn/tools/buildbot/slaves/win32-vcpkg:r875693-876404
  Merged 
/subversion/branches/issue-3975/tools/buildbot/slaves/win32-vcpkg:r1152931-1160746
  Merged 
/subversion/branches/kwallet/tools/buildbot/slaves/win32-vcpkg:r870785-871314
  Merged 
/subversion/branches/bdb-reverse-deltas/tools/buildbot/slaves/win32-vcpkg:r872050-872529
  Merged /subversion/branches/1.9.x/tools/buildbot/slaves/win32-vcpkg:r1735680
  Merged 
/subversion/branches/issue-4194-dev/tools/buildbot/slaves/win32-vcpkg:r1410507-1414880
  Merged 
/subversion/branches/in-repo-authz/tools/buildbot/slaves/win32-vcpkg:r1414342-1424779
  Merged 
/subversion/branches/performance/tools/buildbot/slaves/win32-vcpkg:r979193,980118,981087,981090,981189,981194,981287,981684,981827,982043,982355,983398,983406,983430,983474,983488,983490,983760,983764,983766,983770,984927,984973,984984,985014,985037,985046,985472,985477,985482,985487-985488,985493,985497,985500,985514,985601,985603,985606,985669,985673,985695,985697,986453,986465,986485,986491-986492,986517,986521,986605,986608,986817,986832,987865,987868-987869,987872,987886-987888,987893,988319,988898,990330,990533,990535-990537,990541,990568,990572,990574-990575,990600,990759,992899,992904,992911,993127,993141,994956,995478,995507,995603,998012,998858,999098,1001413,1001417,1004291,1022668,1022670,1022676,1022715,1022719,1025660,1025672,1027193,1027203,1027206,1027214,1027227,1028077,1028092,1028094,1028104,1028107,1028111,1028354,1029038,1029042-1029043,1029054-1029055,1029062-1029063,1029078,1029080,1029090,1029092-1029093,1029111,1029151,1029158,1029229-1029230,1029232
 
,1029335-1029336,1029339-1029340,1029342,1029344,1030763,1030827,1031203,1031235,1032285,1032333,1033040,1033057,1033294,1035869,1035882,1039511,1043705,1053735,1056015,1066452,1067683,1067697-1078365
  Merged 
/subversion/branches/double-delete/tools/buildbot/slaves/win32-vcpkg:r870511-872970
  Merged 
/subversion/branches/shelve/tools/buildbot/slaves/win32-vcpkg:r1802592-1815226
  Merged 
/subversion/branches/move-tracking-2/tools/buildbot/slaves/win32-vcpkg:r1606692-1714632
  Merged 
/subversion/branches/fs-rep-sharing/tools/buildbot/slaves/win32-vcpkg:r869036-873803
  Merged 
/subversion/branches/issue-3334-dirs/tools/buildbot/slaves/win32-vcpkg:r875156-875867
  Merged 
/subversion/branches/svnserve-logging/tools/buildbot/slaves/win32-vcpkg:r869828-870893
  Merged 
/subversion/branches/revprop-packing/tools/buildbot/slaves/win32-vcpkg:r1143907,1143971,1143997,1144017,1144499,1144568,1146145
  Merged 
/subversion/branches/gtest_addition/tools/buildbot/slaves/win32-vcpkg:r1452117-1502138
  Merged 
/subversion/branches/dump-load-cross-check/tools/buildbot/slaves/win32-vcpkg:r1654853-1657295
  Merged 
/subversion/branches/multi-wc-format/tools/buildbot/slaves/win32-vcpkg:r1897034-1898186
  Merged 
/subversion/branches/resolve-incoming-add/tools/buildbot/slaves/win32-vcpkg:r1762797-1764284
  Merged 
/subversion/branches/in-memory-cache/tools/buildbot/slaves/win32-vcpkg:r869829-871452
  Merged 
/subversion/branches/pin-externals/tools/buildbot/slaves/win32-vcpkg:r1643757-1659392
  Merged 
/subversion/branches/wc-collate-path/tools/buildbot/slaves/win32-vcpkg:r1402685-1480384
  Merged 
/subversion/branches/revprop-cache/tools/buildbot/slaves/win32-vcpkg:r1298521-1326293
  Merged 
/subversion/branches/merge-skips-obstructions/tools/buildbot/slaves/win32-vcpkg:r874525-874615
  Merged 
/subversion/branches/integrate-txdelta-caching/tools/buildbot/slaves/win32-vcpkg:r1072541-1078213
  Merged 
/subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-vcpkg:r1439280-1546110
  Merged 
/subversion/branches/revprop-caching-ng/tools/buildbot/slaves/win32-vcpkg:r1620597,1620599
  Merged 
/subversion/branches/issue-3148-dev/tools/buildbot/slaves/win32-vcpkg:r875193-875204
  Merged 
/subversion/branches/node_pool/tools/buildbot/slaves/win32-vcpkg:r1304828-1305388
  Merged 
/subversion/branches/diff-optimizations-bytes/tools/buildbot/slaves/win32-vcpkg:r1037353-1067789
  Merged 
/subversion/branches/cache-server/tools/buildbot/slaves/win32-vcpkg:r1458643-1476567
  Merged 
/subversion/branches/dont-save-plaintext-passwords-by-default/tools/buildbot/slaves/win32-vcpkg:r870728-871118
  Merged 
/subversion/branches/1.7.x-fs-verify/tools/buildbot/slaves/win32-vcpkg:r1146708,1161180
  Merged 
/subversion/branches/file-externals/tools/buildbot/slaves/win32-vcpkg:r871779-873302
  Merged 
/subversion/branches/http-protocol-v2/tools/buildbot/slaves/win32-vcpkg:r874395-876041
  Merged 
/subversion/branches/10Gb/tools/buildbot/slaves/win32-vcpkg:r1388102,1388163-1388190,1388195,1388202,1388205,1388211,1388276,1388362,1388375,1388394,1388636,1388639-1388640,1388643-1388644,1388654,1388720,1388789,1388795,1388801,1388805,1388807,1388810,1388816,1389044,1389276,1389289,1389662,1389867,1390017,1390209,1390216,1390407,1390409,1390414,1390419,1390955
  Merged 
/subversion/branches/nfc-nfd-aware-client/tools/buildbot/slaves/win32-vcpkg:r870276,870376
  Merged 
/subversion/branches/authzperf/tools/buildbot/slaves/win32-vcpkg:r1613053-1776831
  Merged 
/subversion/branches/ev2-export/tools/buildbot/slaves/win32-vcpkg:r1325914,1332738,1413107
  Merged 
/subversion/branches/svn-mergeinfo-normalizer/tools/buildbot/slaves/win32-vcpkg:r1642232-1695991
  Merged 
/subversion/branches/shelving-v3/tools/buildbot/slaves/win32-vcpkg:r1853394-1853901
  Merged 
/subversion/branches/tweak-build-take-two/tools/buildbot/slaves/win32-vcpkg:r1424288-1425049,1425051-1425613
  Merged 
/subversion/branches/issue-3220-dev/tools/buildbot/slaves/win32-vcpkg:r872210-872226
  Merged 
/subversion/branches/tc-issue-3334/tools/buildbot/slaves/win32-vcpkg:r874697-874773
  Merged 
/subversion/branches/tree-conflicts-notify/tools/buildbot/slaves/win32-vcpkg:r873926-874008
  Merged 
/subversion/branches/svn-mergeinfo-enhancements/tools/buildbot/slaves/win32-vcpkg:r870119-870195,870197-870288
  Merged 
/subversion/branches/verify-at-commit/tools/buildbot/slaves/win32-vcpkg:r1462039-1462408
  Merged 
/subversion/branches/issue-4116-dev/tools/buildbot/slaves/win32-vcpkg:r1424719-1425040
  Merged 
/subversion/branches/diff-callbacks3/tools/buildbot/slaves/win32-vcpkg:r870059-870761
  Merged 
/subversion/branches/fsx-id/tools/buildbot/slaves/win32-vcpkg:r1645603-1649011
  Merged 
/subversion/branches/ra-svn-tuning/tools/buildbot/slaves/win32-vcpkg:r1658201-1694489
  Merged 
/subversion/branches/integrate-string-improvements/tools/buildbot/slaves/win32-vcpkg:r1068251-1190617
  Merged 
/subversion/branches/inheritable-props/tools/buildbot/slaves/win32-vcpkg:r1297080-1395089
  Merged 
/subversion/branches/fsx/tools/buildbot/slaves/win32-vcpkg:r1507845-1509914
  Merged 
/subversion/branches/py-tests-as-modules/tools/buildbot/slaves/win32-vcpkg:r956579-1033052
  Merged 
/subversion/branches/1.10-cache-improvements/tools/buildbot/slaves/win32-vcpkg:r1669168-1694487
  Merged 
/subversion/branches/issue-2843-dev/tools/buildbot/slaves/win32-vcpkg:r871432-874179
  Merged 
/subversion/branches/integrate-cache-item-serialization/tools/buildbot/slaves/win32-vcpkg:r1068724-1068739
  Merged 
/subversion/branches/explore-wc/tools/buildbot/slaves/win32-vcpkg:r875486,875493,875497,875507,875511,875514,875559,875580-875581,875584,875587,875611,875627,875647,875667-875668,875711-875712,875733-875734,875736,875744-875748,875751,875758,875782,875795-875796,875830,875836,875838,875842,875852,875855,875864,875870,875873,875880,875885-875888,875890,875897-875898,875905,875907-875909,875935,875943-875944,875946,875979,875982-875983,875985-875986,875990,875997
  Merged 
/subversion/branches/atomic-revprop/tools/buildbot/slaves/win32-vcpkg:r965046-1000689
  Merged 
/subversion/branches/subtree-mergeinfo/tools/buildbot/slaves/win32-vcpkg:r876734-878766
  Merged 
/subversion/branches/javahl-ra/tools/buildbot/slaves/win32-vcpkg:r991978-1494640
  Merged 
/subversion/branches/fsfs-lock-many/tools/buildbot/slaves/win32-vcpkg:r1571740-1577217
  Merged /subversion/trunk/tools/buildbot/slaves/win32-vcpkg:r1807118-1845475
  Merged 
/subversion/branches/issue-4869/tools/buildbot/slaves/win32-vcpkg:r1885862-1885981
  Merged 
/subversion/branches/1.9-cache-improvements/tools/buildbot/slaves/win32-vcpkg:r1678948-1679863
  Merged 
/subversion/branches/integrate-is-cachable/tools/buildbot/slaves/win32-vcpkg:r1072568-1074082
  Merged 
/subversion/branches/auto-props-sdc/tools/buildbot/slaves/win32-vcpkg:r1384106-1401643
  Merged 
/subversion/branches/fsfs-format7/tools/buildbot/slaves/win32-vcpkg:r1426304,1430673,1433848,1438408,1438982,1441129,1442051,1442068,1442504,1442910,1443171,1443803,1444690,1444693,1444695,1445040,1445080,1446103,1451129,1453590,1454307,1460579,1461851,1461865,1462837,1462904,1463120,1467362,1467382,1469487,1471208,1477166,1478055,1481447,1489817,1489949,1490673-1490674,1491784,1493042,1498029,1498103,1498155,1500054,1507729-1507731,1507735-1507736
  Merged 
/subversion/branches/shelve-checkpoint/tools/buildbot/slaves/win32-vcpkg:r1801593-1801923,1801970,1817320,1828508,1828521
  Merged 
/subversion/branches/patch-exec/tools/buildbot/slaves/win32-vcpkg:r1692717-1705390
  Merged 
/subversion/branches/svn-patch-improvements/tools/buildbot/slaves/win32-vcpkg:r918519-934609
  Merged 
/subversion/branches/1.5.x-r30215/tools/buildbot/slaves/win32-vcpkg:r870312
  Merged 
/subversion/branches/integrate-io-improvements/tools/buildbot/slaves/win32-vcpkg:r1068684-1072297
  Merged 
/subversion/branches/issue-3067-deleted-subtrees/tools/buildbot/slaves/win32-vcpkg:r873375-874084
  Merged 
/subversion/branches/remote-only-status/tools/buildbot/slaves/win32-vcpkg:r1581845-1586090
  Merged 
/subversion/branches/integrate-stream-api-extensions/tools/buildbot/slaves/win32-vcpkg:r1068695-1072516
  Merged 
/subversion/branches/svn-auth-x509/tools/buildbot/slaves/win32-vcpkg:r1603509-1655900
  Merged 
/subversion/branches/tc_url_rev/tools/buildbot/slaves/win32-vcpkg:r874351-874483
  Merged 
/subversion/branches/uris-as-urls/tools/buildbot/slaves/win32-vcpkg:r1060426-1064427
  Merged 
/subversion/branches/decouple-shelving-cli/tools/buildbot/slaves/win32-vcpkg:r1874630-1875035
  Merged 
/subversion/branches/javahl-1.14-fixes/tools/buildbot/slaves/win32-vcpkg:r1882126-1886028
  Merged 
/subversion/branches/issue-3242-dev/tools/buildbot/slaves/win32-vcpkg:r879653-896436
  Merged 
/subversion/branches/reintegrate-improvements/tools/buildbot/slaves/win32-vcpkg:r873853-874164
  Merged 
/subversion/branches/svnraisetc/tools/buildbot/slaves/win32-vcpkg:r874709-875149
  Merged 
/subversion/branches/better-pristines/tools/buildbot/slaves/win32-vcpkg:r1807118-1843075
  Merged 
/subversion/branches/tc-merge-notify/tools/buildbot/slaves/win32-vcpkg:r874017-874062
  Merged 
/subversion/branches/integrate-readline-speedup/tools/buildbot/slaves/win32-vcpkg:r1072553-1072555
  Merged 
/subversion/branches/integrate-partial-getter/tools/buildbot/slaves/win32-vcpkg:r1072558-1076552
  Merged 
/subversion/branches/gpg-agent-password-store/tools/buildbot/slaves/win32-vcpkg:r1005036-1150766
  Merged 
/subversion/branches/gnome-keyring/tools/buildbot/slaves/win32-vcpkg:r870558-871410
  Merged 
/subversion/branches/swig-py3/tools/buildbot/slaves/win32-vcpkg:r1813660-1869353
  Merged 
/subversion/branches/1.11.x/tools/buildbot/slaves/win32-vcpkg:r1841316,1841548
  Merged 
/subversion/branches/log-g-performance/tools/buildbot/slaves/win32-vcpkg:r870941-871032
  Merged 
/subversion/branches/issue-3000/tools/buildbot/slaves/win32-vcpkg:r871713,871716-871719,871721-871726,871728,871734
  Merged 
/subversion/branches/fsfs-pack/tools/buildbot/slaves/win32-vcpkg:r873717-874575
  Merged 
/subversion/branches/diff-optimizations/tools/buildbot/slaves/win32-vcpkg:r1031270-1037352
  Merged 
/subversion/branches/issue-2779-dev/tools/buildbot/slaves/win32-vcpkg:r965496-984198
  Merged 
/subversion/branches/fsfs-improvements/tools/buildbot/slaves/win32-vcpkg:r1499981-1547039
  Merged 
/subversion/branches/integrate-cache-membuffer/tools/buildbot/slaves/win32-vcpkg:r998649-998852
  Merged 
/subversion/branches/java10-compat/tools/buildbot/slaves/win32-vcpkg:r1840620-1841179
  Merged 
/subversion/branches/log-addressing/tools/buildbot/slaves/win32-vcpkg:r1509279-1546844
  Merged 
/subversion/branches/tc-resolve/tools/buildbot/slaves/win32-vcpkg:r874191-874239
  Merged 
/subversion/branches/multi-layer-moves/tools/buildbot/slaves/win32-vcpkg:r1239019-1300930
  Merged 
/subversion/branches/tristate-chunked-request/tools/buildbot/slaves/win32-vcpkg:r1502394-1502681
  Merged 
/subversion/branches/tree-conflicts/tools/buildbot/slaves/win32-vcpkg:r868291-873154
  Merged 
/subversion/branches/svnpatch-diff/tools/buildbot/slaves/win32-vcpkg:r865738-876477
  Merged 
/subversion/branches/svn_mutex/tools/buildbot/slaves/win32-vcpkg:r1141683-1182099
  Merged 
/subversion/branches/integrate-compression-level/tools/buildbot/slaves/win32-vcpkg:r1068651-1072287
  Merged 
/subversion/branches/svn-info-detail/tools/buildbot/slaves/win32-vcpkg:r1660035-1662618
  Merged 
/subversion/branches/fsx-1.10/tools/buildbot/slaves/win32-vcpkg:r1658219-1694500


Reply via email to