You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2010/03/02 22:00:57 UTC
svn commit: r918178 - /subversion/trunk/subversion/libsvn_wc/adm_ops.c
Author: philip
Date: Tue Mar 2 21:00:57 2010
New Revision: 918178
URL: http://svn.apache.org/viewvc?rev=918178&view=rev
Log:
* subversion/libsvn_wc/adm_ops.c
(revert_internal): Remove use of svn_wc_entry_t.
Modified:
subversion/trunk/subversion/libsvn_wc/adm_ops.c
Modified: subversion/trunk/subversion/libsvn_wc/adm_ops.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_ops.c?rev=918178&r1=918177&r2=918178&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/adm_ops.c (original)
+++ subversion/trunk/subversion/libsvn_wc/adm_ops.c Tue Mar 2 21:00:57 2010
@@ -1998,8 +1998,10 @@
void *notify_baton,
apr_pool_t *pool)
{
- svn_node_kind_t kind;
- const svn_wc_entry_t *entry;
+ svn_node_kind_t disk_kind;
+ svn_wc__db_status_t status;
+ svn_wc__db_kind_t db_kind;
+ svn_boolean_t unversioned;
const svn_wc_conflict_description2_t *tree_conflict;
const char *path;
svn_error_t *err;
@@ -2013,25 +2015,36 @@
/* Safeguard 1: the item must be versioned for any reversion to make sense,
except that a tree conflict can exist on an unversioned item. */
- err = svn_wc__get_entry(&entry, db, local_abspath, TRUE, svn_node_unknown,
- FALSE, pool, pool);
+ err = svn_wc__db_read_info(&status, &db_kind,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL,
+ db, local_abspath, pool, pool);
- if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
- svn_error_clear(err);
+ if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ {
+ svn_error_clear(err);
+ unversioned = TRUE;
+ }
+ else if (err)
+ svn_error_return(err);
else
- SVN_ERR(err);
+ unversioned = FALSE;
SVN_ERR(svn_wc__db_op_read_tree_conflict(&tree_conflict, db, local_abspath,
pool, pool));
- if (entry == NULL && tree_conflict == NULL)
+ if (unversioned && tree_conflict == NULL)
return svn_error_createf(SVN_ERR_UNVERSIONED_RESOURCE, NULL,
_("Cannot revert unversioned item '%s'"), path);
/* Safeguard 1.5: is this a missing versioned directory? */
- SVN_ERR(svn_io_check_path(local_abspath, &kind, pool));
- if (entry && (entry->kind == svn_node_dir))
+ SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, pool));
+ if (!unversioned && (db_kind == svn_wc__db_kind_dir))
{
- if ((kind != svn_node_dir) && (entry->schedule != svn_wc_schedule_add))
+ if ((disk_kind != svn_node_dir)
+ && (status != svn_wc__db_status_added)
+ && (status != svn_wc__db_status_obstructed_add))
{
/* When the directory itself is missing, we can't revert without
hitting the network. Someday a '--force' option will
@@ -2049,7 +2062,8 @@
}
/* Safeguard 2: can we handle this entry's recorded kind? */
- if (entry && (entry->kind != svn_node_file) && (entry->kind != svn_node_dir))
+ if (!unversioned
+ && (db_kind != svn_wc__db_kind_file) && (db_kind != svn_wc__db_kind_dir))
return svn_error_createf
(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Cannot revert '%s': unsupported entry node kind"),
@@ -2057,9 +2071,9 @@
/* Safeguard 3: can we deal with the node kind of PATH currently in
the working copy? */
- if ((kind != svn_node_none)
- && (kind != svn_node_file)
- && (kind != svn_node_dir))
+ if ((disk_kind != svn_node_none)
+ && (disk_kind != svn_node_file)
+ && (disk_kind != svn_node_dir))
return svn_error_createf
(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Cannot revert '%s': unsupported node kind in working copy"),
@@ -2085,8 +2099,8 @@
/* Actually revert this entry. If this is a working copy root,
we provide a base_name from the parent path. */
- if (entry)
- SVN_ERR(revert_entry(&depth, db, local_abspath, kind,
+ if (!unversioned)
+ SVN_ERR(revert_entry(&depth, db, local_abspath, disk_kind,
use_commit_times,
cancel_func, cancel_baton,
&reverted, pool));
@@ -2100,7 +2114,7 @@
}
/* Finally, recurse if requested. */
- if (entry && entry->kind == svn_node_dir && depth > svn_depth_empty)
+ if (!unversioned && db_kind == svn_wc__db_kind_dir && depth > svn_depth_empty)
{
const apr_array_header_t *children;
apr_hash_t *nodes = apr_hash_make(pool);
@@ -2150,34 +2164,48 @@
/* Visit any unversioned children that are tree conflict victims. */
{
- apr_hash_t *conflicts;
- apr_hash_index_t *hi2;
+ const apr_array_header_t *conflict_victims;
/* Loop through all the tree conflict victims */
- SVN_ERR(svn_wc__read_tree_conflicts(&conflicts,
- entry->tree_conflict_data,
- path, pool));
+ SVN_ERR(svn_wc__db_read_conflict_victims(&conflict_victims,
+ db, local_abspath,
+ pool, pool));
- for (hi2 = apr_hash_first(pool, conflicts); hi2;
- hi2 = apr_hash_next(hi2))
+ for (i = 0; i < conflict_victims->nelts; ++i)
{
- const svn_wc_conflict_description2_t *conflict =
- svn_apr_hash_index_val(hi2);
+ int j;
+ const apr_array_header_t *child_conflicts;
+ const char *child_name;
+ const char *child_abspath;
svn_pool_clear(iterpool);
- /* If this victim is not in this dir's entries ... */
- if (apr_hash_get(nodes,
- svn_dirent_basename(conflict->local_abspath,
- pool),
- APR_HASH_KEY_STRING) == NULL)
+ child_name = APR_ARRAY_IDX(conflict_victims, i, const char *);
+
+ /* Skip if in this dir's entries, we only want unversioned */
+ if (apr_hash_get(nodes, child_name, APR_HASH_KEY_STRING))
+ continue;
+
+ child_abspath = svn_dirent_join(local_abspath, child_name,
+ iterpool);
+
+ SVN_ERR(svn_wc__db_read_conflicts(&child_conflicts,
+ db, child_abspath,
+ iterpool, iterpool));
+
+ for (j = 0; j < child_conflicts->nelts; ++j)
{
- /* Revert the entry. */
- SVN_ERR(revert_internal(db, conflict->local_abspath,
- svn_depth_empty,
- use_commit_times, changelist_hash,
- cancel_func, cancel_baton,
- notify_func, notify_baton, iterpool));
+ const svn_wc_conflict_description2_t *conflict =
+ APR_ARRAY_IDX(child_conflicts, j,
+ const svn_wc_conflict_description2_t *);
+
+ if (conflict->kind == svn_wc_conflict_kind_tree)
+ SVN_ERR(revert_internal(db, conflict->local_abspath,
+ svn_depth_empty,
+ use_commit_times, changelist_hash,
+ cancel_func, cancel_baton,
+ notify_func, notify_baton,
+ iterpool));
}
}
}