Author: hwright
Date: Wed Apr 27 20:45:04 2011
New Revision: 1097231

URL: http://svn.apache.org/viewvc?rev=1097231&view=rev
Log:
Expand svn_info2_t to contain multiple conflicts for a given node.

* subversion/svn/info-cmd.c
  (print_info_xml, print info): Output all the conflicts received.

* subversion/include/svn_wc.h
  (svn_wc_info_t.conflicts): Make an array of conflicts, rather than just one.

* subversion/libsvn_client/deprecated.c
  (info_from_info2): Handle multiple conflicts in the info2.
 
* subversion/libsvn_client/info.c
  (info_found_node_callback, crawl_entries): Put the tree conflict in the list.

Modified:
    subversion/trunk/subversion/include/svn_wc.h
    subversion/trunk/subversion/libsvn_client/deprecated.c
    subversion/trunk/subversion/libsvn_client/info.c
    subversion/trunk/subversion/svn/info-cmd.c

Modified: subversion/trunk/subversion/include/svn_wc.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=1097231&r1=1097230&r2=1097231&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_wc.h (original)
+++ subversion/trunk/subversion/include/svn_wc.h Wed Apr 27 20:45:04 2011
@@ -3022,8 +3022,9 @@ typedef struct svn_wc_info_t
    */
   svn_filesize_t working_size;
 
-  /** Info on any conflict of which this node is a victim. Otherwise NULL.  */
-  const svn_wc_conflict_description2_t *conflict;
+  /** Array of const svn_wc_conflict_description2_t * which contains info
+   * on any conflict of which this node is a victim. Otherwise NULL.  */
+  const apr_array_header_t *conflicts;
 
   /** The local absolute path of the working copy root.  */
   const char *wcroot_abspath;

