On Thu, Mar 22, 2012 at 5:36 AM, Julian Foad <[email protected]> wrote:
> If anyone wants to try the new symmetric merge code, it's basically in
> place. It's not finished. It's enabled with '--symmetric' command-line
> option. I've just tried running it in place of 'reintegrate, using the
> following patch to the test suite, and this much seems to work...
>
> Index: subversion/tests/cmdline/svntest/actions.py
> ===================================================================
> --- subversion/tests/cmdline/svntest/actions.py (revision 1303481)
> +++ subversion/tests/cmdline/svntest/actions.py (working copy)
> @@ -1029,6 +1029,9 @@ def run_and_verify_merge(dir, rev1, rev2
> the working copy, but still verify the entire working copy dir. """
>
> merge_command = [ "merge" ]
> + if '--reintegrate' in args:
> + args += ('--symmetric',)
> +
> if url2:
> merge_command.extend((url1 + "@" + str(rev1), url2 + "@" + str(rev2)))
> else:
>
>
> Now I'll try using it in place of 'sync' merges. But the more interesting
> thing is it should be able to do repeated 'reintegrate' merges, and indeed
> arbitrary sequences of to-and-fro merges between a pair of branches, without
> any 'keep-alive dance'.
>
> Please tell me what you think or what you find!
>
> - Julian
Hi Julian,
I tweaked run_and_verify_svn2 in a manner similar to what you did to
run_and_verify_merge. This picks up a lot of other 'svn merge' uses
and several test failures. These failures fall into 4 basic
categories as detailed below. I'll be trying some ad hoc testing
tomorrow, but wanted to give you what I found thus far.
[[[
Index: subversion/tests/cmdline/svntest/actions.py
===================================================================
--- subversion/tests/cmdline/svntest/actions.py (revision 1305966)
+++ subversion/tests/cmdline/svntest/actions.py (working copy)
@@ -320,6 +320,30 @@
elif expected_stderr != []:
want_err = True
+ if 'merge' in varargs:
+ print "## run_and_verify_svn2(" + ' '.join(varargs) + ")"
+ if '--reintegrate' in varargs:
+ print '## Adding --symmetric option to reintegrate merge' + '
'.join(varargs)
+ varargs += ('--symmetric',)
+ elif not [arg for arg in varargs
+ if arg.startswith('-r') or arg.startswith('--revision')
+ or arg.startswith('-c') or arg.startswith('--change')]:
+ #if len([arg for arg in varargs if not arg.startswith('-')]) <= 3:
+ source_count = 0
+ # Is this a 2-URL merge?
+ for arg in varargs:
+ if (arg.startswith('file://')
+ or arg.startswith('svn://')
+ or arg.startswith('http://')
+ or (arg.find('@') > 1)):
+ print "##" + arg
+ source_count+=1
+ if source_count < 2:
+ print '## Adding --symmetric option to sync merge'
+ varargs += ('--symmetric',)
+
exit_code, out, err = main.run_svn(want_err, *varargs)
verify.verify_outputs(message, out, err, expected_stdout, expected_stderr)
verify.verify_exit_code(message, exit_code, expected_exit)
]]]
######################################################
1) Merge from a file to itself asserts:
(Using our own Greek tree)
>svn merge ^^/iota iota --symmetric
..\..\..\subversion\libsvn_client\merge.c:3631: (apr_err=235000)
svn: E235000: In file '..\..\..\subversion\libsvn_client\merge.c' line
3631: assertion failed (SVN_IS_VALID_REVNUM(start) &&
SVN_IS_VALID_REVNUM(end) && (start
> end))
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
>svn merge iota --symmetric
..\..\..\subversion\libsvn_client\merge.c:3631: (apr_err=235000)
svn: E235000: In file '..\..\..\subversion\libsvn_client\merge.c' line
3631: assertion failed (SVN_IS_VALID_REVNUM(start) &&
SVN_IS_VALID_REVNUM(end) && (start
> end))
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
######################################################
2) Mergeinfo for shallow merges not recorded correctly.
Using the --symmetric option causes shallow merges to be recorded as
if they were infinite depth.
>svn st
>svn pg svn:mergeinfo
>svn mergeinfo --show-revs eligible ^^/A A_COPY
r4
r5
r6
r7
r8
>svn merge ^^/A A_COPY --depth empty --symmetric
DBG: merge.c:11195: base on source:
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-55/A@1
DBG: merge.c:11197: base on target:
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-55/A@1
DBG: merge.c:11310: yca
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-55/A@1
DBG: merge.c:11311: base
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-55/A@1
DBG: merge.c:11313: mid
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-55/A@8
DBG: merge.c:11314: right
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-55/A@8
--- Recording mergeinfo for merge between repository URLs into 'A_COPY':
U A_COPY
>svn diff
Index: A_COPY
===================================================================
--- A_COPY (revision 8)
+++ A_COPY (working copy)
Property changes on: A_COPY
___________________________________________________________________
Added: svn:mergeinfo
Merged /A:r2-8
^^^^
That's wrong, the mergeinfo should be non-inheritable, like below,
otherwise it appears we performed the merge at depth-infinity.
>svn revert -Rq .
>svn merge ^^/A A_COPY --depth empty
--- Recording mergeinfo for merge of r2 through r8 into 'A_COPY':
U A_COPY
>svn diff
Index: A_COPY
===================================================================
--- A_COPY (revision 8)
+++ A_COPY (working copy)
Property changes on: A_COPY
___________________________________________________________________
Added: svn:mergeinfo
Merged /A:r2-8*
######################################################
3) Subtree merge not properly considering pre-exiting mergeinfo.
As merge_tests.py 83 'subtree merge source might not exist'
demonstrates, merges are not properly considering existing mergeinfo
on the target and are repeating merges:
>svn pg svn:mergeinfo A_COPY\D\H\omega
/A/D/H/omega:6,8
>svn mergeinfo --show-revs eligible ^^/A/D/H/omega A_COPY\D\H\omega
r12
### Why is this merging *everything* again?
>svn merge ^^/A/D/H/omega A_COPY\D\H\omega --symmetric
DBG: merge.c:11195: base on source:
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-83/A/D/H/omega@1
DBG: merge.c:11197: base on target:
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-83/A/D/H/omega@1
DBG: merge.c:11310: yca
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-83/A/D/H/omega@1
DBG: merge.c:11311: base
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-83/A/D/H/omega@1
DBG: merge.c:11313: mid
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-83/A/D/H/omega@12
DBG: merge.c:11314: right
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-83/A/D/H/omega@12
Conflict discovered in
'C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/working_copies/merge_tests-83/A_COPY/D/H/omega'.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: p
### VVVVV This is the notification for a 2-URL merge, is this expected
now in some cases? VVVVVV
--- Merging differences between repository URLs into 'A_COPY\D\H\omega':
C A_COPY\D\H\omega
--- Recording mergeinfo for merge between repository URLs into
'A_COPY\D\H\omega':
U A_COPY\D\H\omega
Summary of conflicts:
Text conflicts: 1
>svn pg svn:mergeinfo A_COPY\D\H\omega
/A/D/H/omega:2-12
>svn revert -Rq .
### This is correct, the merge is broken up into three discreet
revision ranges, 2-5, 7 , and 9-12. The first two are flagged as
noops and no editor drive occurs, only the last operative block is
merged (though of course all three are recorded in the mergeinfo).
>svn merge ^^/A/D/H/omega A_COPY\D\H\omega
--- Merging r9 through r12 into 'A_COPY\D\H\omega':
U A_COPY\D\H\omega
--- Recording mergeinfo for merge of r2 through r12 into 'A_COPY\D\H\omega':
U A_COPY\D\H\omega
There is a similar bug demonstrated by merge_tests.py 120 'reverse
merge adds subtree', but with a directory target.
Note: The following tests also demonstrate similar behavior:
merge_tests.py 71 'merge range predates history'
merge_tests.py 78 'dont merge revs into a subtree that predate it'
merge_tests.py 79 'merge fails with renamed subtrees with mergeinfo'
merge_tests.py 96 'merge prior to rename src existence still dels src'
merge_reintegrate_tests.py 10 'merge --reintegrate with subtree mergeinfo'
merge_reintegrate_tests.py 11 'multiple reintegrates create self-referential'
merge_authz_tests.py 3: reintegrate fails if no root access
######################################################
3) Symmetric merge code needs to error out sooner if WC is missing subtrees:
### Missing subtrees...
>svn st
! A_COPY\mu
! A_COPY\C
! A_COPY\D\G
! A_COPY\D\G\rho
! A_COPY\D\G\pi
! A_COPY\D\G\tau
! A_COPY\D\H\psi
### ...should be a no-op error:
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113>svn
merge ^^/A A_COPY
..\..\..\subversion\svn\util.c:913: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:10969: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:10933: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:9099: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:8573: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:5877: (apr_err=195016)
svn: E195016: Merge tracking not allowed with missing subtrees; try
restoring these items first:
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113\A_COPY\D\H\psi
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113\A_COPY\D\G
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113\A_COPY\mu
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113\A_COPY\C
### Not sure this is really a desirable outcome.
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113>svn
merge ^^/A A_COPY --symmetric
DBG: merge.c:11195: base on source:
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-113/A@1
DBG: merge.c:11197: base on target:
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-113/A@1
DBG: merge.c:11310: yca
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-113/A@1
DBG: merge.c:11311: base
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-113/A@1
DBG: merge.c:11313: mid
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-113/A@6
DBG: merge.c:11314: right
file:///C:/SVN/src-trunk-3/Debug/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-113/A@6
--- Merging differences between repository URLs into 'A_COPY':
U A_COPY\B\E\beta
Skipped missing target: 'A_COPY\D\G'
U A_COPY\D\H\omega
Skipped missing target: 'A_COPY\D\H\psi'
--- Recording mergeinfo for merge between repository URLs into 'A_COPY':
Summary of conflicts:
Skipped paths: 2
..\..\..\subversion\svn\util.c:913: (apr_err=195016)
..\..\..\subversion\svn\merge-cmd.c:132: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:11379: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:11351: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:9241: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:9099: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:8573: (apr_err=195016)
..\..\..\subversion\libsvn_client\merge.c:5877: (apr_err=195016)
svn: E195016: Merge tracking not allowed with missing subtrees; try
restoring these items first:
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113\A_COPY\C
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113\A_COPY\D\H\psi
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113\A_COPY\D\G
C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\svn-test-work\working_copies\merge_tests-113\A_COPY\mu
Paul