> Heads-up: I've added a test suite file, 'merge_symmetric_tests.py'.
Stefan^2, Cristian, Oleksiy... maybe you'd like to help out with this? This test file starts with depictions of the scenarios we're aiming to address. So far, this is what I've come up with: # Merge once # # A (--?--- # ( \ # B (--?--x ('?' means to test both with and without a change here; see the 'Key' below.) # Merge twice in same direction # # A (--o-----?--- # ( \ \ # B (--o--x--?--x # # Merge to and fro # # A (--o-----?--x # ( \ / # B (--o--x--?--- # # A (--o-----o-----?--x # ( \ \ / # B (--o--x--o--x--?--- # # A (--o-----o--x--?--x # ( \ / / # B (--o--x--o-----?--- # # A (--o-----o--x--?--- # ( \ / \ # B (--o--x--o-----?--x # # Merge with cherry-picks # # Cherry1, fwd # A (--o-----o-[o]----o--- # ( \ \ \ # B (--o--x--?-----c-----x # # Cherry2, fwd # A (--o-----?-----c--o--- # ( \ / \ # B (--o--x--o-[o]-------x # # Cherry3, fwd # A (--o-----?-------c--o---- # ( \_____ / \ # ( \ / \ # B (--o--o-[o]-x-/---------x # \__/ # # Cherry1, back # A (--o-----o-[o]-------x # ( \ \ / # B (--o--x--?-----c--o--- # # Cherry2, back # A (--o-----?-----c-----x # ( \ / / # B (--o--x--o-[o]----o--- # # Cherry3, back # A (--o-----?-------c------x # ( \_____ / / # ( \ / / # B (--o--o-[o]-x-/-----o---- # \__/ # # Criss-cross merge # # A (--o--?--x--?---- # ( \ / \ # ( X \ # ( / \ \ # B (--o--?--x--?---x # # Subtree mergeinfo # # ... # # Sparse WC # # ... # # Mixed-rev WC # # ... # # # Key to diagrams: # # o - an original change # ? - an original change or no-op (test both) # x - a merge # c - a cherry-pick merge # [o] - source range of a cherry-pick merge I've created a few utility functions for easily creating these scenarios... def make_branches(sbox): """Make branches A and B.""" def modify_branch(sbox, branch, number, conflicting=False): """Commit a modification to branch BRANCH. The actual modification depends on NUMBER. If CONFLICTING=True, the change will be of a kind that conflicts with any other change that has CONFLICTING=True.""" def cherry_pick(sbox, rev, source, target): """Cherry-pick merge revision REV from branch SOURCE to branch TARGET (both WC-relative paths), and commit.""" def symmetric_merge(sbox, source, target, lines=None, args=[], expect_mi=None, ...): """Do a complete, automatic merge from path SOURCE to path TARGET, and commit. Verify the output and that there is no error. ### TODO: Verify the changes made.) ... and written tests for a few of the test scenarios. Now I'm working on how to test for the expected results. So far, symmetric_merge() checks that the mergeinfo addition on the target is a given list of revs. Now I'm trying to check that the expected sequence of 3-way merges is performed, maybe initially by looking at the (current) debug output... DBG: merge.c:11335: yca svn://localhost:33705/svn-test-work/repositories/merge_symmetric_tests-1/A@1 DBG: merge.c:11336: base svn://localhost:33705/svn-test-work/repositories/merge_symmetric_tests-1/A@1 DBG: merge.c:11338: mid svn://localhost:33705/svn-test-work/repositories/merge_symmetric_tests-1/A@2 DBG: merge.c:11339: right svn://localhost:33705/svn-test-work/repositories/merge_symmetric_tests-1/A@2 or maybe by making the regular notifications more detailed than they currently are ... --- Recording mergeinfo for merge between repository URLs into 'B': U B - Julian