Author: rhuijben
Date: Mon Jan 21 22:08:56 2013
New Revision: 1436652
URL: http://svn.apache.org/viewvc?rev=1436652&view=rev
Log:
* subversion/svn/merge-cmd.c
(svn_cl__merge): If the user provides an explicit merge target, use it. Until
this patch the '.' was taken as no target provided, and the target might
just
decide to merge into a child instead.
* subversion/tests/cmdline/merge_tests.py
(merge_target_selection): Test target selection handling.
Modified:
subversion/trunk/subversion/svn/merge-cmd.c
subversion/trunk/subversion/tests/cmdline/merge_tests.py
Modified: subversion/trunk/subversion/svn/merge-cmd.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/merge-cmd.c?rev=1436652&r1=1436651&r2=1436652&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/merge-cmd.c (original)
+++ subversion/trunk/subversion/svn/merge-cmd.c Mon Jan 21 22:08:56 2013
@@ -212,6 +212,7 @@ svn_cl__merge(apr_getopt_t *os,
svn_opt_revision_t first_range_start, first_range_end, peg_revision1,
peg_revision2;
apr_array_header_t *options, *ranges_to_merge = opt_state->revision_ranges;
+ svn_boolean_t has_explicit_target = FALSE;
/* Merge doesn't support specifying a revision or revision range
when using --reintegrate. */
@@ -343,6 +344,7 @@ svn_cl__merge(apr_getopt_t *os,
if (targets->nelts == 2)
{
targetpath = APR_ARRAY_IDX(targets, 1, const char *);
+ has_explicit_target = TRUE;
if (svn_path_is_url(targetpath))
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("Cannot specify a revision range "
@@ -378,12 +380,17 @@ svn_cl__merge(apr_getopt_t *os,
/* Decide where to apply the delta (defaulting to "."). */
if (targets->nelts == 3)
- targetpath = APR_ARRAY_IDX(targets, 2, const char *);
+ {
+ targetpath = APR_ARRAY_IDX(targets, 2, const char *);
+ has_explicit_target = TRUE;
+ }
}
/* If no targetpath was specified, see if we can infer it from the
sourcepaths. */
- if (sourcepath1 && sourcepath2 && strcmp(targetpath, "") == 0)
+ if (! has_explicit_target
+ && sourcepath1 && sourcepath2
+ && strcmp(targetpath, "") == 0)
{
/* If the sourcepath is a URL, it can only refer to a target in
the current working directory or which is the current working
Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=1436652&r1=1436651&r2=1436652&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Mon Jan 21
22:08:56 2013
@@ -17993,6 +17993,85 @@ def merge_conflict_when_keywords_removed
' U A2\n']),
[], 'merge', '--accept=postpone', '^/A', 'A2')
+@SkipUnless(server_has_mergeinfo)
+@Issue(4139, 3274, 3503)
+def merge_target_selection(sbox):
+ "merge target selection handling"
+
+ sbox.build()
+
+ # r2
+ sbox.simple_mkdir('dir')
+ sbox.simple_add_text('\1\2\3\4\5', 'dir/binary-file')
+ sbox.simple_add_text('abcde', 'dir/text-file')
+ sbox.simple_commit()
+
+ # r3
+ sbox.simple_copy('dir', 'branch')
+ sbox.simple_commit()
+
+ # r4
+ svntest.main.file_write(sbox.ospath('dir/binary-file'), '\5\4\3\2\1')
+ sbox.simple_commit()
+
+ sbox.simple_update()
+
+ os.chdir(sbox.ospath('branch'))
+
+ # Merge the directory (no target)
+ expected_output = [
+ '--- Merging r4 into \'.\':\n',
+ 'U binary-file\n',
+ '--- Recording mergeinfo for merge of r4 into \'.\':\n',
+ ' U .\n',
+ ]
+ svntest.actions.run_and_verify_svn(None, expected_output, [],
+ 'merge', '^/dir', '-c', '4')
+
+ svntest.main.run_svn(None, 'revert', '-R', '.')
+
+ # Merge the file (no target)
+ expected_output = [
+ '--- Merging r4 into \'binary-file\':\n',
+ 'U binary-file\n',
+ '--- Recording mergeinfo for merge of r4 into \'binary-file\':\n',
+ ' U binary-file\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 directory (explicit target)
+ expected_output = [
+ '--- Merging r4 into \'.\':\n',
+ 'U binary-file\n',
+ '--- Recording mergeinfo for merge of r4 into \'.\':\n',
+ ' U .\n',
+ ]
+ svntest.actions.run_and_verify_svn(None, expected_output, [],
+ 'merge', '^/dir', '-c', '4', '.')
+
+ svntest.main.run_svn(None, 'revert', '-R', '.')
+
+ # Merge the file (explicit target)
+ expected_output = [
+ '--- Merging r4 into \'binary-file\':\n',
+ 'U binary-file\n',
+ '--- Recording mergeinfo for merge of r4 into \'binary-file\':\n',
+ ' U binary-file\n',
+ ]
+ svntest.actions.run_and_verify_svn(None, None, [],
+ '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,
+ 'merge', '^/dir/binary-file', '-c', '4',
'.')
+
+
########################################################################
# Run the tests
@@ -18131,6 +18210,7 @@ test_list = [ None,
merge_with_externals_with_mergeinfo,
merge_binary_file_with_keywords,
merge_conflict_when_keywords_removed,
+ merge_target_selection,
]
if __name__ == '__main__':