You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2013/01/30 15:27:43 UTC
svn commit: r1440432 - /subversion/trunk/subversion/libsvn_client/merge.c
Author: rhuijben
Date: Wed Jan 30 14:27:42 2013
New Revision: 1440432
URL: http://svn.apache.org/viewvc?rev=1440432&view=rev
Log:
Make the single file merge code use the diff processor instead of calling
the implementation directly.
* subversion/libsvn_client/merge.c
(do_file_merge): Call the diff processor instead of calling the
implementation directly.
Modified:
subversion/trunk/subversion/libsvn_client/merge.c
Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1440432&r1=1440431&r2=1440432&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Wed Jan 30 14:27:42 2013
@@ -6924,14 +6924,10 @@ do_file_merge(svn_mergeinfo_catalog_t re
svn_merge_range_t *r = APR_ARRAY_IDX(ranges_to_merge, i,
svn_merge_range_t *);
const merge_source_t *real_source;
- const char *tmpfile1, *tmpfile2;
- apr_hash_t *props1, *props2;
- svn_string_t *pval;
- const char *mimetype1, *mimetype2;
- apr_array_header_t *propchanges;
- svn_wc_notify_state_t prop_state = svn_wc_notify_state_inapplicable;
- svn_wc_notify_state_t text_state = svn_wc_notify_state_inapplicable;
- svn_boolean_t tree_conflicted = FALSE;
+ const char *left_file, *right_file;
+ apr_hash_t *left_props, *right_props;
+ const svn_diff_source_t *left_source;
+ const svn_diff_source_t *right_source;
svn_pool_clear(iterpool);
@@ -6943,63 +6939,101 @@ do_file_merge(svn_mergeinfo_catalog_t re
real_source = subrange_source(source, r->start, r->end, iterpool);
else
real_source = source;
- SVN_ERR(single_file_merge_get_file(&tmpfile1, &props1,
+ SVN_ERR(single_file_merge_get_file(&left_file, &left_props,
merge_b->ra_session1,
real_source->loc1,
target_abspath,
iterpool, iterpool));
- SVN_ERR(single_file_merge_get_file(&tmpfile2, &props2,
+ SVN_ERR(single_file_merge_get_file(&right_file, &right_props,
merge_b->ra_session2,
real_source->loc2,
target_abspath,
iterpool, iterpool));
+ /* Calculate sources for the diff processor */
+ left_source = svn_diff__source_create(r->start, iterpool);
+ right_source = svn_diff__source_create(r->end, iterpool);
- /* Discover any svn:mime-type values in the proplists */
- pval = apr_hash_get(props1, SVN_PROP_MIME_TYPE,
- strlen(SVN_PROP_MIME_TYPE));
- mimetype1 = pval ? pval->data : NULL;
-
- pval = apr_hash_get(props2, SVN_PROP_MIME_TYPE,
- strlen(SVN_PROP_MIME_TYPE));
- mimetype2 = pval ? pval->data : NULL;
-
- /* Deduce property diffs. */
- SVN_ERR(svn_prop_diffs(&propchanges, props2, props1, iterpool));
/* If the sources are related or we're ignoring ancestry in diffs,
do a text-n-props merge; otherwise, do a delete-n-add merge. */
if (! (merge_b->diff_ignore_ancestry || sources_related))
{
+ void *file_baton;
+ svn_boolean_t skip;
+
/* Delete... */
- SVN_ERR(merge_file_deleted(&text_state,
- &tree_conflicted,
- target_relpath,
- tmpfile1, tmpfile2,
- mimetype1, mimetype2,
- props1,
- merge_b, iterpool));
+ file_baton = NULL;
+ skip = FALSE;
+ SVN_ERR(processor->file_opened(&file_baton, &skip, target_relpath,
+ left_source,
+ NULL /* right_source */,
+ NULL /* copyfrom_source */,
+ NULL /* dir_baton */,
+ processor,
+ iterpool, iterpool));
+ if (! skip)
+ SVN_ERR(processor->file_deleted(target_relpath,
+ left_source,
+ left_file,
+ left_props,
+ file_baton,
+ processor,
+ iterpool));
+
/* ...plus add... */
- SVN_ERR(merge_file_added(&text_state, &prop_state,
- &tree_conflicted,
- target_relpath,
- tmpfile1, tmpfile2,
- r->start, r->end,
- mimetype1, mimetype2,
- NULL, SVN_INVALID_REVNUM,
- propchanges, props1,
- merge_b, iterpool));
+ file_baton = NULL;
+ skip = FALSE;
+ SVN_ERR(processor->file_opened(&file_baton, &skip, target_relpath,
+ NULL /* left_source */,
+ right_source,
+ NULL /* copyfrom_source */,
+ NULL /* dir_baton */,
+ processor,
+ iterpool, iterpool));
+ if (! skip)
+ SVN_ERR(processor->file_added(target_relpath,
+ NULL /* copyfrom_source */,
+ right_source,
+ NULL /* copyfrom_file */,
+ right_file,
+ NULL /* copyfrom_props */,
+ right_props,
+ file_baton,
+ processor,
+ iterpool));
/* ... equals replace. */
}
else
{
- SVN_ERR(merge_file_changed(&text_state, &prop_state,
- &tree_conflicted,
- target_relpath,
- tmpfile1, tmpfile2,
- r->start, r->end,
- mimetype1, mimetype2,
- propchanges, props1,
- merge_b, iterpool));
+ void *file_baton = NULL;
+ svn_boolean_t skip = FALSE;
+ apr_array_header_t *propchanges;
+
+
+ /* Deduce property diffs. */
+ SVN_ERR(svn_prop_diffs(&propchanges, right_props, left_props,
+ iterpool));
+
+ SVN_ERR(processor->file_opened(&file_baton, &skip, target_relpath,
+ left_source,
+ right_source,
+ NULL /* copyfrom_source */,
+ NULL /* dir_baton */,
+ processor,
+ iterpool, iterpool));
+ if (! skip)
+ SVN_ERR(processor->file_changed(target_relpath,
+ left_source,
+ right_source,
+ left_file,
+ right_file,
+ left_props,
+ right_props,
+ TRUE /* file changed */,
+ propchanges,
+ file_baton,
+ processor,
+ iterpool));
}
if ((i < (ranges_to_merge->nelts - 1))