Make a second-pass revision to conflict-callback API, in prepration for prop conflicts.
Update the mountain of code that has cropped up on top of this stuff!

* subversion/include/svn_wc.h
  (svn_wc_conflict_kind_t):  new enumerated type.
  (svn_wc_conflict_description_t):  include new 'kind' enum.
                                    add new fields for prop-conflicts.
  (svn_wc_conflict_choice_t):  the new name of the 'choose' enum.
  (svn_wc_conflict_result_t):  this is now a structure, not an enum.
                               includes a choice enum, and an optional merged_propval.
  (svn_wc_create_conflict_result):  declare a constructor for the new structure.
  (svn_wc_conflict_resolver_func_t):  return the new structure.
  (svn_wc_resolved_conflict3):  update declaration with new 'choice' enum name.

* subversion/include/svn_client.h
  (svn_wc_resolved2):  update declaration with new 'choice' enum name.

* subversion/libsvn_wc/merge.c
  (svn_wc__merge_internal):  upgrade to use the new conflict API.
  (svn_wc_create_conflict_result):  new constructor function.

* subversion/libsvn_wc/adm_crawler.c
  (restore_file):  update use of enum.

* subversion/libsvn_wc/adm_ops.c
  (resolve_conflict_on_entry):  update use of enum.
  (resolve_found_entry_callback):  update use of enum.
  (svn_wc_resolved_conflict2):  update use of enum.
  (svn_wc_resolved_conflict3):  update use of enum.

* subversion/libsvn_client/merge.c
  (conflict_resolver):  update function signature.

* subversion/libsvn_client/resolved.c
  (svn_client_resolved, svn_client_resolved2):  update use of enum.

* subversion/svn/resolved-cmd.c
  (svn_cl__resolved):  update use of enum.

* subversion/svn/cl.h
  (svn_cl__ignore_conflicts,
   svn_cl__conflict_handler):  update function signatures.

* subversion/svn/conflict-callbacks.c
  (print_conflict_description):  remove crufty old debugging function.
  (svn_cl__ignore_conflicts):  update function signature and use of API.
  (svn_cl__conflict_handler):  upgrade to use new API.



Index: subversion/include/svn_wc.h
===================================================================
--- subversion/include/svn_wc.h	(revision 27157)
+++ subversion/include/svn_wc.h	(working copy)
@@ -966,7 +966,7 @@
 /**
  * Conflict handling
  *
- * @defgroup clnt_diff Conflict callback functionality
+ * @defgroup svn_wc_conflict Conflict callback functionality
  *
  * @{
  */
@@ -999,6 +999,21 @@
 } svn_wc_conflict_reason_t;
 
 
+/** The type of conflict being described by an @c
+ * svn_wc_conflict_description_t (see below).
+ *
+ * @since New in 1.5.
+ */
+typedef enum svn_wc_conflict_kind_t
+{
+  svn_wc_conflict_kind_text,         /* textual conflict (on a file) */
+  svn_wc_conflict_kind_property,     /* property conflict (on a file or dir) */
+
+  /* ### Add future kinds here that represent "tree" conflicts. */
+
+} svn_wc_conflict_kind_t;
+
+
 /** A struct that describes a conflict that has occurred in the
  * working copy.  Passed to @c svn_wc_conflict_resolver_func_t.
  *
@@ -1014,6 +1029,9 @@
   const char *path;
   svn_node_kind_t node_kind;
 
+  /** What sort of conflict are we describing? */
+  svn_wc_conflict_kind_t kind;
+
   /** The following only apply to file objects:
    *   - Whether svn thinks the object is a binary file.
    *   - If available (non-NULL), the svn:mime-type of the path */
@@ -1031,51 +1049,105 @@
   /* The reason for the conflict. */
   svn_wc_conflict_reason_t reason;
 
-  /** If the conflict involves the merging of two files descended from
-   * a common ancestor, here are the paths of up to four fulltext
-   * files that can be used to interactively resolve the conflict.
-   * All four files will be in repository-normal form -- LF line endings
-   * and contracted keywords.  (If any of these files are not available,
-   * they default to NULL.) */
+  /** If this is text-conflict and involves the merging of two files
+   * descended from a common ancestor, here are the paths of up to
+   * four fulltext files that can be used to interactively resolve the
+   * conflict.  All four files will be in repository-normal form -- LF
+   * line endings and contracted keywords.  (If any of these files are
+   * not available, they default to NULL.) */
 
   const char *base_file;     /* common ancestor of the two files being merged */
   const char *their_file;    /* their version of the file */
   const char *my_file;       /* my locally-edited version of the file */
   const char *merged_file;   /* merged version of file; has conflict markers */
 
