You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Neels Janosch Hofmeyr <ne...@elego.de> on 2008/08/16 01:55:02 UTC

tree conflicts: segfault in merge_dir_opened

-    'A2/D/H/chi'   : Item("This is the file 'chi'.\n"),
-    'A2/D/H/psi'   : Item("This is the file 'psi'.\n"),
-    'A2/D/H/omega' : Item("This is the file 'omega'.\n"),
-  })
-  expected_disk.tweak('A/D/G/pi',
-                      contents=3D"This is the file 'pi'.\nEdited in wc 1=
=2E\n")
-  expected_disk.remove('A/D/G/rho',
-                       'A/D/G/tau')
+  expected_disk =3D svntest.actions.deep_trees_virginal_state.copy()
+  expected_disk.tweak('F/alpha', contents=3D"This is the file 'alpha'.\n=
More text for file alpha.\n")
=20
-  expected_status =3D svntest.actions.get_virginal_state(wc_dir, 2)
-  expected_status.add({
-    'A2'           : Item(wc_rev=3D3),
-    'A2/mu'        : Item(wc_rev=3D3),
-    'A2/B'         : Item(wc_rev=3D3),
-    'A2/B/lambda'  : Item(wc_rev=3D3),
-    'A2/B/E'       : Item(wc_rev=3D3),
-    'A2/B/E/alpha' : Item(wc_rev=3D3),
-    'A2/B/E/beta'  : Item(wc_rev=3D3),
-    'A2/B/F'       : Item(wc_rev=3D3),
-    'A2/C'         : Item(wc_rev=3D3),
-    'A2/D'         : Item(wc_rev=3D3),
-    'A2/D/gamma'   : Item(wc_rev=3D3),
-    'A2/D/G'       : Item(wc_rev=3D3),
-    'A2/D/G/pi'    : Item(wc_rev=3D3),
-    'A2/D/H'       : Item(wc_rev=3D3),
-    'A2/D/H/chi'   : Item(wc_rev=3D3),
-    'A2/D/H/psi'   : Item(wc_rev=3D3),
-    'A2/D/H/omega' : Item(wc_rev=3D3),
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'DDF'               : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDF/D1'            : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDF/D1/D2'         : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDF/D1/D2/gamma'   : Item(status=3D'  ', wc_rev=3D'3'),
+    'D'                 : Item(status=3D'  ', wc_rev=3D'3'),
+    'D/D1'              : Item(status=3D'  ', wc_rev=3D'3'),
+    'DD'                : Item(status=3D'  ', wc_rev=3D'3'),
+    'DD/D1'             : Item(status=3D'  ', wc_rev=3D'3'),
+    'DD/D1/D2'          : Item(status=3D'  ', wc_rev=3D'3'),
+    'DF'                : Item(status=3D'  ', wc_rev=3D'3'),
+    'DF/D1'             : Item(status=3D'  ', wc_rev=3D'3'),
+    'DF/D1/beta'        : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDD'               : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDD/D1'            : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDD/D1/D2'         : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDD/D1/D2/D3'      : Item(status=3D'  ', wc_rev=3D'3'),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
_del_F",
+                                        leaf_edit_F,
+                                        tree_del_F,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status) ]
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
_del_D",
+                                        leaf_edit_D,
+                                        tree_del_D,
+                                        error_re_string =3D error_re_str=
ing) ]
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
_del_DF",
+                                        leaf_edit_DF,
+                                        tree_del_DF,
+                                        error_re_string =3D error_re_str=
ing) ]
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
_del_DD",
+                                        leaf_edit_DD,
+                                        tree_del_DD,
+                                        error_re_string =3D error_re_str=
ing) ]
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
_del_DDF",
+                                        leaf_edit_DDF,
+                                        tree_del_DDF,
+                                        error_re_string =3D error_re_str=
ing) ]
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
_del_DDD",
+                                        leaf_edit_DDD,
+                                        tree_del_DDD,
+                                        error_re_string =3D error_re_str=
ing) ]
+
+
+  # 2.2) local leaf delete, incoming tree delete
+
+  expected_output =3D svntest.wc.State('', {
+    'D'                 : Item(status=3D'C '),
+    'D/D1'              : Item(status=3D'D '),
+    'F'                 : Item(status=3D'C '),
+    'F/alpha'           : Item(status=3D'D '),
+    'DD'                : Item(),
+    'DD/D1'             : Item(status=3D'D '),
+    'DF'                : Item(),
+    'DF/D1'             : Item(status=3D'D '),
+    'DDD'               : Item(),
+    'DDD/D1'            : Item(status=3D'D '),
+    'DDF'               : Item(),
+    'DDF/D1'            : Item(status=3D'D '),
+    })
+
+  expected_disk =3D state_after_tree_del
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'DD'                : Item(status=3D'  ', wc_rev=3D'3'),
+    'DF'                : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDD'               : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDF'               : Item(status=3D'  ', wc_rev=3D'3'),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_del_incoming_tree_=
del",
+                                        leaf_del,
+                                        tree_del,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status) ]
+
+
+  # use case 3, as in notes/tree-conflicts/use-cases.txt
+  # local tree delete, incoming tree delete
+
+  expected_output =3D svntest.wc.State('', {
+    'D'                 : Item(status=3D'C '),
+    'D/D1'              : Item(status=3D'D '),
+    'F'                 : Item(status=3D'C '),
+    'F/alpha'           : Item(status=3D'D '),
+    'DD'                : Item(status=3D'C '),
+    'DD/D1'             : Item(status=3D'D '),
+    'DF'                : Item(status=3D'C '),
+    'DF/D1'             : Item(status=3D'D '),
+    'DDD'               : Item(status=3D'C '),
+    'DDD/D1'            : Item(status=3D'D '),
+    'DDF'               : Item(status=3D'C '),
+    'DDF/D1'            : Item(status=3D'D '),
   })
-  expected_status.tweak(status=3D'  ')
-  expected_status.tweak('A2', switched=3D'S')
-  expected_status.tweak('A2/D/G', status=3D'C ')
-  expected_status.tweak('A2/D/G/pi', status=3D'D ')
-  expected_status.tweak('A/D/G/pi', wc_rev=3D3)
-  expected_status.remove('A/D/G/rho',
-                         'A/D/G/tau')
=20
-  svntest.actions.run_and_verify_switch(wc_dir, A2,=20
-                                        sbox.repo_url + '/A',
+  expected_disk =3D state_after_tree_del
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'3'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'3'),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'3'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'3'),
+    })
+
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_tree_=
del",
+                                        tree_del,
+                                        tree_del,
                                         expected_output,
                                         expected_disk,
-                                        expected_status)
+                                        expected_status) ]
=20
=20
+  # now run the whole bunch of them.
+  svntest.actions.deep_trees_run_tests_scheme_for_switch(sbox, greater_s=
cheme)
+
+
+
 ########################################################################=

 # Run the tests
=20
@@ -2232,7 +2496,7 @@
               switch_urls_with_spaces,
               switch_to_dir_with_peg_rev2,
               switch_to_root,
-              tree_conflicts_in_switched_files,
+              tree_conflicts_on_switch,
              ]
=20
 if __name__ =3D=3D '__main__':
Index: subversion/tests/cmdline/update_tests.py
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- subversion/tests/cmdline/update_tests.py	(revision 32499)
+++ subversion/tests/cmdline/update_tests.py	(working copy)
@@ -3862,50 +3862,251 @@
=20
 #----------------------------------------------------------------------
=20
-def tree_conflicts_in_updated_files(sbox):
-  "tree conflicts in updated files"
+# Detect tree conflicts among files and directories,
+# edited or deleted in a deep directory structure.
+#
+# See use cases 1-3 in notes/tree-conflicts/use-cases.txt for background=
=2E
+#
+def tree_conflicts_on_update(sbox):
+  "tree conflicts on update (tc use cases 1 to 3)"
=20
-  # Detect simple tree conflicts among files edited or deleted in a sing=
le
-  # directory.
+  # Each case is constructed and then appended to this table, which
+  # is initially empty:
+  greater_scheme =3D [];
=20
-  # See use cases 1-3 in notes/tree-conflicts/use-cases.txt for backgrou=
nd.
-  # Note that we do not try to track renames.  The only difference from
-  # the behavior of Subversion 1.4 and 1.5 is the conflicted status of t=
he
-  # parent directory.
+  # convenience definitions
+  leaf_edit =3D svntest.actions.deep_trees_leaf_edit
+  tree_del =3D svntest.actions.deep_trees_tree_del
+  leaf_del =3D svntest.actions.deep_trees_leaf_del
=20
-  sbox.build()
-  wc_dir =3D sbox.wc_dir
+  state_after_leaf_edit =3D svntest.actions.deep_trees_after_leaf_edit
+  state_after_leaf_del =3D svntest.actions.deep_trees_after_leaf_del
+  state_after_tree_del =3D svntest.actions.deep_trees_after_tree_del
=20
-  # Set up tree conflicts in wc 2
-  wc_dir_2 =3D svntest.actions.set_up_tree_conflicts(sbox)
+  DeepTreesTestCase =3D svntest.actions.DeepTreesTestCase
=20
-  # Update in wc 2
-  expected_output =3D wc.State(wc_dir_2, {
-    'A/D/G'       : Item(status=3D'C '),
-    'A/D/G/pi'    : Item(status=3D'U '),
-    'A/D/G/rho'   : Item(status=3D'D '),
-    'A/D/G/tau'   : Item(status=3D'D '),
+
+  # use case 1, as in notes/tree-conflicts/use-cases.txt
+  # 1.1) local tree delete, incoming leaf edit
+
+  expected_output =3D wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'F/alpha'           : Item(status=3D'U '),
+    'D'                 : Item(status=3D'C '),
+    'D/D1/delta'        : Item(status=3D'A '),
+    'DF'                : Item(status=3D'C '),
+    'DF/D1'             : Item(status=3D'C '),
+    'DF/D1/beta'        : Item(status=3D'U '),
+    'DD'                : Item(status=3D'C '),
+    'DD/D1'             : Item(status=3D'C '),
+    'DD/D1/D2/epsilon'  : Item(status=3D'A '),
+    'DDF'               : Item(status=3D'C '),
+    'DDF/D1'            : Item(status=3D'C '),
+    'DDF/D1/D2'         : Item(status=3D'C '),
+    'DDF/D1/D2/gamma'   : Item(status=3D'U '),
+    'DDD'               : Item(status=3D'C '),
+    'DDD/D1'            : Item(status=3D'C '),
+    'DDD/D1/D2'         : Item(status=3D'C '),
+    'DDD/D1/D2/D3/zeta' : Item(status=3D'A '),
     })
=20
-  expected_disk =3D svntest.main.greek_state.copy()
-  expected_disk.tweak('A/D/G/pi',
-                      contents=3D"This is the file 'pi'.\nEdited in wc 1=
=2E\n")
-  expected_disk.tweak('A/D/G/rho',
-                      contents=3D"This is the file 'rho'.\nEdited in wc =
2.\n")
-  expected_disk.remove('A/D/G/tau')
+  expected_disk =3D state_after_leaf_edit
=20
-  expected_status =3D svntest.actions.get_virginal_state(wc_dir_2, 2)
-  expected_status.tweak('A/D/G',     status=3D'C ')
-  expected_status.tweak('A/D/G/pi',  status=3D'D ')
-  expected_status.remove('A/D/G/rho',
-                         'A/D/G/tau')
+  expected_status =3D wc.State('', {
+    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'3'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'D/D1'              : Item(status=3D'D ', wc_rev=3D'3'),
+    'D/D1/delta'        : Item(status=3D'  ', wc_rev=3D'3'),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'3'),
+    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'3'),
+    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'3'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'3'),
+    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'3'),
+    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'3'),
+    'DD/D1/D2/epsilon'  : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'3'),
+    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'3'),
+    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDD/D1/D2/D3/zeta' : Item(status=3D'  ', wc_rev=3D'3'),
+    })
=20
-  svntest.actions.run_and_verify_update(wc_dir_2,
+  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_leaf_=
edit",
+                                        tree_del,
+                                        leaf_edit,
                                         expected_output,
                                         expected_disk,
-                                        expected_status)
+                                        expected_status) ]
=20
=20
+  # 1.2) local tree delete, incoming leaf delete
+
+  expected_output =3D wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'F/alpha'           : Item(status=3D'D '),
+    'D'                 : Item(status=3D'C '),
+    'D/D1'              : Item(status=3D'D '),
+    'DF'                : Item(status=3D'C '),
+    'DF/D1'             : Item(status=3D'C '),
+    'DF/D1/beta'        : Item(status=3D'D '),
+    'DD'                : Item(status=3D'C '),
+    'DD/D1'             : Item(status=3D'C '),
+    'DD/D1/D2'          : Item(status=3D'D '),
+    'DDF'               : Item(status=3D'C '),
+    'DDF/D1'            : Item(status=3D'C '),
+    'DDF/D1/D2'         : Item(status=3D'C '),
+    'DDF/D1/D2/gamma'   : Item(status=3D'D '),
+    'DDD'               : Item(status=3D'C '),
+    'DDD/D1'            : Item(status=3D'C '),
+    'DDD/D1/D2'         : Item(status=3D'C '),
+    'DDD/D1/D2/D3'      : Item(status=3D'D '),
+    })
+
+  expected_disk =3D state_after_leaf_del
+
+  expected_status =3D wc.State('', {
+    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'3'),
+    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'3'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'3'),
+    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'3'),
+    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'3'),
+    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'3'),
+    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'3'),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_leaf_=
del",
+                                        tree_del,
+                                        leaf_del,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status) ]
+
+
+  # use case 2, as in notes/tree-conflicts/use-cases.txt
+  # 2.1) local leaf edit, incoming tree delete
+
+  expected_output =3D wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'F/alpha'           : Item(status=3D'D '),
+    'D/D1'              : Item(status=3D'D '),
+    'DF/D1'             : Item(status=3D'D '),
+    'DD/D1'             : Item(status=3D'D '),
+    'DDF/D1'            : Item(status=3D'D '),
+    'DDD/D1'            : Item(status=3D'D '),
+    })
+
+  expected_disk =3D state_after_leaf_edit
+
+  expected_status =3D wc.State('', {
+    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'D'                 : Item(status=3D'  ', wc_rev=3D'3'),
+    'DF'                : Item(status=3D'  ', wc_rev=3D'3'),
+    'DD'                : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDF'               : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDD'               : Item(status=3D'  ', wc_rev=3D'3'),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
_del",
+                                        leaf_edit,
+                                        tree_del,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status) ]
+
+
+  # 2.2) local leaf delete, incoming tree delete
+
+  expected_output =3D wc.State('', {
+    'D'                 : Item(status=3D'C '),
+    'D/D1'              : Item(status=3D'D '),
+    'F'                 : Item(status=3D'C '),
+    'F/alpha'           : Item(status=3D'D '),
+    'DD'                : Item(),
+    'DD/D1'             : Item(status=3D'D '),
+    'DF'                : Item(),
+    'DF/D1'             : Item(status=3D'D '),
+    'DDD'               : Item(),
+    'DDD/D1'            : Item(status=3D'D '),
+    'DDF'               : Item(),
+    'DDF/D1'            : Item(status=3D'D '),
+    })
+
+  expected_disk =3D state_after_tree_del
+
+  expected_status =3D wc.State('', {
+    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'DD'                : Item(status=3D'  ', wc_rev=3D'3'),
+    'DF'                : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDD'               : Item(status=3D'  ', wc_rev=3D'3'),
+    'DDF'               : Item(status=3D'  ', wc_rev=3D'3'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_del_incoming_tree_=
del",
+                                        leaf_del,
+                                        tree_del,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status) ]
+
+
+  # use case 3, as in notes/tree-conflicts/use-cases.txt
+  # local tree delete, incoming tree delete
+
+  expected_output =3D wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'F/alpha'           : Item(status=3D'D '),
+    'D'                 : Item(status=3D'C '),
+    'D/D1'              : Item(status=3D'D '),
+    'DF'                : Item(status=3D'C '),
+    'DF/D1'             : Item(status=3D'D '),
+    'DD'                : Item(status=3D'C '),
+    'DD/D1'             : Item(status=3D'D '),
+    'DDF'               : Item(status=3D'C '),
+    'DDF/D1'            : Item(status=3D'D '),
+    'DDD'               : Item(status=3D'C '),
+    'DDD/D1'            : Item(status=3D'D '),
+    })
+
+  expected_disk =3D state_after_tree_del
+
+  expected_status =3D wc.State('', {
+    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'3'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'3'),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'3'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'3'),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_tree_=
del",
+                                        tree_del,
+                                        tree_del,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status) ]
+
+
+  # now run the whole bunch of them.
+  svntest.actions.deep_trees_run_tests_scheme_for_update(sbox, greater_s=
cheme)
+
+
+
 #######################################################################
 # Run the tests
