On Thu, Mar 22, 2012 at 5:36 AM, Julian Foad <julianf...@btopenworld.com> 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

Reply via email to