+  /** If this is a property-conflict, here is the property name and
+   * and the three values in competition.  (Any of these values may be
+   * NULL, indicating either non-existence or an intent to delete.) */
+
+  const char *propname;           /* the property in conflict */
+  svn_string_t *base_propvalue;   /* the original value */
+  svn_string_t *their_propvalue;  /* their new value */
+  svn_string_t *my_propvalue;     /* my locally modified value */
+
+  /** @note: Unlike textual conflicts, libsvn_wc doesn't provide a
+   * "merged" propvalue with conflict markers.  The conflict callback,
+   * however, may want to allow the user to interactively merge
+   * propvalues into something new.  If so, the conflict callback
+   * should return this new merged value in its @c
+   * svn_wc_conflict_result_t and indicate its usage by selecting
+   * @c svn_wc_conflict_choose_merged. */
+
 } svn_wc_conflict_description_t;
 
 
-/** The final result returned by the conflict callback.  If the
- * callback wholly resolves the conflict by itself, it would return @c
- * svn_wc_conflict_result_resolved.  If the conflict still persists,
- * then return @c svn_wc_conflict_result_conflicted.  In the case of
- * file conflicts, the callback may instead signal that the user
- * wishes to resolve the conflict by "choosing" one of the four
- * fulltext files.
+
+/** The way in which the conflict callback chooses a course of action.
  *
  * @since New in 1.5.
  */
-typedef enum svn_wc_conflict_result_t
+typedef enum svn_wc_conflict_choice_t
 {
-  svn_wc_conflict_result_conflicted,    /* user did nothing; conflict remains */
-  svn_wc_conflict_result_resolved,      /* user has resolved the conflict */
+  /* Don't resolve the conflict now.  This tells libsvn_wc that the
+     path should be marked 'conflicted' as usual, so that the user can
+     resolve things later via 'svn resolved'.  */
+  svn_wc_conflict_choose_postpone,
 
-  /* The following results only apply to file-conflicts.  Note that
-     they're all specific ways of saying that the conflict is
-     resolved, in the sense that the user has chosen one of the four
-     files. The caller of the conflict-callback is responsible for
-     "installing" the chosen file as the final version of the file.*/
+  /* If the svn_wc_conflict_description_t provided chunks of data to
+     choose from, select one of them below as a way of resolving the
+     conflict here and now.  In the case of a text-conflict, this
+     means choosing an entire version of a file.  In the case of a
+     prop-conflict, this means choosing a specific property value.
+     libsvn_wc will then do the work of "installing" the chosen data.
+  */
+  svn_wc_conflict_choose_base,   /* user chooses the base version */
+  svn_wc_conflict_choose_theirs, /* user chooses incoming version */
+  svn_wc_conflict_choose_mine,   /* user chooses own version */
+  svn_wc_conflict_choose_merged, /* user chooses the merged version */
 
-  svn_wc_conflict_result_choose_base,   /* user chooses the base file */
-  svn_wc_conflict_result_choose_theirs, /* user chooses their file */
-  svn_wc_conflict_result_choose_mine,   /* user chooses own version of file */
-  svn_wc_conflict_result_choose_merged  /* user chooses the merged-file
-                                           (which she may have
-                                           manually edited) */
+} svn_wc_conflict_choice_t;
+
+
+/** The final result returned by @a svn_wc_conflict_resolver_func_t.
+ *
+ * @note Fields may be added to the end of this structure in future
+ * versions.  Therefore, to preserve binary compatibility, users
+ * should not directly allocate structures of this type.  Instead,
+ * construct this structure using @c svn_wc_create_conflict_result()
+ * below.
+ *
+ * @since New in 1.5.
+ */
+typedef struct svn_wc_conflict_result_t
+{
+  /* A choice to either delay the conflict resolution or select one
+     of several chunks of data to resolve the conflict. */
+  svn_wc_conflict_choice_t choice;
+
+  /* If the conflict is a property-conflict, and the user has selected
+     'svn_wc_conflict_choose_merged' then the callback should supply
+     the merged value here.  (Otherwise, this field is ignored.)  */
+  svn_string_t *merged_propvalue;
+
 } svn_wc_conflict_result_t;
 
 
+/**
+ * Allocate an @c svn_wc_conflict_result_t structure in @a pool,
+ * initialize and return it.
+ *
+ * Set the @c choice field of the structure to @a choice, and @c
+ * merged_propvalue to @a merged_propvalue.  Set all other fields to
+ * their @c _unknown, @c NULL or invalid value, respectively.
+ *
+ * @since New in 1.5.
+ */
+svn_wc_conflict_result_t *
+svn_wc_create_conflict_result(svn_wc_conflict_choice_t choice,
+                              svn_string_t *merged_propvalue,
+                              apr_pool_t *pool);
+
+
 /** A callback used in svn_client_merge3(), svn_client_update3(), and
  * svn_client_switch2() for resolving conflicts during the application
  * of a tree delta to a working copy.
@@ -1084,8 +1156,8 @@
  * provides information to help resolve it.  @a baton is a closure
  * object; it should be provided by the implementation, and passed by
  * the caller.  All allocations should be performed in @a pool.  When
- * finished, the callback signals its resolution by setting @a *result
- * to a proper enumerated state.  (See @c svn_wc_conflict_result_t.)
+ * finished, the callback signals its resolution by returning a
+ * structure in @a *result.  (See @c svn_wc_conflict_result_t.)
  *
  * Implementations of this callback are free to present the conflict
  * using any user interface.  This may include simple contextual
@@ -1099,7 +1171,7 @@
  * @since New in 1.5.
  */
 typedef svn_error_t *(*svn_wc_conflict_resolver_func_t)