=20
@@ -3959,7 +4160,7 @@
               update_accept_conflicts,
               eof_in_interactive_conflict_resolver,
               update_uuid_changed,
-              tree_conflicts_in_updated_files,
+              tree_conflicts_on_update,
              ]
=20
 if __name__ =3D=3D '__main__':
Index: subversion/tests/cmdline/svntest/tree.py
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- subversion/tests/cmdline/svntest/tree.py	(revision 32499)
+++ subversion/tests/cmdline/svntest/tree.py	(working copy)
@@ -207,6 +207,40 @@
     else:
       print >> stream, "    Children:  None (node is probably a file)"
=20
+  def print_script(self, stream =3D sys.stdout, strip =3D 0):
+    "Python-script-print the meta data for this node."
+   =20
+    path =3D self.path
+    if len(path) > len(root_node_name) and path.startswith(root_node_nam=
e):
+      path =3D path[(len(root_node_name)+1):]
+    if len(path) > strip:
+      path =3D path[strip:]
+
+    line =3D "%-20s: Item(" % ("'%s'" % path)
+    comma =3D False
+
+    mime_type =3D self.props.get("svn:mime-type")
+    if not mime_type or mime_type.startswith("text/"):
+      if self.children is None and not self.contents is None:
+        line +=3D "contents=3D\"\"\"%s\"\"\"" % self.contents
+        comma =3D True
+
+    for name in self.atts:
+      if comma:
+        line +=3D ", "
+      line +=3D "%s=3D'%s'" % (name, self.atts[name])
+      comma =3D True
+
+#    for name in self.props:
+#      if comma:
+#        line +=3D ", "
+#      line +=3D "%s=3D'%s'" % (name, self.props[name])
+#      comma =3D True
+
+    line +=3D "),"
+    print >> stream, line
+
+
   def __str__(self):
     import StringIO
     s =3D StringIO.StringIO()
@@ -555,7 +589,7 @@
=20
 # Visually show a tree's structure
=20
-def dump_tree(n,indent=3D""):
+def dump_tree(n,indent=3D"",verbose=3DFalse):
   "Print out a nice representation of the tree's structure."
=20
   # Code partially stolen from Dave Beazley
@@ -569,17 +603,41 @@
   else:
     print "%s%s" % (indent, n.name)
=20
+  if verbose:
+    n.pprint()
+
   indent =3D indent.replace("-", " ")
   indent =3D indent.replace("+", " ")
   for i in range(len(tmp_children)):
     c =3D tmp_children[i]
     if i =3D=3D len(tmp_children
                 )-1:
-      dump_tree(c,indent + "  +-- ")
+      dump_tree(c,indent + "  +-- ",verbose)
     else:
-      dump_tree(c,indent + "  |-- ")
+      dump_tree(c,indent + "  |-- ",verbose)
=20
+def dump_tree_script(n, strip=3D0):
=20
+  for i in range(len(tmp_children)):
+    c =3D tmp_children[i]
+    if i =3D=3D len(tmp_children
+                )-1:
+      dump_tree_script(c, strip=3Dstrip)
+    else:
+      dump_tree_script(c, strip=3Dstrip)
+
+
 ###################################################################
 ###################################################################
 # PARSERS that return trees made of SVNTreeNodes....
Index: subversion/tests/cmdline/merge_tests.py
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- subversion/tests/cmdline/merge_tests.py	(revision 32499)
+++ subversion/tests/cmdline/merge_tests.py	(working copy)
@@ -12548,6 +12548,8 @@
                                        None, None, None, None, None, 1)
   os.chdir(saved_cwd)
