Index: subversion/libsvn_client/merge.c =================================================================== --- subversion/libsvn_client/merge.c (revision 33012) +++ subversion/libsvn_client/merge.c (working copy) @@ -264,6 +264,13 @@ svn_ra_session_t *ra_session1; svn_ra_session_t *ra_session2; + /* Whether the merge being performed is a reverse or forward merge. + Note: Since combinations of forward and reverse merges are supported + by svn_client_merge_peg3() the value of this field may change and + applies only to the merge_source_t *currently* being merged by + do_merge(). */ + svn_boolean_t is_rollback; + /* Pool which has a lifetime limited to one iteration over a given merge source, i.e. it is cleared on every call to do_directory_merge() or do_file_merge() in do_merge(). */ @@ -564,9 +571,11 @@ TRUE, -1, ctx->cancel_func, ctx->cancel_baton, subpool)); - /* Don't add mergeinfo from PATH's own history. */ - SVN_ERR(filter_self_referential_mergeinfo(&props, path, merge_b, - adm_access, subpool)); + /* If this is a forward merge then don't add mergeinfo from + PATH's own history. */ + if (!merge_b->is_rollback) + SVN_ERR(filter_self_referential_mergeinfo(&props, path, merge_b, + adm_access, subpool)); err = svn_wc_merge_props2(state, path, adm_access, original_props, props, FALSE, merge_b->dry_run, ctx->conflict_func, @@ -5867,6 +5876,7 @@ merge_cmd_baton.paths_with_new_mergeinfo = NULL; merge_cmd_baton.ra_session1 = ra_session1; merge_cmd_baton.ra_session2 = ra_session2; + merge_cmd_baton.is_rollback = (rev1 > rev2); /* Populate the portions of the merge context baton that require an RA session to set, but shouldn't be reset for each iteration. */