You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2013/03/07 01:55:09 UTC
svn commit: r1453635 - in /subversion/trunk/subversion:
libsvn_client/merge.c tests/cmdline/merge_tests.py
Author: pburba
Date: Thu Mar 7 00:55:09 2013
New Revision: 1453635
URL: http://svn.apache.org/r1453635
Log:
Fix issue #4138 'replacement in merge source not notified correctly'.
* subversion/libsvn_client/merge.c
(remove_source_gap): New.
(notify_merge_begin,
record_mergeinfo_for_dir_merge): Remove gap revisions from merge
notifications.
* subversion/tests/cmdline/merge_tests.py
(merge_source_with_replacement): Remove XFail decorator, adjust failure
status comments, and expand test to cover a reverse merge.
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=1453635&r1=1453634&r2=1453635&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Thu Mar 7 00:55:09 2013
@@ -3460,6 +3460,37 @@ notify_merge_completed(const char *targe
|| notify->action == svn_wc_notify_tree_conflict)
+/* Remove merge source gaps from range used for merge notifications.
+ See http://subversion.tigris.org/issues/show_bug.cgi?id=4138
+
+ If IMPLICIT_SRC_GAP is not NULL then it is a rangelist containing a
+ single range (see the implicit_src_gap member of merge_cmd_baton_t).
+ RANGE describes a (possibly reverse) merge.
+
+ If IMPLICIT_SRC_GAP is not NULL and it's sole range intersects with
+ the older revision in *RANGE, then remove IMPLICIT_SRC_GAP's range
+ from *RANGE. */
+static void
+remove_source_gap(svn_merge_range_t *range,
+ apr_array_header_t *implicit_src_gap)
+{
+ if (implicit_src_gap)
+ {
+ svn_merge_range_t *gap_range =
+ APR_ARRAY_IDX(implicit_src_gap, 0, svn_merge_range_t *);
+ if (range->start < range->end)
+ {
+ if (gap_range->start == range->start)
+ range->start = gap_range->end;
+ }
+ else /* Reverse merge */
+ {
+ if (gap_range->start == range->end)
+ range->end = gap_range->end;
+ }
+ }
+}
+
/* Notify that we're starting a merge
*
* This calls the client's notification receiver (as found in the client
@@ -3551,9 +3582,16 @@ notify_merge_begin(merge_cmd_baton_t *me
scratch_pool);
if (SVN_IS_VALID_REVNUM(n_range.start))
- notify->merge_range = &n_range;
+ {
+ /* If the merge source has a gap, then don't mention
+ those gap revisions in the notification. */
+ remove_source_gap(&n_range, merge_b->implicit_src_gap);
+ notify->merge_range = &n_range;
+ }
else
- notify->merge_range = NULL;
+ {
+ notify->merge_range = NULL;
+ }
(*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2, notify,
scratch_pool);
@@ -8313,8 +8351,13 @@ record_mergeinfo_for_dir_merge(svn_merge
continue;
if (!squelch_mergeinfo_notifications)
- notify_mergeinfo_recording(child->abspath, merged_range,
- merge_b->ctx, iterpool);
+ {
+ /* If the merge source has a gap, then don't mention
+ those gap revisions in the notification. */
+ remove_source_gap(&range, merge_b->implicit_src_gap);
+ notify_mergeinfo_recording(child->abspath, &range,
+ merge_b->ctx, iterpool);
+ }
/* If we are here we know we will be recording some mergeinfo, but
before we do, set override mergeinfo on skipped paths so they
Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=1453635&r1=1453634&r2=1453635&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Thu Mar 7 00:55:09 2013
@@ -17447,7 +17447,6 @@ def svnmucc_abuse_1(sbox):
#----------------------------------------------------------------------
# Test for issue #4138 'replacement in merge source not notified correctly'.
@SkipUnless(server_has_mergeinfo)
-@XFail()
@Issue(4138)
def merge_source_with_replacement(sbox):
"replacement in merge source not notified correctly"
@@ -17481,8 +17480,8 @@ def merge_source_with_replacement(sbox):
# Update and sync merge ^/A to A_COPY.
svntest.main.run_svn(None, 'up', wc_dir)
- # This currently fails because the merge notifications make it look like
- # r6 from ^/A was merged and recorded:
+ # This previously failed because the merge notifications make it look
+ # like r6 from ^/A was merged and recorded:
#
# >svn merge ^^/A A_COPY
# --- Merging r2 through r5 into 'A_COPY':
@@ -17495,13 +17494,14 @@ def merge_source_with_replacement(sbox):
# U A_COPY\D\H\omega
# --- Recording mergeinfo for merge of r6 through r8 into 'A_COPY':
# G A_COPY
- expected_output = expected_merge_output([[2,5],[7,8]],
- ['U ' + beta_COPY_path + '\n',
- 'U ' + rho_COPY_path + '\n',
- 'U ' + omega_COPY_path + '\n',
- 'U ' + psi_COPY_path + '\n',
- ' U ' + A_COPY_path + '\n',
- ' G ' + A_COPY_path + '\n',])
+ expected_output = expected_merge_output(
+ [[2,5],[7,8]],
+ ['U ' + beta_COPY_path + '\n',
+ 'U ' + rho_COPY_path + '\n',
+ 'U ' + omega_COPY_path + '\n',
+ 'U ' + psi_COPY_path + '\n',
+ ' U ' + A_COPY_path + '\n',
+ ' G ' + A_COPY_path + '\n',])
svntest.actions.run_and_verify_svn(None, expected_output, [],
'merge', sbox.repo_url + '/A',
A_COPY_path)
@@ -17513,6 +17513,23 @@ def merge_source_with_replacement(sbox):
[], 'pg', SVN_PROP_MERGEINFO,
'-R', A_COPY_path)
+ # Commit the above merge and then reverse merge it. Again r6 is not
+ # being merged and should not be part of the notifications.
+ sbox.simple_commit()
+ sbox.simple_update()
+ expected_output = expected_merge_output(
+ [[5,2],[8,7]],
+ ['U ' + beta_COPY_path + '\n',
+ 'U ' + rho_COPY_path + '\n',
+ 'U ' + omega_COPY_path + '\n',
+ 'U ' + psi_COPY_path + '\n',
+ ' U ' + A_COPY_path + '\n',
+ ' G ' + A_COPY_path + '\n',],
+ elides=True)
+ svntest.actions.run_and_verify_svn(None, expected_output, [],
+ 'merge', sbox.repo_url + '/A',
+ A_COPY_path, '-r8:1')
+
#----------------------------------------------------------------------
# Test for issue #4144 'Reverse merge with replace in source applies
# diffs in forward order'.