On Fri, Jan 4, 2013 at 3:04 PM, Julian Foad <julianf...@btopenworld.com> wrote:
> The condition was originally added in r873100, following the discussion 
> (mainly between Paul and me) at 
> <http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=72921>.
>   At that time, the "foreign repos" filtering was inside the function 
> "filter_self_referential_mergeinfo", so that may have caused confusion.
>
> It looks like r873100 was in error and the foreign-repos filtering should be 
> unconditional.

Hi Julian,

Quite correct, +1 for this change.

> Fix:
> [[[
> Index: subversion/libsvn_client/merge.c
> ===================================================================
> --- subversion/libsvn_client/merge.c    (revision 1429021)
> +++ subversion/libsvn_client/merge.c    (working copy)
> @@ -1293,32 +1293,33 @@ prepare_merge_props_changed(const apr_ar
>          }
>        props = mergeinfo_props;
>      }
>
>    if (props->nelts)
>      {
> +      /* Issue #3383: We don't want mergeinfo from a foreign repos.
> +
> +         If this is a merge from a foreign repository we must strip all
> +         incoming mergeinfo (including mergeinfo deletions).  Otherwise if
> +         this property isn't mergeinfo or is NULL valued (i.e. prop removal)
> +         or empty mergeinfo it does not require any special handling.  There
> +         is nothing to filter out of empty mergeinfo and the concept of
> +         filtering doesn't apply if we are trying to remove mergeinfo
> +         entirely.  */
> +      if (! merge_b->same_repos)
> +        SVN_ERR(omit_mergeinfo_changes(&props, props, result_pool));
> +
>        /* If this is a forward merge then don't add new mergeinfo to
>           PATH that is already part of PATH's own history, see
>           http://svn.haxx.se/dev/archive-2008-09/0006.shtml.  If the
>           merge sources are not ancestral then there is no concept of a
>           'forward' or 'reverse' merge and we filter unconditionally. */
>        if (merge_b->merge_source.loc1->rev < merge_b->merge_source.loc2->rev
>            || !merge_b->merge_source.ancestral)
>          {
> -          /* Issue #3383: We don't want mergeinfo from a foreign repos.
> -
> -             If this is a merge from a foreign repository we must strip all
> -             incoming mergeinfo (including mergeinfo deletions).  Otherwise 
> if
> -             this property isn't mergeinfo or is NULL valued (i.e. prop 
> removal)
> -             or empty mergeinfo it does not require any special handling.  
> There
> -             is nothing to filter out of empty mergeinfo and the concept of
> -             filtering doesn't apply if we are trying to remove mergeinfo
> -             entirely.  */
> -          if (! merge_b->same_repos)
> -            SVN_ERR(omit_mergeinfo_changes(&props, props, result_pool));
> -          else if (HONOR_MERGEINFO(merge_b) || merge_b->reintegrate_merge)
> +          if (HONOR_MERGEINFO(merge_b) || merge_b->reintegrate_merge)
>              SVN_ERR(filter_self_referential_mergeinfo(&props,
>                                                        local_abspath,
>                                                        merge_b->ra_session2,
>                                                        merge_b->ctx,
>                                                        result_pool));
>          }
> ]]]
>
> FWIW, I tried removing the "if (! reverse-merge)" condition entirely (from 
> both the foreign-repos and the self-ref filtering), and the test suite
> passed.  That is not too surprising, as it probably has very few test cases 
> for
> foreign-repos reverse merge and/or self-ref mergeinfo.

Hmmm.  Reviewing the old thread
(http://svn.haxx.se/dev/archive-2008-09/0397.shtml) it seems my most
compelling argument in favor not filtering during reverse merges was
delivered to you via IRC -- in the days before it was logged :-\  I
wish I could recall what I said!  Regardless, there are still the two
advantages mentioned in the thread to skipping self-referential
filtering during reverse merges:

1) Performance -- filter_self_referential_mergeinfo(), potentially run
for every subtree with mergeinfo changes, calls
svn_client__repos_location().

2) Reverse merges "revert" to the same prior mergeinfo representation.

I can come up with a contrived example where filtering
self-referential mergeinfo from reverse merges gives a better result
(i.e. self-referential mergeinfo is actually removed), but this
involves purposefully setting self-referential mergeinfo with 'svn
propset'.  The word "tortured" comes to mind.

Unless there is a realistic use-case I am missing (which demonstrates
the benefit of filtering self-referential mergeinfo during reverse
merges) then I'm reluctant to change this.  Reluctant, but not totally
against, I can see the opposing argument in support of this
behavior...there's no "correct" answer here that I can see; each
approach has it's pros and cons.

-- 
Paul T. Burba
CollabNet, Inc. -- www.collab.net -- Enterprise Cloud Development
Skype: ptburba

Reply via email to