=20
+
+#----------------------------------------------------------------------
 # Helper for text output.
 def verify_lines(lines, regexes):
   """Return True if each of the given regular expressions matches
@@ -12581,107 +12583,10 @@
                           actions_and_victims)):
     raise svntest.Failure("Wrong tree-conflict result")
=20
-# This test involves tree conflicts.
-def tree_conflicts_in_merged_files(sbox):
-  "tree conflicts in merged files"
=20
-  # Detect simple tree conflicts among files edited or deleted in a sing=
le
-  # directory.
=20
-  # See use cases 4-6 in notes/tree-conflicts/use-cases.txt for backgrou=
nd.
-  # Note that we do not try to track renames.  The only difference from
-  # the behavior of Subversion 1.4 and 1.5 is the conflicted status of t=
he
-  # parent directory.
+#----------------------------------------------------------------------
=20
-  sbox.build()
-  wc_dir =3D sbox.wc_dir
-
-  # Set up tree conflicts in wc 2
-  wc_dir_2 =3D svntest.actions.set_up_tree_conflicts_for_merge(sbox)
-  j =3D os.path.join
-  A2 =3D j(wc_dir, 'A2')
-  D2 =3D j(wc_dir, 'A2', 'D')
-  G2 =3D j(wc_dir, 'A2', 'D', 'G')
-  svntest.main.run_svn(None, 'ci', '-m', 'Changes in wc 2.', A2)
-
-  # Merge a revision from url 1 into wc 2
-  expected_output =3D wc.State(A2, {
-    'D'         : Item(status=3D'C '),
-    'D/sigma'   : Item(status=3D'D '),
-    'D/G'       : Item(status=3D'C '),
-    'D/G/rho'   : Item(status=3D'D '),
-    })
-
-  expected_disk =3D wc.State('', {
-    'mu'        : Item("This is the file 'mu'.\n"),
-    'B'         : Item(),
-    'B/lambda'  : Item("This is the file 'lambda'.\n"),
-    'B/E'       : Item(),
-    'B/E/alpha' : Item("This is the file 'alpha'.\n"),
-    'B/E/beta'  : Item("This is the file 'beta'.\n"),
-    'B/F'       : Item(),
-    'C'         : Item(),
-    'D'         : Item(),
-    'D/sigma'   : Item("This is the file 'sigma'.\nEdited in wc 2.\n"),
-    'D/G'       : Item(),
-    'D/G/rho'   : Item("This is the file 'rho'.\nEdited in wc 2.\n"),
-    'D/H'       : Item(),
-    'D/H/chi'   : Item("This is the file 'chi'.\n"),
-    'D/H/psi'   : Item("This is the file 'psi'.\n"),
-    'D/H/omega' : Item("This is the file 'omega'.\n"),
-    })
-
-  expected_status =3D wc.State(A2, {
-    ''          : Item(),
-    'mu'        : Item(),
-    'B'         : Item(),
-    'B/lambda'  : Item(),
-    'B/E'       : Item(),
-    'B/E/alpha' : Item(),
-    'B/E/beta'  : Item(),
-    'B/F'       : Item(),
-    'C'         : Item(),
-    'D'         : Item(),
-    'D/sigma'   : Item(),
-    'D/G'       : Item(),
-    'D/G/rho'   : Item(),
-    'D/H'       : Item(),
-    'D/H/chi'   : Item(),
-    'D/H/psi'   : Item(),
-    'D/H/omega' : Item(),
-    })
-  expected_status.tweak(status=3D'  ', wc_rev=3D3)
-  expected_status.tweak('', status=3D' M')
-  expected_status.tweak('D', 'D/G', status=3D'C ')
-  expected_status.tweak('D/sigma', 'D/G/rho', status=3D'D ', wc_rev=3D5)=

-
-  expected_skip =3D wc.State(A2, {
-    'D/gamma'   : Item(),
-    'D/theta'   : Item(),
-    'D/G/pi'    : Item(),
-    'D/G/tau'   : Item(),
-    })
-
-  svntest.actions.run_and_verify_merge(A2, 3, 4,
-                                       sbox.repo_url + '/A',
-                                       expected_output,
-                                       expected_disk,
-                                       expected_status,
-                                       expected_skip)
-
-  # Make sure all victims have been found.
-  verify_tree_conflict_info(D2,
-                            [('edit',   'gamma'),  # use case 4
-                             ('delete', 'sigma'),  # use case 5
-                             ('delete', 'theta'),  # use case 6
-                             ])
-  verify_tree_conflict_info(G2,
-                            [('edit',   'pi'),   # use case 4
-                             ('delete', 'rho'),  # use case 5
-                             ('delete', 'tau'),  # use case 6
-                             ])
-
-
 # This test involves tree conflicts.
 def tree_conflicts_and_obstructions(sbox):
   "tree conflicts and obstructions"
@@ -12752,6 +12657,646 @@
                             [('add', 'alpha-moved')])
=20
=20
+#----------------------------------------------------------------------
+
+# Detect tree conflicts among files and directories,
+# edited or deleted in a deep directory structure.
+#
+# See use cases 4-6 in notes/tree-conflicts/use-cases.txt for background=
=2E
+# Note that we do not try to track renames.  The only difference from
+# the behavior of Subversion 1.4 and 1.5 is the conflicted status of the=

+# parent directory.
+#
+def tree_conflicts_on_merge_local_ci(sbox):
+  "tree conflicts on merge, local commit (tc 4-6)"
+
+  # Each case is constructed and then appended to the table, which
+  # is initially empty:
+  greater_scheme =3D [];
+
+  # convenience definitions
+  leaf_edit =3D svntest.actions.deep_trees_leaf_edit
+  tree_del =3D svntest.actions.deep_trees_tree_del
+  leaf_del =3D svntest.actions.deep_trees_leaf_del
+
+  state_after_leaf_edit =3D svntest.actions.deep_trees_after_leaf_edit
+  state_after_leaf_del =3D svntest.actions.deep_trees_after_leaf_del
+  state_after_tree_del =3D svntest.actions.deep_trees_after_tree_del
+
+  j =3D os.path.join
+
+  DeepTreesTestCase =3D svntest.actions.DeepTreesTestCase
+
+
+  # use case 1, as in notes/tree-conflicts/use-cases.txt
+  # 1.1) local tree delete, incoming leaf edit
+
+  expected_output =3D svntest.wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'D'                 : Item(status=3D'C '),
+    'DF'                : Item(status=3D'C '),
+    'DD'                : Item(status=3D'C '),
+    'DDF'               : Item(status=3D'C '),
+    'DDD'               : Item(status=3D'C '),
+    })
+
+  expected_disk =3D state_after_tree_del
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
+    })
+
+  expected_skip =3D svntest.wc.State('', {
+    'F/alpha'           : Item(),
+    'DF/D1/beta'        : Item(),
+    'DDF/D1/D2/gamma'   : Item(),
+    'D/D1/delta'        : Item(),
+    'DD/D1/D2/epsilon'  : Item(),
+    'DDD/D1/D2/D3/zeta' : Item(),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_leaf_=
edit",
+                                        tree_del,
+                                        leaf_edit,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status,
+                                        expected_skip) ]
+
+  # 1.2) local tree delete, incoming leaf delete
+
+  expected_output =3D svntest.wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'D'                 : Item(status=3D'C '),
+    'DF'                : Item(status=3D'C '),
+    'DD'                : Item(status=3D'C '),
+    'DDF'               : Item(status=3D'C '),
+    'DDD'               : Item(status=3D'C '),
+    })
+
+  expected_disk =3D state_after_tree_del
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
+    })
+
+  expected_skip =3D svntest.wc.State('', {
+    'F/alpha'           : Item(),
+    'DF/D1/beta'        : Item(),
+    'DDF/D1/D2/gamma'   : Item(),
+    'D/D1'              : Item(),
+    'DD/D1/D2'          : Item(),
+    'DDD/D1/D2/D3'      : Item(),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_leaf_=
del",
+                                        tree_del,
+                                        leaf_del,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status,
+                                        expected_skip) ]
+
+
+
+
+  # use case 2, as in notes/tree-conflicts/use-cases.txt
+  # 2.1) local leaf edit, incoming tree delete
+
+  expected_output =3D svntest.wc.State('', {
+    'D'                 : Item(),
+    'D/D1'              : Item(status=3D'D '),
+    'F'                 : Item(status=3D'C '),
+    'F/alpha'           : Item(status=3D'D '),
+    'DD'                : Item(),
+    'DD/D1'             : Item(status=3D'D '),
+    'DF'                : Item(),
+    'DF/D1'             : Item(status=3D'D '),
+    'DDD'               : Item(),
+    'DDD/D1'            : Item(status=3D'D '),
+    'DDF'               : Item(),
+    'DDF/D1'            : Item(status=3D'D '),
+    })
+
+  expected_disk =3D svntest.wc.State('', {
+    'DF'                : Item(),
+    'DF/D1'             : Item(),
+    'DDF'               : Item(),
+    'DDF/D1'            : Item(),
+    'DDF/D1/D2'         : Item(),
+    'F'                 : Item(),
+    'F/alpha'           : Item(contents=3D"This is the file 'alpha'.\nMo=
re text for file alpha.\n"),
+    'DDD'               : Item(),
+    'DDD/D1'            : Item(),
+    'DDD/D1/D2'         : Item(),
+    'DDD/D1/D2/D3'      : Item(),
+    'DD'                : Item(),
+    'DD/D1'             : Item(),
+    'DD/D1/D2'          : Item(),
+    'D'                 : Item(),
+    'D/D1'              : Item(),
+    })
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'  ', wc_rev=3D'7'),
+    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
+    'D/D1/delta'        : Item(status=3D'D ', wc_rev=3D'8'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'8'),
+    'DD'                : Item(status=3D'  ', wc_rev=3D'7'),
+    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD/D1/D2/epsilon'  : Item(status=3D'D ', wc_rev=3D'8'),
+    'DF'                : Item(status=3D'  ', wc_rev=3D'7'),
+    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'8'),
+    'DDD'               : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2/D3/zeta' : Item(status=3D'D ', wc_rev=3D'8'),
+    'DDF'               : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'8'),
+    })
+
+  expected_skip =3D svntest.wc.State('', {})
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
_del",
+                                        leaf_edit,
+                                        tree_del,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status,
+                                        expected_skip) ]
+
+
+  # 2.2) local leaf del, incoming tree delete
+
+  expected_output =3D svntest.wc.State('', {
+    'D'                 : Item(status=3D'C '),
+    'F'                 : Item(status=3D'C '),
+    'DD'                : Item(),
+    'DD/D1'             : Item(status=3D'D '),
+    'DF'                : Item(),
+    'DF/D1'             : Item(status=3D'D '),
+    'DDD'               : Item(),
+    'DDD/D1'            : Item(status=3D'D '),
+    'DDF'               : Item(),
+    'DDF/D1'            : Item(status=3D'D '),
+    })
+
+
+  expected_disk =3D svntest.wc.State('', {
+    'F'                 : Item(),
+    'D'                 : Item(),
+    'DF/D1'             : Item(),
+    'DD/D1'             : Item(),
+    'DDF/D1/D2'         : Item(),
+    'DDD/D1/D2'         : Item(),
+    })
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'DD'                : Item(status=3D'  ', wc_rev=3D'7'),
+    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DF'                : Item(status=3D'  ', wc_rev=3D'7'),
+    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD'               : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF'               : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    })
+
+  expected_skip =3D svntest.wc.State('', {
+    'F/alpha'           : Item(),
+    'D/D1'              : Item(),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_del_incoming_tree_=
del",
+                                        leaf_del,
+                                        tree_del,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status,
+                                        expected_skip) ]
+
+
+  # use case 3, as in notes/tree-conflicts/use-cases.txt
+  # local tree delete, incoming tree delete
+
+  expected_output =3D svntest.wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'D'                 : Item(status=3D'C '),
+    'DF'                : Item(status=3D'C '),
+    'DD'                : Item(status=3D'C '),
+    'DDF'               : Item(status=3D'C '),
+    'DDD'               : Item(status=3D'C '),
+    })
+
+  expected_disk =3D state_after_tree_del
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
+    })
+
+  expected_skip =3D svntest.wc.State('', {
+    'D/D1'              : Item(),
+    'F/alpha'           : Item(),
+    'DD/D1'             : Item(),
+    'DF/D1'             : Item(),
+    'DDD/D1'            : Item(),
+    'DDF/D1'            : Item(),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_tree_=
del",
+                                        tree_del,
+                                        tree_del,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status,
+                                        expected_skip) ]
+
+
+  # now run the whole bunch of them.
+  svntest.actions.deep_trees_run_tests_scheme_for_merge(sbox, greater_sc=
heme,
+                                                        True)
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+def tree_conflicts_on_merge_no_local_ci(sbox):
+  "tree conflicts on merge, NO local commit (tc 4-6)"
+
+  # Each case is constructed and then appended to the table, which
+  # is initially empty:
+  greater_scheme =3D [];
+
+  # convenience definitions
+  leaf_edit =3D svntest.actions.deep_trees_leaf_edit
+  tree_del =3D svntest.actions.deep_trees_tree_del
+  leaf_del =3D svntest.actions.deep_trees_leaf_del
+
+  state_after_leaf_edit =3D svntest.actions.deep_trees_after_leaf_edit
+  state_after_leaf_del =3D svntest.actions.deep_trees_after_leaf_del
+  state_after_tree_del =3D svntest.actions.deep_trees_after_tree_del
+
+  j =3D os.path.join
+
+  DeepTreesTestCase =3D svntest.actions.DeepTreesTestCase
+
+
+  # use case 1, as in notes/tree-conflicts/use-cases.txt
+  # 1.1) local tree delete, incoming leaf edit
+
+  expected_output =3D svntest.wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'D'                 : Item(status=3D'C '),
+    'D/D1'              : Item(),
+    'D/D1/delta'        : Item(status=3D'A '),
+    'DF'                : Item(status=3D'C '),
+    'DF/D1'             : Item(status=3D'C '),
+    'DD'                : Item(status=3D'C '),
+    'DD/D1'             : Item(status=3D'C '),
+    'DD/D1/D2'          : Item(),
+    'DD/D1/D2/epsilon'  : Item(status=3D'A '),
+    'DDF'               : Item(status=3D'C '),
+    'DDF/D1'            : Item(status=3D'C '),
+    'DDF/D1/D2'         : Item(status=3D'C '),
+    'DDD'               : Item(status=3D'C '),
+    'DDD/D1'            : Item(status=3D'C '),
+    'DDD/D1/D2'         : Item(status=3D'C '),
+    'DDD/D1/D2/D3'      : Item(),
+    'DDD/D1/D2/D3/zeta' : Item(status=3D'A '),
+    })
+
+  expected_disk =3D svntest.wc.State('', {
+    'F'                 : Item(),
+    'D/D1/delta'        : Item(contents=3D"This is the file 'delta'.\n")=
,
+    'DF/D1'             : Item(),
+    'DD/D1/D2/epsilon'  : Item(contents=3D"This is the file 'epsilon'.\n=
"),
+    'DDF/D1/D2'         : Item(),
+    'DDD/D1/D2/D3/zeta' : Item(contents=3D"This is the file 'zeta'.\n"),=

+    })
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD/D1/D2/epsilon'  : Item(status=3D'A ', copied=3D'+', wc_rev=3D'-'=
),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2/D3/zeta' : Item(status=3D'A ', copied=3D'+', wc_rev=3D'-'=
),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
+    'D/D1/delta'        : Item(status=3D'A ', copied=3D'+', wc_rev=3D'-'=
),
+    })
+
+  alpha_beta_gamma =3D svntest.wc.State('', {
+    'F/alpha'           : Item(),
+    'DF/D1/beta'        : Item(),
+    'DDF/D1/D2/gamma'   : Item(),
+    })
+
+  expected_skip =3D alpha_beta_gamma
+
+  greater_scheme +=3D [ DeepTreesTestCase(
+                               "local_tree_del_incoming_leaf_edit",
+                               tree_del,
+                               leaf_edit,
+                               expected_output,
+                               expected_disk,
+                               expected_status,
+                               expected_skip,
+                             ) ]
+
+  # 1.2) local tree delete, incoming leaf delete
+
+  expected_output =3D svntest.wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'D'                 : Item(status=3D'C '),
+    'D/D1'              : Item(status=3D'D '),
+    'DF'                : Item(status=3D'C '),
+    'DF/D1'             : Item(status=3D'C '),
+    'DD'                : Item(status=3D'C '),
+    'DD/D1'             : Item(status=3D'C '),
+    'DD/D1/D2'          : Item(status=3D'D '),
+    'DDF'               : Item(status=3D'C '),
+    'DDF/D1'            : Item(status=3D'C '),
+    'DDF/D1/D2'         : Item(status=3D'C '),
+    'DDD'               : Item(status=3D'C '),
+    'DDD/D1'            : Item(status=3D'C '),
+    'DDD/D1/D2'         : Item(status=3D'C '),
+    'DDD/D1/D2/D3'      : Item(status=3D'D '),
+    })
+
+  expected_disk =3D svntest.wc.State('', {
+    'F'                 : Item(),
+    'D/D1'              : Item(),
+    'DF/D1'             : Item(),
+    'DD/D1/D2'          : Item(),
+    'DDF/D1/D2'         : Item(),
+    'DDD/D1/D2/D3'      : Item(),
+    })
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
+    })
+
+  expected_skip =3D alpha_beta_gamma
+
+  greater_scheme +=3D [ DeepTreesTestCase(
+                               "local_tree_del_incoming_leaf_del",
+                               tree_del,
+                               leaf_del,
+                               expected_output,
+                               expected_disk,
+                               expected_status,
+                               expected_skip,
+                             ) ]
+
+
+
+
+  # use case 2, as in notes/tree-conflicts/use-cases.txt
+  # 2.1) local leaf edit, incoming tree delete
+
+  expected_output =3D svntest.wc.State('', {
+    'F'                 : Item(status=3D'C '),
+    'F/alpha'           : Item(status=3D'D '),
+    })
+
+  expected_disk =3D state_after_leaf_edit
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'  ', wc_rev=3D'7'),
+    'D/D1'              : Item(status=3D' M', wc_rev=3D'7'),
+    'D/D1/delta'        : Item(status=3D'A ', wc_rev=3D'0'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD'                : Item(status=3D'  ', wc_rev=3D'7'),
+    'DD/D1'             : Item(status=3D' M', wc_rev=3D'7'),
+    'DD/D1/D2'          : Item(status=3D'  ', wc_rev=3D'7'),
+    'DD/D1/D2/epsilon'  : Item(status=3D'A ', wc_rev=3D'0'),
+    'DF'                : Item(status=3D'  ', wc_rev=3D'7'),
+    'DF/D1'             : Item(status=3D' M', wc_rev=3D'7'),
+    'DF/D1/beta'        : Item(status=3D'M ', wc_rev=3D'7'),
+    'DDD'               : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDD/D1'            : Item(status=3D' M', wc_rev=3D'7'),
+    'DDD/D1/D2'         : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDD/D1/D2/D3'      : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDD/D1/D2/D3/zeta' : Item(status=3D'A ', wc_rev=3D'0'),
+    'DDF'               : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDF/D1'            : Item(status=3D' M', wc_rev=3D'7'),
+    'DDF/D1/D2'         : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDF/D1/D2/gamma'   : Item(status=3D'M ', wc_rev=3D'7'),
+    })
+
+  expected_skip =3D svntest.wc.State('', {
+    'D/D1'              : Item(),
+    'DF/D1'             : Item(),
+    'DD/D1'             : Item(),
+    'DDF/D1'            : Item(),
+    'DDD/D1'            : Item(),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase(
+                               "local_leaf_edit_incoming_tree_del",
+                               leaf_edit,
+                               tree_del,
+                               expected_output,
+                               expected_disk,
+                               expected_status,
+                               expected_skip,
+                             ) ]
+
+
+  # 2.2) local leaf del, incoming tree delete
+
+  expected_output =3D svntest.wc.State('', {
+    'D'                 : Item(status=3D'C '),
+    'D/D1'              : Item(status=3D'D '),
+    'F'                 : Item(status=3D'C '),
+    'DD'                : Item(),
+    'DD/D1'             : Item(status=3D'D '),
+    'DF'                : Item(),
+    'DF/D1'             : Item(status=3D'D '),
+    'DDD'               : Item(),
+    'DDD/D1'            : Item(status=3D'D '),
+    'DDF'               : Item(),
+    'DDF/D1'            : Item(status=3D'D '),
+    })
+
+
+  expected_disk =3D svntest.wc.State('', {
+    'F'                 : Item(),
+    'D/D1'              : Item(),
+    'DF/D1'             : Item(),
+    'DD/D1/D2'          : Item(),
+    'DDF/D1/D2'         : Item(),
+    'DDD/D1/D2/D3'      : Item(),
+    })
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD'                : Item(status=3D'  ', wc_rev=3D'7'),
+    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
+    'DF'                : Item(status=3D'  ', wc_rev=3D'7'),
+    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD'               : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF'               : Item(status=3D'  ', wc_rev=3D'7'),
+    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
+    })
+
+  expected_skip =3D svntest.wc.State('', {
+    'F/alpha'           : Item(),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase(
+                               "local_leaf_del_incoming_tree_del",
+                               leaf_del,
+                               tree_del,
+                               expected_output,
+                               expected_disk,
+                               expected_status,
+                               expected_skip,
+                             ) ]
+
+
+  # use case 3, as in notes/tree-conflicts/use-cases.txt
+  # local tree delete, incoming tree delete
+
+  expected_output =3D svntest.wc.State('', {
+    'D'                 : Item(status=3D'C '),
+    'D/D1'              : Item(status=3D'D '),
+    'F'                 : Item(status=3D'C '),
+    'DD'                : Item(status=3D'C '),
+    'DD/D1'             : Item(status=3D'D '),
+    'DF'                : Item(status=3D'C '),
+    'DF/D1'             : Item(status=3D'D '),
+    'DDD'               : Item(status=3D'C '),
+    'DDD/D1'            : Item(status=3D'D '),
+    'DDF'               : Item(status=3D'C '),
+    'DDF/D1'            : Item(status=3D'D '),
+    })
+
+  expected_disk =3D svntest.wc.State('', {
+    'F'                 : Item(),
+    'D/D1'              : Item(),
+    'DF/D1'             : Item(),
+    'DD/D1/D2'          : Item(),
+    'DDF/D1/D2'         : Item(),
+    'DDD/D1/D2/D3'      : Item(),
+    })
+
+  expected_status =3D svntest.wc.State('', {
+    ''                  : Item(status=3D' M', wc_rev=3D'7'),
+    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'7'),
+    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
+    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
+    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
+    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
+    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
+    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
+    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
+    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
+    })
+
+  expected_skip =3D svntest.wc.State('', {
+    'F/alpha'           : Item(),
+    })
+
+  greater_scheme +=3D [ DeepTreesTestCase(
+                               "local_tree_del_incoming_tree_del",
+                               tree_del,
+                               tree_del,
+                               expected_output,
+                               expected_disk,
+                               expected_status,
+                               expected_skip,
+                             ) ]
+
+
+  # now run the whole bunch of them.
+  svntest.actions.deep_trees_run_tests_scheme_for_merge(sbox, greater_sc=
heme,
+                                                        False)
+
+
+
 ########################################################################=

 # Run the tests
=20
@@ -12925,8 +13470,9 @@
                          server_has_mergeinfo),
               XFail(SkipUnless(subtrees_with_empty_mergeinfo,
                                server_has_mergeinfo)),
-              tree_conflicts_in_merged_files,
               tree_conflicts_and_obstructions,
+              tree_conflicts_on_merge_local_ci,
+              tree_conflicts_on_merge_no_local_ci,
              ]
=20
 if __name__ =3D=3D '__main__':

--------------080409030609080001000909
Content-Type: text/x-diff;
 name="merge_patch.diff"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline;
 filename="merge_patch.diff"

Index: subversion/libsvn_client/merge.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- subversion/libsvn_client/merge.c	(revision 32499)
+++ subversion/libsvn_client/merge.c	(working copy)
@@ -1516,27 +1516,35 @@
                  svn_revnum_t rev,
                  void *baton)
 {
+  // TODO This function segfaulted for adm_access =3D=3D NULL. I disable=
d all of
+  // the code that was added on the tree-conflicts branch for the case o=
f
+  // adm_access =3D=3D NULL. It remains to be seen if that's ok.
+
+  if (adm_access !=3D NULL)
+    {
-  merge_cmd_baton_t *merge_b =3D baton;
-  apr_pool_t *subpool =3D svn_pool_create(merge_b->pool);
-  svn_node_kind_t kind;
-  const svn_wc_entry_t *entry;
+      merge_cmd_baton_t *merge_b =3D baton;
+      apr_pool_t *subpool =3D svn_pool_create(merge_b->pool);
+      svn_node_kind_t kind;
+      const svn_wc_entry_t *entry =3D NULL;
=20
-  /* Find the version-control and on-disk states of this path */
-  SVN_ERR(svn_wc_entry(&entry, path, adm_access, TRUE, subpool));
-  SVN_ERR(svn_io_check_path(path, &kind, subpool));
+      /* Find the version-control and on-disk states of this path */
+      SVN_ERR(svn_wc_entry(&entry, path, adm_access, TRUE, subpool));
+      SVN_ERR(svn_io_check_path(path, &kind, subpool));
=20
-  /* If we're trying to open a directory that's not a directory,
-   * raise a tree conflict. */
-  if (!entry || entry->schedule =3D=3D svn_wc_schedule_delete
-      || kind !=3D svn_node_dir)
-    {
-      SVN_ERR(tree_conflict(merge_b, adm_access, path,
-                            svn_node_dir,
-                            svn_wc_conflict_action_edit,
-                            svn_wc_conflict_reason_deleted));
-    }
+      /* If we're trying to open a directory that's not a directory,
+       * raise a tree conflict. */
+      if (!entry || entry->schedule =3D=3D svn_wc_schedule_delete
+          || kind !=3D svn_node_dir)
+        {
+          SVN_ERR(tree_conflict(merge_b, adm_access, path,
+                                svn_node_dir,
+                                svn_wc_conflict_action_edit,
+                                svn_wc_conflict_reason_deleted));
+        }

-  svn_pool_destroy(subpool);
+      svn_pool_destroy(subpool);
+    }
=20
   return SVN_NO_ERROR;
 }
=20

--------------080409030609080001000909
Content-Type: text/plain;
 name="segfault.backtrace"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline;
 filename="segfault.backtrace"

The segmentation fault occurs in merge_tests.py:101,
subtest local_tree_del_incoming_leaf_edit.

It occurs when calling svn_wc_entry with parameter adm_access=3D=3DNULL,
when trying to merge the addition of the file

  DD/D1/D2/epsilon

, while in the local working copy, on another branch sharing ancestry,
a removal of DD/D1 has been committed.

It occurs while trying to get adm_access information on DD/D1/D2.

My guess is that adm_access becomes NULL since neither D2 nor its parent
D1 are present on the branch.


neels@dub:/arch/elego/svn/tc/subversion/tests/cmdline=20
$ ./merge_tests.py 101
<artificially exiting just before the segmentation fault:
 put `return None` in svntest/actions.py:2063, just after "8) Merge all">=

PASS:  merge_tests.py 101: tree conflicts on merge, local commit (tc 4-6)=


neels@dub:/arch/elego/svn/tc/subversion/tests/cmdline=20
$ gdb /arch/elego/svn/tc/subversion/svn/svn
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.h=
tml>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying=
"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...

(gdb) run merge file:///arch/elego/svn/tc/subversion/tests/cmdline/svn-te=
st-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_edit/in=
coming svn-test-work/working_copies/merge_tests-101/local_tree_del_incomi=
ng_leaf_edit/local --config-dir /arch/elego/svn/tc/subversion/tests/cmdli=
ne/svn-test-work/local_tmp/config --password rayjandom --no-auth-cache --=
username jrandom
Starting program: /arch/elego/svn/tc/subversion/svn/svn merge file:///arc=
h/elego/svn/tc/subversion/tests/cmdline/svn-test-work/repositories/merge_=
tests-101/local_tree_del_incoming_leaf_edit/incoming svn-test-work/workin=
g_copies/merge_tests-101/local_tree_del_incoming_leaf_edit/local --config=
-dir /arch/elego/svn/tc/subversion/tests/cmdline/svn-test-work/local_tmp/=
config --password rayjandom --no-auth-cache --username jrandom
[Thread debugging using libthread_db enabled]
Skipped missing target: 'svn-test-work/working_copies/merge_tests-101/loc=
al_tree_del_incoming_leaf_edit/local/D/D1/delta'
Skipped missing target: 'svn-test-work/working_copies/merge_tests-101/loc=
al_tree_del_incoming_leaf_edit/local/D/D1'
--- Merging r3 through r8 into 'svn-test-work/working_copies/merge_tests-=
101/local_tree_del_incoming_leaf_edit/local':
C    svn-test-work/working_copies/merge_tests-101/local_tree_del_incoming=
_leaf_edit/local/D
Skipped missing target: 'svn-test-work/working_copies/merge_tests-101/loc=
al_tree_del_incoming_leaf_edit/local/F/alpha'
C    svn-test-work/working_copies/merge_tests-101/local_tree_del_incoming=
_leaf_edit/local/F
[New Thread 0xb7a8c6d0 (LWP 584)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7a8c6d0 (LWP 584)]
0x080ada84 in svn_wc__adm_retrieve_internal (adm_access=3D0xbfc76890, ass=
ociated=3D0x0,=20
    path=3D0x829b5b0 "svn-test-work/working_copies/merge_tests-101/local_=
tree_del_incoming_leaf_edit/local/DD/D1/D2", pool=3D0x82cc038) at subvers=
ion/libsvn_wc/lock.c:894
894	  if (associated->set)
(gdb) bt
#0  0x080ada84 in svn_wc__adm_retrieve_internal (adm_access=3D0xbfc76890,=
 associated=3D0x0,=20
    path=3D0x829b5b0 "svn-test-work/working_copies/merge_tests-101/local_=
tree_del_incoming_leaf_edit/local/DD/D1/D2", pool=3D0x82cc038) at subvers=
ion/libsvn_wc/lock.c:894
#1  0x080a88fe in svn_wc_entry (entry=3D0xbfc768d8, path=3D0x829b5b0 "svn=
-test-work/working_copies/merge_tests-101/local_tree_del_incoming_leaf_ed=
it/local/DD/D1/D2",=20
    adm_access=3D0x0, show_hidden=3D1, pool=3D0x82cc038) at subversion/li=
bsvn_wc/entries.c:1247
#2  0x08080d20 in merge_dir_opened (adm_access=3D0x0, path=3D0x829b5b0 "s=
vn-test-work/working_copies/merge_tests-101/local_tree_del_incoming_leaf_=
edit/local/DD/D1/D2", rev=3D2,=20
    baton=3D0xbfc77348) at subversion/libsvn_client/merge.c:1531
#3  0x08091af2 in open_directory (path=3D0x829b480 "DD/D1/D2", parent_bat=
on=3D0x82b6d28, base_revision=3D2, pool=3D0x829b3c0, child_baton=3D0x829b=
514)
    at subversion/libsvn_client/repos_diff.c:616
#4  0x081313dd in open_directory (path=3D0x829b480 "DD/D1/D2", parent_bat=
on=3D0x82b6d20, base_revision=3D2, pool=3D0x829b3c0, child_baton=3D0x829b=
50c)
    at subversion/libsvn_delta/cancel.c:140
#5  0x081313dd in open_directory (path=3D0x829b480 "DD/D1/D2", parent_bat=
on=3D0x82b6d18, base_revision=3D2, pool=3D0x829b3c0, child_baton=3D0xbfc7=
6aa0)
    at subversion/libsvn_delta/cancel.c:140
#6  0x080e76df in update_entry (b=3D0x8207680, s_rev=3D2, s_path=3D0x829b=
438 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1/D2", s_entry=3D0x8=
2a6e08,=20
    t_path=3D0x829b4d0 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1=
/D2", t_entry=3D0x82a73b8, dir_baton=3D0x82b6d18, e_path=3D0x829b480 "DD/=
D1/D2", info=3D0x0,=20
    wc_depth=3Dsvn_depth_infinity, requested_depth=3Dsvn_depth_infinity, =
pool=3D0x829b3c0) at subversion/libsvn_repos/reporter.c:830
#7  0x080e82a6 in delta_dirs (b=3D0x8207680, s_rev=3D2, s_path=3D0x82b6c5=
8 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1",=20
    t_path=3D0x82b6ce0 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1=
", dir_baton=3D0x82b6d18, e_path=3D0x82b6ca0 "DD/D1", start_empty=3D0, wc=
_depth=3Dsvn_depth_infinity,=20
    requested_depth=3Dsvn_depth_infinity, pool=3D0x82b6be8) at subversion=
/libsvn_repos/reporter.c:1110
#8  0x080e77cf in update_entry (b=3D0x8207680, s_rev=3D2, s_path=3D0x82b6=
c58 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1", s_entry=3D0x8296=
d90,=20
    t_path=3D0x82b6ce0 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1=
", t_entry=3D0x8297320, dir_baton=3D0x8275448, e_path=3D0x82b6ca0 "DD/D1"=
, info=3D0x0,=20
    wc_depth=3Dsvn_depth_infinity, requested_depth=3Dsvn_depth_infinity, =
pool=3D0x82b6be8) at subversion/libsvn_repos/reporter.c:837
#9  0x080e82a6 in delta_dirs (b=3D0x8207680, s_rev=3D2, s_path=3D0x827539=
8 "/local_tree_del_incoming_leaf_edit/incoming/DD",=20
    t_path=3D0x8275418 "/local_tree_del_incoming_leaf_edit/incoming/DD", =
dir_baton=3D0x8275448, e_path=3D0x82753d8 "DD", start_empty=3D0, wc_depth=
=3Dsvn_depth_infinity,=20
    requested_depth=3Dsvn_depth_infinity, pool=3D0x8275328) at subversion=
/libsvn_repos/reporter.c:1110
#10 0x080e77cf in update_entry (b=3D0x8207680, s_rev=3D2, s_path=3D0x8275=
398 "/local_tree_del_incoming_leaf_edit/incoming/DD", s_entry=3D0x8282360=
,=20
    t_path=3D0x8275418 "/local_tree_del_incoming_leaf_edit/incoming/DD", =
t_entry=3D0x82830c0, dir_baton=3D0x828ab38, e_path=3D0x82753d8 "DD", info=
=3D0x0, wc_depth=3Dsvn_depth_infinity,=20
    requested_depth=3Dsvn_depth_infinity, pool=3D0x8275328) at subversion=
/libsvn_repos/reporter.c:837
#11 0x080e82a6 in delta_dirs (b=3D0x8207680, s_rev=3D2, s_path=3D0x826583=
8 "/local_tree_del_incoming_leaf_edit/incoming",=20
    t_path=3D0x8207475 "/local_tree_del_incoming_leaf_edit/incoming", dir=
_baton=3D0x828ab38, e_path=3D0x819e96b "", start_empty=3D0, wc_depth=3Dsv=
n_depth_infinity,=20
    requested_depth=3Dsvn_depth_infinity, pool=3D0x8207200) at subversion=
/libsvn_repos/reporter.c:1110
#12 0x080e865e in drive (b=3D0x8207680, s_rev=3D2, info=3D0x8208e50, pool=
=3D0x8207200) at subversion/libsvn_repos/reporter.c:1174
#13 0x080e8a13 in finish_report (b=3D0x8207680, pool=3D0x8207200) at subv=
ersion/libsvn_repos/reporter.c:1241
#14 0x080e8ed7 in svn_repos_finish_report (baton=3D0x8207680, pool=3D0x82=
07200) at subversion/libsvn_repos/reporter.c:1365
#15 0x080dac25 in reporter_finish_report (reporter_baton=3D0x8208e18, poo=
l=3D0x8207200) at subversion/libsvn_ra_local/ra_plugin.c:210
#16 0x08082a37 in drive_merge_report_editor (target_wcpath=3D0x81d19b0 "s=
vn-test-work/working_copies/merge_tests-101/local_tree_del_incoming_leaf_=
edit/local",=20
    url1=3D0x81f3f38 "file:///arch/elego/svn/tc/subversion/tests/cmdline/=
svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_e=
dit/incoming", revision1=3D2,=20
    url2=3D0x81f40c8 "file:///arch/elego/svn/tc/subversion/tests/cmdline/=
svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_e=
dit/incoming", revision2=3D8,=20
    children_with_mergeinfo=3D0x81ef618, is_rollback=3D0, depth=3Dsvn_dep=
th_infinity, notify_b=3D0xbfc773a0, adm_access=3D0x81d1e48, callbacks=3D0=
x8198520, merge_b=3D0xbfc77348,=20
    pool=3D0x8207200) at subversion/libsvn_client/merge.c:2791
#17 0x080865e6 in do_directory_merge (
    url1=3D0x81f3f38 "file:///arch/elego/svn/tc/subversion/tests/cmdline/=
svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_e=
dit/incoming", revision1=3D2,=20
    url2=3D0x81f40c8 "file:///arch/elego/svn/tc/subversion/tests/cmdline/=
svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_e=
dit/incoming", revision2=3D8,=20
    parent_entry=3D0x81d1f30, adm_access=3D0x81d1e48, depth=3Dsvn_depth_i=
nfinity, notify_b=3D0xbfc773a0, merge_b=3D0xbfc77348, pool=3D0x81e7198) a=
t subversion/libsvn_client/merge.c:4912
#18 0x08087747 in do_merge (merge_sources=3D0x81f3b68, target=3D0x81d19b0=
 "svn-test-work/working_copies/merge_tests-101/local_tree_del_incoming_le=
af_edit/local",=20
    target_entry=3D0x81d1f30, adm_access=3D0x81d1e48, sources_ancestral=3D=
1, sources_related=3D1, same_repos=3D1, ignore_ancestry=3D0, force=3D0, d=
ry_run=3D0, record_only=3D0,=20
    depth=3Dsvn_depth_infinity, merge_options=3D0x0, ctx=3D0x81d07a8, poo=
l=3D0x81d01e0) at subversion/libsvn_client/merge.c:5395
#19 0x08089d23 in svn_client_merge_peg3 (
    source=3D0x81d1690 "file:///arch/elego/svn/tc/subversion/tests/cmdlin=
e/svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf=
_edit/incoming",=20
    ranges_to_merge=3D0x81d1a40, peg_revision=3D0xbfc77524, target_wcpath=
=3D0x81d19b0 "svn-test-work/working_copies/merge_tests-101/local_tree_del=
_incoming_leaf_edit/local",=20
    depth=3Dsvn_depth_unknown, ignore_ancestry=3D0, force=3D0, record_onl=
y=3D0, dry_run=3D0, merge_options=3D0x0, ctx=3D0x81d07a8, pool=3D0x81d01e=
0) at subversion/libsvn_client/merge.c:6339
#20 0x08058d36 in svn_cl__merge (os=3D0x81d0380, baton=3D0xbfc77760, pool=
=3D0x81d01e0) at subversion/svn/merge-cmd.c:307
#21 0x080582d1 in main (argc=3D11, argv=3D0xbfc77894) at subversion/svn/m=
ain.c:1981


--------------080409030609080001000909--

Re: tree conflicts: segfault in merge_dir_opened

Posted by Neels Janosch Hofmeyr <ne...@elego.de>.
My mail client seriously messed this one up.
I'll have to retype all of it... >:(

Neels Janosch Hofmeyr wrote:
>  # Run the tests
> =20
> @@ -2232,7 +2496,7 @@
>                switch_urls_with_spaces,
>                switch_to_dir_with_peg_rev2,
>                switch_to_root,
> -              tree_conflicts_in_switched_files,
> +              tree_conflicts_on_switch,
>               ]
> =20
>  if __name__ =3D=3D '__main__':
> Index: subversion/tests/cmdline/update_tests.py
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- subversion/tests/cmdline/update_tests.py	(revision 32499)
> +++ subversion/tests/cmdline/update_tests.py	(working copy)
> @@ -3862,50 +3862,251 @@
> =20
>  #----------------------------------------------------------------------
> =20
> -def tree_conflicts_in_updated_files(sbox):
> -  "tree conflicts in updated files"
> +# Detect tree conflicts among files and directories,
> +# edited or deleted in a deep directory structure.
> +#
> +# See use cases 1-3 in notes/tree-conflicts/use-cases.txt for background=
> =2E
> +#
> +def tree_conflicts_on_update(sbox):
> +  "tree conflicts on update (tc use cases 1 to 3)"
> =20
> -  # Detect simple tree conflicts among files edited or deleted in a sing=
> le
> -  # directory.
> +  # Each case is constructed and then appended to this table, which
> +  # is initially empty:
> +  greater_scheme =3D [];
> =20
> -  # See use cases 1-3 in notes/tree-conflicts/use-cases.txt for backgrou=
> nd.
> -  # Note that we do not try to track renames.  The only difference from
> -  # the behavior of Subversion 1.4 and 1.5 is the conflicted status of t=
> he
> -  # parent directory.
> +  # convenience definitions
> +  leaf_edit =3D svntest.actions.deep_trees_leaf_edit
> +  tree_del =3D svntest.actions.deep_trees_tree_del
> +  leaf_del =3D svntest.actions.deep_trees_leaf_del
> =20
> -  sbox.build()
> -  wc_dir =3D sbox.wc_dir
> +  state_after_leaf_edit =3D svntest.actions.deep_trees_after_leaf_edit
> +  state_after_leaf_del =3D svntest.actions.deep_trees_after_leaf_del
> +  state_after_tree_del =3D svntest.actions.deep_trees_after_tree_del
> =20
> -  # Set up tree conflicts in wc 2
> -  wc_dir_2 =3D svntest.actions.set_up_tree_conflicts(sbox)
> +  DeepTreesTestCase =3D svntest.actions.DeepTreesTestCase
> =20
> -  # Update in wc 2
> -  expected_output =3D wc.State(wc_dir_2, {
> -    'A/D/G'       : Item(status=3D'C '),
> -    'A/D/G/pi'    : Item(status=3D'U '),
> -    'A/D/G/rho'   : Item(status=3D'D '),
> -    'A/D/G/tau'   : Item(status=3D'D '),
> +
> +  # use case 1, as in notes/tree-conflicts/use-cases.txt
> +  # 1.1) local tree delete, incoming leaf edit
> +
> +  expected_output =3D wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'F/alpha'           : Item(status=3D'U '),
> +    'D'                 : Item(status=3D'C '),
> +    'D/D1/delta'        : Item(status=3D'A '),
> +    'DF'                : Item(status=3D'C '),
> +    'DF/D1'             : Item(status=3D'C '),
> +    'DF/D1/beta'        : Item(status=3D'U '),
> +    'DD'                : Item(status=3D'C '),
> +    'DD/D1'             : Item(status=3D'C '),
> +    'DD/D1/D2/epsilon'  : Item(status=3D'A '),
> +    'DDF'               : Item(status=3D'C '),
> +    'DDF/D1'            : Item(status=3D'C '),
> +    'DDF/D1/D2'         : Item(status=3D'C '),
> +    'DDF/D1/D2/gamma'   : Item(status=3D'U '),
> +    'DDD'               : Item(status=3D'C '),
> +    'DDD/D1'            : Item(status=3D'C '),
> +    'DDD/D1/D2'         : Item(status=3D'C '),
> +    'DDD/D1/D2/D3/zeta' : Item(status=3D'A '),
>      })
> =20
> -  expected_disk =3D svntest.main.greek_state.copy()
> -  expected_disk.tweak('A/D/G/pi',
> -                      contents=3D"This is the file 'pi'.\nEdited in wc 1=
> =2E\n")
> -  expected_disk.tweak('A/D/G/rho',
> -                      contents=3D"This is the file 'rho'.\nEdited in wc =
> 2.\n")
> -  expected_disk.remove('A/D/G/tau')
> +  expected_disk =3D state_after_leaf_edit
> =20
> -  expected_status =3D svntest.actions.get_virginal_state(wc_dir_2, 2)
> -  expected_status.tweak('A/D/G',     status=3D'C ')
> -  expected_status.tweak('A/D/G/pi',  status=3D'D ')
> -  expected_status.remove('A/D/G/rho',
> -                         'A/D/G/tau')
> +  expected_status =3D wc.State('', {
> +    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
> +    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'3'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
> +    'D/D1'              : Item(status=3D'D ', wc_rev=3D'3'),
> +    'D/D1/delta'        : Item(status=3D'  ', wc_rev=3D'3'),
> +    'DF'                : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DD'                : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DD/D1/D2/epsilon'  : Item(status=3D'  ', wc_rev=3D'3'),
> +    'DDF'               : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDD'               : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDD/D1/D2/D3/zeta' : Item(status=3D'  ', wc_rev=3D'3'),
> +    })
> =20
> -  svntest.actions.run_and_verify_update(wc_dir_2,
> +  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_leaf_=
> edit",
> +                                        tree_del,
> +                                        leaf_edit,
>                                          expected_output,
>                                          expected_disk,
> -                                        expected_status)
> +                                        expected_status) ]
> =20
> =20
> +  # 1.2) local tree delete, incoming leaf delete
> +
> +  expected_output =3D wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'F/alpha'           : Item(status=3D'D '),
> +    'D'                 : Item(status=3D'C '),
> +    'D/D1'              : Item(status=3D'D '),
> +    'DF'                : Item(status=3D'C '),
> +    'DF/D1'             : Item(status=3D'C '),
> +    'DF/D1/beta'        : Item(status=3D'D '),
> +    'DD'                : Item(status=3D'C '),
> +    'DD/D1'             : Item(status=3D'C '),
> +    'DD/D1/D2'          : Item(status=3D'D '),
> +    'DDF'               : Item(status=3D'C '),
> +    'DDF/D1'            : Item(status=3D'C '),
> +    'DDF/D1/D2'         : Item(status=3D'C '),
> +    'DDF/D1/D2/gamma'   : Item(status=3D'D '),
> +    'DDD'               : Item(status=3D'C '),
> +    'DDD/D1'            : Item(status=3D'C '),
> +    'DDD/D1/D2'         : Item(status=3D'C '),
> +    'DDD/D1/D2/D3'      : Item(status=3D'D '),
> +    })
> +
> +  expected_disk =3D state_after_leaf_del
> +
> +  expected_status =3D wc.State('', {
> +    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DF'                : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DD'                : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDF'               : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDD'               : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'3'),
> +    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'3'),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_leaf_=
> del",
> +                                        tree_del,
> +                                        leaf_del,
> +                                        expected_output,
> +                                        expected_disk,
> +                                        expected_status) ]
> +
> +
> +  # use case 2, as in notes/tree-conflicts/use-cases.txt
> +  # 2.1) local leaf edit, incoming tree delete
> +
> +  expected_output =3D wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'F/alpha'           : Item(status=3D'D '),
> +    'D/D1'              : Item(status=3D'D '),
> +    'DF/D1'             : Item(status=3D'D '),
> +    'DD/D1'             : Item(status=3D'D '),
> +    'DDF/D1'            : Item(status=3D'D '),
> +    'DDD/D1'            : Item(status=3D'D '),
> +    })
> +
> +  expected_disk =3D state_after_leaf_edit
> +
> +  expected_status =3D wc.State('', {
> +    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
> +    'D'                 : Item(status=3D'  ', wc_rev=3D'3'),
> +    'DF'                : Item(status=3D'  ', wc_rev=3D'3'),
> +    'DD'                : Item(status=3D'  ', wc_rev=3D'3'),
> +    'DDF'               : Item(status=3D'  ', wc_rev=3D'3'),
> +    'DDD'               : Item(status=3D'  ', wc_rev=3D'3'),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
> _del",
> +                                        leaf_edit,
> +                                        tree_del,
> +                                        expected_output,
> +                                        expected_disk,
> +                                        expected_status) ]
> +
> +
> +  # 2.2) local leaf delete, incoming tree delete
> +
> +  expected_output =3D wc.State('', {
> +    'D'                 : Item(status=3D'C '),
> +    'D/D1'              : Item(status=3D'D '),
> +    'F'                 : Item(status=3D'C '),
> +    'F/alpha'           : Item(status=3D'D '),
> +    'DD'                : Item(),
> +    'DD/D1'             : Item(status=3D'D '),
> +    'DF'                : Item(),
> +    'DF/D1'             : Item(status=3D'D '),
> +    'DDD'               : Item(),
> +    'DDD/D1'            : Item(status=3D'D '),
> +    'DDF'               : Item(),
> +    'DDF/D1'            : Item(status=3D'D '),
> +    })
> +
> +  expected_disk =3D state_after_tree_del
> +
> +  expected_status =3D wc.State('', {
> +    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DD'                : Item(status=3D'  ', wc_rev=3D'3'),
> +    'DF'                : Item(status=3D'  ', wc_rev=3D'3'),
> +    'DDD'               : Item(status=3D'  ', wc_rev=3D'3'),
> +    'DDF'               : Item(status=3D'  ', wc_rev=3D'3'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_del_incoming_tree_=
> del",
> +                                        leaf_del,
> +                                        tree_del,
> +                                        expected_output,
> +                                        expected_disk,
> +                                        expected_status) ]
> +
> +
> +  # use case 3, as in notes/tree-conflicts/use-cases.txt
> +  # local tree delete, incoming tree delete
> +
> +  expected_output =3D wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'F/alpha'           : Item(status=3D'D '),
> +    'D'                 : Item(status=3D'C '),
> +    'D/D1'              : Item(status=3D'D '),
> +    'DF'                : Item(status=3D'C '),
> +    'DF/D1'             : Item(status=3D'D '),
> +    'DD'                : Item(status=3D'C '),
> +    'DD/D1'             : Item(status=3D'D '),
> +    'DDF'               : Item(status=3D'C '),
> +    'DDF/D1'            : Item(status=3D'D '),
> +    'DDD'               : Item(status=3D'C '),
> +    'DDD/D1'            : Item(status=3D'D '),
> +    })
> +
> +  expected_disk =3D state_after_tree_del
> +
> +  expected_status =3D wc.State('', {
> +    ''                  : Item(status=3D'  ', wc_rev=3D'3'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'3'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DF'                : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DD'                : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DDF'               : Item(status=3D'C ', wc_rev=3D'3'),
> +    'DDD'               : Item(status=3D'C ', wc_rev=3D'3'),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_tree_=
> del",
> +                                        tree_del,
> +                                        tree_del,
> +                                        expected_output,
> +                                        expected_disk,
> +                                        expected_status) ]
> +
> +
> +  # now run the whole bunch of them.
> +  svntest.actions.deep_trees_run_tests_scheme_for_update(sbox, greater_s=
> cheme)
> +
> +
> +
>  #######################################################################
>  # Run the tests
> =20
> @@ -3959,7 +4160,7 @@
>                update_accept_conflicts,
>                eof_in_interactive_conflict_resolver,
>                update_uuid_changed,
> -              tree_conflicts_in_updated_files,
> +              tree_conflicts_on_update,
>               ]
> =20
>  if __name__ =3D=3D '__main__':
> Index: subversion/tests/cmdline/svntest/tree.py
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- subversion/tests/cmdline/svntest/tree.py	(revision 32499)
> +++ subversion/tests/cmdline/svntest/tree.py	(working copy)
> @@ -207,6 +207,40 @@
>      else:
>        print >> stream, "    Children:  None (node is probably a file)"
> =20
> +  def print_script(self, stream =3D sys.stdout, strip =3D 0):
> +    "Python-script-print the meta data for this node."
> +   =20
> +    path =3D self.path
> +    if len(path) > len(root_node_name) and path.startswith(root_node_nam=
> e):
> +      path =3D path[(len(root_node_name)+1):]
> +    if len(path) > strip:
> +      path =3D path[strip:]
> +
> +    line =3D "%-20s: Item(" % ("'%s'" % path)
> +    comma =3D False
> +
> +    mime_type =3D self.props.get("svn:mime-type")
> +    if not mime_type or mime_type.startswith("text/"):
> +      if self.children is None and not self.contents is None:
> +        line +=3D "contents=3D\"\"\"%s\"\"\"" % self.contents
> +        comma =3D True
> +
> +    for name in self.atts:
> +      if comma:
> +        line +=3D ", "
> +      line +=3D "%s=3D'%s'" % (name, self.atts[name])
> +      comma =3D True
> +
> +#    for name in self.props:
> +#      if comma:
> +#        line +=3D ", "
> +#      line +=3D "%s=3D'%s'" % (name, self.props[name])
> +#      comma =3D True
> +
> +    line +=3D "),"
> +    print >> stream, line
> +
> +
>    def __str__(self):
>      import StringIO
>      s =3D StringIO.StringIO()
> @@ -555,7 +589,7 @@
> =20
>  # Visually show a tree's structure
> =20
> -def dump_tree(n,indent=3D""):
> +def dump_tree(n,indent=3D"",verbose=3DFalse):
>    "Print out a nice representation of the tree's structure."
> =20
>    # Code partially stolen from Dave Beazley
> @@ -569,17 +603,41 @@
>    else:
>      print "%s%s" % (indent, n.name)
> =20
> +  if verbose:
> +    n.pprint()
> +
>    indent =3D indent.replace("-", " ")
>    indent =3D indent.replace("+", " ")
>    for i in range(len(tmp_children)):
>      c =3D tmp_children[i]
>      if i =3D=3D len(tmp_children
>                  )-1:
> -      dump_tree(c,indent + "  +-- ")
> +      dump_tree(c,indent + "  +-- ",verbose)
>      else:
> -      dump_tree(c,indent + "  |-- ")
> +      dump_tree(c,indent + "  |-- ",verbose)
> =20
> +def dump_tree_script(n, strip=3D0):
> =20
> +  for i in range(len(tmp_children)):
> +    c =3D tmp_children[i]
> +    if i =3D=3D len(tmp_children
> +                )-1:
> +      dump_tree_script(c, strip=3Dstrip)
> +    else:
> +      dump_tree_script(c, strip=3Dstrip)
> +
> +
>  ###################################################################
>  ###################################################################
>  # PARSERS that return trees made of SVNTreeNodes....
> Index: subversion/tests/cmdline/merge_tests.py
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- subversion/tests/cmdline/merge_tests.py	(revision 32499)
> +++ subversion/tests/cmdline/merge_tests.py	(working copy)
> @@ -12548,6 +12548,8 @@
>                                         None, None, None, None, None, 1)
>    os.chdir(saved_cwd)
> =20
> +
> +#----------------------------------------------------------------------
>  # Helper for text output.
>  def verify_lines(lines, regexes):
>    """Return True if each of the given regular expressions matches
> @@ -12581,107 +12583,10 @@
>                            actions_and_victims)):
>      raise svntest.Failure("Wrong tree-conflict result")
> =20
> -# This test involves tree conflicts.
> -def tree_conflicts_in_merged_files(sbox):
> -  "tree conflicts in merged files"
> =20
> -  # Detect simple tree conflicts among files edited or deleted in a sing=
> le
> -  # directory.
> =20
> -  # See use cases 4-6 in notes/tree-conflicts/use-cases.txt for backgrou=
> nd.
> -  # Note that we do not try to track renames.  The only difference from
> -  # the behavior of Subversion 1.4 and 1.5 is the conflicted status of t=
> he
> -  # parent directory.
> +#----------------------------------------------------------------------
> =20
> -  sbox.build()
> -  wc_dir =3D sbox.wc_dir
> -
> -  # Set up tree conflicts in wc 2
> -  wc_dir_2 =3D svntest.actions.set_up_tree_conflicts_for_merge(sbox)
> -  j =3D os.path.join
> -  A2 =3D j(wc_dir, 'A2')
> -  D2 =3D j(wc_dir, 'A2', 'D')
> -  G2 =3D j(wc_dir, 'A2', 'D', 'G')
> -  svntest.main.run_svn(None, 'ci', '-m', 'Changes in wc 2.', A2)
> -
> -  # Merge a revision from url 1 into wc 2
> -  expected_output =3D wc.State(A2, {
> -    'D'         : Item(status=3D'C '),
> -    'D/sigma'   : Item(status=3D'D '),
> -    'D/G'       : Item(status=3D'C '),
> -    'D/G/rho'   : Item(status=3D'D '),
> -    })
> -
> -  expected_disk =3D wc.State('', {
> -    'mu'        : Item("This is the file 'mu'.\n"),
> -    'B'         : Item(),
> -    'B/lambda'  : Item("This is the file 'lambda'.\n"),
> -    'B/E'       : Item(),
> -    'B/E/alpha' : Item("This is the file 'alpha'.\n"),
> -    'B/E/beta'  : Item("This is the file 'beta'.\n"),
> -    'B/F'       : Item(),
> -    'C'         : Item(),
> -    'D'         : Item(),
> -    'D/sigma'   : Item("This is the file 'sigma'.\nEdited in wc 2.\n"),
> -    'D/G'       : Item(),
> -    'D/G/rho'   : Item("This is the file 'rho'.\nEdited in wc 2.\n"),
> -    'D/H'       : Item(),
> -    'D/H/chi'   : Item("This is the file 'chi'.\n"),
> -    'D/H/psi'   : Item("This is the file 'psi'.\n"),
> -    'D/H/omega' : Item("This is the file 'omega'.\n"),
> -    })
> -
> -  expected_status =3D wc.State(A2, {
> -    ''          : Item(),
> -    'mu'        : Item(),
> -    'B'         : Item(),
> -    'B/lambda'  : Item(),
> -    'B/E'       : Item(),
> -    'B/E/alpha' : Item(),
> -    'B/E/beta'  : Item(),
> -    'B/F'       : Item(),
> -    'C'         : Item(),
> -    'D'         : Item(),
> -    'D/sigma'   : Item(),
> -    'D/G'       : Item(),
> -    'D/G/rho'   : Item(),
> -    'D/H'       : Item(),
> -    'D/H/chi'   : Item(),
> -    'D/H/psi'   : Item(),
> -    'D/H/omega' : Item(),
> -    })
> -  expected_status.tweak(status=3D'  ', wc_rev=3D3)
> -  expected_status.tweak('', status=3D' M')
> -  expected_status.tweak('D', 'D/G', status=3D'C ')
> -  expected_status.tweak('D/sigma', 'D/G/rho', status=3D'D ', wc_rev=3D5)=
> 
> -
> -  expected_skip =3D wc.State(A2, {
> -    'D/gamma'   : Item(),
> -    'D/theta'   : Item(),
> -    'D/G/pi'    : Item(),
> -    'D/G/tau'   : Item(),
> -    })
> -
> -  svntest.actions.run_and_verify_merge(A2, 3, 4,
> -                                       sbox.repo_url + '/A',
> -                                       expected_output,
> -                                       expected_disk,
> -                                       expected_status,
> -                                       expected_skip)
> -
> -  # Make sure all victims have been found.
> -  verify_tree_conflict_info(D2,
> -                            [('edit',   'gamma'),  # use case 4
> -                             ('delete', 'sigma'),  # use case 5
> -                             ('delete', 'theta'),  # use case 6
> -                             ])
> -  verify_tree_conflict_info(G2,
> -                            [('edit',   'pi'),   # use case 4
> -                             ('delete', 'rho'),  # use case 5
> -                             ('delete', 'tau'),  # use case 6
> -                             ])
> -
> -
>  # This test involves tree conflicts.
>  def tree_conflicts_and_obstructions(sbox):
>    "tree conflicts and obstructions"
> @@ -12752,6 +12657,646 @@
>                              [('add', 'alpha-moved')])
> =20
> =20
> +#----------------------------------------------------------------------
> +
> +# Detect tree conflicts among files and directories,
> +# edited or deleted in a deep directory structure.
> +#
> +# See use cases 4-6 in notes/tree-conflicts/use-cases.txt for background=
> =2E
> +# Note that we do not try to track renames.  The only difference from
> +# the behavior of Subversion 1.4 and 1.5 is the conflicted status of the=
> 
> +# parent directory.
> +#
> +def tree_conflicts_on_merge_local_ci(sbox):
> +  "tree conflicts on merge, local commit (tc 4-6)"
> +
> +  # Each case is constructed and then appended to the table, which
> +  # is initially empty:
> +  greater_scheme =3D [];
> +
> +  # convenience definitions
> +  leaf_edit =3D svntest.actions.deep_trees_leaf_edit
> +  tree_del =3D svntest.actions.deep_trees_tree_del
> +  leaf_del =3D svntest.actions.deep_trees_leaf_del
> +
> +  state_after_leaf_edit =3D svntest.actions.deep_trees_after_leaf_edit
> +  state_after_leaf_del =3D svntest.actions.deep_trees_after_leaf_del
> +  state_after_tree_del =3D svntest.actions.deep_trees_after_tree_del
> +
> +  j =3D os.path.join
> +
> +  DeepTreesTestCase =3D svntest.actions.DeepTreesTestCase
> +
> +
> +  # use case 1, as in notes/tree-conflicts/use-cases.txt
> +  # 1.1) local tree delete, incoming leaf edit
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'D'                 : Item(status=3D'C '),
> +    'DF'                : Item(status=3D'C '),
> +    'DD'                : Item(status=3D'C '),
> +    'DDF'               : Item(status=3D'C '),
> +    'DDD'               : Item(status=3D'C '),
> +    })
> +
> +  expected_disk =3D state_after_tree_del
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    })
> +
> +  expected_skip =3D svntest.wc.State('', {
> +    'F/alpha'           : Item(),
> +    'DF/D1/beta'        : Item(),
> +    'DDF/D1/D2/gamma'   : Item(),
> +    'D/D1/delta'        : Item(),
> +    'DD/D1/D2/epsilon'  : Item(),
> +    'DDD/D1/D2/D3/zeta' : Item(),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_leaf_=
> edit",
> +                                        tree_del,
> +                                        leaf_edit,
> +                                        expected_output,
> +                                        expected_disk,
> +                                        expected_status,
> +                                        expected_skip) ]
> +
> +  # 1.2) local tree delete, incoming leaf delete
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'D'                 : Item(status=3D'C '),
> +    'DF'                : Item(status=3D'C '),
> +    'DD'                : Item(status=3D'C '),
> +    'DDF'               : Item(status=3D'C '),
> +    'DDD'               : Item(status=3D'C '),
> +    })
> +
> +  expected_disk =3D state_after_tree_del
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    })
> +
> +  expected_skip =3D svntest.wc.State('', {
> +    'F/alpha'           : Item(),
> +    'DF/D1/beta'        : Item(),
> +    'DDF/D1/D2/gamma'   : Item(),
> +    'D/D1'              : Item(),
> +    'DD/D1/D2'          : Item(),
> +    'DDD/D1/D2/D3'      : Item(),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_leaf_=
> del",
> +                                        tree_del,
> +                                        leaf_del,
> +                                        expected_output,
> +                                        expected_disk,
> +                                        expected_status,
> +                                        expected_skip) ]
> +
> +
> +
> +
> +  # use case 2, as in notes/tree-conflicts/use-cases.txt
> +  # 2.1) local leaf edit, incoming tree delete
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'D'                 : Item(),
> +    'D/D1'              : Item(status=3D'D '),
> +    'F'                 : Item(status=3D'C '),
> +    'F/alpha'           : Item(status=3D'D '),
> +    'DD'                : Item(),
> +    'DD/D1'             : Item(status=3D'D '),
> +    'DF'                : Item(),
> +    'DF/D1'             : Item(status=3D'D '),
> +    'DDD'               : Item(),
> +    'DDD/D1'            : Item(status=3D'D '),
> +    'DDF'               : Item(),
> +    'DDF/D1'            : Item(status=3D'D '),
> +    })
> +
> +  expected_disk =3D svntest.wc.State('', {
> +    'DF'                : Item(),
> +    'DF/D1'             : Item(),
> +    'DDF'               : Item(),
> +    'DDF/D1'            : Item(),
> +    'DDF/D1/D2'         : Item(),
> +    'F'                 : Item(),
> +    'F/alpha'           : Item(contents=3D"This is the file 'alpha'.\nMo=
> re text for file alpha.\n"),
> +    'DDD'               : Item(),
> +    'DDD/D1'            : Item(),
> +    'DDD/D1/D2'         : Item(),
> +    'DDD/D1/D2/D3'      : Item(),
> +    'DD'                : Item(),
> +    'DD/D1'             : Item(),
> +    'DD/D1/D2'          : Item(),
> +    'D'                 : Item(),
> +    'D/D1'              : Item(),
> +    })
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'  ', wc_rev=3D'7'),
> +    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
> +    'D/D1/delta'        : Item(status=3D'D ', wc_rev=3D'8'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'8'),
> +    'DD'                : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD/D1/D2/epsilon'  : Item(status=3D'D ', wc_rev=3D'8'),
> +    'DF'                : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'8'),
> +    'DDD'               : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2/D3/zeta' : Item(status=3D'D ', wc_rev=3D'8'),
> +    'DDF'               : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'8'),
> +    })
> +
> +  expected_skip =3D svntest.wc.State('', {})
> +
> +  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_edit_incoming_tree=
> _del",
> +                                        leaf_edit,
> +                                        tree_del,
> +                                        expected_output,
> +                                        expected_disk,
> +                                        expected_status,
> +                                        expected_skip) ]
> +
> +
> +  # 2.2) local leaf del, incoming tree delete
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'D'                 : Item(status=3D'C '),
> +    'F'                 : Item(status=3D'C '),
> +    'DD'                : Item(),
> +    'DD/D1'             : Item(status=3D'D '),
> +    'DF'                : Item(),
> +    'DF/D1'             : Item(status=3D'D '),
> +    'DDD'               : Item(),
> +    'DDD/D1'            : Item(status=3D'D '),
> +    'DDF'               : Item(),
> +    'DDF/D1'            : Item(status=3D'D '),
> +    })
> +
> +
> +  expected_disk =3D svntest.wc.State('', {
> +    'F'                 : Item(),
> +    'D'                 : Item(),
> +    'DF/D1'             : Item(),
> +    'DD/D1'             : Item(),
> +    'DDF/D1/D2'         : Item(),
> +    'DDD/D1/D2'         : Item(),
> +    })
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DD'                : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DF'                : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD'               : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF'               : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    })
> +
> +  expected_skip =3D svntest.wc.State('', {
> +    'F/alpha'           : Item(),
> +    'D/D1'              : Item(),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase("local_leaf_del_incoming_tree_=
> del",
> +                                        leaf_del,
> +                                        tree_del,
> +                                        expected_output,
> +                                        expected_disk,
> +                                        expected_status,
> +                                        expected_skip) ]
> +
> +
> +  # use case 3, as in notes/tree-conflicts/use-cases.txt
> +  # local tree delete, incoming tree delete
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'D'                 : Item(status=3D'C '),
> +    'DF'                : Item(status=3D'C '),
> +    'DD'                : Item(status=3D'C '),
> +    'DDF'               : Item(status=3D'C '),
> +    'DDD'               : Item(status=3D'C '),
> +    })
> +
> +  expected_disk =3D state_after_tree_del
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    })
> +
> +  expected_skip =3D svntest.wc.State('', {
> +    'D/D1'              : Item(),
> +    'F/alpha'           : Item(),
> +    'DD/D1'             : Item(),
> +    'DF/D1'             : Item(),
> +    'DDD/D1'            : Item(),
> +    'DDF/D1'            : Item(),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase("local_tree_del_incoming_tree_=
> del",
> +                                        tree_del,
> +                                        tree_del,
> +                                        expected_output,
> +                                        expected_disk,
> +                                        expected_status,
> +                                        expected_skip) ]
> +
> +
> +  # now run the whole bunch of them.
> +  svntest.actions.deep_trees_run_tests_scheme_for_merge(sbox, greater_sc=
> heme,
> +                                                        True)
> +
> +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> +
> +def tree_conflicts_on_merge_no_local_ci(sbox):
> +  "tree conflicts on merge, NO local commit (tc 4-6)"
> +
> +  # Each case is constructed and then appended to the table, which
> +  # is initially empty:
> +  greater_scheme =3D [];
> +
> +  # convenience definitions
> +  leaf_edit =3D svntest.actions.deep_trees_leaf_edit
> +  tree_del =3D svntest.actions.deep_trees_tree_del
> +  leaf_del =3D svntest.actions.deep_trees_leaf_del
> +
> +  state_after_leaf_edit =3D svntest.actions.deep_trees_after_leaf_edit
> +  state_after_leaf_del =3D svntest.actions.deep_trees_after_leaf_del
> +  state_after_tree_del =3D svntest.actions.deep_trees_after_tree_del
> +
> +  j =3D os.path.join
> +
> +  DeepTreesTestCase =3D svntest.actions.DeepTreesTestCase
> +
> +
> +  # use case 1, as in notes/tree-conflicts/use-cases.txt
> +  # 1.1) local tree delete, incoming leaf edit
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'D'                 : Item(status=3D'C '),
> +    'D/D1'              : Item(),
> +    'D/D1/delta'        : Item(status=3D'A '),
> +    'DF'                : Item(status=3D'C '),
> +    'DF/D1'             : Item(status=3D'C '),
> +    'DD'                : Item(status=3D'C '),
> +    'DD/D1'             : Item(status=3D'C '),
> +    'DD/D1/D2'          : Item(),
> +    'DD/D1/D2/epsilon'  : Item(status=3D'A '),
> +    'DDF'               : Item(status=3D'C '),
> +    'DDF/D1'            : Item(status=3D'C '),
> +    'DDF/D1/D2'         : Item(status=3D'C '),
> +    'DDD'               : Item(status=3D'C '),
> +    'DDD/D1'            : Item(status=3D'C '),
> +    'DDD/D1/D2'         : Item(status=3D'C '),
> +    'DDD/D1/D2/D3'      : Item(),
> +    'DDD/D1/D2/D3/zeta' : Item(status=3D'A '),
> +    })
> +
> +  expected_disk =3D svntest.wc.State('', {
> +    'F'                 : Item(),
> +    'D/D1/delta'        : Item(contents=3D"This is the file 'delta'.\n")=
> ,
> +    'DF/D1'             : Item(),
> +    'DD/D1/D2/epsilon'  : Item(contents=3D"This is the file 'epsilon'.\n=
> "),
> +    'DDF/D1/D2'         : Item(),
> +    'DDD/D1/D2/D3/zeta' : Item(contents=3D"This is the file 'zeta'.\n"),=
> 
> +    })
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD/D1/D2/epsilon'  : Item(status=3D'A ', copied=3D'+', wc_rev=3D'-'=
> ),
> +    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2/D3/zeta' : Item(status=3D'A ', copied=3D'+', wc_rev=3D'-'=
> ),
> +    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
> +    'D/D1/delta'        : Item(status=3D'A ', copied=3D'+', wc_rev=3D'-'=
> ),
> +    })
> +
> +  alpha_beta_gamma =3D svntest.wc.State('', {
> +    'F/alpha'           : Item(),
> +    'DF/D1/beta'        : Item(),
> +    'DDF/D1/D2/gamma'   : Item(),
> +    })
> +
> +  expected_skip =3D alpha_beta_gamma
> +
> +  greater_scheme +=3D [ DeepTreesTestCase(
> +                               "local_tree_del_incoming_leaf_edit",
> +                               tree_del,
> +                               leaf_edit,
> +                               expected_output,
> +                               expected_disk,
> +                               expected_status,
> +                               expected_skip,
> +                             ) ]
> +
> +  # 1.2) local tree delete, incoming leaf delete
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'D'                 : Item(status=3D'C '),
> +    'D/D1'              : Item(status=3D'D '),
> +    'DF'                : Item(status=3D'C '),
> +    'DF/D1'             : Item(status=3D'C '),
> +    'DD'                : Item(status=3D'C '),
> +    'DD/D1'             : Item(status=3D'C '),
> +    'DD/D1/D2'          : Item(status=3D'D '),
> +    'DDF'               : Item(status=3D'C '),
> +    'DDF/D1'            : Item(status=3D'C '),
> +    'DDF/D1/D2'         : Item(status=3D'C '),
> +    'DDD'               : Item(status=3D'C '),
> +    'DDD/D1'            : Item(status=3D'C '),
> +    'DDD/D1/D2'         : Item(status=3D'C '),
> +    'DDD/D1/D2/D3'      : Item(status=3D'D '),
> +    })
> +
> +  expected_disk =3D svntest.wc.State('', {
> +    'F'                 : Item(),
> +    'D/D1'              : Item(),
> +    'DF/D1'             : Item(),
> +    'DD/D1/D2'          : Item(),
> +    'DDF/D1/D2'         : Item(),
> +    'DDD/D1/D2/D3'      : Item(),
> +    })
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
> +    })
> +
> +  expected_skip =3D alpha_beta_gamma
> +
> +  greater_scheme +=3D [ DeepTreesTestCase(
> +                               "local_tree_del_incoming_leaf_del",
> +                               tree_del,
> +                               leaf_del,
> +                               expected_output,
> +                               expected_disk,
> +                               expected_status,
> +                               expected_skip,
> +                             ) ]
> +
> +
> +
> +
> +  # use case 2, as in notes/tree-conflicts/use-cases.txt
> +  # 2.1) local leaf edit, incoming tree delete
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'F'                 : Item(status=3D'C '),
> +    'F/alpha'           : Item(status=3D'D '),
> +    })
> +
> +  expected_disk =3D state_after_leaf_edit
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'  ', wc_rev=3D'7'),
> +    'D/D1'              : Item(status=3D' M', wc_rev=3D'7'),
> +    'D/D1/delta'        : Item(status=3D'A ', wc_rev=3D'0'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD'                : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DD/D1'             : Item(status=3D' M', wc_rev=3D'7'),
> +    'DD/D1/D2'          : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DD/D1/D2/epsilon'  : Item(status=3D'A ', wc_rev=3D'0'),
> +    'DF'                : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DF/D1'             : Item(status=3D' M', wc_rev=3D'7'),
> +    'DF/D1/beta'        : Item(status=3D'M ', wc_rev=3D'7'),
> +    'DDD'               : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDD/D1'            : Item(status=3D' M', wc_rev=3D'7'),
> +    'DDD/D1/D2'         : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDD/D1/D2/D3'      : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDD/D1/D2/D3/zeta' : Item(status=3D'A ', wc_rev=3D'0'),
> +    'DDF'               : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDF/D1'            : Item(status=3D' M', wc_rev=3D'7'),
> +    'DDF/D1/D2'         : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDF/D1/D2/gamma'   : Item(status=3D'M ', wc_rev=3D'7'),
> +    })
> +
> +  expected_skip =3D svntest.wc.State('', {
> +    'D/D1'              : Item(),
> +    'DF/D1'             : Item(),
> +    'DD/D1'             : Item(),
> +    'DDF/D1'            : Item(),
> +    'DDD/D1'            : Item(),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase(
> +                               "local_leaf_edit_incoming_tree_del",
> +                               leaf_edit,
> +                               tree_del,
> +                               expected_output,
> +                               expected_disk,
> +                               expected_status,
> +                               expected_skip,
> +                             ) ]
> +
> +
> +  # 2.2) local leaf del, incoming tree delete
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'D'                 : Item(status=3D'C '),
> +    'D/D1'              : Item(status=3D'D '),
> +    'F'                 : Item(status=3D'C '),
> +    'DD'                : Item(),
> +    'DD/D1'             : Item(status=3D'D '),
> +    'DF'                : Item(),
> +    'DF/D1'             : Item(status=3D'D '),
> +    'DDD'               : Item(),
> +    'DDD/D1'            : Item(status=3D'D '),
> +    'DDF'               : Item(),
> +    'DDF/D1'            : Item(status=3D'D '),
> +    })
> +
> +
> +  expected_disk =3D svntest.wc.State('', {
> +    'F'                 : Item(),
> +    'D/D1'              : Item(),
> +    'DF/D1'             : Item(),
> +    'DD/D1/D2'          : Item(),
> +    'DDF/D1/D2'         : Item(),
> +    'DDD/D1/D2/D3'      : Item(),
> +    })
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD'                : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DF'                : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD'               : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF'               : Item(status=3D'  ', wc_rev=3D'7'),
> +    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
> +    })
> +
> +  expected_skip =3D svntest.wc.State('', {
> +    'F/alpha'           : Item(),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase(
> +                               "local_leaf_del_incoming_tree_del",
> +                               leaf_del,
> +                               tree_del,
> +                               expected_output,
> +                               expected_disk,
> +                               expected_status,
> +                               expected_skip,
> +                             ) ]
> +
> +
> +  # use case 3, as in notes/tree-conflicts/use-cases.txt
> +  # local tree delete, incoming tree delete
> +
> +  expected_output =3D svntest.wc.State('', {
> +    'D'                 : Item(status=3D'C '),
> +    'D/D1'              : Item(status=3D'D '),
> +    'F'                 : Item(status=3D'C '),
> +    'DD'                : Item(status=3D'C '),
> +    'DD/D1'             : Item(status=3D'D '),
> +    'DF'                : Item(status=3D'C '),
> +    'DF/D1'             : Item(status=3D'D '),
> +    'DDD'               : Item(status=3D'C '),
> +    'DDD/D1'            : Item(status=3D'D '),
> +    'DDF'               : Item(status=3D'C '),
> +    'DDF/D1'            : Item(status=3D'D '),
> +    })
> +
> +  expected_disk =3D svntest.wc.State('', {
> +    'F'                 : Item(),
> +    'D/D1'              : Item(),
> +    'DF/D1'             : Item(),
> +    'DD/D1/D2'          : Item(),
> +    'DDF/D1/D2'         : Item(),
> +    'DDD/D1/D2/D3'      : Item(),
> +    })
> +
> +  expected_status =3D svntest.wc.State('', {
> +    ''                  : Item(status=3D' M', wc_rev=3D'7'),
> +    'DDF'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDF/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDF/D1/D2/gamma'   : Item(status=3D'D ', wc_rev=3D'7'),
> +    'D'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'D/D1'              : Item(status=3D'D ', wc_rev=3D'7'),
> +    'F'                 : Item(status=3D'C ', wc_rev=3D'7'),
> +    'F/alpha'           : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DD/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DD/D1/D2'          : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DF'                : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DF/D1'             : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DF/D1/beta'        : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD'               : Item(status=3D'C ', wc_rev=3D'7'),
> +    'DDD/D1'            : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2'         : Item(status=3D'D ', wc_rev=3D'7'),
> +    'DDD/D1/D2/D3'      : Item(status=3D'D ', wc_rev=3D'7'),
> +    })
> +
> +  expected_skip =3D svntest.wc.State('', {
> +    'F/alpha'           : Item(),
> +    })
> +
> +  greater_scheme +=3D [ DeepTreesTestCase(
> +                               "local_tree_del_incoming_tree_del",
> +                               tree_del,
> +                               tree_del,
> +                               expected_output,
> +                               expected_disk,
> +                               expected_status,
> +                               expected_skip,
> +                             ) ]
> +
> +
> +  # now run the whole bunch of them.
> +  svntest.actions.deep_trees_run_tests_scheme_for_merge(sbox, greater_sc=
> heme,
> +                                                        False)
> +
> +
> +
>  ########################################################################=
> 
>  # Run the tests
> =20
> @@ -12925,8 +13470,9 @@
>                           server_has_mergeinfo),
>                XFail(SkipUnless(subtrees_with_empty_mergeinfo,
>                                 server_has_mergeinfo)),
> -              tree_conflicts_in_merged_files,
>                tree_conflicts_and_obstructions,
> +              tree_conflicts_on_merge_local_ci,
> +              tree_conflicts_on_merge_no_local_ci,
>               ]
> =20
>  if __name__ =3D=3D '__main__':
> 
> --------------080409030609080001000909
> Content-Type: text/x-diff;
>  name="merge_patch.diff"
> Content-Transfer-Encoding: quoted-printable
> Content-Disposition: inline;
>  filename="merge_patch.diff"
> 
> Index: subversion/libsvn_client/merge.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- subversion/libsvn_client/merge.c	(revision 32499)
> +++ subversion/libsvn_client/merge.c	(working copy)
> @@ -1516,27 +1516,35 @@
>                   svn_revnum_t rev,
>                   void *baton)
>  {
> +  // TODO This function segfaulted for adm_access =3D=3D NULL. I disable=
> d all of
> +  // the code that was added on the tree-conflicts branch for the case o=
> f
> +  // adm_access =3D=3D NULL. It remains to be seen if that's ok.
> +
> +  if (adm_access !=3D NULL)
> +    {
> -  merge_cmd_baton_t *merge_b =3D baton;
> -  apr_pool_t *subpool =3D svn_pool_create(merge_b->pool);
> -  svn_node_kind_t kind;
> -  const svn_wc_entry_t *entry;
> +      merge_cmd_baton_t *merge_b =3D baton;
> +      apr_pool_t *subpool =3D svn_pool_create(merge_b->pool);
> +      svn_node_kind_t kind;
> +      const svn_wc_entry_t *entry =3D NULL;
> =20
> -  /* Find the version-control and on-disk states of this path */
> -  SVN_ERR(svn_wc_entry(&entry, path, adm_access, TRUE, subpool));
> -  SVN_ERR(svn_io_check_path(path, &kind, subpool));
> +      /* Find the version-control and on-disk states of this path */
> +      SVN_ERR(svn_wc_entry(&entry, path, adm_access, TRUE, subpool));
> +      SVN_ERR(svn_io_check_path(path, &kind, subpool));
> =20
> -  /* If we're trying to open a directory that's not a directory,
> -   * raise a tree conflict. */
> -  if (!entry || entry->schedule =3D=3D svn_wc_schedule_delete
> -      || kind !=3D svn_node_dir)
> -    {
> -      SVN_ERR(tree_conflict(merge_b, adm_access, path,
> -                            svn_node_dir,
> -                            svn_wc_conflict_action_edit,
> -                            svn_wc_conflict_reason_deleted));
> -    }
> +      /* If we're trying to open a directory that's not a directory,
> +       * raise a tree conflict. */
> +      if (!entry || entry->schedule =3D=3D svn_wc_schedule_delete
> +          || kind !=3D svn_node_dir)
> +        {
> +          SVN_ERR(tree_conflict(merge_b, adm_access, path,
> +                                svn_node_dir,
> +                                svn_wc_conflict_action_edit,
> +                                svn_wc_conflict_reason_deleted));
> +        }
> 
> -  svn_pool_destroy(subpool);
> +      svn_pool_destroy(subpool);
> +    }
> =20
>    return SVN_NO_ERROR;
>  }
> =20
> 
> --------------080409030609080001000909
> Content-Type: text/plain;
>  name="segfault.backtrace"
> Content-Transfer-Encoding: quoted-printable
> Content-Disposition: inline;
>  filename="segfault.backtrace"
> 
> The segmentation fault occurs in merge_tests.py:101,
> subtest local_tree_del_incoming_leaf_edit.
> 
> It occurs when calling svn_wc_entry with parameter adm_access=3D=3DNULL,
> when trying to merge the addition of the file
> 
>   DD/D1/D2/epsilon
> 
> , while in the local working copy, on another branch sharing ancestry,
> a removal of DD/D1 has been committed.
> 
> It occurs while trying to get adm_access information on DD/D1/D2.
> 
> My guess is that adm_access becomes NULL since neither D2 nor its parent
> D1 are present on the branch.
> 
> 
> neels@dub:/arch/elego/svn/tc/subversion/tests/cmdline=20
> $ ./merge_tests.py 101
> <artificially exiting just before the segmentation fault:
>  put `return None` in svntest/actions.py:2063, just after "8) Merge all">=
> 
> PASS:  merge_tests.py 101: tree conflicts on merge, local commit (tc 4-6)=
> 
> 
> neels@dub:/arch/elego/svn/tc/subversion/tests/cmdline=20
> $ gdb /arch/elego/svn/tc/subversion/svn/svn
> GNU gdb 6.8-debian
> Copyright (C) 2008 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.h=
> tml>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying=
> "
> and "show warranty" for details.
> This GDB was configured as "i486-linux-gnu"...
> 
> (gdb) run merge file:///arch/elego/svn/tc/subversion/tests/cmdline/svn-te=
> st-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_edit/in=
> coming svn-test-work/working_copies/merge_tests-101/local_tree_del_incomi=
> ng_leaf_edit/local --config-dir /arch/elego/svn/tc/subversion/tests/cmdli=
> ne/svn-test-work/local_tmp/config --password rayjandom --no-auth-cache --=
> username jrandom
> Starting program: /arch/elego/svn/tc/subversion/svn/svn merge file:///arc=
> h/elego/svn/tc/subversion/tests/cmdline/svn-test-work/repositories/merge_=
> tests-101/local_tree_del_incoming_leaf_edit/incoming svn-test-work/workin=
> g_copies/merge_tests-101/local_tree_del_incoming_leaf_edit/local --config=
> -dir /arch/elego/svn/tc/subversion/tests/cmdline/svn-test-work/local_tmp/=
> config --password rayjandom --no-auth-cache --username jrandom
> [Thread debugging using libthread_db enabled]
> Skipped missing target: 'svn-test-work/working_copies/merge_tests-101/loc=
> al_tree_del_incoming_leaf_edit/local/D/D1/delta'
> Skipped missing target: 'svn-test-work/working_copies/merge_tests-101/loc=
> al_tree_del_incoming_leaf_edit/local/D/D1'
> --- Merging r3 through r8 into 'svn-test-work/working_copies/merge_tests-=
> 101/local_tree_del_incoming_leaf_edit/local':
> C    svn-test-work/working_copies/merge_tests-101/local_tree_del_incoming=
> _leaf_edit/local/D
> Skipped missing target: 'svn-test-work/working_copies/merge_tests-101/loc=
> al_tree_del_incoming_leaf_edit/local/F/alpha'
> C    svn-test-work/working_copies/merge_tests-101/local_tree_del_incoming=
> _leaf_edit/local/F
> [New Thread 0xb7a8c6d0 (LWP 584)]
> 
> Program received signal SIGSEGV, Segmentation fault.
> [Switching to Thread 0xb7a8c6d0 (LWP 584)]
> 0x080ada84 in svn_wc__adm_retrieve_internal (adm_access=3D0xbfc76890, ass=
> ociated=3D0x0,=20
>     path=3D0x829b5b0 "svn-test-work/working_copies/merge_tests-101/local_=
> tree_del_incoming_leaf_edit/local/DD/D1/D2", pool=3D0x82cc038) at subvers=
> ion/libsvn_wc/lock.c:894
> 894	  if (associated->set)
> (gdb) bt
> #0  0x080ada84 in svn_wc__adm_retrieve_internal (adm_access=3D0xbfc76890,=
>  associated=3D0x0,=20
>     path=3D0x829b5b0 "svn-test-work/working_copies/merge_tests-101/local_=
> tree_del_incoming_leaf_edit/local/DD/D1/D2", pool=3D0x82cc038) at subvers=
> ion/libsvn_wc/lock.c:894
> #1  0x080a88fe in svn_wc_entry (entry=3D0xbfc768d8, path=3D0x829b5b0 "svn=
> -test-work/working_copies/merge_tests-101/local_tree_del_incoming_leaf_ed=
> it/local/DD/D1/D2",=20
>     adm_access=3D0x0, show_hidden=3D1, pool=3D0x82cc038) at subversion/li=
> bsvn_wc/entries.c:1247
> #2  0x08080d20 in merge_dir_opened (adm_access=3D0x0, path=3D0x829b5b0 "s=
> vn-test-work/working_copies/merge_tests-101/local_tree_del_incoming_leaf_=
> edit/local/DD/D1/D2", rev=3D2,=20
>     baton=3D0xbfc77348) at subversion/libsvn_client/merge.c:1531
> #3  0x08091af2 in open_directory (path=3D0x829b480 "DD/D1/D2", parent_bat=
> on=3D0x82b6d28, base_revision=3D2, pool=3D0x829b3c0, child_baton=3D0x829b=
> 514)
>     at subversion/libsvn_client/repos_diff.c:616
> #4  0x081313dd in open_directory (path=3D0x829b480 "DD/D1/D2", parent_bat=
> on=3D0x82b6d20, base_revision=3D2, pool=3D0x829b3c0, child_baton=3D0x829b=
> 50c)
>     at subversion/libsvn_delta/cancel.c:140
> #5  0x081313dd in open_directory (path=3D0x829b480 "DD/D1/D2", parent_bat=
> on=3D0x82b6d18, base_revision=3D2, pool=3D0x829b3c0, child_baton=3D0xbfc7=
> 6aa0)
>     at subversion/libsvn_delta/cancel.c:140
> #6  0x080e76df in update_entry (b=3D0x8207680, s_rev=3D2, s_path=3D0x829b=
> 438 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1/D2", s_entry=3D0x8=
> 2a6e08,=20
>     t_path=3D0x829b4d0 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1=
> /D2", t_entry=3D0x82a73b8, dir_baton=3D0x82b6d18, e_path=3D0x829b480 "DD/=
> D1/D2", info=3D0x0,=20
>     wc_depth=3Dsvn_depth_infinity, requested_depth=3Dsvn_depth_infinity, =
> pool=3D0x829b3c0) at subversion/libsvn_repos/reporter.c:830
> #7  0x080e82a6 in delta_dirs (b=3D0x8207680, s_rev=3D2, s_path=3D0x82b6c5=
> 8 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1",=20
>     t_path=3D0x82b6ce0 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1=
> ", dir_baton=3D0x82b6d18, e_path=3D0x82b6ca0 "DD/D1", start_empty=3D0, wc=
> _depth=3Dsvn_depth_infinity,=20
>     requested_depth=3Dsvn_depth_infinity, pool=3D0x82b6be8) at subversion=
> /libsvn_repos/reporter.c:1110
> #8  0x080e77cf in update_entry (b=3D0x8207680, s_rev=3D2, s_path=3D0x82b6=
> c58 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1", s_entry=3D0x8296=
> d90,=20
>     t_path=3D0x82b6ce0 "/local_tree_del_incoming_leaf_edit/incoming/DD/D1=
> ", t_entry=3D0x8297320, dir_baton=3D0x8275448, e_path=3D0x82b6ca0 "DD/D1"=
> , info=3D0x0,=20
>     wc_depth=3Dsvn_depth_infinity, requested_depth=3Dsvn_depth_infinity, =
> pool=3D0x82b6be8) at subversion/libsvn_repos/reporter.c:837
> #9  0x080e82a6 in delta_dirs (b=3D0x8207680, s_rev=3D2, s_path=3D0x827539=
> 8 "/local_tree_del_incoming_leaf_edit/incoming/DD",=20
>     t_path=3D0x8275418 "/local_tree_del_incoming_leaf_edit/incoming/DD", =
> dir_baton=3D0x8275448, e_path=3D0x82753d8 "DD", start_empty=3D0, wc_depth=
> =3Dsvn_depth_infinity,=20
>     requested_depth=3Dsvn_depth_infinity, pool=3D0x8275328) at subversion=
> /libsvn_repos/reporter.c:1110
> #10 0x080e77cf in update_entry (b=3D0x8207680, s_rev=3D2, s_path=3D0x8275=
> 398 "/local_tree_del_incoming_leaf_edit/incoming/DD", s_entry=3D0x8282360=
> ,=20
>     t_path=3D0x8275418 "/local_tree_del_incoming_leaf_edit/incoming/DD", =
> t_entry=3D0x82830c0, dir_baton=3D0x828ab38, e_path=3D0x82753d8 "DD", info=
> =3D0x0, wc_depth=3Dsvn_depth_infinity,=20
>     requested_depth=3Dsvn_depth_infinity, pool=3D0x8275328) at subversion=
> /libsvn_repos/reporter.c:837
> #11 0x080e82a6 in delta_dirs (b=3D0x8207680, s_rev=3D2, s_path=3D0x826583=
> 8 "/local_tree_del_incoming_leaf_edit/incoming",=20
>     t_path=3D0x8207475 "/local_tree_del_incoming_leaf_edit/incoming", dir=
> _baton=3D0x828ab38, e_path=3D0x819e96b "", start_empty=3D0, wc_depth=3Dsv=
> n_depth_infinity,=20
>     requested_depth=3Dsvn_depth_infinity, pool=3D0x8207200) at subversion=
> /libsvn_repos/reporter.c:1110
> #12 0x080e865e in drive (b=3D0x8207680, s_rev=3D2, info=3D0x8208e50, pool=
> =3D0x8207200) at subversion/libsvn_repos/reporter.c:1174
> #13 0x080e8a13 in finish_report (b=3D0x8207680, pool=3D0x8207200) at subv=
> ersion/libsvn_repos/reporter.c:1241
> #14 0x080e8ed7 in svn_repos_finish_report (baton=3D0x8207680, pool=3D0x82=
> 07200) at subversion/libsvn_repos/reporter.c:1365
> #15 0x080dac25 in reporter_finish_report (reporter_baton=3D0x8208e18, poo=
> l=3D0x8207200) at subversion/libsvn_ra_local/ra_plugin.c:210
> #16 0x08082a37 in drive_merge_report_editor (target_wcpath=3D0x81d19b0 "s=
> vn-test-work/working_copies/merge_tests-101/local_tree_del_incoming_leaf_=
> edit/local",=20
>     url1=3D0x81f3f38 "file:///arch/elego/svn/tc/subversion/tests/cmdline/=
> svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_e=
> dit/incoming", revision1=3D2,=20
>     url2=3D0x81f40c8 "file:///arch/elego/svn/tc/subversion/tests/cmdline/=
> svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_e=
> dit/incoming", revision2=3D8,=20
>     children_with_mergeinfo=3D0x81ef618, is_rollback=3D0, depth=3Dsvn_dep=
> th_infinity, notify_b=3D0xbfc773a0, adm_access=3D0x81d1e48, callbacks=3D0=
> x8198520, merge_b=3D0xbfc77348,=20
>     pool=3D0x8207200) at subversion/libsvn_client/merge.c:2791
> #17 0x080865e6 in do_directory_merge (
>     url1=3D0x81f3f38 "file:///arch/elego/svn/tc/subversion/tests/cmdline/=
> svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_e=
> dit/incoming", revision1=3D2,=20
>     url2=3D0x81f40c8 "file:///arch/elego/svn/tc/subversion/tests/cmdline/=
> svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf_e=
> dit/incoming", revision2=3D8,=20
>     parent_entry=3D0x81d1f30, adm_access=3D0x81d1e48, depth=3Dsvn_depth_i=
> nfinity, notify_b=3D0xbfc773a0, merge_b=3D0xbfc77348, pool=3D0x81e7198) a=
> t subversion/libsvn_client/merge.c:4912
> #18 0x08087747 in do_merge (merge_sources=3D0x81f3b68, target=3D0x81d19b0=
>  "svn-test-work/working_copies/merge_tests-101/local_tree_del_incoming_le=
> af_edit/local",=20
>     target_entry=3D0x81d1f30, adm_access=3D0x81d1e48, sources_ancestral=3D=
> 1, sources_related=3D1, same_repos=3D1, ignore_ancestry=3D0, force=3D0, d=
> ry_run=3D0, record_only=3D0,=20
>     depth=3Dsvn_depth_infinity, merge_options=3D0x0, ctx=3D0x81d07a8, poo=
> l=3D0x81d01e0) at subversion/libsvn_client/merge.c:5395
> #19 0x08089d23 in svn_client_merge_peg3 (
>     source=3D0x81d1690 "file:///arch/elego/svn/tc/subversion/tests/cmdlin=
> e/svn-test-work/repositories/merge_tests-101/local_tree_del_incoming_leaf=
> _edit/incoming",=20
>     ranges_to_merge=3D0x81d1a40, peg_revision=3D0xbfc77524, target_wcpath=
> =3D0x81d19b0 "svn-test-work/working_copies/merge_tests-101/local_tree_del=
> _incoming_leaf_edit/local",=20
>     depth=3Dsvn_depth_unknown, ignore_ancestry=3D0, force=3D0, record_onl=
> y=3D0, dry_run=3D0, merge_options=3D0x0, ctx=3D0x81d07a8, pool=3D0x81d01e=
> 0) at subversion/libsvn_client/merge.c:6339
> #20 0x08058d36 in svn_cl__merge (os=3D0x81d0380, baton=3D0xbfc77760, pool=
> =3D0x81d01e0) at subversion/svn/merge-cmd.c:307
> #21 0x080582d1 in main (argc=3D11, argv=3D0xbfc77894) at subversion/svn/m=
> ain.c:1981
> 
> 
> --------------080409030609080001000909--

-- 
Neels Hofmeyr -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23458696  mobile: +49 177 2345869  fax: +49 30 23458695
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelsreg: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194