Julian Foad wrote on Fri, Jan 28, 2022 at 17:15:53 +0000: > For interest/comments.
Please use text/* MIME type for patches so our MUAs show them inline. Naming patches *.txt usually achieves this. > On the 'pristines-on-demand' branch: > > - Sketch of configurable pristines-mode per WC. > - Debug/trace prints. > > The pristines-mode config option can be set in: > > - user config (e.g. '~/.subversion/config') -- for user default > - (new) WC config file ('wc/.svn/config') -- per WC override > > The pristines mode can: > > - skip the "hydrating" of modified files > - skip the "dehydrating" of unmodified files > > It CANNOT yet: > > - force "hydrating" files that currently have no local modification > > Syntax and currently effective values for the option (in the user > config file and/or in the per-WC config file): > > [working-copy] > pristines-mode = hydrate=[never|on-demand],dehydrate=[never|on-demand] The value "all", returned as the default value from svn_wc__db_pristines_mode(), is not handled at all by check_pristines_mode(). Therefore, the resulting behaviour will be the default behaviour, namely to fall back to the values of ALLOW_HYDRATE and ALLOW_DEHYDRATE hardcoded into the svn_client__textbase_sync() callsite. Should "all" mean ALLOW_HYDRATE and ALLOW_DEHYDRATE would both be forced to TRUE? Or perhaps should it be renamed "default"? Or perhaps this patch is at too early a stage for any of this to matter :-) Trimmed diff below. > +++ subversion/libsvn_wc/textbase.c (working copy) > @@ -513,12 +516,52 @@ textbase_hydrate_cb(void *baton, > +/* Check the pristines mode configured for the WC identified by WC_CTX, > + * LOCAL_ABSPATH. Modify the values of *ALLOW_HYDRATE, *ALLOW_DEHYDRATE > + * according to the mode. When the value is "all", *ALLOW_HYDRATE and *ALLOW_DEHYDRATE are not modified. That doesn't matter for the current callers, but a future caller could assume that passing the address of an uninitialized variable is allowed, in which case we'd go on using the uninitialized value. > + */ > +static svn_error_t * > +check_pristines_mode(svn_boolean_t *allow_hydrate, > + svn_boolean_t *allow_dehydrate, > + svn_wc_context_t *wc_ctx, > + const char *local_abspath, > + apr_pool_t *scratch_pool) > +{ > + const char *mode; > + > + SVN_ERR(svn_wc__db_pristines_mode(wc_ctx->db, local_abspath, > + &mode, scratch_pool)); > + > + /* ### for now, these are just a bunch of experimental modes and > + * experimental matching syntax */ > + if (strcmp(mode, "off") == 0) > + { > + *allow_hydrate = FALSE; > + *allow_dehydrate = FALSE; > + } > + if (strcmp(mode, "off-line") == 0) > + *allow_hydrate = FALSE; > + if (strcmp(mode, "fetch-only") == 0) > + *allow_dehydrate = FALSE; > + if (strcmp(mode, "fetch-all") == 0) > + *allow_dehydrate = FALSE; > + > + if (strstr(mode, "hydrate=never")) > + *allow_hydrate = FALSE; > + if (strstr(mode, "dehydrate=never")) > + *allow_dehydrate = FALSE; > + > + SVN_DBG(("pristines mode: %s -> hydrate=%d dehydrate=%d", > + mode, *allow_hydrate, *allow_dehydrate)); > + return SVN_NO_ERROR; > +} > +++ subversion/libsvn_wc/wc_db.h (working copy) > @@ -1069,12 +1069,21 @@ svn_wc__db_pristine_check(svn_boolean_t > +/* Read the pristines mode into *MODE from the per-WC config (if set there) > + * or else from the per-user config (if set there), with a default value of > + * "all". */ > +svn_error_t * > +svn_wc__db_pristines_mode(svn_wc__db_t *db, > + const char *local_abspath, > + const char **mode, > + apr_pool_t *scratch_pool); > +++ subversion/libsvn_wc/wc_db_wcroot.c (working copy) > @@ -229,21 +229,23 @@ svn_wc__db_open(svn_wc__db_t **db, > { > *db = apr_pcalloc(result_pool, sizeof(**db)); > (*db)->config = config; > (*db)->verify_format = !open_without_upgrade; > (*db)->enforce_empty_wq = enforce_empty_wq; > (*db)->dir_data = apr_hash_make(result_pool); > + (*db)->pristines_mode = "all"; Cheers, Daniel