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

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

From: Kouhei Sutou <kou_at_cozmixng.org>
Date: Sat, 9 May 2009 09:18:25 +0900

Hi,

This change requires that repos_root should not be NULL.
(svn_uri_is_child(repos_root, ...) causes SEGV.)

svn_wc_ensure_adm3()'s documents says
"@a uuid and @a repos may be @c NULL." If this change
is valid, svn_wc_ensure_adm3() with "repos is NULL" causes
SEGV.

Thanks,

--
kou
2009/3/25 Hyrum K. Wright <hyrum_at_hyrumwright.org>:
> Author: hwright
> Date: Tue Mar 24 14:09:14 2009
> New Revision: 36758
>
> Log:
> Move the directory initialization code into wc_db.
>
> * subversion/libsvn_wc/entries.c
>  (statements, statement_keys): Remove a statement.
>  (svn_wc__entries_init): Largely gut, calling the wc_db API instead.
>
> * subversion/libsvn_wc/wc_db.c
>  (statement_keys, statements): New statement.  Also, when inserting the
>    base_node, also insert the incomplete children flag.
>  (insert_base_baton): Add incomplete_children flag.
>  (insert_base_node): Insert the incomplete children flag.
>  (svn_wc__db_init): New.
>
> * subversion/libsvn_wc/wc_db.h
>  (svn_wc__db_init): New.
>
> Modified:
>   trunk/subversion/libsvn_wc/entries.c
>   trunk/subversion/libsvn_wc/wc_db.c
>   trunk/subversion/libsvn_wc/wc_db.h
>
> Modified: trunk/subversion/libsvn_wc/entries.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/entries.c?pathrev=36758&r1=36757&r2=36758
> ==============================================================================
> --- trunk/subversion/libsvn_wc/entries.c        Tue Mar 24 09:59:55 2009        (r36757)
> +++ trunk/subversion/libsvn_wc/entries.c        Tue Mar 24 14:09:14 2009        (r36758)
> @@ -59,7 +59,6 @@ static const char * const upgrade_sql[]
>    and removed at the same time. */
>  enum statement_keys {
>   STMT_INSERT_REPOSITORY,
> -  STMT_INSERT_WCROOT,
>   STMT_INSERT_BASE_NODE,
>   STMT_INSERT_WORKING_NODE,
>   STMT_INSERT_ACTUAL_NODE,
> @@ -81,9 +80,6 @@ static const char * const statements[] =
>   "insert into repository (root, uuid) "
>   "values (?1, ?2);",
>
> -  "insert into wcroot (local_abspath) "
> -  "values (?1);",
> -
>   "insert or replace into base_node "
>     "(wc_id, local_relpath, repos_id, repos_relpath, parent_relpath, "
>      "presence, "
> @@ -2935,77 +2931,31 @@ svn_error_t *
>  svn_wc__entries_init(const char *path,
>                      const char *uuid,
>                      const char *url,
> -                     const char *repos,
> +                     const char *repos_root,
>                      svn_revnum_t initial_rev,
>                      svn_depth_t depth,
>                      apr_pool_t *pool)
>  {
> -  svn_sqlite__db_t *wc_db;
> -  svn_wc__db_t *db;
> -  svn_sqlite__stmt_t *stmt;
>   apr_pool_t *scratch_pool = svn_pool_create(pool);
> -  const char *wc_db_path = db_path(path, scratch_pool);
> -  apr_int64_t wc_id;
> -  apr_int64_t repos_id;
> -  svn_wc_entry_t *entry = alloc_entry(scratch_pool);
> +  const char *abspath;
> +  const char *repos_relpath;
>
>   if (!should_create_next_gen())
> -    return svn_wc__entries_init_old(path, uuid, url, repos, initial_rev,
> +    return svn_wc__entries_init_old(path, uuid, url, repos_root, initial_rev,
>                                     depth, pool);
>
> -  SVN_ERR_ASSERT(! repos || svn_path_is_ancestor(repos, url));
> +  SVN_ERR_ASSERT(! repos_root || svn_path_is_ancestor(repos_root, url));
>   SVN_ERR_ASSERT(depth == svn_depth_empty
>                  || depth == svn_depth_files
>                  || depth == svn_depth_immediates
>                  || depth == svn_depth_infinity);
>
> -  /* ### chicken and egg problem: we don't have an adm_access baton to
> -     ### use to open the initial entries database, we we've got to do it
> -     ### manually. */
> -  SVN_ERR(svn_wc__db_open(&db, svn_wc__db_openmode_readwrite, path,
> -                          NULL, scratch_pool, scratch_pool));
> -
> -  /* Open the sqlite database, and insert the REPOS and WCROOT.
> -     ### this is redundant, but we currently need it for the entry
> -     ### inserting API.  DB and WC_DB should be pointing to the *same*
> -     ### sqlite database, and it works fine thanks for sqlite's
> -     ### concurrency handling.  However, this should eventually disappear. */
> -  SVN_ERR(svn_sqlite__open(&wc_db, wc_db_path, svn_sqlite__mode_rwcreate,
> -                           statements,
> -                           SVN_WC__VERSION_EXPERIMENTAL, upgrade_sql,
> -                           scratch_pool, scratch_pool));
> -
> -#ifdef SVN_DEBUG
> -  {
> -    SVN_ERR(svn_sqlite__exec(wc_db, WC_CHECKS_SQL));
> -  }
> -#endif
> -
> -  /* Insert the repository. */
> -  SVN_ERR(svn_sqlite__get_statement(&stmt, wc_db, STMT_INSERT_REPOSITORY));
> -  SVN_ERR(svn_sqlite__bindf(stmt, "ss", repos, uuid));
> -  SVN_ERR(svn_sqlite__insert(&repos_id, stmt));
> -
> -  /* Insert the wcroot. */
> -  /* ### Right now, this just assumes wc metadata is being stored locally. */
> -  SVN_ERR(svn_sqlite__get_statement(&stmt, wc_db, STMT_INSERT_WCROOT));
> -  SVN_ERR(svn_sqlite__insert(&wc_id, stmt));
> -
> -  /* Add an entry for the dir itself.  The directory has no name.  It
> -     might have a UUID, but otherwise only the revision and default
> -     ancestry are present, and possibly an 'incomplete' flag if the revnum
> -     is > 0. */
> -  entry->kind = svn_node_dir;
> -  entry->url = url;
> -  entry->revision = initial_rev;
> -  entry->uuid = uuid;
> -  entry->repos = repos;
> -  entry->depth = depth;
> -  if (initial_rev > 0)
> -    entry->incomplete = TRUE;
> -
> -  SVN_ERR(write_entry(db, wc_db, wc_id, repos_id, repos, entry,
> -                      SVN_WC_ENTRY_THIS_DIR, path, entry, scratch_pool));
> +  /* Initialize the db for this directory. */
> +  SVN_ERR(svn_dirent_get_absolute(&abspath, path, scratch_pool));
> +  repos_relpath = svn_uri_is_child(repos_root, url, scratch_pool);
> +  SVN_ERR(svn_wc__db_init(abspath, repos_relpath == NULL ? ""
> +                            : svn_path_uri_decode(repos_relpath, scratch_pool),
> +                          repos_root, uuid, initial_rev, depth, scratch_pool));
>
>   svn_pool_destroy(scratch_pool);
>   return SVN_NO_ERROR;
>
> Modified: trunk/subversion/libsvn_wc/wc_db.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/wc_db.c?pathrev=36758&r1=36757&r2=36758
> ==============================================================================
> --- trunk/subversion/libsvn_wc/wc_db.c  Tue Mar 24 09:59:55 2009        (r36757)
> +++ trunk/subversion/libsvn_wc/wc_db.c  Tue Mar 24 14:09:14 2009        (r36758)
> @@ -166,7 +166,8 @@ enum statement_keys {
>   STMT_UPDATE_ACTUAL_PROPS,
>   STMT_SELECT_ALL_PROPS,
>   STMT_SELECT_PRISTINE_PROPS,
> -  STMT_INSERT_LOCK
> +  STMT_INSERT_LOCK,
> +  STMT_INSERT_WCROOT
>  };
>
>  static const char * const statements[] = {
> @@ -209,9 +210,9 @@ static const char * const statements[] =
>   "insert or replace into base_node ("
>   "  wc_id, local_relpath, repos_id, repos_relpath, parent_relpath, presence, "
>   "  kind, revnum, properties, changed_rev, changed_date, changed_author, "
> -  "  depth, checksum, translated_size, symlink_target) "
> +  "  depth, checksum, translated_size, symlink_target, incomplete_children) "
>   "values (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, "
> -  "        ?15, ?16);",
> +  "        ?15, ?16, ?17);",
>
>   "insert or ignore into base_node ("
>   "  wc_id, local_relpath, parent_relpath, presence, kind, revnum) "
> @@ -258,6 +259,9 @@ static const char * const statements[] =
>     " lock_date)"
>   "values (?1, ?2, ?3, ?4, ?5, ?6);",
>
> +  "insert into wcroot (local_abspath) "
> +  "values (?1);",
> +
>   NULL
>  };
>
> @@ -289,6 +293,7 @@ typedef struct {
>   const char *target;
>
>   /* for inserting absent nodes */
> +  svn_boolean_t incomplete_children;
>
>   /* for temporary allocations */
>   apr_pool_t *scratch_pool;
> @@ -1102,6 +1107,8 @@ insert_base_node(void *baton, svn_sqlite
>         SVN_ERR(svn_sqlite__bind_text(stmt, 16, pibb->target));
>     }
>
> +  SVN_ERR(svn_sqlite__bind_int64(stmt, 17, pibb->incomplete_children));
> +
>   SVN_ERR(svn_sqlite__insert(NULL, stmt));
>
>   if (pibb->kind == svn_wc__db_kind_dir && pibb->children)
> @@ -1304,6 +1311,62 @@ svn_wc__db_close(svn_wc__db_t *db,
>
>
>  svn_error_t *
> +svn_wc__db_init(const char *local_abspath,
> +                const char *repos_relpath,
> +                const char *repos_root_url,
> +                const char *repos_uuid,
> +                svn_revnum_t initial_rev,
> +                svn_depth_t depth,
> +                apr_pool_t *scratch_pool)
> +{
> +  svn_sqlite__db_t *sdb;
> +  svn_sqlite__stmt_t *stmt;
> +  apr_int64_t repos_id;
> +  apr_int64_t wc_id;
> +  insert_base_baton_t ibb;
> +
> +  SVN_ERR(svn_sqlite__open(&sdb,
> +                           svn_wc__adm_child(local_abspath, "wc.db",
> +                                             scratch_pool),
> +                           svn_sqlite__mode_rwcreate, statements,
> +                           SVN_WC__VERSION_EXPERIMENTAL, upgrade_sql,
> +                           scratch_pool, scratch_pool));
> +
> +  /* Insert the repository. */
> +  SVN_ERR(create_repos_id(&repos_id, repos_root_url, repos_uuid, sdb,
> +                          scratch_pool));
> +
> +  /* Insert the wcroot. */
> +  /* ### Right now, this just assumes wc metadata is being stored locally. */
> +  SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_INSERT_WCROOT));
> +  SVN_ERR(svn_sqlite__insert(&wc_id, stmt));
> +
> +  ibb.status = svn_wc__db_status_normal;
> +  ibb.kind = svn_wc__db_kind_dir;
> +  ibb.wc_id = wc_id;
> +  ibb.local_relpath = "";
> +  ibb.repos_id = repos_id;
> +  ibb.repos_relpath = repos_relpath;
> +  ibb.revision = initial_rev;
> +
> +  ibb.props = NULL;
> +  ibb.changed_rev = SVN_INVALID_REVNUM;
> +  ibb.changed_date = 0;
> +  ibb.changed_author = NULL;
> +
> +  ibb.children = NULL;
> +  ibb.incomplete_children = TRUE;
> +  ibb.depth = depth;
> +
> +  ibb.scratch_pool = scratch_pool;
> +
> +  SVN_ERR(insert_base_node(&ibb, sdb));
> +
> +  return svn_sqlite__close(sdb);
> +}
> +
> +
> +svn_error_t *
>  svn_wc__db_base_add_directory(svn_wc__db_t *db,
>                               const char *local_abspath,
>                               const char *repos_relpath,
>
> Modified: trunk/subversion/libsvn_wc/wc_db.h
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/wc_db.h?pathrev=36758&r1=36757&r2=36758
> ==============================================================================
> --- trunk/subversion/libsvn_wc/wc_db.h  Tue Mar 24 09:59:55 2009        (r36757)
> +++ trunk/subversion/libsvn_wc/wc_db.h  Tue Mar 24 14:09:14 2009        (r36758)
> @@ -274,6 +274,21 @@ svn_error_t *
>  svn_wc__db_close(svn_wc__db_t *db,
>                  apr_pool_t *scratch_pool);
>
> +
> +/**
> + * Initialize the DB for LOCAL_ABSPATH, which should be a working copy path.
> + * Use SCRATCH_POOL for temporary allocations.
> + */
> +svn_error_t *
> +svn_wc__db_init(const char *local_abspath,
> +                const char *repos_relpath,
> +                const char *repos_root_url,
> +                const char *repos_uuid,
> +                svn_revnum_t initial_rev,
> +                svn_depth_t depth,
> +                apr_pool_t *scratch_pool);
> +
> +
>  /** @} */
>
>  /**
>
> ------------------------------------------------------
> http://subversion.tigris.org/ds/viewMessage.do?dsForumId=495&dsMessageId=1406091
>
------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=2126603
Received on 2009-05-09 02:18:50 CEST

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