Can I have a second pair of eyes on this please?  When copy_tests.py 94
deletes a WC directory 'A/B' and tries to copy the repos file 'iota' to
WC path 'A/B', it the svn_wc_add_repos_file4() call fails with:

  .../libsvn_client/copy.c:1570: (apr_err=155005)
  .../libsvn_wc/update_editor.c:5572: (apr_err=155005)
  .../libsvn_wc/lock.c:1468: (apr_err=155005)
  svn: No write-lock in '.../copy_tests-94/A'

I don't understand why svn_wc_add_repos_file4() requires this parent to
be locked, while seven other code paths succeed:

  WC-to-WC copies: (file/dir) over (file/dir)
  repos-to-WC copy: file over file
  repos-to-WC copy: dir over dir
  repos-to-WC copy: dir over file

The following patch fixes it, but I'm not satisfied it's the correct
fix:

[[[
Fix a problem in copying a repository file over a deleted WC directory.

* subversion/libsvn_client/copy.c
  (repos_to_wc_copy): Get a write lock on the target path's anchor, not just
    on the target path itself.

* subversion/tests/cmdline/copy_tests.py
  (test_list): Remove 'XFail' from copy_repos_over_deleted_other_kind.
--This line, and those below, will be ignored--

Index: subversion/libsvn_client/copy.c
===================================================================
--- subversion/libsvn_client/copy.c     (revision 1031400)
+++ subversion/libsvn_client/copy.c     (working copy)
@@ -1890,7 +1890,7 @@ repos_to_wc_copy(const apr_array_header_

   SVN_ERR(svn_wc__call_with_write_lock(repos_to_wc_copy_cb, &baton,
                                        ctx->wc_ctx, lock_abspath,
-                                       FALSE, pool, pool));
+                                       TRUE, pool, pool));
   return SVN_NO_ERROR;
 }

Index: subversion/tests/cmdline/copy_tests.py
===================================================================
--- subversion/tests/cmdline/copy_tests.py      (revision 1031411)
+++ subversion/tests/cmdline/copy_tests.py      (working copy)
@@ -5017,7 +5017,7 @@ test_list = [ None,
               XFail(copy_delete_revert),
               delete_replace_delete,
               copy_repos_over_deleted_same_kind,
-              XFail(copy_repos_over_deleted_other_kind),
+              copy_repos_over_deleted_other_kind,
               copy_wc_over_deleted_same_kind,
               copy_wc_over_deleted_other_kind,
              ]
]]]

- Julian


Reply via email to