Author: gstein Date: Mon May 10 03:41:06 2010 New Revision: 942652 URL: http://svn.apache.org/viewvc?rev=942652&view=rev Log: Simplify the code path for resolving text conflicts on a file when it is restored.
* subversion/libsvn_wc/conflicts.h: (svn_wc__resolve_text_conflict): new helper function to resolve text conflicts on a file * subversion/libsvn_wc/wc.h: (svn_wc__internal_resolved_conflict): removed. unused. * subversion/libsvn_wc/conflicts.c: (resolve_conflict_on_node): initialize the DID_RESOLVE OUT param (svn_wc__resolve_text_conflict): new helper, as a simple wrapper around resolve_conflict_on_node (resolve_one_conflict): remove CANCEL_FUNC/BATON. calling that within the granularity of looping over an individual node's conflicts is way way too much. add parameter comments on calls to lower funcs. add a note that RESOLVE_PROP *cannot* be used to resolve a single prop conflict. (recursive_resolve_conflict): remove CANCEL_FUNC/BATON on call to resolve_one_conflict (svn_wc__internal_resolved_conflict): removed (svn_wc_resolved_conflict5): move DEPTH adjust from internal_resolved_conflict to here. add a check for unimplemented RESOLVE_PROP behavior (see resolve_one_conflict comment and resolve_conflict_on_node behavior). call recursive_resolve_conflict directly instead of the "internal" func. * subversion/libsvn_wc/adm_crawler.c: (restore_file): call svn_wc__resolve_text_conflict rather than the overpowered internal_resolved_conflict. Modified: subversion/trunk/subversion/libsvn_wc/adm_crawler.c subversion/trunk/subversion/libsvn_wc/conflicts.c subversion/trunk/subversion/libsvn_wc/conflicts.h subversion/trunk/subversion/libsvn_wc/wc.h Modified: subversion/trunk/subversion/libsvn_wc/adm_crawler.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_crawler.c?rev=942652&r1=942651&r2=942652&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/adm_crawler.c (original) +++ subversion/trunk/subversion/libsvn_wc/adm_crawler.c Mon May 10 03:41:06 2010 @@ -48,6 +48,7 @@ #include "entries.h" #include "lock.h" #include "workqueue.h" +#include "conflicts.h" #include "svn_private_config.h" @@ -88,12 +89,8 @@ restore_file(svn_wc__db_t *db, scratch_pool)); /* Remove any text conflict */ - SVN_ERR(svn_wc__internal_resolved_conflict( - db, local_abspath, svn_depth_empty, TRUE, NULL, FALSE, - svn_wc_conflict_choose_merged, NULL, NULL, NULL, NULL, - scratch_pool)); - - return SVN_NO_ERROR; + return svn_error_return(svn_wc__resolve_text_conflict(db, local_abspath, + scratch_pool)); } /* Try to restore LOCAL_ABSPATH of node type KIND and if successfull, Modified: subversion/trunk/subversion/libsvn_wc/conflicts.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/conflicts.c?rev=942652&r1=942651&r2=942652&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/conflicts.c (original) +++ subversion/trunk/subversion/libsvn_wc/conflicts.c Mon May 10 03:41:06 2010 @@ -329,9 +329,11 @@ resolve_conflict_on_node(svn_wc__db_t *d const char *prop_reject_file = NULL; svn_wc__db_kind_t kind; int i; - const apr_array_header_t *conflicts = NULL; + const apr_array_header_t *conflicts; const char *conflict_dir_abspath; + *did_resolve = FALSE; + SVN_ERR(svn_wc__db_read_info(NULL, &kind, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -488,6 +490,24 @@ resolve_conflict_on_node(svn_wc__db_t *d return SVN_NO_ERROR; } + +svn_error_t * +svn_wc__resolve_text_conflict(svn_wc__db_t *db, + const char *local_abspath, + apr_pool_t *scratch_pool) +{ + svn_boolean_t ignored_result; + + return svn_error_return(resolve_conflict_on_node( + db, local_abspath, + TRUE /* resolve_text */, + FALSE /* resolve_props */, + svn_wc_conflict_choose_merged, + &ignored_result, + scratch_pool)); +} + + /* */ static svn_error_t * resolve_one_conflict(svn_wc__db_t *db, @@ -496,8 +516,6 @@ resolve_one_conflict(svn_wc__db_t *db, const char *resolve_prop, svn_boolean_t resolve_tree, svn_wc_conflict_choice_t conflict_choice, - svn_cancel_func_t cancel_func, - void *cancel_baton, svn_wc_notify_func2_t notify_func, void *notify_baton, apr_pool_t *scratch_pool) @@ -519,9 +537,6 @@ resolve_one_conflict(svn_wc__db_t *db, svn_pool_clear(iterpool); - if (cancel_func) - SVN_ERR(cancel_func(cancel_baton)); - switch (cd->kind) { case svn_wc_conflict_kind_tree: @@ -555,8 +570,8 @@ resolve_one_conflict(svn_wc__db_t *db, SVN_ERR(resolve_conflict_on_node(db, local_abspath, - TRUE, - FALSE, + TRUE /* resolve_text */, + FALSE /* resolve_props */, conflict_choice, &did_resolve, iterpool)); @@ -569,6 +584,8 @@ resolve_one_conflict(svn_wc__db_t *db, if (!resolve_prop) break; + /* ### this is bogus. resolve_conflict_on_node() does not handle + ### individual property resolution. */ if (*resolve_prop != '\0' && strcmp(resolve_prop, cd->property_name) != 0) { @@ -579,8 +596,8 @@ resolve_one_conflict(svn_wc__db_t *db, /* We don't have property name handling here yet :( */ SVN_ERR(resolve_conflict_on_node(db, local_abspath, - FALSE, - TRUE, + FALSE /* resolve_text */, + TRUE /* resolve_props */, conflict_choice, &did_resolve, iterpool)); @@ -657,7 +674,6 @@ recursive_resolve_conflict(svn_wc__db_t resolve_prop, resolve_tree, conflict_choice, - cancel_func, cancel_baton, notify_func, notify_baton, iterpool)); } @@ -683,10 +699,9 @@ recursive_resolve_conflict(svn_wc__db_t child_abspath = svn_dirent_join(local_abspath, name, iterpool); - SVN_ERR(svn_wc__db_read_kind(&kind, db, child_abspath, TRUE, iterpool)); - apr_hash_set(visited, name, APR_HASH_KEY_STRING, name); + SVN_ERR(svn_wc__db_read_kind(&kind, db, child_abspath, TRUE, iterpool)); if (kind == svn_wc__db_kind_dir && depth < svn_depth_immediates) continue; @@ -723,12 +738,10 @@ recursive_resolve_conflict(svn_wc__db_t child_abspath = svn_dirent_join(local_abspath, name, iterpool); SVN_ERR(svn_wc__db_node_hidden(&hidden, db, child_abspath, iterpool)); - if (hidden) continue; SVN_ERR(svn_wc__db_read_kind(&kind, db, child_abspath, TRUE, iterpool)); - if (kind == svn_wc__db_kind_dir && depth < svn_depth_immediates) continue; @@ -749,39 +762,7 @@ recursive_resolve_conflict(svn_wc__db_t return SVN_NO_ERROR; } -svn_error_t * -svn_wc__internal_resolved_conflict(svn_wc__db_t *db, - const char *local_abspath, - svn_depth_t depth, - svn_boolean_t resolve_text, - const char *resolve_prop, - svn_boolean_t resolve_tree, - svn_wc_conflict_choice_t conflict_choice, - svn_cancel_func_t cancel_func, - void *cancel_baton, - svn_wc_notify_func2_t notify_func, - void *notify_baton, - apr_pool_t *scratch_pool) -{ - /* When the implementation still used the entry walker, depth - unknown was translated to infinity. */ - if (depth == svn_depth_unknown) - depth = svn_depth_infinity; - return svn_error_return( - recursive_resolve_conflict(db, - local_abspath, - depth, - resolve_text, - resolve_prop, - resolve_tree, - conflict_choice, - cancel_func, cancel_baton, - notify_func, notify_baton, - scratch_pool)); -} - -/* The public function */ svn_error_t * svn_wc_resolved_conflict5(svn_wc_context_t *wc_ctx, const char *local_abspath, @@ -796,15 +777,27 @@ svn_wc_resolved_conflict5(svn_wc_context void *notify_baton, apr_pool_t *scratch_pool) { - return svn_error_return( - svn_wc__internal_resolved_conflict(wc_ctx->db, - local_abspath, - depth, - resolve_text, - resolve_prop, - resolve_tree, - conflict_choice, - cancel_func, cancel_baton, - notify_func, notify_baton, - scratch_pool)); + /* ### the underlying code does NOT support resolving individual + ### properties. bail out if the caller tries it. */ + if (resolve_prop != NULL && *resolve_prop != '\0') + return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL, + U_("Resolving a single property is not (yet) " + "supported.")); + + /* When the implementation still used the entry walker, depth + unknown was translated to infinity. */ + if (depth == svn_depth_unknown) + depth = svn_depth_infinity; + + return svn_error_return(recursive_resolve_conflict( + wc_ctx->db, + local_abspath, + depth, + resolve_text, + resolve_prop, + resolve_tree, + conflict_choice, + cancel_func, cancel_baton, + notify_func, notify_baton, + scratch_pool)); } Modified: subversion/trunk/subversion/libsvn_wc/conflicts.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/conflicts.h?rev=942652&r1=942651&r2=942652&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/conflicts.h (original) +++ subversion/trunk/subversion/libsvn_wc/conflicts.h Mon May 10 03:41:06 2010 @@ -278,6 +278,13 @@ svn_wc__conflict_skel_add_obstruction(sv apr_pool_t *scratch_pool); +/* Resolve text conflicts on the given node. */ +svn_error_t * +svn_wc__resolve_text_conflict(svn_wc__db_t *db, + const char *local_abspath, + apr_pool_t *scratch_pool); + + #ifdef __cplusplus } #endif /* __cplusplus */ Modified: subversion/trunk/subversion/libsvn_wc/wc.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc.h?rev=942652&r1=942651&r2=942652&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/wc.h (original) +++ subversion/trunk/subversion/libsvn_wc/wc.h Mon May 10 03:41:06 2010 @@ -586,22 +586,6 @@ svn_wc__internal_remove_from_revision_co apr_pool_t *scratch_pool); -/* Library-internal version of svn_wc__resolved_conflict5(). */ -svn_error_t * -svn_wc__internal_resolved_conflict(svn_wc__db_t *db, - const char *local_abspath, - svn_depth_t depth, - svn_boolean_t resolve_text, - const char *resolve_prop, - svn_boolean_t resolve_tree, - svn_wc_conflict_choice_t conflict_choice, - svn_cancel_func_t cancel_func, - void *cancel_baton, - svn_wc_notify_func2_t notify_func, - void *notify_baton, - apr_pool_t *scratch_pool); - - svn_error_t * svn_wc__internal_is_replaced(svn_boolean_t *replaced, svn_wc__db_t *db,