I (Julian Foad) wrote:
> Investigating the second of three 'symmetric merge' test failures:
> 
>   merge_reintegrate_tests.py 10
> 
> There is a definite issue concerning reverse merges from the branches' own 
> history.  In this test, the merge that behaves unexpectedly is the final 
> 'reintegrate' shown in the following graph (which appears as a comment 
> in that test).

I've fixed this in r1365182 by making the 'reintegrate-like' code path of 
symmetric merge call the 'find_reintegrate_merge' function which rejects cases 
such as this one (where a revision from the common ancestry of the two branches 
is not recorded as merged in the source branch).

- Julian


>   # Make some more changes to A_COPY so that the same revisions have *not*
>   # been uniformly applied from A to A_COPY.  In this case the reintegrate
>   # merge should fail, but should provide a helpful message as to where the
>   # problems are.
>   #
>   #   A_COPY_3        4-------[9]--
>   #                  /          \
>   #                 /            \          [-8]___
>   #   A     -1---------5-6-7-8---10----------------\-------WC--
>   #            \ \               (D)        \       \      
> /reint.
>   #             \ \                    (mu)  \       \    /
>   #   A_COPY     2-\--------------------12---13--14--15--------
>   #                 \                   /            (D)
>   #                  \                 /
>   #   A_COPY_2        3-------------[11]--
> 
> A 'reintegrate' merge complains:
> 
> svn: E195016: Reintegrate can only be used if revisions 2 through 15 were 
> previously merged from [...]/A to the reintegrate source, but this is not the 
> case:
>   A_COPY/D
>     Missing ranges: /A/D:8
> 
> A 'symmetric' merge merges every change made on the branch A_COPY onto 
> branch 'A'.  That includes r15, the removal of change A:8, which was a 
> change to A/D/H/omega:
> 
> --- Merging differences between repository URLs into '[...]/A':
> U    [...]/A/B/E/alpha
> UU   [...]/A/mu
> U    [...]/A/D/H/omega
>  U   [...]/A/D
> --- Recording mergeinfo for merge between repository URLs into 
> '[...]/A':
>  U   [...]/A
>  U   [...]/A/D
>  G   [...]/A/mu
> 
> For completeness, let's see what a plain 1.7 merge does:
> 
> --- Merging r2 through r15 into '[...]/A':
> U    [...]/A/B/E/alpha
> UU   [...]/A/mu
> --- Merging r2 through r15 into '[...]/A/D':
>  G   [...]/A/D
> --- Recording mergeinfo for merge of r2 through r15 [...]
> 
> The plain merge does in fact merge r15, the reverse merge of r8.  (It 
> doesn't print any evidence of it there, because the result is a no-op, but 
> if we change the test to make another modification to that file, then we can 
> see 
> it.)
> 
> 
> The root issue here is that a reverse-merge of a change from the shared 
> history[1] history is interpreted by 'reintegrate' as a user error to be 
> diagnosed, by plain 'merge' as just another change to be merged, and by 
> the current 'symmetric' code as just another change to be merged.
> 
> Without going into *why* they should behave differently right now, I think it 
> is 
> clear that the 'symmetric' merge should in this case behave like the 
> 'reintegrate' merge and detect and report the situation.
> 
> So I'll take a stab at fixing that.
> 
> [1] We probably have very similar issues dealing with a reverse-merge of a 
> change from the history of one branch or the other (after their youngest 
> common 
> ancestor).
> 
> - Julian
>

Reply via email to