-    (svn_wc_conflict_result_t *result,
+    (svn_wc_conflict_result_t **result,
      const svn_wc_conflict_description_t *description,
      void *baton,
      apr_pool_t *pool);
@@ -2694,11 +2766,11 @@
  * if any); if @c svn_depth_infinity, resolve @a path and every
  * conflicted file or directory anywhere beneath it.
  *
- * If @a conflict_result is svn_wc_conflict_result_choose_base, resolve the
+ * If @a conflict_choice is svn_wc_conflict_choose_base, resolve the
  * conflict with the old file contents; if
- * svn_wc_conflict_result_choose_user, use the original working contents;
- * if svn_wc_conflict_result_choose_theirs, the new contents; and if
- * svn_wc_conflict_result_choose_merged, don't change the contents at all,
+ * svn_wc_conflict_choose_mine, use the original working contents;
+ * if svn_wc_conflict_choose_theirs, the new contents; and if
+ * svn_wc_conflict_choose_merged, don't change the contents at all,
  * just remove the conflict status (i.e. pre-1.5 behavior).
  *
  * @a adm_access is an access baton, with a write lock, for @a path.
@@ -2729,7 +2801,7 @@
                                        svn_boolean_t resolve_text,
                                        svn_boolean_t resolve_props,
                                        svn_depth_t depth,
-                                       svn_wc_conflict_result_t conflict_result,
+                                       svn_wc_conflict_choice_t conflict_choice,
                                        svn_wc_notify_func2_t notify_func,
                                        void *notify_baton,
                                        svn_cancel_func_t cancel_func,
Index: subversion/include/svn_client.h
===================================================================
--- subversion/include/svn_client.h	(revision 27157)
+++ subversion/include/svn_client.h	(working copy)
@@ -2711,11 +2711,11 @@
  * if any); if @c svn_depth_infinity, resolve @a path and every
  * conflicted file or directory anywhere beneath it.
  *
- * If @a conflict_result is svn_wc_conflict_result_choose_base, resolve the
+ * If @a conflict_choice is svn_wc_conflict_choose_base, resolve the
  * conflict with the old file contents; if
- * svn_wc_conflict_result_choose_user, use the original working contents;
- * if svn_wc_conflict_result_choose_theirs, the new contents; and if
- * svn_wc_conflict_result_choose_merged, don't change the contents at all,
+ * svn_wc_conflict_choose_mine, use the original working contents;
+ * if svn_wc_conflict_choose_theirs, the new contents; and if
+ * svn_wc_conflict_choose_merged, don't change the contents at all,
  * just remove the conflict status (i.e. pre-1.5 behavior).
  *
  * If @a path is not in a state of conflict to begin with, do nothing.
@@ -2727,7 +2727,7 @@
 svn_error_t *
 svn_client_resolved2(const char *path,
                      svn_depth_t depth,
-                     svn_wc_conflict_result_t conflict_result,
+                     svn_wc_conflict_choice_t conflict_choice,
                      svn_client_ctx_t *ctx,
                      apr_pool_t *pool);
 
