[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r40473 - trunk/subversion/libsvn_wc

From: Hyrum K. Wright <hyrum_at_hyrumwright.org>
Date: Thu, 12 Nov 2009 00:09:57 -0600

On Nov 11, 2009, at 11:56 PM, Hyrum K. Wright wrote:

> Author: hwright
> Date: Wed Nov 11 21:56:37 2009
> New Revision: 40473
>
> Log:
> Add a working copy upgrade migration routine for moving properties from disk
> to the wc_db.
>
> This commit does *not* change the current version number of the working copy,
> so this code will never be run. In fact, even with the current version number
> bumped, I still can't get the code to run, for reasons I'll pontificate on
> at a later date. I'm committing this now to get some review.

Greg,
Although this code is called from svn_wc__upgrade_sdb(), that function never gets called. We're not making any schema changes in the 15 -> 16 bump, and the sqlite version updater just goes right along with that. By the time we get to the call to svn_wc__upgrade_sdb() inside of create_wcroot(), it turns out that the sqlite format has already been bumped to 16, so we don't even make the call. Is this the intended behavior? If so, how can I get that function called so we can migrate the properties correctly?

> Once we feel confident that the upgrade works as intended, I plan to commit
> the rest of the patch: bumping the working copy version and using in-database
> properties exclusively.

Bert,
I think this does the props migration correctly. I've got the rest of the cutover patch queued up in my working copy, just waiting verification of this patch. When you get a minute, could you take a look at the migrate_props() function and tell me if it matches what you'd expect?

Thanks,
-Hyrum

>
> * subversion/libsvn_wc/upgrade.c
> (PROPS_SUBDIR, PROP_BASE_SUBDIR, TEMP_DIR): Some useful defines.
> (migrate_props): New.
> (bump_database_to_16): Renamed to...
> (bump_database_to_17): ...this.
> (bump_to_16): Renamed to...
> (bump_to_17): ...this.
> (svn_wc__upgrade_sdb): Call the new properties migration code when moving
> from format 15 -> 16.
>
> Modified:
> trunk/subversion/libsvn_wc/upgrade.c
>
> Modified: trunk/subversion/libsvn_wc/upgrade.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/upgrade.c?pathrev=40473&r1=40472&r2=40473
> ==============================================================================
> --- trunk/subversion/libsvn_wc/upgrade.c Wed Nov 11 14:53:19 2009 (r40472)
> +++ trunk/subversion/libsvn_wc/upgrade.c Wed Nov 11 21:56:37 2009 (r40473)
> @@ -49,6 +49,12 @@
> #define WCPROPS_FNAME_FOR_DIR "dir-wcprops"
> #define WCPROPS_ALL_DATA "all-wcprops"
>
> +/* Old property locations. */
> +#define PROPS_SUBDIR "props"
> +#define PROP_BASE_SUBDIR "prop-base"
> +
> +#define TEMP_DIR "tmp"
> +
> /* Old data files that we no longer need/use. */
> #define ADM_README "README.txt"
> #define ADM_EMPTY_FILE "empty-file"
> @@ -725,10 +731,141 @@ migrate_locks(const char *wcroot_abspath
> }
>
>
> +static svn_error_t *
> +migrate_props(const char *wcroot_abspath,
> + svn_sqlite__db_t *sdb,
> + apr_pool_t *scratch_pool)
> +{
> + /* General logic here: iterate over all the immediate children of the root
> + (since we aren't yet in a centralized system), and for any properties that
> + exist, map them as follows:
> +
> + if (node is replaced):
> + revert -> BASE
> + working -> ACTUAL
> + else if (prop pristine is working [as defined in props.c] ):
> + base -> WORKING
> + working -> ACTUAL
> + else:
> + base -> BASE
> + working -> ACTUAL
> + */
> + const apr_array_header_t *children;
> + apr_pool_t *iterpool;
> + const char *props_dirpath;
> + const char *props_base_dirpath;
> + svn_wc__db_t *db;
> + int i;
> +
> + /* *sigh* We actually want to use wc_db APIs to read data, but we aren't
> + provided a wc_db, so open one. */
> + SVN_ERR(svn_wc__db_open(&db, svn_wc__db_openmode_default, NULL, FALSE, TRUE,
> + scratch_pool, scratch_pool));
> +
> + /* Go find all the children of the wcroot. */
> + SVN_ERR(svn_wc__db_read_children(&children, db, wcroot_abspath,
> + scratch_pool, scratch_pool));
> +
> + /* Set up some data structures */
> + iterpool = svn_pool_create(scratch_pool);
> + props_dirpath = svn_wc__adm_child(wcroot_abspath, PROPS_SUBDIR, scratch_pool);
> + props_base_dirpath = svn_wc__adm_child(wcroot_abspath, PROP_BASE_SUBDIR,
> + scratch_pool);
> +
> + /* Iterate over the children, as described above */
> + for (i = 0; i < children->nelts; i++)
> + {
> + const char *child_relpath = APR_ARRAY_IDX(children, i, const char *);
> + const char *child_abspath;
> + const char *prop_base_path, *prop_working_path, *prop_revert_path;
> + svn_boolean_t pristine_is_working;
> + svn_boolean_t replaced;
> + apr_hash_t *working_props;
> + svn_stream_t *stream;
> +
> + svn_pool_clear(iterpool);
> +
> + /* Several useful paths. */
> + child_abspath = svn_dirent_join(wcroot_abspath, child_relpath, iterpool);
> + prop_base_path = svn_dirent_join(props_base_dirpath,
> + apr_psprintf(iterpool, "%s" SVN_WC__BASE_EXT,
> + child_relpath),
> + iterpool);
> + prop_working_path = svn_dirent_join(props_dirpath,
> + apr_psprintf(iterpool, "%s" SVN_WC__WORK_EXT,
> + child_relpath),
> + iterpool);
> + prop_revert_path = svn_dirent_join(props_base_dirpath,
> + apr_psprintf(iterpool, "%s" SVN_WC__REVERT_EXT,
> + child_relpath),
> + iterpool);
> +
> + /* if node is replaced ... */
> + SVN_ERR(svn_wc__internal_is_replaced(&replaced, db, child_abspath,
> + iterpool));
> + if (replaced)
> + {
> + apr_hash_t *revert_props;
> +
> + SVN_ERR(svn_stream_open_readonly(&stream, prop_revert_path, iterpool,
> + iterpool));
> + SVN_ERR(svn_hash_read2(revert_props, stream, SVN_HASH_TERMINATOR,
> + iterpool));
> +
> + SVN_ERR(svn_wc__db_temp_op_set_pristine_props(db, child_abspath,
> + revert_props, FALSE,
> + iterpool));
> + }
> + else
> + {
> + apr_hash_t *base_props;
> +
> + SVN_ERR(svn_stream_open_readonly(&stream, prop_base_path, iterpool,
> + iterpool));
> + SVN_ERR(svn_hash_read2(base_props, stream, SVN_HASH_TERMINATOR,
> + iterpool));
> +
> + SVN_ERR(svn_wc__prop_pristine_is_working(&pristine_is_working, db,
> + child_abspath, iterpool));
> + SVN_ERR(svn_wc__db_temp_op_set_pristine_props(db, child_abspath,
> + base_props,
> + pristine_is_working,
> + iterpool));
> + }
> +
> + SVN_ERR(svn_stream_open_readonly(&stream, prop_working_path, iterpool,
> + iterpool));
> + SVN_ERR(svn_hash_read2(working_props, stream, SVN_HASH_TERMINATOR,
> + iterpool));
> +
> + SVN_ERR(svn_wc__db_op_set_props(db, child_abspath, working_props,
> + iterpool));
> + }
> +
> + /* Now delete the old directories. */
> + SVN_ERR(svn_io_remove_dir2(props_dirpath, TRUE, NULL, NULL, iterpool));
> + SVN_ERR(svn_io_remove_dir2(props_base_dirpath, TRUE, NULL, NULL,
> + iterpool));
> + SVN_ERR(svn_io_remove_dir2(svn_dirent_join_many(iterpool, wcroot_abspath,
> + ".svn", TEMP_DIR,
> + PROPS_SUBDIR, NULL),
> + TRUE, NULL, NULL, iterpool));
> + SVN_ERR(svn_io_remove_dir2(svn_dirent_join_many(iterpool, wcroot_abspath,
> + ".svn", TEMP_DIR,
> + PROP_BASE_SUBDIR, NULL),
> + TRUE, NULL, NULL, iterpool));
> +
> + SVN_ERR(svn_wc__db_close(db));
> + svn_pool_destroy(iterpool);
> +
> + return SVN_NO_ERROR;
> +}
> +
> +
> #if 0
> /* This implements svn_sqlite__transaction_callback_t */
> static svn_error_t *
> -bump_database_to_16(void *baton,
> +bump_database_to_17(void *baton,
> svn_sqlite__db_t *sdb,
> apr_pool_t *scratch_pool)
> {
> @@ -742,15 +879,15 @@ bump_database_to_16(void *baton,
> }
>
> static svn_error_t *
> -bump_to_16(const char *wcroot_abspath,
> +bump_to_17(const char *wcroot_abspath,
> svn_sqlite__db_t *sdb,
> apr_pool_t *scratch_pool)
> {
> /* ### migrate disk bits here. */
>
> /* Perform the database upgrade. The last thing this does is to bump
> - the recorded version to 15. */
> - SVN_ERR(svn_sqlite__with_transaction(sdb, bump_database_to_15, NULL, scratch_pool));
> + the recorded version to 17. */
> + SVN_ERR(svn_sqlite__with_transaction(sdb, bump_database_to_17, NULL, scratch_pool));
>
> return SVN_NO_ERROR;
> }
> @@ -790,8 +927,13 @@ svn_wc__upgrade_sdb(int *result_format,
> SVN_ERR(svn_sqlite__set_schema_version(sdb, 15, scratch_pool));
> ++start_format;
>
> -#if 0
> case 15:
> + SVN_ERR(migrate_props(wcroot_abspath, sdb, scratch_pool));
> + SVN_ERR(svn_sqlite__set_schema_version(sdb, 16, scratch_pool));
> + ++start_format;
> +
> +#if 0
> + case 16:
> SVN_ERR(bump_to_16(wcroot_abspath, sdb, scratch_pool));
> ++start_format;
> #endif
>
> ------------------------------------------------------
> http://subversion.tigris.org/ds/viewMessage.do?dsForumId=495&dsMessageId=2416883

------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=2416884
Received on 2009-11-12 07:10:17 CET

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.