After Philip's great work I see just three op-depth failures remaining:
> FAIL: copy_tests.py 83: move a directory containing moved node
> FAIL: lock_tests.py 40: uncommitted svn:needs-lock add/cp not read-only
> FAIL: upgrade_tests.py 15: upgrade tree conflict data (f20->f21)
lock_tests.py 40 fails because my WC-to-WC copy code doesn't reset files
to read-write on disk when it copies them if svn:needs-lock was set on
the source, which the old code did; instead, it just copies exactly
what's there.
The attached patch is where I have got to today, attacking that from the
angle of abandoning my all-in-one approach now that Philip's made the
WC-to-WC code handle op-depth automatically. I try to extend that to
cover this case.
As it says in the log msg, it fixes lock_tests.py 40 but breaks
copy_tests.py 47. I haven't time today to go further with seeing why.
If anyone wants to look tonight, be my guest.
- Julian
Try to fix the op-depth code for copies. This makes lock_tests.py 40 PASS
but copy_tests.py 47 FAIL, when compiled with SVN_WC__OP_DEPTH.
* subversion/libsvn_wc/copy.c
(svn_wc_copy3): Always use the old one-node-at-a-time code.
* subversion/libsvn_wc/wc_db.c
(db_op_copy, svn_wc__db_op_copy): Calculate the correct op depth
internally, instead of using what the caller provides.
--This line, and those below, will be ignored--
Index: subversion/libsvn_wc/copy.c
===================================================================
--- subversion/libsvn_wc/copy.c (revision 1037758)
+++ subversion/libsvn_wc/copy.c (working copy)
@@ -723,7 +723,7 @@ svn_wc_copy3(svn_wc_context_t *wc_ctx,
scratch_pool));
}
-#ifdef SVN_WC__OP_DEPTH
+#ifdef __SVN_WC__OP_DEPTH
if (svn_wc__db_same_db(db, src_abspath, dst_abspath, scratch_pool))
{
SVN_ERR(copy_versioned_tree(db, src_abspath, dst_abspath,
Index: subversion/libsvn_wc/wc_db.c
===================================================================
--- subversion/libsvn_wc/wc_db.c (revision 1037758)
+++ subversion/libsvn_wc/wc_db.c (working copy)
@@ -2975,6 +2975,15 @@ get_info_for_copy(apr_int64_t *copyfrom_
return SVN_NO_ERROR;
}
+static svn_error_t *
+op_depth_for_copy(apr_int64_t *op_depth,
+ apr_int64_t copyfrom_repos_id,
+ const char *copyfrom_relpath,
+ svn_revnum_t copyfrom_revision,
+ svn_wc__db_pdh_t *pdh,
+ const char *local_relpath,
+ apr_pool_t *scratch_pool);
+
/* Like svn_wc__db_op_copy(), but with PDH+LOCAL_RELPATH instead of
* DB+LOCAL_ABSPATH. */
static svn_error_t *
@@ -2982,7 +2991,6 @@ db_op_copy(svn_wc__db_pdh_t *src_pdh,
const char *src_relpath,
svn_wc__db_pdh_t *dst_pdh,
const char *dst_relpath,
- apr_int64_t dst_op_depth,
const svn_skel_t *work_items,
apr_pool_t *scratch_pool)
{
@@ -2991,6 +2999,7 @@ db_op_copy(svn_wc__db_pdh_t *src_pdh,
svn_wc__db_status_t status, dst_status;
svn_boolean_t have_work;
apr_int64_t copyfrom_id;
+ apr_int64_t dst_op_depth;
svn_wc__db_kind_t kind;
const apr_array_header_t *children;
@@ -2998,6 +3007,10 @@ db_op_copy(svn_wc__db_pdh_t *src_pdh,
&status, &kind, &have_work,
src_pdh, src_relpath, scratch_pool, scratch_pool));
+ SVN_ERR(op_depth_for_copy(&dst_op_depth, copyfrom_id,
+ copyfrom_relpath, copyfrom_rev,
+ dst_pdh, dst_relpath, scratch_pool));
+
SVN_ERR_ASSERT(kind == svn_wc__db_kind_file || kind == svn_wc__db_kind_dir);
/* ### New status, not finished, see notes/wc-ng/copying */
@@ -3112,10 +3125,6 @@ svn_wc__db_op_copy(svn_wc__db_t *db,
{
svn_wc__db_pdh_t *src_pdh, *dst_pdh;
const char *src_relpath, *dst_relpath;
-#ifdef SVN_WC__OP_DEPTH
- const char *dst_op_root_relpath;
-#endif
- apr_int64_t dst_op_depth;
SVN_ERR_ASSERT(svn_dirent_is_absolute(src_abspath));
SVN_ERR_ASSERT(svn_dirent_is_absolute(dst_abspath));
@@ -3132,19 +3141,9 @@ svn_wc__db_op_copy(svn_wc__db_t *db,
scratch_pool, scratch_pool));
VERIFY_USABLE_PDH(dst_pdh);
-#ifdef SVN_WC__OP_DEPTH
- SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&dst_pdh, &dst_op_root_relpath,
- db, dst_op_root_abspath,
- svn_sqlite__mode_readwrite,
- scratch_pool, scratch_pool));
- dst_op_depth = relpath_depth(dst_op_root_relpath);
-#else
- dst_op_depth = 2; /* ### temporary op_depth */
-#endif
-
/* ### This should all happen in one transaction. */
SVN_ERR(db_op_copy(src_pdh, src_relpath, dst_pdh, dst_relpath,
- dst_op_depth, work_items, scratch_pool));
+ work_items, scratch_pool));
return SVN_NO_ERROR;
}