Author: svn-role
Date: Sat Dec 19 04:00:12 2020
New Revision: 1884617
URL: http://svn.apache.org/viewvc?rev=1884617&view=rev
Log:
Merge r1880192 from trunk:
* r1880192
Fix issue #4862 "Merge: the resulting mergeinfo is non-deterministic".
Justification:
Non-deterministic merge result is bad.
Depends:
r1878997, r1879192, r1879474, r1879959 (Fix issue #4859)
Votes:
+1: julianfoad, hartmannathan, jcorvel
Modified:
subversion/branches/1.14.x/ (props changed)
subversion/branches/1.14.x/STATUS
subversion/branches/1.14.x/subversion/libsvn_client/merge.c
subversion/branches/1.14.x/subversion/tests/cmdline/merge_tests.py
Propchange: subversion/branches/1.14.x/
------------------------------------------------------------------------------
Merged /subversion/trunk:r1880192
Modified: subversion/branches/1.14.x/STATUS
URL:
http://svn.apache.org/viewvc/subversion/branches/1.14.x/STATUS?rev=1884617&r1=1884616&r2=1884617&view=diff
==============================================================================
--- subversion/branches/1.14.x/STATUS (original)
+++ subversion/branches/1.14.x/STATUS Sat Dec 19 04:00:12 2020
@@ -53,15 +53,6 @@ Veto-blocked changes:
Approved changes:
=================
- * r1880192
- Fix issue #4862 "Merge: the resulting mergeinfo is non-deterministic".
- Justification:
- Non-deterministic merge result is bad.
- Depends:
- r1878997, r1879192, r1879474, r1879959 (Fix issue #4859)
- Votes:
- +1: julianfoad, hartmannathan, jcorvel
-
* r1881985, r1882105
Follow up to r1880192: Fix an EOL issue in test on Windows.
Justification:
Modified: subversion/branches/1.14.x/subversion/libsvn_client/merge.c
URL:
http://svn.apache.org/viewvc/subversion/branches/1.14.x/subversion/libsvn_client/merge.c?rev=1884617&r1=1884616&r2=1884617&view=diff
==============================================================================
--- subversion/branches/1.14.x/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/1.14.x/subversion/libsvn_client/merge.c Sat Dec 19
04:00:12 2020
@@ -7915,18 +7915,23 @@ process_children_with_new_mergeinfo(merg
apr_pool_t *pool)
{
apr_pool_t *iterpool;
- apr_hash_index_t *hi;
+ apr_array_header_t *a;
+ int i;
if (!merge_b->paths_with_new_mergeinfo || merge_b->dry_run)
return SVN_NO_ERROR;
/* Iterate over each path with explicit mergeinfo added by the merge. */
+ /* Iterate over the paths in a parent-to-child order so that inherited
+ * mergeinfo is propagated consistently from each parent path to its
+ * children. (Issue #4862) */
+ a = svn_sort__hash(merge_b->paths_with_new_mergeinfo,
+ svn_sort_compare_items_as_paths, pool);
iterpool = svn_pool_create(pool);
- for (hi = apr_hash_first(pool, merge_b->paths_with_new_mergeinfo);
- hi;
- hi = apr_hash_next(hi))
+ for (i = 0; i < a->nelts; i++)
{
- const char *abspath_with_new_mergeinfo = apr_hash_this_key(hi);
+ svn_sort__item_t *item = &APR_ARRAY_IDX(a, i, svn_sort__item_t);
+ const char *abspath_with_new_mergeinfo = item->key;
svn_mergeinfo_t path_inherited_mergeinfo;
svn_mergeinfo_t path_explicit_mergeinfo;
svn_client__merge_path_t *new_child;
Modified: subversion/branches/1.14.x/subversion/tests/cmdline/merge_tests.py
URL:
http://svn.apache.org/viewvc/subversion/branches/1.14.x/subversion/tests/cmdline/merge_tests.py?rev=1884617&r1=1884616&r2=1884617&view=diff
==============================================================================
--- subversion/branches/1.14.x/subversion/tests/cmdline/merge_tests.py
(original)
+++ subversion/branches/1.14.x/subversion/tests/cmdline/merge_tests.py Sat Dec
19 04:00:12 2020
@@ -18609,12 +18609,12 @@ def merge_deleted_folder_with_mergeinfo_
'A/D/G2' : Item(status='A '),
})
# verify that mergeinfo is set/changed on A/D, A/D/G, A/D/G2.
- #expected_mergeinfo_output = wc.State(sbox.ospath(''), {
- # 'A' : Item(status=' U'),
- # 'A/D' : Item(status=' G'),
- # 'A/D/G' : Item(status=' G'), # varies, G or U: see issue #4862
- # 'A/D/G2' : Item(status=' G'), # varies, G or U: see issue #4862
- # })
+ expected_mergeinfo_output = wc.State(sbox.ospath(''), {
+ 'A' : Item(status=' U'),
+ 'A/D' : Item(status=' G'),
+ 'A/D/G' : Item(status=' G'),
+ 'A/D/G2' : Item(status=' G'),
+ })
expected_status = svntest.actions.get_virginal_state(sbox.ospath('A'),
7).subtree('A')
expected_status.tweak_some(
lambda path, item: [True] if path.split('/')[0] == 'D' else [],
@@ -18628,7 +18628,7 @@ def merge_deleted_folder_with_mergeinfo_
svntest.actions.run_and_verify_merge(sbox.ospath('A'), None, None,
'^/branch_A', None,
expected_output,
- None, #expected_mergeinfo_output
+ expected_mergeinfo_output,
None,
None,
expected_status,
@@ -18638,6 +18638,17 @@ def merge_deleted_folder_with_mergeinfo_
dry_run=False # as dry run is broken
)
+ # verify that mergeinfo is set/changed on A/D, A/D/G, A/D/G2.
+ expected_mergeinfo = [
+ ('A', ['/branch_A:3-7']),
+ ('A/D', ['/branch_A/D:5-7\n', '/branch_B/C:1*']),
+ ('A/D/G', ['/branch_A/D/G:5-7\n', '/branch_B/C/G:1*']),
+ ('A/D/G2', ['/branch_A/D/G2:5-7\n', '/branch_B/C/G2:1*']),
+ ]
+ for path, mergeinfo in expected_mergeinfo:
+ svntest.actions.check_prop('svn:mergeinfo', sbox.ospath(path),
+ [m.encode() for m in mergeinfo])
+
os.chdir(was_cwd)
########################################################################