You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2012/06/19 16:18:33 UTC
svn commit: r1351726 - in /subversion/trunk/subversion: include/svn_wc.h
libsvn_wc/conflicts.c svn/notify.c
Author: stsp
Date: Tue Jun 19 14:18:33 2012
New Revision: 1351726
URL: http://svn.apache.org/viewvc?rev=1351726&view=rev
Log:
Revert r1350917, vetoed by Bert:
"I think we have some precedent of providing notification actions where
we need these notifications, but I don't think libsvn_wc should do the
counting."
http://svn.haxx.se/dev/archive-2012-06/0311.shtml
A different approach will be taken in future commits.
Modified:
subversion/trunk/subversion/include/svn_wc.h
subversion/trunk/subversion/libsvn_wc/conflicts.c
subversion/trunk/subversion/svn/notify.c
Modified: subversion/trunk/subversion/include/svn_wc.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=1351726&r1=1351725&r2=1351726&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_wc.h (original)
+++ subversion/trunk/subversion/include/svn_wc.h Tue Jun 19 14:18:33 2012
@@ -1227,11 +1227,7 @@ typedef enum svn_wc_notify_action_t
/** Operation failed because a node is obstructed.
* @since New in 1.8. */
- svn_wc_notify_failed_obstruction,
-
- /** Summary of conflicts in the working copy.
- * @since New in 1.8. */
- svn_wc_notify_conflict_summary
+ svn_wc_notify_failed_obstruction
} svn_wc_notify_action_t;
@@ -1417,12 +1413,6 @@ typedef struct svn_wc_notify_t {
* @since New in 1.7 */
svn_linenum_t hunk_fuzz;
- /** Number of conflicts per kind, for conflict summary notification.
- * @since New in 1.8 */
- unsigned int text_conflicts;
- unsigned int prop_conflicts;
- unsigned int tree_conflicts;
-
/* NOTE: Add new fields at the end to preserve binary compatibility.
Also, if you add fields here, you have to update svn_wc_create_notify
and svn_wc_dup_notify. */
Modified: subversion/trunk/subversion/libsvn_wc/conflicts.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/conflicts.c?rev=1351726&r1=1351725&r2=1351726&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/conflicts.c (original)
+++ subversion/trunk/subversion/libsvn_wc/conflicts.c Tue Jun 19 14:18:33 2012
@@ -358,87 +358,41 @@ svn_wc__resolve_text_conflict(svn_wc__db
scratch_pool));
}
-/* Baton for gather_conflict_stats() */
-struct gather_conflict_stats_baton {
- svn_wc__db_t *db;
- apr_array_header_t *conflicted_paths;
- unsigned int text_conflicts;
- unsigned int prop_conflicts;
- unsigned int tree_conflicts;
- apr_pool_t *pool;
-} gather_conflict_stats_baton;
+/* Baton for conflict_status_walker */
+struct conflict_status_walker_baton
+{
+ svn_wc__db_t *db;
+ svn_boolean_t resolve_text;
+ const char *resolve_prop;
+ svn_boolean_t resolve_tree;
+ svn_wc_conflict_choice_t conflict_choice;
+ svn_wc_conflict_resolver_func2_t conflict_func;
+ void *conflict_baton;
+ svn_cancel_func_t cancel_func;
+ void *cancel_baton;
+ svn_wc_notify_func2_t notify_func;
+ void *notify_baton;
+};
-/* Implements svn_wc_status4_t to walk all conflicts to resolve.
- * Gathers conflicts for the purpose of sending a conflict summary
- * and then process conflicts in turn. */
+/* Implements svn_wc_status4_t to walk all conflicts to resolve */
static svn_error_t *
-gather_conflict_stats(void *baton,
- const char *local_abspath,
- const svn_wc_status3_t *status,
- apr_pool_t *scratch_pool)
+conflict_status_walker(void *baton,
+ const char *local_abspath,
+ const svn_wc_status3_t *status,
+ apr_pool_t *scratch_pool)
{
- struct gather_conflict_stats_baton *b = baton;
+ struct conflict_status_walker_baton *cswb = baton;
+ svn_wc__db_t *db = cswb->db;
+
const apr_array_header_t *conflicts;
+ apr_pool_t *iterpool;
int i;
+ svn_boolean_t resolved = FALSE;
if (!status->conflicted)
return SVN_NO_ERROR;
- APR_ARRAY_PUSH(b->conflicted_paths,
- const char *) = apr_pstrdup(b->pool, local_abspath);
-
- SVN_ERR(svn_wc__db_read_conflicts(&conflicts, b->db, local_abspath,
- scratch_pool, scratch_pool));
- for (i = 0; i < conflicts->nelts; i++)
- {
- const svn_wc_conflict_description2_t *cd;
-
- cd = APR_ARRAY_IDX(conflicts, i, const svn_wc_conflict_description2_t *);
- switch (cd->kind)
- {
- case svn_wc_conflict_kind_text:
- b->text_conflicts++;
- break;
- case svn_wc_conflict_kind_property:
- b->prop_conflicts++;
- break;
- case svn_wc_conflict_kind_tree:
- b->tree_conflicts++;
- break;
- default:
- return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
- NULL, _("Unkown conflict kind %d"),
- cd->kind);
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-
-/* Give the conflict callback a go at resolving all conflicts at LOCAL_ABSPATH.
- * All parameters as in svn_wc__resolve_conflicts(). */
-static svn_error_t *
-resolve_conflicts_on_node(const char *local_abspath,
- svn_wc__db_t *db,
- svn_boolean_t resolve_text,
- const char *resolve_prop,
- svn_boolean_t resolve_tree,
- svn_wc_conflict_choice_t conflict_choice,
- svn_wc_conflict_resolver_func2_t conflict_func,
- void *conflict_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- svn_wc_notify_func2_t notify_func,
- void *notify_baton,
- apr_pool_t *scratch_pool)
-{
- const apr_array_header_t *conflicts;
- svn_boolean_t resolved = FALSE;
- int i;
- apr_pool_t *iterpool;
-
iterpool = svn_pool_create(scratch_pool);
SVN_ERR(svn_wc__db_read_conflicts(&conflicts, db, local_abspath,
@@ -448,7 +402,7 @@ resolve_conflicts_on_node(const char *lo
{
const svn_wc_conflict_description2_t *cd;
svn_boolean_t did_resolve;
- svn_wc_conflict_choice_t my_choice = conflict_choice;
+ svn_wc_conflict_choice_t my_choice = cswb->conflict_choice;
cd = APR_ARRAY_IDX(conflicts, i, const svn_wc_conflict_description2_t *);
@@ -458,13 +412,13 @@ resolve_conflicts_on_node(const char *lo
{
svn_wc_conflict_result_t *result;
- if (!conflict_func)
+ if (!cswb->conflict_func)
return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("No conflict-callback and no "
"pre-defined conflict-choice provided"));
- SVN_ERR(conflict_func(&result, cd, conflict_baton,
- iterpool, iterpool));
+ SVN_ERR(cswb->conflict_func(&result, cd, cswb->conflict_baton,
+ iterpool, iterpool));
my_choice = result->choice;
}
@@ -476,7 +430,7 @@ resolve_conflicts_on_node(const char *lo
switch (cd->kind)
{
case svn_wc_conflict_kind_tree:
- if (!resolve_tree)
+ if (!cswb->resolve_tree)
break;
/* For now, we only clear tree conflict information and resolve
@@ -501,27 +455,26 @@ resolve_conflicts_on_node(const char *lo
FALSE /* resolve_props */,
TRUE /* resolve_tree */,
my_choice,
- cancel_func,
- cancel_baton,
+ cswb->cancel_func,
+ cswb->cancel_baton,
iterpool));
resolved = TRUE;
break;
case svn_wc_conflict_kind_text:
- if (!resolve_text)
+ if (!cswb->resolve_text)
break;
SVN_ERR(resolve_conflict_on_node(&did_resolve,
db,
local_abspath,
TRUE /* resolve_text */,
-
FALSE /* resolve_props */,
FALSE /* resolve_tree */,
my_choice,
- cancel_func,
- cancel_baton,
+ cswb->cancel_func,
+ cswb->cancel_baton,
iterpool));
if (did_resolve)
@@ -529,13 +482,13 @@ resolve_conflicts_on_node(const char *lo
break;
case svn_wc_conflict_kind_property:
- if (!resolve_prop)
+ if (!cswb->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)
+ if (*cswb->resolve_prop != '\0' &&
+ strcmp(cswb->resolve_prop, cd->property_name) != 0)
{
break; /* Skip this property conflict */
}
@@ -549,8 +502,8 @@ resolve_conflicts_on_node(const char *lo
TRUE /* resolve_props */,
FALSE /* resolve_tree */,
my_choice,
- cancel_func,
- cancel_baton,
+ cswb->cancel_func,
+ cswb->cancel_baton,
iterpool));
if (did_resolve)
@@ -564,12 +517,12 @@ resolve_conflicts_on_node(const char *lo
}
/* Notify */
- if (notify_func && resolved)
- notify_func(notify_baton,
- svn_wc_create_notify(local_abspath,
- svn_wc_notify_resolved,
- iterpool),
- iterpool);
+ if (cswb->notify_func && resolved)
+ cswb->notify_func(cswb->notify_baton,
+ svn_wc_create_notify(local_abspath,
+ svn_wc_notify_resolved,
+ iterpool),
+ iterpool);
svn_pool_destroy(iterpool);
@@ -594,9 +547,7 @@ svn_wc__resolve_conflicts(svn_wc_context
{
svn_kind_t kind;
svn_boolean_t conflicted;
- struct gather_conflict_stats_baton gcsb;
- int i;
- apr_pool_t *iterpool;
+ struct conflict_status_walker_baton cswb;
/* ### the underlying code does NOT support resolving individual
### properties. bail out if the caller tries it. */
@@ -621,14 +572,21 @@ svn_wc__resolve_conflicts(svn_wc_context
else if (depth == svn_depth_unknown)
depth = svn_depth_infinity;
- gcsb.db = wc_ctx->db;
- gcsb.conflicted_paths = apr_array_make(scratch_pool, 0, sizeof(const char *));
- gcsb.text_conflicts = 0;
- gcsb.prop_conflicts = 0;
- gcsb.tree_conflicts = 0;
- gcsb.pool = scratch_pool;
+ cswb.db = wc_ctx->db;
+ cswb.resolve_text = resolve_text;
+ cswb.resolve_prop = resolve_prop;
+ cswb.resolve_tree = resolve_tree;
+ cswb.conflict_choice = conflict_choice;
+
+ cswb.conflict_func = conflict_func;
+ cswb.conflict_baton = conflict_baton;
+
+ cswb.cancel_func = cancel_func;
+ cswb.cancel_baton = cancel_baton;
+
+ cswb.notify_func = notify_func;
+ cswb.notify_baton = notify_baton;
- /* Gather conflicts within LOCAL_ABSPATH. */
SVN_ERR(svn_wc_walk_status(wc_ctx,
local_abspath,
depth,
@@ -636,42 +594,10 @@ svn_wc__resolve_conflicts(svn_wc_context
FALSE /* no_ignore */,
TRUE /* ignore_text_mods */,
NULL /* ignore_patterns */,
- gather_conflict_stats, &gcsb,
+ conflict_status_walker, &cswb,
cancel_func, cancel_baton,
scratch_pool));
- /* Send a conflict summary notification. */
- if (notify_func)
- {
- svn_wc_notify_t *notify;
-
- notify = svn_wc_create_notify(local_abspath,
- svn_wc_notify_conflict_summary,
- scratch_pool),
- notify->text_conflicts = gcsb.text_conflicts;
- notify->prop_conflicts = gcsb.prop_conflicts;
- notify->tree_conflicts = gcsb.tree_conflicts;
- notify_func(notify_baton, notify, scratch_pool);
- }
-
- /* Give the conflict callback a go at resolving conflicts. */
- iterpool = svn_pool_create(scratch_pool);
- for (i = 0; i < gcsb.conflicted_paths->nelts; i++)
- {
- const char *conflicted_path;
-
- svn_pool_clear(iterpool);
- conflicted_path = APR_ARRAY_IDX(gcsb.conflicted_paths, i, const char *);
- SVN_ERR(resolve_conflicts_on_node(conflicted_path, wc_ctx->db,
- resolve_text, resolve_prop,
- resolve_tree, conflict_choice,
- conflict_func, conflict_baton,
- cancel_func, cancel_baton,
- notify_func, notify_baton,
- iterpool));
- }
- svn_pool_destroy(iterpool);
-
return SVN_NO_ERROR;
}
Modified: subversion/trunk/subversion/svn/notify.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/notify.c?rev=1351726&r1=1351725&r2=1351726&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/notify.c (original)
+++ subversion/trunk/subversion/svn/notify.c Tue Jun 19 14:18:33 2012
@@ -982,15 +982,6 @@ notify(void *baton, const svn_wc_notify_
goto print_error;
break;
- case svn_wc_notify_conflict_summary:
- /* Once all operations invoke the interactive conflict resolution after
- * they've completed, we can run svn_cl__print_conflict_stats() here.
- * For now, allow the resolver to override stats we've gathered. */
- nb->text_conflicts = n->text_conflicts;
- nb->prop_conflicts = n->prop_conflicts;
- nb->tree_conflicts = n->tree_conflicts;
- break;
-
default:
break;
}