Modified: subversion/trunk/subversion/libsvn_client/deprecated.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/deprecated.c?rev=1097231&r1=1097230&r2=1097231&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/deprecated.c (original)
+++ subversion/trunk/subversion/libsvn_client/deprecated.c Wed Apr 27 20:45:04 
2011
@@ -2046,26 +2046,34 @@ info_from_info2(const svn_info2_t *info2
     info->has_wc_info           = FALSE;
 
   /* Populate conflict fields. */
-  if (info2->wc_info && info2->wc_info->conflict)
+  if (info2->wc_info && info2->wc_info->conflicts)
     {
-      const svn_wc_conflict_description2_t *conflict
-                                                = info2->wc_info->conflict;
+      int i;
 
-      switch (conflict->kind)
+      for (i = 0; i < info2->wc_info->conflicts->nelts; i++)
         {
-          case svn_wc_conflict_kind_tree:
-            info->tree_conflict = svn_wc__cd2_to_cd(conflict, pool);
-            break;
-
-          case svn_wc_conflict_kind_text:
-            info->conflict_old = conflict->base_abspath;
-            info->conflict_new = conflict->my_abspath;
-            info->conflict_wrk = conflict->their_abspath;
-            break;
-
-          case svn_wc_conflict_kind_property:
-            info->prejfile = conflict->their_abspath;
-            break;
+          const svn_wc_conflict_description2_t *conflict
+                              = APR_ARRAY_IDX(info2->wc_info->conflicts, i,
+                                    const svn_wc_conflict_description2_t *);
+
+          /* ### Not really sure what we should do if we get multiple
+             ### conflicts of the same type. */
+          switch (conflict->kind)
+            {
+              case svn_wc_conflict_kind_tree:
+                info->tree_conflict = svn_wc__cd2_to_cd(conflict, pool);
+                break;
+
+              case svn_wc_conflict_kind_text:
+                info->conflict_old = conflict->base_abspath;
+                info->conflict_new = conflict->my_abspath;
+                info->conflict_wrk = conflict->their_abspath;
+                break;
+
+              case svn_wc_conflict_kind_property:
+                info->prejfile = conflict->their_abspath;
+                break;
+            }
         }
     }
 

Modified: subversion/trunk/subversion/libsvn_client/info.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/info.c?rev=1097231&r1=1097230&r2=1097231&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/info.c (original)
+++ subversion/trunk/subversion/libsvn_client/info.c Wed Apr 27 20:45:04 2011
@@ -404,7 +404,15 @@ info_found_node_callback(const char *loc
 
   SVN_ERR_ASSERT(info != NULL);
 
-  info->wc_info->conflict = tree_conflict;
+  if (tree_conflict)
+    {
+      info->wc_info->conflicts = apr_array_make(pool, 1,
+                            sizeof(const svn_wc_conflict_description2_t *));
+
+      APR_ARRAY_PUSH(info->wc_info->conflicts,
+                     const svn_wc_conflict_description2_t *) = tree_conflict;
+    }
+
   SVN_ERR(fe_baton->receiver(fe_baton->receiver_baton, local_abspath,
                              info, pool));
   return SVN_NO_ERROR;
@@ -450,7 +458,14 @@ crawl_entries(const char *local_abspath,
           svn_error_clear(err);
 
           SVN_ERR(build_info_for_unversioned(&info, pool));
-          info->wc_info->conflict = tree_conflict;
+          if (tree_conflict)
+            {
+              info->wc_info->conflicts = apr_array_make(pool, 1,
+                            sizeof(const svn_wc_conflict_description2_t *));
+
+              APR_ARRAY_PUSH(info->wc_info->conflicts,
+                     const svn_wc_conflict_description2_t *) = tree_conflict;
+            }
 
           SVN_ERR(svn_wc__node_get_repos_info(&(info->repos_root_URL),
                                               NULL,

Modified: subversion/trunk/subversion/svn/info-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/info-cmd.c?rev=1097231&r1=1097230&r2=1097231&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/info-cmd.c (original)
+++ subversion/trunk/subversion/svn/info-cmd.c Wed Apr 27 20:45:04 2011
@@ -178,49 +178,57 @@ print_info_xml(void *baton,
                                pool);
     }
 
-  if (info->wc_info->conflict)
+  if (info->wc_info && info->wc_info->conflicts)
     {
-      const svn_wc_conflict_description2_t *conflict = info->wc_info->conflict;
-      /* ### Handle multiple conflicts. */
+      int i;
 
-      switch (conflict->kind)
+      for (i = 0; i < info->wc_info->conflicts->nelts; i++)
         {
-          case svn_wc_conflict_kind_text:
-            /* "<conflict>" */
-            svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "conflict", NULL);
-
-            /* "<prev-base-file> xx </prev-base-file>" */
-            svn_cl__xml_tagged_cdata(&sb, pool, "prev-base-file",
-                                     conflict->base_abspath);
-
-            /* "<prev-wc-file> xx </prev-wc-file>" */
-            svn_cl__xml_tagged_cdata(&sb, pool, "prev-wc-file",
-                                     conflict->my_abspath);
-
-            /* "<cur-base-file> xx </cur-base-file>" */
-            svn_cl__xml_tagged_cdata(&sb, pool, "cur-base-file",
-                                     conflict->their_abspath);
+          const svn_wc_conflict_description2_t *conflict =
+                      APR_ARRAY_IDX(info->wc_info->conflicts, i,
+                                    const svn_wc_conflict_description2_t *);
 
-            /* "</conflict>" */
-            svn_xml_make_close_tag(&sb, pool, "conflict");
-          break;
+          switch (conflict->kind)
+            {
+              case svn_wc_conflict_kind_text:
+                /* "<conflict>" */
+                svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "conflict",
+                                      NULL);
+
+                /* "<prev-base-file> xx </prev-base-file>" */
+                svn_cl__xml_tagged_cdata(&sb, pool, "prev-base-file",
+                                         conflict->base_abspath);
+
+                /* "<prev-wc-file> xx </prev-wc-file>" */
+                svn_cl__xml_tagged_cdata(&sb, pool, "prev-wc-file",
+                                         conflict->my_abspath);
+
+                /* "<cur-base-file> xx </cur-base-file>" */
+                svn_cl__xml_tagged_cdata(&sb, pool, "cur-base-file",
+                                         conflict->their_abspath);
 
-          case svn_wc_conflict_kind_property:
-            /* "<conflict>" */
-            svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "conflict", NULL);
+                /* "</conflict>" */
+                svn_xml_make_close_tag(&sb, pool, "conflict");
+              break;
 
-            /* "<prop-file> xx </prop-file>" */
-            svn_cl__xml_tagged_cdata(&sb, pool, "prop-file",
-                                     conflict->their_abspath);
+              case svn_wc_conflict_kind_property:
+                /* "<conflict>" */
+                svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "conflict",
+                                      NULL);
+
+                /* "<prop-file> xx </prop-file>" */
+                svn_cl__xml_tagged_cdata(&sb, pool, "prop-file",
+                                         conflict->their_abspath);
 
-            /* "</conflict>" */
-            svn_xml_make_close_tag(&sb, pool, "conflict");
-          break;
+                /* "</conflict>" */
+                svn_xml_make_close_tag(&sb, pool, "conflict");
+              break;
 
-          case svn_wc_conflict_kind_tree:
-            SVN_ERR(svn_cl__append_tree_conflict_info_xml(sb, conflict,
-                                                          pool));
-          break;
+              case svn_wc_conflict_kind_tree:
+                SVN_ERR(svn_cl__append_tree_conflict_info_xml(sb, conflict,
+                                                              pool));
+              break;
+            }
         }
     }
 
