You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2010/10/20 19:57:43 UTC
svn commit: r1025655 [3/6] - in /subversion/branches/object-model: ./
build/win32/ notes/http-and-webdav/ notes/wc-ng/
subversion/bindings/ctypes-python/csvn/ subversion/include/
subversion/libsvn_client/ subversion/libsvn_diff/ subversion/libsvn_fs_fs...
Modified: subversion/branches/object-model/subversion/libsvn_wc/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/object-model/subversion/libsvn_wc/status.c?rev=1025655&r1=1025654&r2=1025655&view=diff
==============================================================================
--- subversion/branches/object-model/subversion/libsvn_wc/status.c (original)
+++ subversion/branches/object-model/subversion/libsvn_wc/status.c Wed Oct 20 17:57:41 2010
@@ -233,6 +233,115 @@ struct file_baton
/** Code **/
+
+/* Fill in *INFO with the information it would contain if it were
+ obtained from svn_wc__db_read_children_info. */
+static svn_error_t *
+read_info(const struct svn_wc__db_info_t **info,
+ const char *local_abspath,
+ svn_wc__db_t *db,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ struct svn_wc__db_info_t *mutable
+ = apr_palloc(scratch_pool, sizeof(struct svn_wc__db_info_t));
+
+ SVN_ERR(svn_wc__db_read_info(&mutable->status, &mutable->kind,
+ &mutable->revnum, &mutable->repos_relpath,
+ &mutable->repos_root_url, NULL,
+ &mutable->changed_rev,
+ &mutable->changed_date,
+ &mutable->changed_author,
+ &mutable->last_mod_time,
+ &mutable->depth, NULL,
+ &mutable->translated_size, NULL,
+ &mutable->changelist, NULL, NULL, NULL, NULL,
+ &mutable->props_mod,
+ &mutable->have_base, NULL,
+ &mutable->conflicted, &mutable->lock,
+ db, local_abspath,
+ result_pool, scratch_pool));
+
+ if (mutable->status == svn_wc__db_status_deleted)
+ mutable->has_props = FALSE;
+ else if (mutable->props_mod)
+ {
+ mutable->has_props = TRUE;
+#ifdef HAVE_SYMLINK
+ SVN_ERR(svn_wc__get_translate_info(NULL, NULL, NULL, &mutable->special,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
+#endif
+ }
+ else
+ {
+ apr_hash_t *properties;
+
+ SVN_ERR(svn_wc__db_read_pristine_props(&properties, db, local_abspath,
+ scratch_pool, scratch_pool));
+ mutable->has_props = (properties && !!apr_hash_count(properties));
+#ifdef HAVE_SYMLINK
+ mutable->special = (mutable->has_props
+ && apr_hash_get(properties, SVN_PROP_SPECIAL,
+ APR_HASH_KEY_STRING));
+#endif
+ }
+
+ *info = mutable;
+
+ return SVN_NO_ERROR;
+}
+
+/* Return *REPOS_RELPATH and *REPOS_ROOT_URL for LOCAL_ABSPATH using
+ information in INFO if available, falling back on
+ PARENT_REPOS_RELPATH and PARENT_REPOS_ROOT_URL if available, and
+ finally falling back on querying DB. */
+static svn_error_t *
+get_repos_root_url_relpath(const char **repos_relpath,
+ const char **repos_root_url,
+ const struct svn_wc__db_info_t *info,
+ const char *parent_repos_relpath,
+ const char *parent_repos_root_url,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (info->repos_relpath && info->repos_root_url)
+ {
+ *repos_relpath = info->repos_relpath;
+ *repos_root_url = info->repos_root_url;
+ }
+ else if (parent_repos_relpath && parent_repos_root_url)
+ {
+ *repos_relpath = svn_relpath_join(parent_repos_relpath,
+ svn_dirent_basename(local_abspath,
+ NULL),
+ scratch_pool);
+ *repos_root_url = parent_repos_root_url;
+ }
+ else if (info->status == svn_wc__db_status_added)
+ {
+ SVN_ERR(svn_wc__db_scan_addition(NULL, NULL,
+ repos_relpath, repos_root_url,
+ NULL, NULL, NULL, NULL, NULL,
+ db, local_abspath,
+ result_pool, scratch_pool));
+ }
+ else if (info->have_base)
+ {
+ SVN_ERR(svn_wc__db_scan_base_repos(repos_relpath, repos_root_url, NULL,
+ db, local_abspath,
+ result_pool, scratch_pool));
+ }
+ else
+ {
+ *repos_relpath = NULL;
+ *repos_root_url = NULL;
+ }
+ return SVN_NO_ERROR;
+}
+
static svn_error_t *
internal_status(svn_wc_status3_t **status,
svn_wc__db_t *db,
@@ -262,6 +371,7 @@ assemble_status(svn_wc_status3_t **statu
const char *local_abspath,
const char *parent_repos_root_url,
const char *parent_repos_relpath,
+ const struct svn_wc__db_info_t *info,
const svn_io_dirent2_t *dirent,
svn_boolean_t get_all,
const svn_lock_t *repos_lock,
@@ -269,76 +379,32 @@ assemble_status(svn_wc_status3_t **statu
apr_pool_t *scratch_pool)
{
svn_wc_status3_t *stat;
- svn_wc__db_status_t db_status;
- svn_wc__db_kind_t db_kind;
- const char *repos_relpath;
- const char *repos_root_url;
svn_boolean_t switched_p = FALSE;
- svn_boolean_t prop_modified_p;
- svn_wc__db_lock_t *lock;
- svn_revnum_t revision;
- svn_revnum_t changed_rev;
- const char *changed_author;
- apr_time_t changed_date;
- const char *changelist;
- svn_boolean_t have_base;
- svn_boolean_t conflicted;
svn_boolean_t copied = FALSE;
- svn_filesize_t translated_size;
- apr_time_t last_mod_time;
- svn_depth_t depth;
+ svn_boolean_t conflicted;
svn_error_t *err;
+ const char *repos_relpath;
+ const char *repos_root_url;
/* Defaults for two main variables. */
enum svn_wc_status_kind node_status = svn_wc_status_normal;
enum svn_wc_status_kind text_status = svn_wc_status_normal;
enum svn_wc_status_kind prop_status = svn_wc_status_none;
- SVN_ERR(svn_wc__db_read_info(&db_status, &db_kind, &revision,
- &repos_relpath, &repos_root_url, NULL,
- &changed_rev, &changed_date,
- &changed_author, &last_mod_time, &depth, NULL,
- &translated_size, NULL, &changelist, NULL, NULL,
- NULL, NULL, &prop_modified_p, &have_base, NULL,
- &conflicted, &lock, db, local_abspath,
- result_pool, scratch_pool));
- if (!repos_relpath)
- {
- /* The node is not switched, so imply from parent if possible */
-
- if (parent_repos_relpath != NULL)
- repos_relpath = svn_relpath_join(parent_repos_relpath,
- svn_dirent_basename(local_abspath,
- NULL),
- result_pool);
- else if (db_status == svn_wc__db_status_added)
- SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, &repos_relpath,
- &repos_root_url, NULL, NULL, NULL,
- NULL, NULL,
- db, local_abspath,
- result_pool, scratch_pool));
- else if (have_base)
- SVN_ERR(svn_wc__db_scan_base_repos(&repos_relpath,
- &repos_root_url, NULL,
- db, local_abspath,
- result_pool, scratch_pool));
+ if (!info)
+ SVN_ERR(read_info(&info, local_abspath, db, result_pool, scratch_pool));
- switched_p = FALSE;
- }
- else if (!parent_repos_relpath)
+ if (!info->repos_relpath || !parent_repos_relpath)
switched_p = FALSE;
else
{
/* A node is switched if it doesn't have the implied repos_relpath */
-
- const char *name = svn_relpath_is_child(parent_repos_relpath, repos_relpath, NULL);
+ const char *name = svn_relpath_is_child(parent_repos_relpath,
+ info->repos_relpath, NULL);
switched_p = !name || (strcmp(name, svn_dirent_basename(local_abspath, NULL)) != 0);
}
- if (!repos_root_url && parent_repos_root_url)
- repos_root_url = apr_pstrdup(result_pool, parent_repos_root_url);
-
/* Examine whether our target is missing or obstructed or missing.
While we are not completely in single-db mode yet, data about
@@ -347,14 +413,14 @@ assemble_status(svn_wc_status3_t **statu
mode these obstructions are no longer reported and we have
to detect obstructions by looking at the on disk status in DIRENT.
*/
- if (db_kind == svn_wc__db_kind_dir)
+ if (info->kind == svn_wc__db_kind_dir)
{
- if (db_status == svn_wc__db_status_incomplete)
+ if (info->status == svn_wc__db_status_incomplete)
{
/* Highest precedence. */
node_status = svn_wc_status_incomplete;
}
- else if (db_status == svn_wc__db_status_deleted)
+ else if (info->status == svn_wc__db_status_deleted)
{
node_status = svn_wc_status_deleted;
@@ -374,7 +440,7 @@ assemble_status(svn_wc_status3_t **statu
}
else
{
- if (db_status == svn_wc__db_status_deleted)
+ if (info->status == svn_wc__db_status_deleted)
{
node_status = svn_wc_status_deleted;
@@ -400,13 +466,11 @@ assemble_status(svn_wc_status3_t **statu
It means that no further information is available, and we should skip
all this work. */
if (node_status == svn_wc_status_normal
- || (node_status == svn_wc_status_missing && db_kind != svn_wc__db_kind_dir))
+ || (node_status == svn_wc_status_missing
+ && info->kind != svn_wc__db_kind_dir))
{
svn_boolean_t has_props;
svn_boolean_t text_modified_p = FALSE;
-#ifdef HAVE_SYMLINK
- svn_boolean_t wc_special;
-#endif /* HAVE_SYMLINK */
/* Implement predecence rules: */
@@ -415,43 +479,30 @@ assemble_status(svn_wc_status3_t **statu
precedence over M. */
/* Does the node have props? */
- if (db_status == svn_wc__db_status_deleted)
+ if (info->status == svn_wc__db_status_deleted)
has_props = FALSE; /* Not interesting */
- else if (prop_modified_p)
+ else if (info->props_mod)
has_props = TRUE;
else
- {
- apr_hash_t *props;
-
- SVN_ERR(svn_wc__db_read_pristine_props(&props, db, local_abspath,
- scratch_pool, scratch_pool));
+ has_props = info->has_props;
- has_props = (props != NULL && apr_hash_count(props) > 0);
- }
if (has_props)
prop_status = svn_wc_status_normal;
/* If the entry has a properties, see if it has local changes. */
if (has_props)
- prop_status = prop_modified_p ? svn_wc_status_modified
+ prop_status = info->props_mod ? svn_wc_status_modified
: svn_wc_status_normal;
-#ifdef HAVE_SYMLINK
- if (has_props)
- SVN_ERR(svn_wc__get_translate_info(NULL, NULL, NULL,
- &wc_special,
- db, local_abspath,
- scratch_pool, scratch_pool));
- else
- wc_special = FALSE;
-#endif /* HAVE_SYMLINK */
+ /* ### Don't read properties twice! Cache wc_special in
+ svn_wc__db_read_children_info. */
/* If the entry is a file, check for textual modifications */
if (node_status != svn_wc_status_missing
- && (db_kind == svn_wc__db_kind_file
- || db_kind == svn_wc__db_kind_symlink)
+ && (info->kind == svn_wc__db_kind_file
+ || info->kind == svn_wc__db_kind_symlink)
#ifdef HAVE_SYMLINK
- && (wc_special == (dirent && dirent->special))
+ && (info->special == (dirent && dirent->special))
#endif /* HAVE_SYMLINK */
)
{
@@ -463,8 +514,8 @@ assemble_status(svn_wc_status3_t **statu
if (dirent
&& dirent->filesize != SVN_INVALID_FILESIZE
&& dirent->mtime != 0
- && translated_size == dirent->filesize
- && last_mod_time == dirent->mtime)
+ && info->translated_size == dirent->filesize
+ && info->last_mod_time == dirent->mtime)
text_modified_p = FALSE;
else
{
@@ -488,14 +539,16 @@ assemble_status(svn_wc_status3_t **statu
}
}
#ifdef HAVE_SYMLINK
- else if (wc_special != (dirent && dirent->special))
+ else if (info->special != (dirent && dirent->special))
node_status = svn_wc_status_obstructed;
#endif /* HAVE_SYMLINK */
+
if (text_modified_p)
text_status = svn_wc_status_modified;
}
+ conflicted = info->conflicted;
if (conflicted)
{
svn_boolean_t text_conflicted, prop_conflicted, tree_conflicted;
@@ -517,7 +570,7 @@ assemble_status(svn_wc_status3_t **statu
of medium precedence. They also override any C or M that may
be in the prop_status field at this point, although they do not
override a C text status.*/
- if (db_status == svn_wc__db_status_added)
+ if (info->status == svn_wc__db_status_added)
{
svn_wc_schedule_t schedule;
SVN_ERR(svn_wc__internal_node_get_schedule(&schedule, &copied,
@@ -546,21 +599,26 @@ assemble_status(svn_wc_status3_t **statu
|| (node_status == svn_wc_status_normal))
&& (! switched_p)
- && (! lock)
+ && (! info->lock)
&& (! repos_lock)
- && (! changelist)
+ && (! info->changelist)
&& (! conflicted))
{
*status = NULL;
return SVN_NO_ERROR;
}
+ SVN_ERR(get_repos_root_url_relpath(&repos_relpath, &repos_root_url, info,
+ parent_repos_relpath,
+ parent_repos_root_url,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
/* 6. Build and return a status structure. */
stat = apr_pcalloc(result_pool, sizeof(**status));
- switch (db_kind)
+ switch (info->kind)
{
case svn_wc__db_kind_dir:
stat->kind = svn_node_dir;
@@ -573,7 +631,7 @@ assemble_status(svn_wc_status3_t **statu
default:
stat->kind = svn_node_unknown;
}
- stat->depth = depth;
+ stat->depth = info->depth;
stat->node_status = node_status;
stat->text_status = text_status;
stat->prop_status = prop_status;
@@ -583,24 +641,24 @@ assemble_status(svn_wc_status3_t **statu
stat->switched = switched_p;
stat->copied = copied;
stat->repos_lock = repos_lock;
- stat->revision = revision;
- stat->changed_rev = changed_rev;
- stat->changed_author = changed_author;
- stat->changed_date = changed_date;
+ stat->revision = info->revnum;
+ stat->changed_rev = info->changed_rev;
+ stat->changed_author = info->changed_author;
+ stat->changed_date = info->changed_date;
stat->ood_kind = svn_node_none;
stat->ood_changed_rev = SVN_INVALID_REVNUM;
stat->ood_changed_date = 0;
stat->ood_changed_author = NULL;
- if (lock)
+ if (info->lock)
{
svn_lock_t *lck = apr_pcalloc(result_pool, sizeof(*lck));
lck->path = repos_relpath;
- lck->token = lock->token;
- lck->owner = lock->owner;
- lck->comment = lock->comment;
- lck->creation_date = lock->date;
+ lck->token = info->lock->token;
+ lck->owner = info->lock->owner;
+ lck->comment = info->lock->comment;
+ lck->creation_date = info->lock->date;
stat->lock = lck;
}
else
@@ -608,7 +666,7 @@ assemble_status(svn_wc_status3_t **statu
stat->conflicted = conflicted;
stat->versioned = TRUE;
- stat->changelist = changelist;
+ stat->changelist = info->changelist;
stat->repos_root_url = repos_root_url;
stat->repos_relpath = repos_relpath;
@@ -699,6 +757,7 @@ send_status_structure(const struct walk_
const char *local_abspath,
const char *parent_repos_root_url,
const char *parent_repos_relpath,
+ const struct svn_wc__db_info_t *info,
const svn_io_dirent2_t *dirent,
svn_boolean_t get_all,
svn_wc_status_func4_t status_func,
@@ -711,30 +770,13 @@ send_status_structure(const struct walk_
/* Check for a repository lock. */
if (wb->repos_locks)
{
- const char *repos_relpath;
- svn_wc__db_status_t status;
- svn_boolean_t have_base;
-
- SVN_ERR(svn_wc__db_read_info(&status, NULL, NULL, &repos_relpath, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, &have_base, NULL, NULL, NULL,
- wb->db, local_abspath,
- scratch_pool, scratch_pool));
-
- /* A switched path can be deleted: check the right relpath */
- if (status == svn_wc__db_status_deleted && have_base)
- SVN_ERR(svn_wc__db_scan_base_repos(&repos_relpath, NULL,
- NULL, wb->db, local_abspath,
- scratch_pool, scratch_pool));
-
- if (!repos_relpath && parent_repos_relpath)
- repos_relpath = svn_relpath_join(parent_repos_relpath,
- svn_dirent_basename(local_abspath,
- NULL),
- scratch_pool);
-
+ const char *repos_relpath, *repos_root_url;
+ SVN_ERR(get_repos_root_url_relpath(&repos_relpath, &repos_root_url,
+ info, parent_repos_relpath,
+ parent_repos_root_url,
+ wb->db, local_abspath,
+ scratch_pool, scratch_pool));
if (repos_relpath)
{
/* repos_lock still uses the deprecated filesystem absolute path
@@ -748,7 +790,7 @@ send_status_structure(const struct walk_
SVN_ERR(assemble_status(&statstruct, wb->db, local_abspath,
parent_repos_root_url, parent_repos_relpath,
- dirent, get_all,
+ info, dirent, get_all,
repos_lock, scratch_pool, scratch_pool));
if (statstruct && status_func)
@@ -910,6 +952,7 @@ get_dir_status(const struct walk_status_
svn_boolean_t skip_this_dir,
const char *parent_repos_root_url,
const char *parent_repos_relpath,
+ const struct svn_wc__db_info_t *dir_info,
const svn_io_dirent2_t *dirent,
const apr_array_header_t *ignores,
svn_depth_t depth,
@@ -931,6 +974,7 @@ handle_dir_entry(const struct walk_statu
svn_wc__db_kind_t db_kind,
const char *dir_repos_root_url,
const char *dir_repos_relpath,
+ const struct svn_wc__db_info_t *entry_info,
svn_io_dirent2_t *dirent,
const apr_array_header_t *ignores,
svn_depth_t depth,
@@ -963,6 +1007,7 @@ handle_dir_entry(const struct walk_statu
{
SVN_ERR(get_dir_status(wb, local_abspath, NULL, FALSE,
dir_repos_root_url, dir_repos_relpath,
+ entry_info,
dirent, ignores, depth, get_all, no_ignore,
status_func, status_baton, cancel_func,
cancel_baton,
@@ -975,7 +1020,7 @@ handle_dir_entry(const struct walk_statu
SVN_ERR(send_status_structure(wb, local_abspath,
dir_repos_root_url,
dir_repos_relpath,
- dirent, get_all,
+ entry_info, dirent, get_all,
status_func, status_baton, pool));
}
}
@@ -985,7 +1030,7 @@ handle_dir_entry(const struct walk_statu
SVN_ERR(send_status_structure(wb, local_abspath,
dir_repos_root_url,
dir_repos_relpath,
- dirent, get_all,
+ entry_info, dirent, get_all,
status_func, status_baton, pool));
}
@@ -1067,6 +1112,7 @@ get_dir_status(const struct walk_status_
svn_boolean_t skip_this_dir,
const char *parent_repos_root_url,
const char *parent_repos_relpath,
+ const struct svn_wc__db_info_t *dir_info,
const svn_io_dirent2_t *dirent,
const apr_array_header_t *ignore_patterns,
svn_depth_t depth,
@@ -1083,29 +1129,20 @@ get_dir_status(const struct walk_status_
const char *dir_repos_relpath;
apr_hash_t *dirents, *nodes, *conflicts, *all_children;
apr_array_header_t *patterns = NULL;
- svn_wc__db_status_t dir_status;
- svn_depth_t dir_depth;
apr_pool_t *iterpool, *subpool = svn_pool_create(scratch_pool);
svn_error_t *err;
- /* See if someone wants to cancel this operation. */
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
if (depth == svn_depth_unknown)
depth = svn_depth_infinity;
- /* Make our iteration pool. */
iterpool = svn_pool_create(subpool);
- /* Load list of childnodes. */
- {
- const apr_array_header_t *child_nodes;
-
- SVN_ERR(svn_wc__db_read_children(&child_nodes, wb->db, local_abspath,
- iterpool, iterpool));
- SVN_ERR(svn_hash_from_cstring_keys(&nodes, child_nodes, subpool));
- }
+ SVN_ERR(svn_wc__db_read_children_info(&nodes, &conflicts,
+ wb->db, local_abspath,
+ subpool, iterpool));
err = svn_io_get_dirents3(&dirents, local_abspath, FALSE, subpool, subpool);
if (err
@@ -1118,77 +1155,36 @@ get_dir_status(const struct walk_status_
else
SVN_ERR(err);
- SVN_ERR(svn_wc__db_read_info(&dir_status, NULL, NULL, &dir_repos_relpath,
- &dir_repos_root_url, NULL, NULL, NULL, NULL,
- NULL, &dir_depth, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, wb->db, local_abspath, scratch_pool,
- scratch_pool));
-
- if (dir_repos_relpath == NULL)
- {
- if (parent_repos_root_url != NULL)
- {
- dir_repos_root_url = parent_repos_root_url;
- dir_repos_relpath = svn_relpath_join(
- parent_repos_relpath,
- svn_dirent_basename(local_abspath, NULL),
- scratch_pool);
- }
- else if (dir_status != svn_wc__db_status_deleted
- && dir_status != svn_wc__db_status_added)
- SVN_ERR(svn_wc__db_scan_base_repos(&dir_repos_relpath,
- &dir_repos_root_url,
- NULL, wb->db, local_abspath,
- scratch_pool, scratch_pool));
- else
- {
- dir_repos_relpath = NULL;
- dir_repos_root_url = NULL;
- }
- }
-
+ if (!dir_info)
+ SVN_ERR(read_info(&dir_info, local_abspath, wb->db,
+ scratch_pool, scratch_pool));
+
+ SVN_ERR(get_repos_root_url_relpath(&dir_repos_relpath, &dir_repos_root_url,
+ dir_info, parent_repos_relpath,
+ parent_repos_root_url,
+ wb->db, local_abspath,
+ scratch_pool, scratch_pool));
if (selected == NULL)
{
- const apr_array_header_t *victims;
- /* Create a hash containing all children */
+ /* Create a hash containing all children. The source hashes
+ don't all map the same types, but only the keys of the result
+ hash are subsequently used. */
all_children = apr_hash_overlay(subpool, nodes, dirents);
-
- SVN_ERR(svn_wc__db_read_conflict_victims(&victims,
- wb->db, local_abspath,
- iterpool, iterpool));
-
- SVN_ERR(svn_hash_from_cstring_keys(&conflicts, victims, subpool));
-
- /* Optimize for the no-tree-conflict case */
if (apr_hash_count(conflicts) > 0)
all_children = apr_hash_overlay(subpool, conflicts, all_children);
}
else
{
- const svn_wc_conflict_description2_t *tc;
- const char *selected_abspath;
-
- conflicts = apr_hash_make(subpool);
+ /* Create a hash containing just selected */
all_children = apr_hash_make(subpool);
-
apr_hash_set(all_children, selected, APR_HASH_KEY_STRING, selected);
-
- selected_abspath = svn_dirent_join(local_abspath, selected, iterpool);
-
- SVN_ERR(svn_wc__db_op_read_tree_conflict(&tc, wb->db, selected_abspath,
- iterpool, iterpool));
-
- /* Note this path if a tree conflict is present. */
- if (tc != NULL)
- apr_hash_set(conflicts, selected, APR_HASH_KEY_STRING, "");
}
/* If "this dir" has "svn:externals" property set on it, send the name and
value to wc->external_func along with this directory's depth. (Also,
we want to track the externals internally so we can report status more
accurately.) */
- SVN_ERR(handle_externals(wb, local_abspath, dir_depth, iterpool));
+ SVN_ERR(handle_externals(wb, local_abspath, dir_info->depth, iterpool));
if (!selected)
{
@@ -1197,7 +1193,7 @@ get_dir_status(const struct walk_status_
SVN_ERR(send_status_structure(wb, local_abspath,
parent_repos_root_url,
parent_repos_relpath,
- dirent, get_all,
+ dir_info, dirent, get_all,
status_func, status_baton,
iterpool));
@@ -1215,6 +1211,7 @@ get_dir_status(const struct walk_status_
apr_ssize_t klen;
const char *node_abspath;
svn_io_dirent2_t *dirent_p;
+ const struct svn_wc__db_info_t *info;
svn_pool_clear(iterpool);
@@ -1224,32 +1221,24 @@ get_dir_status(const struct walk_status_
dirent_p = apr_hash_get(dirents, key, klen);
- if (apr_hash_get(nodes, key, klen))
+ info = apr_hash_get(nodes, key, klen);
+ if (info)
{
- /* Versioned node */
- svn_wc__db_status_t node_status;
- svn_wc__db_kind_t node_kind;
-
- SVN_ERR(svn_wc__db_read_info(&node_status, &node_kind, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- wb->db, node_abspath, iterpool, iterpool));
-
- if (node_status != svn_wc__db_status_not_present
- && node_status != svn_wc__db_status_excluded
- && node_status != svn_wc__db_status_absent)
+ if (info->status != svn_wc__db_status_not_present
+ && info->status != svn_wc__db_status_excluded
+ && info->status != svn_wc__db_status_absent)
{
- if (depth == svn_depth_files && node_kind == svn_wc__db_kind_dir)
+ if (depth == svn_depth_files && info->kind == svn_wc__db_kind_dir)
continue;
/* Handle this entry (possibly recursing). */
SVN_ERR(handle_dir_entry(wb,
node_abspath,
- node_status,
- node_kind,
+ info->status,
+ info->kind,
dir_repos_root_url,
dir_repos_relpath,
+ info,
dirent_p,
ignore_patterns,
depth == svn_depth_infinity
@@ -1592,6 +1581,7 @@ make_dir_baton(void **dir_baton,
SVN_ERR(get_dir_status(&eb->wb, local_abspath, NULL, TRUE,
status_in_parent->repos_root_url,
status_in_parent->repos_relpath,
+ NULL,
NULL /* dirent */, ignores,
d->depth == svn_depth_files
? svn_depth_files
@@ -1765,6 +1755,7 @@ handle_statii(struct edit_baton *eb,
SVN_ERR(get_dir_status(&eb->wb,
local_abspath, NULL, TRUE,
dir_repos_root_url, dir_repos_relpath,
+ NULL,
NULL /* dirent */,
ignores, depth, eb->get_all, eb->no_ignore,
status_func, status_baton,
@@ -2033,7 +2024,7 @@ close_directory(void *dir_baton,
{
SVN_ERR(get_dir_status(&eb->wb,
eb->target_abspath, NULL, TRUE,
- NULL, NULL, NULL /* dirent */,
+ NULL, NULL, NULL, NULL /* dirent */,
eb->ignores,
eb->default_depth,
eb->get_all, eb->no_ignore,
@@ -2415,7 +2406,7 @@ svn_wc_walk_status(svn_wc_context_t *wc_
anchor_abspath,
target_name,
skip_root,
- NULL, NULL, /* parent info */
+ NULL, NULL, NULL, /* parent info */
dirent,
ignore_patterns,
depth,
@@ -2553,6 +2544,7 @@ internal_status(svn_wc_status3_t **statu
return svn_error_return(assemble_status(status, db, local_abspath,
parent_repos_root_url,
parent_repos_relpath,
+ NULL,
dirent,
TRUE /* get_all */,
NULL /* repos_lock */,
Modified: subversion/branches/object-model/subversion/libsvn_wc/translate.c
URL: http://svn.apache.org/viewvc/subversion/branches/object-model/subversion/libsvn_wc/translate.c?rev=1025655&r1=1025654&r2=1025655&view=diff
==============================================================================
--- subversion/branches/object-model/subversion/libsvn_wc/translate.c (original)
+++ subversion/branches/object-model/subversion/libsvn_wc/translate.c Wed Oct 20 17:57:41 2010
@@ -376,6 +376,7 @@ svn_wc__maybe_set_read_only(svn_boolean_
apr_pool_t *scratch_pool)
{
const svn_string_t *needs_lock;
+ svn_wc__db_status_t status;
svn_wc__db_lock_t *lock;
svn_error_t *err;
@@ -384,7 +385,7 @@ svn_wc__maybe_set_read_only(svn_boolean_
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
- err = svn_wc__db_read_info(NULL, NULL, NULL, NULL, NULL, NULL,
+ err = svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
@@ -399,6 +400,11 @@ svn_wc__maybe_set_read_only(svn_boolean_
else if (err)
return svn_error_return(err);
else if (lock)
+ /* ### Is this "we have the lock?" */
+ return SVN_NO_ERROR;
+
+ /* Files that aren't in the repository yet should be left writable. */
+ if (status == svn_wc__db_status_added)
return SVN_NO_ERROR;
SVN_ERR(svn_wc__internal_propget(&needs_lock, db, local_abspath,
Modified: subversion/branches/object-model/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/object-model/subversion/libsvn_wc/update_editor.c?rev=1025655&r1=1025654&r2=1025655&view=diff
==============================================================================
--- subversion/branches/object-model/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/branches/object-model/subversion/libsvn_wc/update_editor.c Wed Oct 20 17:57:41 2010
@@ -2925,22 +2925,10 @@ close_directory(void *dir_baton,
item to write out an old-style props file. */
if (new_base_props != NULL)
{
- apr_array_header_t *prop_diffs;
-
SVN_ERR_ASSERT(new_actual_props != NULL);
- /* If the ACTUAL props are the same as the BASE props, then we
- should "write" a NULL. This will remove the props from the
- ACTUAL_NODE row, and remove the old-style props file, indicating
- "no change". */
- props = new_actual_props;
- SVN_ERR(svn_prop_diffs(&prop_diffs, new_actual_props, new_base_props,
- pool));
- if (prop_diffs->nelts == 0)
- props = NULL;
-
SVN_ERR(svn_wc__db_op_set_props(eb->db, db->local_abspath,
- props,
+ new_actual_props,
NULL /* conflict */,
NULL /* work_items */,
pool));
@@ -4389,32 +4377,31 @@ close_file(void *file_baton,
/* We will ALWAYS have properties to save (after a not-dry-run merge). */
SVN_ERR_ASSERT(new_base_props != NULL && new_actual_props != NULL);
- /* Merge the text. This will queue some additional work. */
- SVN_ERR(merge_file(&all_work_items, &install_pristine, &install_from,
- &content_state, fb, new_text_base_sha1_checksum,
- pool, scratch_pool));
+ /* Merge the text. This will queue some additional work. */
+ SVN_ERR(merge_file(&all_work_items, &install_pristine, &install_from,
+ &content_state, fb, new_text_base_sha1_checksum,
+ pool, scratch_pool));
- if (install_pristine)
- {
- svn_boolean_t record_fileinfo;
+ if (install_pristine)
+ {
+ svn_boolean_t record_fileinfo;
- /* If we are installing from the pristine contents, then go ahead and
- record the fileinfo. That will be the "proper" values. Installing
- from some random file means the fileinfo does NOT correspond to
- the pristine (in which case, the fileinfo will be cleared for
- safety's sake). */
- record_fileinfo = install_from == NULL;
-
- SVN_ERR(svn_wc__wq_build_file_install(&work_item,
- eb->db,
- fb->local_abspath,
- install_from,
- eb->use_commit_times,
- record_fileinfo,
- pool, pool));
- all_work_items = svn_wc__wq_merge(all_work_items, work_item, pool);
- }
+ /* If we are installing from the pristine contents, then go ahead and
+ record the fileinfo. That will be the "proper" values. Installing
+ from some random file means the fileinfo does NOT correspond to
+ the pristine (in which case, the fileinfo will be cleared for
+ safety's sake). */
+ record_fileinfo = install_from == NULL;
+ SVN_ERR(svn_wc__wq_build_file_install(&work_item,
+ eb->db,
+ fb->local_abspath,
+ install_from,
+ eb->use_commit_times,
+ record_fileinfo,
+ pool, pool));
+ all_work_items = svn_wc__wq_merge(all_work_items, work_item, pool);
+ }
}
else
{
@@ -4587,23 +4574,10 @@ close_file(void *file_baton,
properties merge. */
if (! fb->adding_base_under_local_add)
{
- apr_hash_t *props;
- apr_array_header_t *prop_diffs;
-
SVN_ERR_ASSERT(new_actual_props != NULL);
- /* If the ACTUAL props are the same as the BASE props, then we
- should "write" a NULL. This will remove the props from the
- ACTUAL_NODE row, and remove the old-style props file, indicating
- "no change". */
- props = new_actual_props;
- SVN_ERR(svn_prop_diffs(&prop_diffs, new_actual_props, new_base_props,
- pool));
- if (prop_diffs->nelts == 0)
- props = NULL;
-
SVN_ERR(svn_wc__db_op_set_props(eb->db, fb->local_abspath,
- props,
+ new_actual_props,
NULL /* conflict */,
NULL /* work_item */,
pool));
@@ -5592,7 +5566,6 @@ svn_wc_add_repos_file4(svn_wc_context_t
const char *original_root_url;
const char *original_repos_relpath;
const char *original_uuid;
- apr_hash_t *actual_props;
svn_revnum_t changed_rev;
apr_time_t changed_date;
const char *changed_author;
@@ -5714,25 +5687,6 @@ svn_wc_add_repos_file4(svn_wc_context_t
entry_props, pool, pool));
}
- /* Add some work items to install the properties. */
- {
- if (new_props == NULL)
- {
- actual_props = NULL;
- }
- else
- {
- apr_array_header_t *prop_diffs;
-
- SVN_ERR(svn_prop_diffs(&prop_diffs, new_props, new_base_props,
- pool));
- if (prop_diffs->nelts == 0)
- actual_props = NULL;
- else
- actual_props = new_props;
- }
- }
-
/* Copy NEW_BASE_CONTENTS into a temporary file so our log can refer to
it, and set TMP_TEXT_BASE_ABSPATH to its path. Compute its
NEW_TEXT_BASE_MD5_CHECKSUM and NEW_TEXT_BASE_SHA1_CHECKSUM as we copy. */
@@ -5857,7 +5811,7 @@ svn_wc_add_repos_file4(svn_wc_context_t
/* ### if below fails, then the above db change would remain :-( */
SVN_ERR(svn_wc__db_op_set_props(db, local_abspath,
- actual_props,
+ new_props,
NULL /* conflict */,
all_work_items,
pool));
Modified: subversion/branches/object-model/subversion/libsvn_wc/upgrade.c
URL: http://svn.apache.org/viewvc/subversion/branches/object-model/subversion/libsvn_wc/upgrade.c?rev=1025655&r1=1025654&r2=1025655&view=diff
==============================================================================
--- subversion/branches/object-model/subversion/libsvn_wc/upgrade.c (original)
+++ subversion/branches/object-model/subversion/libsvn_wc/upgrade.c Wed Oct 20 17:57:41 2010
@@ -1707,6 +1707,7 @@ svn_wc_upgrade(svn_wc_context_t *wc_ctx,
scratch_pool);
pristine_to = svn_wc__adm_child(local_abspath, PRISTINE_STORAGE_RELPATH,
scratch_pool);
+ SVN_ERR(svn_wc__ensure_directory(pristine_from, scratch_pool));
SVN_ERR(svn_wc__wq_build_file_move(&work_item, db,
pristine_from, pristine_to,
scratch_pool, scratch_pool));
Modified: subversion/branches/object-model/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/branches/object-model/subversion/libsvn_wc/wc-queries.sql?rev=1025655&r1=1025654&r2=1025655&view=diff
==============================================================================
--- subversion/branches/object-model/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/branches/object-model/subversion/libsvn_wc/wc-queries.sql Wed Oct 20 17:57:41 2010
@@ -78,6 +78,26 @@ conflict_working, tree_conflict_data, pr
FROM actual_node
WHERE wc_id = ?1 AND local_relpath = ?2;
+-- STMT_SELECT_NODE_CHILDREN_INFO
+/* Getting rows in an advantageous order using
+ ORDER BY local_relpath, op_depth DESC
+ turns out to be slower than getting rows in a random order and making the
+ C code handle it. */
+SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
+ checksum, translated_size, changed_revision, changed_date, changed_author,
+ depth, symlink_target, last_mod_time, properties, lock_token, lock_owner,
+ lock_comment, lock_date, local_relpath
+FROM nodes
+LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
+ AND nodes.repos_path = lock.repos_relpath
+WHERE wc_id = ?1 AND parent_relpath = ?2;
+
+-- STMT_SELECT_ACTUAL_CHILDREN_INFO
+SELECT prop_reject, changelist, conflict_old, conflict_new,
+conflict_working, tree_conflict_data, properties, local_relpath
+FROM actual_node
+WHERE wc_id = ?1 AND parent_relpath = ?2;
+
-- STMT_SELECT_REPOSITORY_BY_ID
SELECT root, uuid FROM repository WHERE id = ?1;
@@ -205,11 +225,9 @@ UPDATE actual_node SET tree_conflict_dat
WHERE wc_id = ?1 AND local_relpath = ?2;
-- STMT_INSERT_ACTUAL_TREE_CONFLICTS
-/* tree conflicts are always recorded on the wcroot node, so the
- parent_relpath will be null. */
INSERT INTO actual_node (
- wc_id, local_relpath, tree_conflict_data)
-VALUES (?1, ?2, ?3);
+ wc_id, local_relpath, tree_conflict_data, parent_relpath)
+VALUES (?1, ?2, ?3, ?4);
-- STMT_UPDATE_ACTUAL_TEXT_CONFLICTS
UPDATE actual_node SET conflict_old = ?3, conflict_new = ?4,
@@ -315,10 +333,6 @@ WHERE wc_id = ?1 AND local_relpath = ?2
AND op_depth = (SELECT MAX(op_depth) FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0);
--- STMT_UPDATE_BASE_NODE_PRESENCE_AND_REVNUM
-UPDATE nodes SET presence = ?3, revision = ?4
-WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0;
-
-- STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH
UPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0;