On Tue, Jul 17, 2012 at 1:28 PM, Julian Foad <julianf...@btopenworld.com> wrote:
> There are some merge scenarios for which it's not clear whether the user 
> should specify '--reintegrate' or not.  We need to decide what the 
> 'symmetric' (i.e. automatically-choosing) code should do in those cases.
>
> The following example is adapted from merge_symmetric_tests.py 18, 
> subtree_to_and_fro(), "reintegrate considers source subtree mergeinfo":
>
>                    reintegrate 'everything'
>                            |
>   A ------o-s--------------x
>       \          \        /
>        \          \      /
>   B     o-----s----s----s---
>                    |
>                  merge the subtree 'D' only

What does 's' represent in this diagram?  In
merge_symmetric_tests.py's key 's' represents 'a subtree merge', but
that's not the case here, AFAICT.

> In terms of commands (assume a commit after each step):
>
>   svn cp A B
>   edit A
>   edit A/D
>   edit B/D  svn merge ^/A/D B/D
>   edit B/D
>   svn merge --reintegrate ^/B A
>
> The output from "merge --reintegrate" is:
>
>   svn: E195016: Reintegrate can only be used if
>   revisions 2 through 8 were previously merged [...]
>
> But why did the user choose a 'reintegrate' merge in this example, when there 
> has been no merge of the branch root in the A->B direction?

No, but we could easily have had such a merge,

                  reintegrate 'everything'
                          |
 A -----o----o------------x
     \    \     \        /
      \    \     \      /
 B     o----x-----s----s---
            |     |
            |   merge the subtree 'D' only
            |
          merge 'everything'

and still be facing the same problem.

> Or, from another angle, what if we have this similar scenario?
>
>                    merge 'everything'
>                            |
>   A     o-o-s--------------x
>        /         \        /
>       /           \      /
>   B ----------s----s----s---
>
> Given this example, it looks like a non-reintegrate merge might be the user's 
> choice for the final merge (and for the intermediate merge... either a 
> reintegrate or non-reintegrate); but all that's changed in this example is 
> which branch was branched from which, and that shouldn't make any difference. 
>  AFAIK we don't document a rule for whether '--reintegrate' should be used; 
> it's ambiguous.
>
> We have three possible results when we request a merge:
>
>   (1) a correct merge
>   (2) a wrong merge, with spurious conflicts
>   (3) bail out
>
> Currently, 'merge' gives (2), 'merge --reintegrate' gives (3), and 'merge 
> --symmetric' gives (2).
>
> The subtree_to_and_fro() test expects 'merge --symmetric' to give result (3), 
> but the symmetric merge currently sees that case as one in which a 
> *non-reintegrate* merge is needed, and goes ahead to produce a merged result 
> (with a conflict):
>
>   --- Merging r2 through r8 into 'A':
>   U    A/D/gamma
>   C    A/D/H/psi
>   [...]
>
> Is the symmetric merge 'broken'?  This test claims so, on the basis of 
> expecting it to behave like a reintegrate merge.  However, we can't be 
> strictly backward-compatible with both the reintegrate and the 
> non-reintegrate behaviours if we have to pick one, because they differ.  What 
> do we want to see here?
>
> I think it depends what the user is thinking.  If the user is thinking "just 
> help me merge everything that needs to be merged", then the user probably 
> would have used the plain 'merge' command in 1.7, and would prefer a wrong 
> merge with spurious conflicts, given that we haven't yet implemented a 
> correct merge.  If the user is thinking "this is a reintegration, and I 
> believe my branch was sync'd with the trunk recently", then the user probably 
> would prefer this merge to bail out like 'reintegrate' does.
>
> It almost goes without saying that if and when we have implemented a correct 
> merge then that is the right thing to do, and that will resolve the 
> ambiguity.  (When we do that, there is still the possibility of giving the 
> user an option to make Subversion detect and report whether the required 
> merge has anything complex about it -- subtrees, cherry-picked revisions, and 
> so on -- because the user might want the mental security of confirming that 
> in fact the merge is as simple as the user expects it to be.  But that is 
> another topic.)
>
> Our options for what 'symmetric' merge will do, in cases like this [1], are:
>
>   (1) Implement correct merging.
>   (2) Merge wrongly, with spurious conflicts, like plain 1.7 'merge'.
>   (2a) (2) by default, with an option to check and bail out like (3).
>   (3) Bail out like 1.7 'reintegrate'.
>   (3a) (3) by default, with an option to force the merge to proceed like (2).
>
> If we choose (2), then we break strict compatibility with 1.7 'reintegrate' 
> merge.  If we choose (3), then we break strict compatibility with 1.7 
> 'non-reintegrate' merge.
>
> I'd like to do (1), but, in the meantime, would we be happy with one of the 
> alternatives?

#1 would be awesome :-) but in the meantime...

I take your points about user intent but if the symmetric merge code
is meant to do away with the --reintegrate option, I think we should
take the more cautious approach and assume the user intends a
reintegrate, so IMO (3a) is the best choice.

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

> - Julian
>
>
> [1] At the moment, 'cases like this' means cases where the specified merge 
> root node was last merged in the same direction as the current merge, or was 
> never merged before.  That is, the symmetric merge code chooses whether to do 
> a reintegrate style of merge or a non-reintegrate style of merge based on the 
> direction of this merge relative to the direction of the last merge of the 
> specified root node, not based on any merges that may have been done to 
> subtrees.  That does NOT mean it doesn't handle subtrees; it handles them 
> just the same as
> 1.7 (reintegrate or plain) merge does.  It just means subtrees don't affect 
> the decision of which style of merge it uses.
>
>
> --
> Certified & Supported Apache Subversion Downloads: 
> http://www.wandisco.com/subversion/download

Reply via email to