@@ -410,41 +418,76 @@ print_info(void *baton,
         SVN_ERR(svn_cmdline_printf(pool, _("Checksum: %s\n"),
                                    info->wc_info->checksum));
 
-      if (info->wc_info->conflict)
+      if (info->wc_info->conflicts)
         {
-          const svn_wc_conflict_description2_t *conflict =
-                                                    info->wc_info->conflict;
+          int i;
 
-          switch (conflict->kind)
+          for (i = 0; i < info->wc_info->conflicts->nelts; i++)
             {
-              case svn_wc_conflict_kind_text:
-                SVN_ERR(svn_cmdline_printf(pool,
+                const svn_wc_conflict_description2_t *conflict =
+                      APR_ARRAY_IDX(info->wc_info->conflicts, i,
+                                    const svn_wc_conflict_description2_t *);
+                const char *desc;
+                const char *src_left_version;
+                const char *src_right_version;
+
+              switch (conflict->kind)
+                {
+                  case svn_wc_conflict_kind_text:
+                    SVN_ERR(svn_cmdline_printf(pool,
                               _("Conflict Previous Base File: %s\n"),
                               svn_dirent_local_style(conflict->base_abspath,
                                                      pool)));
 
-                SVN_ERR(svn_cmdline_printf(pool,
+                    SVN_ERR(svn_cmdline_printf(pool,
                               _("Conflict Previous Working File: %s\n"),
                               svn_dirent_local_style(conflict->my_abspath,
                                                      pool)));
 
-                SVN_ERR(svn_cmdline_printf(pool,
+                    SVN_ERR(svn_cmdline_printf(pool,
                               _("Conflict Current Base File: %s\n"),
                               svn_dirent_local_style(conflict->their_abspath,
                                                      pool)));
-              break;
+                  break;
 
-              case svn_wc_conflict_kind_property:
-                SVN_ERR(svn_cmdline_printf(pool,
+                  case svn_wc_conflict_kind_property:
+                    SVN_ERR(svn_cmdline_printf(pool,
                               _("Conflict Properties File: %s\n"),
                               svn_dirent_local_style(conflict->their_abspath,
                                                      pool)));
-              break;
+                  break;
 
-              case svn_wc_conflict_kind_tree:
-                /* Tree conflicts are handled farther down. */
-                /* ### Could they be handled here? */
-              break;
+                  case svn_wc_conflict_kind_tree:
+                    SVN_ERR(
+                        svn_cl__get_human_readable_tree_conflict_description(
+                                                    &desc, conflict, pool));
+
+                    src_left_version =
+                          svn_cl__node_description(conflict->src_left_version,
+                                                   info->repos_root_URL, pool);
+
+                    src_right_version =
+                          svn_cl__node_description(conflict->src_right_version,
+                                                   info->repos_root_URL, pool);
+
+                    SVN_ERR(svn_cmdline_printf(pool, "%s: %s\n",
+                                               _("Tree conflict"), desc));
+
+                    if (src_left_version)
+                        SVN_ERR(svn_cmdline_printf(pool, "  %s: %s\n",
+                                   _("Source  left"), /* (1) */
+                                   src_left_version));
+                    /* (1): Sneaking in a space in "Source  left" so that
+                     * it is the same length as "Source right" while it still
+                     * starts in the same column. That's just a tiny tweak in
+                     * the English `svn'. */
+
+                    if (src_right_version)
+                        SVN_ERR(svn_cmdline_printf(pool, "  %s: %s\n",
+                                                   _("Source right"),
+                                                   src_right_version));
+                  break;
+                }
             }
         }
     }
@@ -485,40 +528,6 @@ print_info(void *baton,
     SVN_ERR(svn_cmdline_printf(pool, _("Changelist: %s\n"),
                                info->wc_info->changelist));
 
-  if (info->wc_info && info->wc_info->conflict
-        && info->wc_info->conflict->kind == svn_wc_conflict_kind_tree)
-    {
-      const svn_wc_conflict_description2_t *conflict = info->wc_info->conflict;
-      const char *desc;
-      const char *src_left_version;
-      const char *src_right_version;
-
-      SVN_ERR(svn_cl__get_human_readable_tree_conflict_description(
-                &desc, conflict, pool));
-
-      src_left_version =
-        svn_cl__node_description(conflict->src_left_version,
-                                 info->repos_root_URL, pool);
-
-      src_right_version =
-        svn_cl__node_description(conflict->src_right_version,
-                                 info->repos_root_URL, pool);
-
-      SVN_ERR(svn_cmdline_printf(pool, "%s: %s\n", _("Tree conflict"), desc));
-
-      if (src_left_version)
-        SVN_ERR(svn_cmdline_printf(pool, "  %s: %s\n",
-                                   _("Source  left"), /* (1) */
-                                   src_left_version));
-        /* (1): Sneaking in a space in "Source  left" so that it is the
-         * same length as "Source right" while it still starts in the same
-         * column. That's just a tiny tweak in the English `svn'. */
-
-      if (src_right_version)
-        SVN_ERR(svn_cmdline_printf(pool, "  %s: %s\n", _("Source right"),
-                                   src_right_version));
-    }
-
   /* Print extra newline separator. */
   return svn_cmdline_printf(pool, "\n");
 }


Reply via email to