Author: pburba
Date: Tue Mar 16 16:34:33 2010
New Revision: 923852
URL: http://svn.apache.org/viewvc?rev=923852&view=rev
Log:
On the 1.6.x-r892050 branch, merge r892085 from trunk.
Modified:
subversion/branches/1.6.x-r892050/ (props changed)
subversion/branches/1.6.x-r892050/subversion/libsvn_client/merge.c
subversion/branches/1.6.x-r892050/subversion/tests/cmdline/merge_tests.py
Propchange: subversion/branches/1.6.x-r892050/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 16 16:34:33 2010
@@ -61,4 +61,4 @@
/subversion/branches/tc_url_rev:870696-870828
/subversion/branches/tree-conflicts:864636-869499
/subversion/branches/tree-conflicts-notify:870271-870353
-/subversion/trunk:875976,875980-875981,876054-876056,876092,876175,876299,876306,876427,876440,876450,876507,876571,879093,879688,880274-880275,880370,880450,880474,880525-880526,880552,881905,884842,886164,886197,888715,888979,889081,889840,891672,892050,895514,895653,896522,898963,899826,899828,900797,901752,904301,904394,904594,905303,905326,906256,906305,917640,918211,922516
+/subversion/trunk:875976,875980-875981,876054-876056,876092,876175,876299,876306,876427,876440,876450,876507,876571,879093,879688,880274-880275,880370,880450,880474,880525-880526,880552,881905,884842,886164,886197,888715,888979,889081,889840,891672,892050,892085,895514,895653,896522,898963,899826,899828,900797,901752,904301,904394,904594,905303,905326,906256,906305,917640,918211,922516
Modified: subversion/branches/1.6.x-r892050/subversion/libsvn_client/merge.c
URL:
http://svn.apache.org/viewvc/subversion/branches/1.6.x-r892050/subversion/libsvn_client/merge.c?rev=923852&r1=923851&r2=923852&view=diff
==============================================================================
--- subversion/branches/1.6.x-r892050/subversion/libsvn_client/merge.c
(original)
+++ subversion/branches/1.6.x-r892050/subversion/libsvn_client/merge.c Tue Mar
16 16:34:33 2010
@@ -7663,6 +7663,9 @@ ensure_all_missing_ranges_are_phantoms(s
p...@target_rev. Effectively this is the mergeinfo catalog on the
reintegrate target.
+ YC_ANCESTOR_REV is the revision of the youngest common ancestor of the
+ reintegrate source and the reintegrate target.
+
SOURCE_REPOS_REL_PATH is the path of the reintegrate source relative to
the root of the repository. TARGET_REPOS_REL_PATH is the path of the
reintegrate target relative to the root of the repository.
@@ -7696,6 +7699,7 @@ static svn_error_t *
find_unmerged_mergeinfo(svn_mergeinfo_catalog_t *unmerged_to_source_catalog,
svn_boolean_t *never_synched,
svn_revnum_t *youngest_merged_rev,
+ svn_revnum_t yc_ancestor_rev,
svn_mergeinfo_catalog_t source_catalog,
apr_hash_t *target_segments_hash,
const char *source_repos_rel_path,
@@ -7745,6 +7749,16 @@ find_unmerged_mergeinfo(svn_mergeinfo_ca
segments,
iterpool));
+ /* Remove any target history that is also part of the source's history,
+ i.e. their common ancestry. By definition this has already been
+ "merged" from the target to the source. If the source has explict
+ self referential mergeinfo it would intersect with the target's
+ history below, making it appear that some merges had been done from
+ the target to the source, when this might not actually be the case. */
+ SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
+ &target_history_as_mergeinfo, target_history_as_mergeinfo,
+ source_rev, yc_ancestor_rev, iterpool));
+
/* Look for any explicit mergeinfo on the source path corresponding to
the target path. If we find any remove that from SOURCE_CATALOG.
When this iteration over TARGET_SEGMENTS_HASH is complete all that
@@ -8034,6 +8048,9 @@ calculate_left_hand_side(const char **ur
apr_hash_t *segments_hash = apr_hash_make(pool);
svn_boolean_t never_synced;
svn_revnum_t youngest_merged_rev;
+ const char *yc_ancestor_path;
+ const char *source_url;
+ const char *target_url;
/* Get the history (segments) for the target and any of its subtrees
with explicit mergeinfo. */
@@ -8058,6 +8075,26 @@ calculate_left_hand_side(const char **ur
APR_HASH_KEY_STRING, segments);
}
+ /* Check that source_...@source_rev and target_...@target_rev are
+ actually related, we can't reintegrate if they are not. Also
+ get an initial value for *REV_LEFT. */
+ source_url = svn_path_url_add_component2(source_repos_root,
+ source_repos_rel_path,
+ subpool),
+ target_url = svn_path_url_add_component2(source_repos_root,
+ target_repos_rel_path,
+ subpool);
+ SVN_ERR(svn_client__get_youngest_common_ancestor(&yc_ancestor_path,
+ rev_left,
+ source_url, source_rev,
+ target_url, target_rev,
+ ctx, subpool));
+ if (!(yc_ancestor_path && SVN_IS_VALID_REVNUM(*rev_left)))
+ return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
+ _("'%...@%ld' must be ancestrally related to "
+ "'%...@%ld'"), source_url, source_rev,
+ target_url, target_rev);
+
/* Get the mergeinfo from the source, including its descendants
with differing explicit mergeinfo. */
APR_ARRAY_PUSH(source_repos_rel_path_as_array, const char *)
@@ -8075,6 +8112,7 @@ calculate_left_hand_side(const char **ur
SVN_ERR(find_unmerged_mergeinfo(&unmerged_catalog,
&never_synced,
&youngest_merged_rev,
+ *rev_left,
mergeinfo_catalog,
segments_hash,
source_repos_rel_path,
@@ -8094,24 +8132,6 @@ calculate_left_hand_side(const char **ur
if (never_synced)
{
/* We never merged to the source. Just return the branch point. */
- const char *yc_ancestor_path,
- *source_url = svn_path_url_add_component2(source_repos_root,
- source_repos_rel_path,
- subpool),
- *target_url = svn_path_url_add_component2(source_repos_root,
- target_repos_rel_path,
- subpool);
-
- SVN_ERR(svn_client__get_youngest_common_ancestor(&yc_ancestor_path,
- rev_left,
- source_url, source_rev,
- target_url, target_rev,
- ctx, subpool));
- if (!(yc_ancestor_path && SVN_IS_VALID_REVNUM(*rev_left)))
- return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
- _("'%...@%ld' must be ancestrally related to "
- "'%...@%ld'"), source_url, source_rev,
- target_url, target_rev);
*url_left = svn_path_url_add_component2(source_repos_root,
yc_ancestor_path, pool);
}
Modified:
subversion/branches/1.6.x-r892050/subversion/tests/cmdline/merge_tests.py
URL:
http://svn.apache.org/viewvc/subversion/branches/1.6.x-r892050/subversion/tests/cmdline/merge_tests.py?rev=923852&r1=923851&r2=923852&view=diff
==============================================================================
--- subversion/branches/1.6.x-r892050/subversion/tests/cmdline/merge_tests.py
(original)
+++ subversion/branches/1.6.x-r892050/subversion/tests/cmdline/merge_tests.py
Tue Mar 16 16:34:33 2010
@@ -16121,6 +16121,10 @@ def merge_replace_causes_tree_conflict(s
actions.run_and_verify_status(wc_dir, expected_status)
+# Test for a reintegrate bug which can occur when the merge source
+# has mergeinfo that explicitly describes common history with the reintegrate
+# target, see http://mail-archives.apache.org/mod_mbox/subversion-dev/
+# 200912.mbox/%[email protected]%3e
def reintegrate_with_self_referential_mergeinfo(sbox):
"source has target's history as explicit mergeinfo"
@@ -16219,7 +16223,7 @@ def reintegrate_with_self_referential_me
'D/H/omega' : Item("New content"),
})
expected_skip = wc.State(A2_path, { })
- # Currently failing with this error:
+ # Previously failed with this error:
#
# svn merge ^/A2.1" A2 --reintegrate
# ..\..\..\subversion\svn\merge-cmd.c:349: (apr_err=160013)
@@ -16461,7 +16465,7 @@ test_list = [ None,
# ra_serf causes duplicate notifications with this test:
Skip(merge_replace_causes_tree_conflict,
svntest.main.is_ra_type_dav_serf),
- XFail(reintegrate_with_self_referential_mergeinfo),
+ reintegrate_with_self_referential_mergeinfo,
]
if __name__ == '__main__':