You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2012/06/30 21:47:21 UTC
svn commit: r1355799 - /subversion/trunk/subversion/libsvn_wc/info.c
Author: rhuijben
Date: Sat Jun 30 19:47:20 2012
New Revision: 1355799
URL: http://svn.apache.org/viewvc?rev=1355799&view=rev
Log:
Avoid tree conflict data specific functions in the libsvn_wc info walker, when
we can just use the more generic conflict victim functions.
* subversion/libsvn_wc/info.c
(info_found_node_callback): Read conflict victims instead of tree conflict
victims.
(svn_wc__get_info): Avoid one query per tree conflict to fetch the repository
and add another one to read the conflicts.
Modified:
subversion/trunk/subversion/libsvn_wc/info.c
Modified: subversion/trunk/subversion/libsvn_wc/info.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/info.c?rev=1355799&r1=1355798&r2=1355799&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/info.c (original)
+++ subversion/trunk/subversion/libsvn_wc/info.c Sat Jun 30 19:47:20 2012
@@ -385,21 +385,21 @@ info_found_node_callback(const char *loc
* are not visited will remain in the list. */
if (fe_baton->actual_only && kind == svn_node_dir)
{
- apr_hash_t *conflicts;
- apr_hash_index_t *hi;
+ const apr_array_header_t *victims;
+ int i;
- SVN_ERR(svn_wc__db_op_read_all_tree_conflicts(
- &conflicts, fe_baton->db, local_abspath,
- fe_baton->pool, scratch_pool));
- for (hi = apr_hash_first(scratch_pool, conflicts); hi;
- hi = apr_hash_next(hi))
+ SVN_ERR(svn_wc__db_read_conflict_victims(&victims,
+ fe_baton->db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ for (i = 0; i < victims->nelts; i++)
{
- const char *this_basename = svn__apr_hash_index_key(hi);
+ const char *this_basename = APR_ARRAY_IDX(victims, i, const char *);
apr_hash_set(fe_baton->tree_conflicts,
svn_dirent_join(local_abspath, this_basename,
fe_baton->pool),
- APR_HASH_KEY_STRING, svn__apr_hash_index_val(hi));
+ APR_HASH_KEY_STRING, "");
}
}
@@ -449,6 +449,8 @@ svn_wc__get_info(svn_wc_context_t *wc_ct
svn_error_t *err;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
apr_hash_index_t *hi;
+ const char *repos_root_url = NULL;
+ const char *repos_uuid = NULL;
fe_baton.receiver = receiver;
fe_baton.receiver_baton = receiver_baton;
@@ -476,9 +478,9 @@ svn_wc__get_info(svn_wc_context_t *wc_ct
const svn_wc_conflict_description2_t *root_tree_conflict;
svn_error_t *err2;
- err2 = svn_wc__db_op_read_tree_conflict(&root_tree_conflict,
- wc_ctx->db, local_abspath,
- scratch_pool, iterpool);
+ err2 = svn_wc__get_tree_conflict(&root_tree_conflict,
+ wc_ctx, local_abspath,
+ scratch_pool, iterpool);
if ((err2 && err2->apr_err == SVN_ERR_WC_PATH_NOT_FOUND))
{
@@ -502,30 +504,41 @@ svn_wc__get_info(svn_wc_context_t *wc_ct
hi = apr_hash_next(hi))
{
const char *this_abspath = svn__apr_hash_index_key(hi);
- const svn_wc_conflict_description2_t *tree_conflict
- = svn__apr_hash_index_val(hi);
+ const svn_wc_conflict_description2_t *tree_conflict;
+ svn_wc__info2_t *info;
svn_pool_clear(iterpool);
- if (depth_includes(local_abspath, depth, tree_conflict->local_abspath,
- tree_conflict->node_kind, iterpool))
+ SVN_ERR(build_info_for_unversioned(&info, iterpool));
+
+ if (!repos_root_url)
{
- apr_array_header_t *conflicts = apr_array_make(iterpool,
- 1, sizeof(const svn_wc_conflict_description2_t *));
- svn_wc__info2_t *info;
-
- SVN_ERR(build_info_for_unversioned(&info, iterpool));
- SVN_ERR(svn_wc__internal_get_repos_info(&info->repos_root_URL,
- &info->repos_UUID,
- fe_baton.db,
+ SVN_ERR(svn_wc__internal_get_repos_info(&repos_root_url,
+ &repos_uuid,
+ wc_ctx->db,
local_abspath,
- iterpool, iterpool));
- APR_ARRAY_PUSH(conflicts, const svn_wc_conflict_description2_t *)
- = tree_conflict;
- info->wc_info->conflicts = conflicts;
-
- SVN_ERR(receiver(receiver_baton, this_abspath, info, iterpool));
+ scratch_pool,
+ iterpool));
}
+
+ info->repos_root_URL = repos_root_url;
+ info->repos_UUID = repos_uuid;
+
+ SVN_ERR(svn_wc__db_read_conflicts(&info->wc_info->conflicts,
+ wc_ctx->db, this_abspath,
+ iterpool, iterpool));
+
+ if (! info->wc_info->conflicts || ! info->wc_info->conflicts->nelts)
+ continue;
+
+ tree_conflict = APR_ARRAY_IDX(info->wc_info->conflicts, 0,
+ svn_wc_conflict_description2_t *);
+
+ if (!depth_includes(local_abspath, depth, tree_conflict->local_abspath,
+ tree_conflict->node_kind, iterpool))
+ continue;
+
+ SVN_ERR(receiver(receiver_baton, this_abspath, info, iterpool));
}
svn_pool_destroy(iterpool);