Author: kotkov Date: Thu Mar 2 11:09:02 2023 New Revision: 1907963 URL: http://svn.apache.org/viewvc?rev=1907963&view=rev Log: Slightly refactor the svn_client__checkout_internal() function so that all parameter processing would happen in one place.
Before this change, this logic was scattered between svn_client_checkout4() and svn_client__checkout_internal(), with an additional downside that the internal function could only accept specific parameter combinations. With this change, all processing happens in svn_client__checkout_internal(), without any assertions on those parameter combinations. * subversion/libsvn_client/client.h (svn_client__checkout_internal): Accept new `settings_from_context` parameter. Adjust docstring. * subversion/libsvn_client/checkout.c (svn_client_checkout4): Move part of the parameter processing into … (svn_client__checkout_internal): …this function. * subversion/libsvn_client/copy.c (svn_client__repos_to_wc_copy_dir): Adjust calling site of svn_client__checkout_internal(). * subversion/libsvn_client/externals.c (switch_dir_external): Adjust calling site of svn_client__checkout_internal(). * subversion/libsvn_client/shelf.c (shelf_copy_base): Adjust calling site of svn_client__checkout_internal(). Modified: subversion/trunk/subversion/libsvn_client/checkout.c subversion/trunk/subversion/libsvn_client/client.h subversion/trunk/subversion/libsvn_client/copy.c subversion/trunk/subversion/libsvn_client/externals.c subversion/trunk/subversion/libsvn_client/shelf.c Modified: subversion/trunk/subversion/libsvn_client/checkout.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/checkout.c?rev=1907963&r1=1907962&r2=1907963&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/checkout.c (original) +++ subversion/trunk/subversion/libsvn_client/checkout.c Thu Mar 2 11:09:02 2023 @@ -80,6 +80,7 @@ svn_client__checkout_internal(svn_revnum svn_depth_t depth, svn_boolean_t ignore_externals, svn_boolean_t allow_unver_obstructions, + svn_boolean_t settings_from_context, const svn_version_t *wc_format_version, svn_tristate_t store_pristine, svn_ra_session_t *ra_session, @@ -103,7 +104,7 @@ svn_client__checkout_internal(svn_revnum && (revision->kind != svn_opt_revision_head)) return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL, NULL); - if (wc_format_version == NULL && store_pristine == svn_tristate_unknown) + if (settings_from_context) { SVN_ERR(svn_wc__settings_from_context(&target_format, &target_store_pristine, @@ -112,17 +113,41 @@ svn_client__checkout_internal(svn_revnum } else { - SVN_ERR_ASSERT(wc_format_version != NULL); + const svn_version_t *target_format_version; - SVN_ERR(svn_wc__format_from_version(&target_format, wc_format_version, - scratch_pool)); - - SVN_ERR_ASSERT(store_pristine != svn_tristate_unknown); - - if (store_pristine == svn_tristate_true) + if (store_pristine == svn_tristate_unknown) + target_store_pristine = TRUE; + else if (store_pristine == svn_tristate_true) target_store_pristine = TRUE; else target_store_pristine = FALSE; + + if (wc_format_version) + { + target_format_version = wc_format_version; + } + else + { + /* A NULL wc_format_version translates to the minimum compatible + version. */ + target_format_version = svn_client_default_wc_version(scratch_pool); + + if (!target_store_pristine) + { + const svn_version_t *required_version = + svn_client__compatible_wc_version_optional_pristine(scratch_pool); + + if (!svn_version__at_least(target_format_version, + required_version->major, + required_version->minor, + required_version->patch)) + target_format_version = required_version; + } + } + + SVN_ERR(svn_wc__format_from_version(&target_format, + target_format_version, + scratch_pool)); } /* Get the RA connection, if needed. */ @@ -271,32 +296,12 @@ svn_client_checkout4(svn_revnum_t *resul SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool)); - if (store_pristine == svn_tristate_unknown) - store_pristine = svn_tristate_true; - - /* A NULL wc_format_version translates to the minimum compatible version. */ - if (!wc_format_version) - { - wc_format_version = svn_client_default_wc_version(pool); - - if (store_pristine == svn_tristate_false) - { - const svn_version_t *required_version = - svn_client__compatible_wc_version_optional_pristine(pool); - - if (!svn_version__at_least(wc_format_version, - required_version->major, - required_version->minor, - required_version->patch)) - wc_format_version = required_version; - } - } - err = svn_client__checkout_internal(result_rev, &sleep_here, URL, local_abspath, peg_revision, revision, depth, ignore_externals, allow_unver_obstructions, + FALSE, /* settings_from_context */ wc_format_version, store_pristine, NULL /* ra_session */, Modified: subversion/trunk/subversion/libsvn_client/client.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/client.h?rev=1907963&r1=1907962&r2=1907963&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/client.h (original) +++ subversion/trunk/subversion/libsvn_client/client.h Thu Mar 2 11:09:02 2023 @@ -539,18 +539,20 @@ svn_client__update_internal(svn_revnum_t the repos are tolerated; if FALSE, these obstructions cause the checkout to fail. - A new working copy, if needed, will be created in the format corresponding - to the WC_FORMAT_VERSION of the client. The format of any existing working - copy will remain unchanged. + If SETTINGS_FROM_CONTEXT is TRUE, the working copy settings such as + WC_FORMAT_VERSION and STORE_PRISTINE will be determined from context + (see svn_wc__settings_from_context) and the values of the corresponding + arguments are ignored. Otherwise, their values take effect as described + below: - If STORE_PRISTINE is svn_tristate_true, the pristine contents of all - files in the working copy will be stored on disk. If STORE_PRISTINE is - svn_tristate_false, the pristine contents will be fetched on-demand when - required by the operation. + - A new working copy, if needed, will be created in the format corresponding + to the WC_FORMAT_VERSION of the client. The format of any existing + working copy will remain unchanged. - If WC_FORMAT_VERSION is NULL and STORE_PRISTINE is svn_tristate_unknown, the - settings will be determined from context (see svn_wc__settings_from_context). - Otherwise, both WC_FORMAT_VERSION and STORE_PRISTINE must be defined. + - If STORE_PRISTINE is svn_tristate_true, the pristine contents of all + files in the working copy will be stored on disk. If STORE_PRISTINE is + svn_tristate_false, the pristine contents will be fetched on-demand when + required by the operation. If RA_SESSION is NOT NULL, it may be used to avoid creating a new session. The session may point to a different URL after returning. @@ -565,6 +567,7 @@ svn_client__checkout_internal(svn_revnum svn_depth_t depth, svn_boolean_t ignore_externals, svn_boolean_t allow_unver_obstructions, + svn_boolean_t settings_from_context, const svn_version_t *wc_format_version, svn_tristate_t store_pristine, svn_ra_session_t *ra_session, Modified: subversion/trunk/subversion/libsvn_client/copy.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/copy.c?rev=1907963&r1=1907962&r2=1907963&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/copy.c (original) +++ subversion/trunk/subversion/libsvn_client/copy.c Thu Mar 2 11:09:02 2023 @@ -2487,8 +2487,8 @@ svn_client__repos_to_wc_copy_dir(svn_boo svn_depth_infinity, TRUE /*ignore_externals*/, FALSE, /* we don't allow obstructions */ - NULL, /* default WC format */ - svn_tristate_unknown, + TRUE, /*settings_from_context*/ + NULL, svn_tristate_unknown, ra_session, ctx, scratch_pool); ctx->notify_func2 = old_notify_func2; Modified: subversion/trunk/subversion/libsvn_client/externals.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/externals.c?rev=1907963&r1=1907962&r2=1907963&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/externals.c (original) +++ subversion/trunk/subversion/libsvn_client/externals.c Thu Mar 2 11:09:02 2023 @@ -412,8 +412,8 @@ switch_dir_external(const char *local_ab url, local_abspath, peg_revision, revision, svn_depth_infinity, FALSE, FALSE, - NULL, /* default WC format */ - svn_tristate_unknown, + TRUE, /*settings_from_context*/ + NULL, svn_tristate_unknown, ra_session, ctx, pool)); Modified: subversion/trunk/subversion/libsvn_client/shelf.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/shelf.c?rev=1907963&r1=1907962&r2=1907963&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/shelf.c (original) +++ subversion/trunk/subversion/libsvn_client/shelf.c Thu Mar 2 11:09:02 2023 @@ -1036,8 +1036,8 @@ shelf_copy_base(svn_client__shelf_versio svn_depth_infinity, TRUE /*ignore_externals*/, FALSE /*allow_unver_obstructions*/, - NULL, /* default WC format */ - svn_tristate_unknown, + TRUE, /*settings_from_context*/ + NULL, svn_tristate_unknown, ra_session, ctx, scratch_pool)); /* ### hopefully we won't eventually need to sleep_here... */