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
