You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2010/06/03 17:23:56 UTC

svn commit: r951030 - /subversion/trunk/subversion/libsvn_wc/wc_db.c

Author: philip
Date: Thu Jun  3 15:23:56 2010
New Revision: 951030

URL: http://svn.apache.org/viewvc?rev=951030&view=rev
Log:
Make SVN_EXPERIMENTAL_COPY insert incomplete children when copying
a directory.  This confuses the old entry compatibility code, in
particular status doesn't work, but the database looks correct.

* subversion/libsvn_wc/wc_db.c
  (insert_incomplete_working_children): New, code from insert_working_node.
  (insert_working_node): Call insert_incomplete_working_children.
  (temp_cross_db_copy): Add children parameter, set depth and children.
  (svn_wc__db_op_copy): Gather and insert children for directories.

Modified:
    subversion/trunk/subversion/libsvn_wc/wc_db.c

Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=951030&r1=951029&r2=951030&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Thu Jun  3 15:23:56 2010
@@ -694,6 +694,33 @@ blank_iwb(insert_working_baton_t *piwb)
      value, but... meh. We'll avoid them if ORIGINAL_REPOS_RELPATH==NULL.  */
 }
 
+static svn_error_t *
+insert_incomplete_working_children(svn_sqlite__db_t *sdb,
+                                   apr_int64_t wc_id,
+                                   const char *local_relpath,
+                                   const apr_array_header_t *children,
+                                   apr_pool_t *scratch_pool)
+{
+  svn_sqlite__stmt_t *stmt;
+  int i;
+
+  SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+                                    STMT_INSERT_WORKING_NODE_INCOMPLETE));
+
+  for (i = children->nelts; i--; )
+    {
+      const char *name = APR_ARRAY_IDX(children, i, const char *);
+
+      SVN_ERR(svn_sqlite__bindf(stmt, "iss",
+                                wc_id,
+                                svn_relpath_join(local_relpath, name,
+                                                 scratch_pool),
+                                local_relpath));
+      SVN_ERR(svn_sqlite__insert(NULL, stmt));
+    }
+
+  return SVN_NO_ERROR;
+}
 
 /* */
 static svn_error_t *
@@ -771,25 +798,10 @@ insert_working_node(void *baton,
   SVN_ERR(svn_sqlite__insert(NULL, stmt));
 
   if (piwb->kind == svn_wc__db_kind_dir && piwb->children)
-    {
-      int i;
-
-      SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
-                                        STMT_INSERT_WORKING_NODE_INCOMPLETE));
-
-      for (i = piwb->children->nelts; i--; )
-        {
-          const char *name = APR_ARRAY_IDX(piwb->children, i, const char *);
-
-          SVN_ERR(svn_sqlite__bindf(stmt, "iss",
-                                    piwb->wc_id,
-                                    svn_relpath_join(piwb->local_relpath,
-                                                     name,
-                                                     scratch_pool),
-                                    piwb->local_relpath));
-          SVN_ERR(svn_sqlite__insert(NULL, stmt));
-        }
-    }
+    SVN_ERR(insert_incomplete_working_children(sdb, piwb->wc_id,
+                                               piwb->local_relpath,
+                                               piwb->children,
+                                               scratch_pool));
 
   SVN_ERR(add_work_items(sdb, piwb->work_items, scratch_pool));
 
@@ -2189,6 +2201,7 @@ temp_cross_db_copy(svn_wc__db_t *db,
                    svn_wc__db_pdh_t *dst_pdh,
                    const char *dst_relpath,
                    svn_wc__db_kind_t kind,
+                   const apr_array_header_t *children,
                    apr_int64_t copyfrom_id,
                    const char *copyfrom_relpath,
                    svn_revnum_t copyfrom_rev,
@@ -2202,6 +2215,7 @@ temp_cross_db_copy(svn_wc__db_t *db,
   apr_hash_t *props;
   svn_sqlite__stmt_t *stmt;
   svn_boolean_t have_row;
+  svn_depth_t depth;
 
   SVN_ERR_ASSERT(kind == svn_wc__db_kind_file || kind == svn_wc__db_kind_dir);
 
@@ -2213,7 +2227,7 @@ temp_cross_db_copy(svn_wc__db_t *db,
                                NULL, /* repos_uuid */
                                &changed_rev, &changed_date, &changed_author,
                                NULL, /* last_mod_time */
-                               NULL, /* depth */
+                               &depth,
                                &checksum,
                                NULL, /* translated_size */
                                NULL, /* target */
@@ -2247,7 +2261,8 @@ temp_cross_db_copy(svn_wc__db_t *db,
   iwb.moved_here = FALSE;
 
   iwb.checksum = checksum;
-  iwb.children = NULL;
+  iwb.children = children;
+  iwb.depth = depth;
 
   iwb.work_items = NULL;
 
@@ -2301,6 +2316,7 @@ svn_wc__db_op_copy(svn_wc__db_t *db,
   svn_wc__db_status_t status;
   apr_int64_t copyfrom_id;
   svn_wc__db_kind_t kind;
+  const apr_array_header_t *children;
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(src_abspath));
   SVN_ERR_ASSERT(svn_dirent_is_absolute(dst_abspath));
@@ -2398,6 +2414,12 @@ svn_wc__db_op_copy(svn_wc__db_t *db,
       src_relpath = svn_dirent_basename(src_abspath, NULL);
     }
 
+  if (kind == svn_wc__db_kind_dir && !*src_relpath)
+    SVN_ERR(gather_children(&children, FALSE, db, src_abspath,
+                            scratch_pool, scratch_pool));
+  else
+    children = NULL;
+
   if (!strcmp(src_pdh->local_abspath, dst_pdh->local_abspath))
     {
       svn_sqlite__stmt_t *stmt;
@@ -2435,15 +2457,17 @@ svn_wc__db_op_copy(svn_wc__db_t *db,
                                 dst_relpath, dst_parent_relpath));
       SVN_ERR(svn_sqlite__step_done(stmt));
 
-      if (kind == svn_wc__db_kind_dir)
-        {
-          /* Add incomplete children if copying a directory */
-        }
+      if (kind == svn_wc__db_kind_dir && children)
+        SVN_ERR(insert_incomplete_working_children(dst_pdh->wcroot->sdb,
+                                                   dst_pdh->wcroot->wc_id,
+                                                   dst_relpath,
+                                                   children,
+                                                   scratch_pool));
     }
   else
     {
       SVN_ERR(temp_cross_db_copy(db, src_abspath, src_pdh, src_relpath,
-                                 dst_pdh, dst_relpath, kind,
+                                 dst_pdh, dst_relpath, kind, children,
                                  copyfrom_id, copyfrom_relpath, copyfrom_rev,
                                  scratch_pool));
     }