Index: subversion/libsvn_wc/merge.c
===================================================================
--- subversion/libsvn_wc/merge.c	(revision 27157)
+++ subversion/libsvn_wc/merge.c	(working copy)
@@ -403,12 +403,12 @@
              up the conflict before we mark the file 'conflicted' */
           if (conflict_func)
             {
-              svn_wc_conflict_result_t result =
-                svn_wc_conflict_result_conflicted;
+              svn_wc_conflict_result_t *result = NULL;
               svn_wc_conflict_description_t cdesc;
 
               cdesc.path = merge_target;
               cdesc.node_kind = svn_node_file;
+              cdesc.kind = svn_wc_conflict_kind_text;
               cdesc.is_binary = FALSE;
               cdesc.mime_type = (mimeprop && mimeprop->value)
                                   ? mimeprop->value->data : NULL;
@@ -419,13 +419,26 @@
               cdesc.their_file = right;
               cdesc.my_file = tmp_target;
               cdesc.merged_file = result_target;
+              cdesc.propname = NULL;
+              cdesc.base_propvalue = NULL;
+              cdesc.their_propvalue = NULL;
+              cdesc.my_propvalue = NULL;
 
               SVN_ERR(conflict_func(&result, &cdesc, conflict_baton, pool));
-              switch (result)
+              if (result == NULL)
                 {
+                  /* If we were harsh, we'd throw an error here.
+                     Instead, we'll just pretend they want to postpone
+                     the conflict resolution. */
+                  result = svn_wc_create_conflict_result(
+                               svn_wc_conflict_choose_postpone, NULL, pool);
+                }
+
+              switch (result->choice)
+                {
                   /* If the callback wants to use one of the fulltexts
                      to resolve the conflict, so be it.*/
-                  case svn_wc_conflict_result_choose_base:
+                  case svn_wc_conflict_choose_base:
                     {
                       SVN_ERR(svn_wc__loggy_copy
                               (log_accum, NULL, adm_access,
@@ -436,7 +449,7 @@
                       contains_conflicts = FALSE;
                       goto merge_complete;
                     }
-                  case svn_wc_conflict_result_choose_theirs:
+                  case svn_wc_conflict_choose_theirs:
                     {
                       SVN_ERR(svn_wc__loggy_copy
                               (log_accum, NULL, adm_access,
@@ -447,7 +460,7 @@
                       contains_conflicts = FALSE;
                       goto merge_complete;
                     }
-                  case svn_wc_conflict_result_choose_mine:
+                  case svn_wc_conflict_choose_mine:
                     {
                       /* Do nothing to merge_target, let it live untouched! */
                       *merge_outcome = svn_wc_merge_merged;
@@ -461,8 +474,7 @@
                        resolved" the situation, we still interpret
                        that as "OK, we'll assume the merged version is
                        good to use". */
-                  case svn_wc_conflict_result_resolved:
-                  case svn_wc_conflict_result_choose_merged:
+                  case svn_wc_conflict_choose_merged:
                     {
                       SVN_ERR(svn_wc__loggy_copy
                               (log_accum, NULL, adm_access,
@@ -473,6 +485,7 @@
                       contains_conflicts = FALSE;
                       goto merge_complete;
                     }
+                  case svn_wc_conflict_choose_postpone:
                   default:
                     {
                       /* Assume conflict remains, fall through to code below. */
@@ -635,12 +648,12 @@
          up the conflict before we mark the file 'conflicted' */
       if (conflict_func)
         {
-          svn_wc_conflict_result_t result =
-            svn_wc_conflict_result_conflicted;
+          svn_wc_conflict_result_t *result = NULL;
           svn_wc_conflict_description_t cdesc;
 
           cdesc.path = merge_target;
           cdesc.node_kind = svn_node_file;
+          cdesc.kind = svn_wc_conflict_kind_text;
           cdesc.is_binary = TRUE;
           cdesc.mime_type = (mimeprop && mimeprop->value)
                                 ? mimeprop->value->data : NULL;
@@ -651,14 +664,27 @@
           cdesc.their_file = right;
           cdesc.my_file = tmp_target;
           cdesc.merged_file = NULL;     /* notice there is NO merged file! */
+          cdesc.propname = NULL;
+          cdesc.base_propvalue = NULL;
+          cdesc.their_propvalue = NULL;
+          cdesc.my_propvalue = NULL;
 
           SVN_ERR(conflict_func(&result, &cdesc, conflict_baton, pool));
-          switch (result)
+          if (result == NULL)
             {
+              /* If we were harsh, we'd throw an error here.
+                 Instead, we'll just pretend they want to postpone
+                 the conflict resolution. */
+              result = svn_wc_create_conflict_result(
+                               svn_wc_conflict_choose_postpone, NULL, pool);
+            }
+
+          switch (result->choice)
+            {
               /* For a binary file, there's no merged file to look at.
                  Two reasonable responses are to choose the base or
                  repos versions of the file. */
-              case svn_wc_conflict_result_choose_base:
+              case svn_wc_conflict_choose_base:
                 {
                   SVN_ERR(svn_wc__loggy_copy
                           (log_accum, NULL, adm_access,
@@ -669,7 +695,7 @@
                   contains_conflicts = FALSE;
                   goto merge_complete;
                 }
-              case svn_wc_conflict_result_choose_theirs:
+              case svn_wc_conflict_choose_theirs:
                 {
                   SVN_ERR(svn_wc__loggy_copy
                           (log_accum, NULL, adm_access,
@@ -684,13 +710,13 @@
                    user's file, we do nothing.  We also do nothing if
                    the response claims to have already resolved the
                    problem.*/
-              case svn_wc_conflict_result_resolved:
-              case svn_wc_conflict_result_choose_mine:
+              case svn_wc_conflict_choose_mine:
                 {
                   *merge_outcome = svn_wc_merge_merged;
                   contains_conflicts = FALSE;
                   goto merge_complete;
                 }
+              case svn_wc_conflict_choose_postpone:
               default:
                 {
                   /* Assume conflict remains, fall through to code below. */
@@ -864,3 +890,20 @@
                        dry_run, diff3_cmd, NULL, NULL, NULL,
                        NULL, pool);
 }
+
+
+
+/* Constructor for the result-structure returned by conflict callbacks. */
+svn_wc_conflict_result_t *
+svn_wc_create_conflict_result(svn_wc_conflict_choice_t choice,
+                              svn_string_t *merged_propvalue,
+                              apr_pool_t *pool)
+{
+  svn_wc_conflict_result_t *result = apr_pcalloc(pool, sizeof(*result));
+  result->choice = choice;
+  result->merged_propvalue = merged_propvalue;
+
+  /* If we add more fields to svn_wc_conflict_result_t, add them here. */
+
+  return result;
+}
Index: subversion/libsvn_wc/adm_crawler.c
===================================================================
--- subversion/libsvn_wc/adm_crawler.c	(revision 27157)
+++ subversion/libsvn_wc/adm_crawler.c	(working copy)
@@ -89,7 +89,7 @@
   /* Remove any text conflict */
   SVN_ERR(svn_wc_resolved_conflict3(file_path, adm_access, TRUE, FALSE,
                                     svn_depth_empty,
-                                    svn_wc_conflict_result_choose_merged,
+                                    svn_wc_conflict_choose_merged,
                                     NULL, NULL, NULL, NULL, pool));
 
   if (use_commit_times)
Index: subversion/libsvn_wc/adm_ops.c
===================================================================
--- subversion/libsvn_wc/adm_ops.c	(revision 27157)
+++ subversion/libsvn_wc/adm_ops.c	(working copy)
@@ -2546,11 +2546,11 @@
 
 /* Conflict resolution involves removing the conflict files, if they exist,
    and clearing the conflict filenames from the entry.  The latter needs to
-   be done whether or not the conflict files exist.  If @a conflict_result
-   is svn_wc_conflict_result_choose_base, resolve the conflict with the old
-   file contents; if svn_wc_conflict_result_choose_user, use the original
-   working contents; if svn_wc_conflict_result_choose_theirs, the new
-   contents; and if svn_wc_conflict_result_choose_merged, don't change the
+   be done whether or not the conflict files exist.  If @a conflict_choice
+   is svn_wc_conflict_choose_base, resolve the conflict with the old
+   file contents; if svn_wc_conflict_choose_mine, use the original
+   working contents; if svn_wc_conflict_choose_theirs, the new
+   contents; and if svn_wc_conflict_choose_merged, don't change the
    contents at all, just remove the conflict status (i.e. pre-1.5 behavior).
 
    @since 1.5 Automatic Conflict Resolution (Issue 2784)
@@ -2566,7 +2566,7 @@
                           const char *base_name,
                           svn_boolean_t resolve_text,
                           svn_boolean_t resolve_props,
-                          svn_wc_conflict_result_t conflict_result,
+                          svn_wc_conflict_choice_t conflict_choice,
                           svn_wc_notify_func2_t notify_func,
                           void *notify_baton,
                           apr_pool_t *pool)
@@ -2578,18 +2578,18 @@
 
   /* Handle automatic conflict resolution before the temporary files are
    * deleted, if necessary. */
-  switch (conflict_result)
+  switch (conflict_choice)
     {
-    case svn_wc_conflict_result_choose_base:
+    case svn_wc_conflict_choose_base:
       auto_resolve_src = entry->conflict_old;
       break;
-    case svn_wc_conflict_result_choose_mine:
+    case svn_wc_conflict_choose_mine:
       auto_resolve_src = entry->conflict_wrk;
       break;
-    case svn_wc_conflict_result_choose_theirs:
+    case svn_wc_conflict_choose_theirs:
       auto_resolve_src = entry->conflict_new;
       break;
-    case svn_wc_conflict_result_choose_merged:
+    case svn_wc_conflict_choose_merged:
       auto_resolve_src = NULL;
       break;
     default:
@@ -2678,7 +2678,7 @@
   /* TRUE if property conflicts are to be resolved. */
   svn_boolean_t resolve_props;
   /* The type of automatic conflict resolution to perform */
-  svn_wc_conflict_result_t conflict_result;
+  svn_wc_conflict_choice_t conflict_choice;
   /* An access baton for the tree, with write access */
   svn_wc_adm_access_t *adm_access;
   /* Notification function and baton */
@@ -2713,7 +2713,7 @@
 
   return resolve_conflict_on_entry(path, entry, adm_access, base_name,
                                    baton->resolve_text, baton->resolve_props,
-                                   baton->conflict_result, baton->notify_func,
+                                   baton->conflict_choice, baton->notify_func,
                                    baton->notify_baton, pool);
 }
 
@@ -2762,7 +2762,7 @@
 {
   return svn_wc_resolved_conflict3(path, adm_access, resolve_text,
                                    resolve_props, recurse,
-                                   svn_wc_conflict_result_choose_merged,
+                                   svn_wc_conflict_choose_merged,
                                    notify_func, notify_baton, cancel_func,
                                    cancel_baton, pool);
 }
@@ -2773,7 +2773,7 @@
                           svn_boolean_t resolve_text,
                           svn_boolean_t resolve_props,
                           svn_depth_t depth,
-                          svn_wc_conflict_result_t conflict_result,
+                          svn_wc_conflict_choice_t conflict_choice,
                           svn_wc_notify_func2_t notify_func,
                           void *notify_baton,
                           svn_cancel_func_t cancel_func,
@@ -2787,7 +2787,7 @@
   baton->adm_access = adm_access;
   baton->notify_func = notify_func;
   baton->notify_baton = notify_baton;
-  baton->conflict_result = conflict_result;
+  baton->conflict_choice = conflict_choice;
 
   if (depth == svn_depth_empty)
     {
Index: subversion/libsvn_client/merge.c
===================================================================
--- subversion/libsvn_client/merge.c	(revision 27157)
+++ subversion/libsvn_client/merge.c	(working copy)
@@ -306,7 +306,7 @@
    We keep a record of paths which remain in conflict after any
    resolution attempt from BATON->wrapped_func. */
 static svn_error_t *
-conflict_resolver(svn_wc_conflict_result_t *result,
+conflict_resolver(svn_wc_conflict_result_t **result,
                   const svn_wc_conflict_description_t *description,
                   void *baton, apr_pool_t *pool)
 {
@@ -320,7 +320,7 @@
     err = SVN_NO_ERROR;
 
   /* Keep a record of paths still in conflict after the resolution attempt. */
-  if (*result == svn_wc_conflict_result_conflicted)
+  if ((*result)->choice == svn_wc_conflict_choose_postpone)
     {
       const char *conflicted_path = apr_pstrdup(conflict_b->pool,
                                                 description->path);
Index: subversion/libsvn_client/resolved.c
===================================================================
--- subversion/libsvn_client/resolved.c	(revision 27157)
+++ subversion/libsvn_client/resolved.c	(working copy)
@@ -40,13 +40,13 @@
 {
   svn_depth_t depth = (recursive ? svn_depth_infinity : svn_depth_empty);
   return svn_client_resolved2(path, depth,
-                              svn_wc_conflict_result_choose_merged, ctx, pool);
+                              svn_wc_conflict_choose_merged, ctx, pool);
 }
 
 svn_error_t *
 svn_client_resolved2(const char *path,
                      svn_depth_t depth,
-                     svn_wc_conflict_result_t conflict_result,
+                     svn_wc_conflict_choice_t conflict_choice,
                      svn_client_ctx_t *ctx,
                      apr_pool_t *pool)
 {
@@ -62,7 +62,7 @@
                                  pool));
 
   SVN_ERR(svn_wc_resolved_conflict3(path, adm_access, TRUE, TRUE, depth,
-                                    conflict_result,
+                                    conflict_choice,
                                     ctx->notify_func2, ctx->notify_baton2,
                                     ctx->cancel_func, ctx->cancel_baton,
                                     pool));
Index: subversion/svn/cl.h
===================================================================
--- subversion/svn/cl.h	(revision 27157)
+++ subversion/svn/cl.h	(working copy)
@@ -313,7 +313,7 @@
 /* A mindless implementation of svn_wc_conflict_resolver_func_t that
  * does absolutely nothing to resolve conflicts. */
 svn_error_t *
-svn_cl__ignore_conflicts(svn_wc_conflict_result_t *result,
+svn_cl__ignore_conflicts(svn_wc_conflict_result_t **result,
                          const svn_wc_conflict_description_t *description,
                          void *baton,
                          apr_pool_t *pool);
@@ -322,7 +322,7 @@
    one of the 3 fulltexts, edit the merged file on the spot, or just
    skip the conflict (to be resolved later). */
 svn_error_t *
-svn_cl__conflict_handler(svn_wc_conflict_result_t *result,
+svn_cl__conflict_handler(svn_wc_conflict_result_t **result,
                          const svn_wc_conflict_description_t *desc,
                          void *baton,
                          apr_pool_t *pool);
Index: subversion/svn/resolved-cmd.c
===================================================================
--- subversion/svn/resolved-cmd.c	(revision 27157)
+++ subversion/svn/resolved-cmd.c	(working copy)
@@ -43,7 +43,7 @@
 {
   svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
   svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
-  svn_wc_conflict_result_t conflict_result;
+  svn_wc_conflict_choice_t conflict_choice;
   svn_error_t *err;
   apr_array_header_t *targets;
   int i;
@@ -52,16 +52,16 @@
   switch (opt_state->accept_which)
     {
     case svn_cl__accept_invalid:
-      conflict_result = svn_wc_conflict_result_choose_merged;
+      conflict_choice = svn_wc_conflict_choose_merged;
       break;
     case svn_cl__accept_base:
-      conflict_result = svn_wc_conflict_result_choose_base;
+      conflict_choice = svn_wc_conflict_choose_base;
       break;
     case svn_cl__accept_theirs:
-      conflict_result = svn_wc_conflict_result_choose_theirs;
+      conflict_choice = svn_wc_conflict_choose_theirs;
       break;
     case svn_cl__accept_mine:
-      conflict_result = svn_wc_conflict_result_choose_mine;
+      conflict_choice = svn_wc_conflict_choose_mine;
       break;
     default:
       return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
@@ -87,7 +87,7 @@
       svn_pool_clear(subpool);
       SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
       err = svn_client_resolved2(target,
-                                 opt_state->depth, conflict_result,
+                                 opt_state->depth, conflict_choice,
                                  ctx,
                                  subpool);
       if (err)
Index: subversion/svn/conflict-callbacks.c
===================================================================
--- subversion/svn/conflict-callbacks.c	(revision 27157)
+++ subversion/svn/conflict-callbacks.c	(working copy)
@@ -74,99 +74,19 @@
 }
 
 
-/* Utility to print a full description of the conflict. */
-static svn_error_t *
-print_conflict_description(const svn_wc_conflict_description_t *desc,
-                           apr_pool_t *pool)
-{
-  SVN_ERR(svn_cmdline_printf(pool, _("Path: %s\n"), desc->path));
-  switch (desc->node_kind)
-  {
-    case svn_node_file:
-      SVN_ERR(svn_cmdline_printf(pool, _("Node kind: file\n")));
-      SVN_ERR(svn_cmdline_printf(pool, _("Binary file?: %s\n"),
-                                 desc->is_binary ? "yes" : "no"));
-      if (desc->mime_type)
-        SVN_ERR(svn_cmdline_printf(pool, _("Mime-type: %s"),
-                                   desc->mime_type));
-      break;
-    case svn_node_dir:
-      SVN_ERR(svn_cmdline_printf(pool, _("Node kind: directory\n")));
-      break;
-    default:
-      SVN_ERR(svn_cmdline_printf(pool, _("Node kind: unknown\n")));
-  }
-
-  switch (desc->action)
-  {
-    case svn_wc_conflict_action_edit:
-      SVN_ERR(svn_cmdline_printf(pool, _("Attempting to edit object.\n")));
-      break;
-    case svn_wc_conflict_action_add:
-      SVN_ERR(svn_cmdline_printf(pool, _("Attempting to add object.\n")));
-      break;
-    case svn_wc_conflict_action_delete:
-      SVN_ERR(svn_cmdline_printf(pool, _("Attempting to delete object.\n")));
-      break;
-    default:
-      SVN_ERR(svn_cmdline_printf(pool, _("No action specified!\n")));
-      break;
-  }
-
-  SVN_ERR(svn_cmdline_printf(pool, _("But:  ")));
-  switch (desc->reason)
-  {
-    case svn_wc_conflict_reason_edited:
-      SVN_ERR(svn_cmdline_printf(pool,
-                                _("existing object has conflicting edits.\n")));
-      break;
-    case svn_wc_conflict_reason_obstructed:
-      SVN_ERR(svn_cmdline_printf(pool, _("existing object is in the way.\n")));
-      break;
-    case svn_wc_conflict_reason_deleted:
-      SVN_ERR(svn_cmdline_printf(pool, _("existing object is deleted.\n")));
-      break;
-    case svn_wc_conflict_reason_missing:
-      SVN_ERR(svn_cmdline_printf(pool, _("existing object is missing.\n")));
-      break;
-    case svn_wc_conflict_reason_unversioned:
-      SVN_ERR(svn_cmdline_printf(pool, _("existing object is unversioned.\n")));
-      break;
-   default:
-      SVN_ERR(svn_cmdline_printf(pool, _("No reason specified!\n")));
-      break;
-  }
-
-  if (desc->base_file)
-    SVN_ERR(svn_cmdline_printf(pool, _("  Base file: %s\n"),
-                               desc->base_file));
-  if (desc->their_file)
-    SVN_ERR(svn_cmdline_printf(pool, _("  Their file: %s\n"),
-                               desc->their_file));
-  if (desc->my_file)
-    SVN_ERR(svn_cmdline_printf(pool, _("  My file: %s\n"),
-                               desc->my_file));
-  if (desc->merged_file)
-    SVN_ERR(svn_cmdline_printf(pool, _("  File with conflict markers: %s\n"),
-                               desc->merged_file));
-
-  return SVN_NO_ERROR;
-}
-
-
 /* A conflict callback which does nothing; useful for debugging and/or
    printing a description of the conflict. */
 svn_error_t *
-svn_cl__ignore_conflicts(svn_wc_conflict_result_t *result,
+svn_cl__ignore_conflicts(svn_wc_conflict_result_t **result,
                          const svn_wc_conflict_description_t *description,
                          void *baton,
                          apr_pool_t *pool)
 {
   SVN_ERR(svn_cmdline_printf(pool, _("Discovered a conflict.\n\n")));
-  SVN_ERR(print_conflict_description(description, pool));
   SVN_ERR(svn_cmdline_printf(pool, "\n\n"));
 
-  *result = svn_wc_conflict_result_conflicted; /* conflict remains. */
+  *result = svn_wc_create_conflict_result(svn_wc_conflict_choose_postpone,
+                                          NULL, pool);
   return SVN_NO_ERROR;
 }
 
@@ -174,7 +94,7 @@
 /* Implement svn_wc_conflict_resolver_func_t; resolves based on
    --accept option if given, else by prompting. */
 svn_error_t *
-svn_cl__conflict_handler(svn_wc_conflict_result_t *result,
+svn_cl__conflict_handler(svn_wc_conflict_result_t **result,
                          const svn_wc_conflict_description_t *desc,
                          void *baton,
                          apr_pool_t *pool)
@@ -183,29 +103,37 @@
   svn_error_t *err;
   apr_pool_t *subpool;
 
+  /* Start out assuming we're going to postpone the conflict. */
+  *result = svn_wc_create_conflict_result(svn_wc_conflict_choose_postpone,
+                                          NULL, pool);
+
+  /* We don't deal with property conflicts yet, just postpone such. */
+  if (desc->kind == svn_wc_conflict_kind_property)
+    return SVN_NO_ERROR;
+
   switch (b->accept_which)
     {
     case svn_cl__accept_invalid:
       /* No --accept option, fall through to prompting. */
       break;
     case svn_cl__accept_postpone:
-      *result = svn_wc_conflict_result_conflicted;
+      (*result)->choice = svn_wc_conflict_choose_postpone;
       return SVN_NO_ERROR;
     case svn_cl__accept_base:
-      *result = svn_wc_conflict_result_choose_base;
+      (*result)->choice = svn_wc_conflict_choose_base;
       return SVN_NO_ERROR;
     case svn_cl__accept_mine:
-      *result = svn_wc_conflict_result_choose_mine;
+      (*result)->choice = svn_wc_conflict_choose_mine;
       return SVN_NO_ERROR;
     case svn_cl__accept_theirs:
-      *result = svn_wc_conflict_result_choose_theirs;
+      (*result)->choice = svn_wc_conflict_choose_theirs;
       return SVN_NO_ERROR;
     case svn_cl__accept_edit:
       if (desc->merged_file)
         {
           if (b->external_failed)
             {
-              *result = svn_wc_conflict_result_conflicted;
+              (*result)->choice = svn_wc_conflict_choose_postpone;
               return SVN_NO_ERROR;
             }
 
@@ -231,7 +159,7 @@
             }
           else if (err)
             return err;
-          *result = svn_wc_conflict_result_choose_merged;
+          (*result)->choice = svn_wc_conflict_choose_merged;
           return SVN_NO_ERROR;
         }
       /* else, fall through to prompting. */
@@ -242,7 +170,7 @@
         {
           if (b->external_failed)
             {
-              *result = svn_wc_conflict_result_conflicted;
+              (*result)->choice = svn_wc_conflict_choose_postpone;
               return SVN_NO_ERROR;
             }
 
@@ -270,7 +198,7 @@
             }
           else if (err)
             return err;
-          *result = svn_wc_conflict_result_choose_merged;
+          (*result)->choice = svn_wc_conflict_choose_merged;
           return SVN_NO_ERROR;
         }
       /* else, fall through to prompting. */
@@ -323,17 +251,17 @@
           if (strcmp(answer, "p") == 0)
             {
               /* Do nothing, let file be marked conflicted. */
-              *result = svn_wc_conflict_result_conflicted;
+              (*result)->choice = svn_wc_conflict_choose_postpone;
               break;
             }
           if (strcmp(answer, "m") == 0)
             {
-              *result = svn_wc_conflict_result_choose_mine;
+              (*result)->choice = svn_wc_conflict_choose_mine;
               break;
             }
           if (strcmp(answer, "t") == 0)
             {
-              *result = svn_wc_conflict_result_choose_theirs;
+              (*result)->choice = svn_wc_conflict_choose_theirs;
               break;
             }
           if (strcmp(answer, "d") == 0)
@@ -432,7 +360,7 @@
                  the diff. */
               if (performed_edit)
                 {
-                  *result = svn_wc_conflict_result_choose_merged;
+                  (*result)->choice = svn_wc_conflict_choose_merged;
                   break;
                 }
               else
@@ -488,17 +416,17 @@
             }
           if (strcmp(answer, "p") == 0)
             {
-              *result = svn_wc_conflict_result_conflicted;
+              (*result)->choice = svn_wc_conflict_choose_postpone;
               break;
             }
           if (strcmp(answer, "m") == 0)
             {
-              *result = svn_wc_conflict_result_choose_mine;
+              (*result)->choice = svn_wc_conflict_choose_mine;
               break;
             }
           if (strcmp(answer, "t") == 0)
             {
-              *result = svn_wc_conflict_result_choose_theirs;
+              (*result)->choice = svn_wc_conflict_choose_theirs;
               break;
             }
         }
@@ -506,7 +434,7 @@
 
   else /* other types of conflicts -- do nothing about them. */
     {
-      *result = svn_wc_conflict_result_conflicted;
+      (*result)->choice = svn_wc_conflict_choose_postpone;
     }
 
   svn_pool_destroy(subpool);
