On Fri, Apr 20, 2012 at 5:36 AM, Julian Foad <julianf...@btopenworld.com> wrote:
> Paul Burba wrote on 27 March 2012:
>> Julian Foad wrote:
>>>  The check for switched subtrees:  I think we should enable this by default.
>>>
>>>  I suppose the issue here must be that we don't have a compelling use
>>> case for supporting such a merge, and so we haven't defined and don't
>>> want to spend the effort of trying to define what such a merge should
>>> mean.  We  can explain what the merge code *does* in such a case, we
>>> just can't give a  requirements-based reason for *why* it does what it
>>> does.  Paul or anyone,  please enlighten me if that's not the case.
>>
>> There are two "whys" to consider here:
>>
>> First, "why" does a user merge into a WC with switched subtrees?  On
>> that I agree with you, I've never seen a compelling case is.  The few
>> users I've come across who did it usually did so by mistake or were
>> merging changes that they knew would not touch the switched subtree.
>
> OK; nor me.  (I can see it could sometimes be convenient to merge into a WC 
> with switched subtrees when the user knows that the merge will not touch the 
> switched subtrees, but even so, that doesn't necessarily mean it's a good 
> idea.)
>
>> Regardless of why users do it, they do it and it was something we
>> allowed merge to do pre-1.5 (i.e. pre-mergetracking), so I tried to
>> support it.
>>
>> Second: Why does the merge code do what it does when faced with a
>> switched subtree.  I'm guessing you see this "what" the code does,
>> but
>> that makes it sound as if the current behavior is somehow arbitrary.
>
> Sorry, I did indeed imply it may be a bit unfounded, as I felt I had no point 
> of reference for the "why".  But I agree it makes sense to behave as you 
> described below...
>
>> The "why" of the current behavior is tied to the fact that by default
>> svn:mergeinfo is inheritable.  [...]:
>>
>>    WC-Root('/SRC:N')
>>       |
>>      SSP('/SRC:N*')
>>       | \
>>       |  \
>>       |   SSS('/SRC:N')
>>       |
>>      SS('/SRC:N')
>>
>> a) Non-inheritable mergeinfo is recorded on the parent [...]
>>
>> b) Normal inheritable mergeinfo is recorded on the root [...]
>>
>> c) Normal inheritable mergeinfo is recorded on siblings [...]
>>
>> d) If the WC-Root isn't the parent [it gets normal mergeinfo ...]
> [...]
>> [1] There are other reasons a subtree might be missing [...]
>> mergetracking behavior and reasoning for this behavior is the same in
>> all these cases, though a bit simpler in the non-switched cases
>> because the subtree is really missing and not "replaced" by something
>> else.
>
> This description would make a superior replacement for the
>  first two bullet points of
> <http://svn.apache.org/repos/asf/subversion/trunk/notes/merge-tracking/func-spec.html#switched-paths>,
>  would it not?
>
> There is an implied logic for the question "Why behave like this?" that seems 
> pretty intuitive; let's see if I can actually capture it in words:
>
> [[[
>   If a subtree (SS) is switched, that means the user has chosen for
>   the time being to work with a substitute for the original subtree
>   (SS@BASE), knowing that any modifications made in SS can be
>   committed only to the repository location of SS and the original
>   subtree SS@BASE remains hidden and unaffected.
>
>   The general semantics of a merge is to apply local modifications
>   to the working copy and record the merge as having been applied
>   to the tree that is represented by the working copy.
>
>   Merge tracking should ensure that the subtree of the merge that
>   goes into SS is recorded as being applied to SS, while the
>   subtree SS@BASE should be recorded as not having received that
>   merge.

This makes a bit more sense to me:

"Merge tracking should ensure that any changes made by the merge to SS
are recorded as merged to the repository location which SS actually
represents while the subtree SS@BASE should be recorded as not having
received that merge."

>   Since the working copy represents parts of two different branches,
>   two parts of the merge are thus applied to the two different
>   branches, and recorded as such when the user commits the result.
>
>   If the user is doing a merge that may affect SS, it is reasonable
>   to assume that SS is an alternative variant of SS@BASE rather than
>   some totally unrelated item.  So, in terms of Subversion's loose
>   branching semantics, SS is a 'branch' of SS@BASE.  If the user
>   chooses to merge when the assumption is false and SS doesn't have
>   a sensible branching relationship with SS@BASE, the result will be
>   nonsensical or, in concrete terms, there will be merge conflicts.
>
>   Note:  Many typical branching policies would forbid committing to
>   two branches at once, let alone committing merges to two branches
>   at once.  However, the user may have reasons for doing this merge
>   without intending to commit the result as-is.
> ]]]
>
>
> Your description cover cases where the merge may or may not affect the inside 
> of the subtree.  One case not made explicit is where the merge deletes the 
> switched subtree.  Would the rule there be:
>
>    * If the incoming change deletes the path SS, then it is interpreted as 
> deleting the entry SS from SSP's list of children.

Correct, SS@BASE is deleted, *but* the repository location represented
by the switched subtree is also deleted -- Both are deleted.  Not sure
what the ideal behavior is, but this is nothing new (it pre-dates
merge-tracking).  Honestly this particular use-case fell through the
cracks, I don't recall it ever being discussed.

> Therefore SS is removed from the WC, and so is no longer a switched path, and 
> the mergeinfo change can be recorded normally on SSP without any need for 
> non-inheritable or subtree mergeinfo.

Agreed, non-inheritable mergeinfo should not be necessary, but
non-inheritable mergeinfo is recorded.  I filed an issue for this:
http://subversion.tigris.org/issues/show_bug.cgi?id=4163

> And as for the repository path that SS represented while it was still 
> switched, we do not want to record any mergeinfo change on that path at all

We couldn't record anything on that path anyway, because we deleted it.

> (nor on that path's repository-parent path,

In a perfect world we'd have a way to record this, since a merge *did*
remove one of it's children, and that information is lost, but this
seems very much an edge case.

Paul

> nor anything to do with it).
>
> ?
>
> - Julian

Reply via email to