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");
}