Author: rhuijben
Date: Mon Jan 21 22:55:45 2013
New Revision: 1436677
URL: http://svn.apache.org/viewvc?rev=1436677&view=rev
Log:
Drive the merge handling based on the source type instead of the target type,
to avoid nasty ra errors and to properly handle merge conflicts when applying
the changes from (src1:src2) upon the specified target.
We document merge as applying the diff between two locations to the target and
this patch makes sure we drive the diff that way.
* subversion/libsvn_client/merge.c
(do_merge): Drive merge based on source type, instead of based on target
type.
* subversion/tests/cmdline/merge_tests.py
(merge_target_selection): Update expected results when using invalid targets.
Modified:
subversion/trunk/subversion/libsvn_client/merge.c
subversion/trunk/subversion/tests/cmdline/merge_tests.py
Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1436677&r1=1436676&r2=1436677&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Mon Jan 21 22:55:45 2013
@@ -9031,6 +9031,7 @@ do_merge(apr_hash_t **modified_subtrees,
for (i = 0; i < merge_sources->nelts; i++)
{
+ svn_node_kind_t src1_kind;
merge_source_t *source =
APR_ARRAY_IDX(merge_sources, i, merge_source_t *);
@@ -9073,8 +9074,11 @@ do_merge(apr_hash_t **modified_subtrees,
checked_mergeinfo_capability = TRUE;
}
- /* Call our merge helpers based on TARGET's kind. */
- if (target->kind == svn_node_file)
+ SVN_ERR(svn_ra_check_path(ra_session1, "", source->loc1->rev,
+ &src1_kind, iterpool));
+
+ /* Call our merge helpers based on SRC1's kind. */
+ if (src1_kind != svn_node_dir)
{
SVN_ERR(do_file_merge(result_catalog,
source, target->abspath,
@@ -9083,7 +9087,7 @@ do_merge(apr_hash_t **modified_subtrees,
¬ify_baton,
&merge_cmd_baton, iterpool));
}
- else if (target->kind == svn_node_dir)
+ else /* Directory */
{
/* If conflicts occur while merging any but the very last
* revision range we want an error to be raised that aborts
Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=1436677&r1=1436676&r2=1436677&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Mon Jan 21
22:55:45 2013
@@ -18061,23 +18061,31 @@ def merge_target_selection(sbox):
'--- Recording mergeinfo for merge of r4 into \'binary-file\':\n',
' U binary-file\n',
]
- svntest.actions.run_and_verify_svn(None, None, [],
+ svntest.actions.run_and_verify_svn(None, expected_output, [],
'merge', '^/dir/binary-file', '-c', '4',
'binary-file')
svntest.main.run_svn(None, 'revert', '-R', '.')
# Merge the file (wrong target)
- expected_error = 'svn: E160005: Cannot replace a directory from within'
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ expected_output = [
+ 'Skipped missing target: \'.\'\n',
+ 'Summary of conflicts:\n',
+ ' Skipped paths: 1\n',
+ ]
+ svntest.actions.run_and_verify_svn(None, expected_output, [],
'merge', '^/dir/binary-file', '-c', '4',
'.')
svntest.main.run_svn(None, 'revert', '-R', '.')
# Merge the dir (wrong target)
- expected_error = 'svn: E160017: (.* is not a file|' + \
- 'Attempted to get checksum.*|' + \
- '.* of a directory)'
- svntest.actions.run_and_verify_svn(None, None, expected_error,
+ expected_output = [
+ 'Skipped \'%s\'\n' % os.path.join('binary-file', 'binary-file'),
+ '--- Recording mergeinfo for merge of r4 into \'binary-file\':\n',
+ ' U binary-file\n',
+ 'Summary of conflicts:\n',
+ ' Skipped paths: 1\n',
+ ]
+ svntest.actions.run_and_verify_svn(None, expected_output, [],
'merge', '^/dir', '-c', '4',
'binary-file')