You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2010/10/26 00:39:08 UTC

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

Author: julianfoad
Date: Mon Oct 25 22:39:07 2010
New Revision: 1027291

URL: http://svn.apache.org/viewvc?rev=1027291&view=rev
Log:
Create and use a local version of svn_wc__db_scan_deletion() that takes
PDH and relpath instead of DB and abspath.

* subversion/libsvn_wc/wc_db.c
  (scan_deletion): New function, extracted from svn_wc__db_scan_deletion()
    and converted to work with relpaths, mostly.
  (svn_wc__db_scan_deletion): Change to a simple wrapper around
    scan_deletion().
  (get_info_for_copy): Use scan_deletion() instead of
    svn_wc__db_scan_deletion(), and, continuing to use relpaths more widely,
    use scan_addition() instead of svn_wc__db_scan_addition() in one more
    place.

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=1027291&r1=1027290&r2=1027291&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Mon Oct 25 22:39:07 2010
@@ -291,6 +291,16 @@ scan_addition(svn_wc__db_status_t *statu
               apr_pool_t *result_pool,
               apr_pool_t *scratch_pool);
 
+static svn_error_t *
+scan_deletion(const char **base_del_relpath,
+              svn_boolean_t *base_replaced,
+              const char **moved_to_relpath,
+              const char **work_del_relpath,
+              svn_wc__db_pdh_t *pdh,
+              const char *local_relpath,
+              apr_pool_t *result_pool,
+              apr_pool_t *scratch_pool);
+
 
 /* Return the absolute path, in local path style, of LOCAL_RELPATH in WCROOT. */
 static const char *
@@ -2869,32 +2879,30 @@ get_info_for_copy(apr_int64_t *copyfrom_
     }
   else if (*status == svn_wc__db_status_deleted)
     {
-      const char *work_del_abspath;
+      const char *work_del_relpath;
 
-      SVN_ERR(svn_wc__db_scan_deletion(NULL, NULL, NULL,
-                                       &work_del_abspath,
-                                       db, local_abspath,
-                                       scratch_pool, scratch_pool));
-      if (work_del_abspath)
+      SVN_ERR(scan_deletion(NULL, NULL, NULL, &work_del_relpath,
+                            pdh, local_relpath, scratch_pool, scratch_pool));
+      if (work_del_relpath)
         {
           const char *op_root_abspath;
           const char *original_repos_relpath, *original_root_url;
           const char *original_uuid;
           svn_revnum_t original_revision;
-          const char *parent_del_abspath = svn_dirent_dirname(work_del_abspath,
+          const char *parent_del_relpath = svn_dirent_dirname(work_del_relpath,
                                                               scratch_pool);
 
           /* Similar to, but not the same as, the _scan_addition and
              _join above.  Can we use get_copyfrom here? */
-          SVN_ERR(svn_wc__db_scan_addition(NULL, &op_root_abspath,
-                                           NULL /* repos_relpath */,
-                                           NULL /* repos_root_url */,
-                                           NULL /* repos_uuid */,
-                                           &original_repos_relpath,
-                                           &original_root_url, &original_uuid,
-                                           &original_revision,
-                                           db, parent_del_abspath,
-                                           scratch_pool, scratch_pool));
+          SVN_ERR(scan_addition(NULL, &op_root_abspath,
+                                NULL /* repos_relpath */,
+                                NULL /* repos_root_url */,
+                                NULL /* repos_uuid */,
+                                &original_repos_relpath,
+                                &original_root_url, &original_uuid,
+                                &original_revision,
+                                pdh, parent_del_relpath,
+                                scratch_pool, scratch_pool));
           *copyfrom_relpath
             = svn_relpath_join(original_repos_relpath,
                                svn_dirent_skip_ancestor(op_root_abspath,
@@ -6350,48 +6358,39 @@ svn_wc__db_scan_addition(svn_wc__db_stat
 }
 
 
-svn_error_t *
-svn_wc__db_scan_deletion(const char **base_del_abspath,
-                         svn_boolean_t *base_replaced,
-                         const char **moved_to_abspath,
-                         const char **work_del_abspath,
-                         svn_wc__db_t *db,
-                         const char *local_abspath,
-                         apr_pool_t *result_pool,
-                         apr_pool_t *scratch_pool)
+/* Like svn_wc__db_scan_deletion(), but with PDH+LOCAL_RELPATH instead of
+ * DB+LOCAL_ABSPATH, and outputting relpaths instead of abspaths. */
+static svn_error_t *
+scan_deletion(const char **base_del_relpath,
+              svn_boolean_t *base_replaced,
+              const char **moved_to_relpath,
+              const char **work_del_relpath,
+              svn_wc__db_pdh_t *pdh,
+              const char *local_relpath,
+              apr_pool_t *result_pool,
+              apr_pool_t *scratch_pool)
 {
-  const char *current_abspath = local_abspath;
-  const char *current_relpath;
-  const char *child_abspath = NULL;
+  const char *current_relpath = local_relpath;
+  const char *child_relpath = NULL;
   svn_wc__db_status_t child_presence;
   svn_boolean_t child_has_base = FALSE;
   svn_boolean_t found_moved_to = FALSE;
-  svn_wc__db_pdh_t *pdh;
-  svn_wc__db_wcroot_t *wcroot;
-
-  SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+  svn_wc__db_wcroot_t *wcroot = pdh->wcroot;
 
   /* Initialize all the OUT parameters.  */
-  if (base_del_abspath != NULL)
-    *base_del_abspath = NULL;
+  if (base_del_relpath != NULL)
+    *base_del_relpath = NULL;
   if (base_replaced != NULL)
     *base_replaced = FALSE;  /* becomes TRUE when we know for sure.  */
-  if (moved_to_abspath != NULL)
-    *moved_to_abspath = NULL;
-  if (work_del_abspath != NULL)
-    *work_del_abspath = NULL;
+  if (moved_to_relpath != NULL)
+    *moved_to_relpath = NULL;
+  if (work_del_relpath != NULL)
+    *work_del_relpath = NULL;
 
   /* Initialize to something that won't denote an important parent/child
      transition.  */
   child_presence = svn_wc__db_status_base_deleted;
 
-  SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &current_relpath, db,
-                              local_abspath, svn_sqlite__mode_readonly,
-                              scratch_pool, scratch_pool));
-  VERIFY_USABLE_PDH(pdh);
-
-  wcroot = pdh->wcroot;
-
   while (TRUE)
     {
       svn_sqlite__stmt_t *stmt;
@@ -6407,11 +6406,12 @@ svn_wc__db_scan_deletion(const char **ba
       if (!have_row)
         {
           /* There better be a row for the starting node!  */
-          if (current_abspath == local_abspath)
+          if (current_relpath == local_relpath)
             return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND,
                                      svn_sqlite__reset(stmt),
                                      _("The node '%s' was not found."),
-                                     svn_dirent_local_style(local_abspath,
+                                     path_for_error_message(wcroot,
+                                                            local_relpath,
                                                             scratch_pool));
 
           /* There are no values, so go ahead and reset the stmt now.  */
@@ -6424,10 +6424,10 @@ svn_wc__db_scan_deletion(const char **ba
              (added) WORKING subtree was deleted.  This can occur
              during post-commit processing when the copied parent that
              was in the WORKING tree has been moved to the BASE tree. */
-          if (work_del_abspath != NULL
+          if (work_del_relpath != NULL
               && child_presence == svn_wc__db_status_not_present
-              && *work_del_abspath == NULL)
-            *work_del_abspath = apr_pstrdup(result_pool, child_abspath);
+              && *work_del_relpath == NULL)
+            *work_del_relpath = apr_pstrdup(result_pool, child_relpath);
 
           /* If the child did not have a BASE node associated with it, then
              we're looking at a deletion that occurred within an added tree.
@@ -6441,10 +6441,10 @@ svn_wc__db_scan_deletion(const char **ba
 
              In both cases, set the root of the operation (if we have not
              already set it as part of a moved-away).  */
-          if (base_del_abspath != NULL
+          if (base_del_relpath != NULL
               && child_has_base
-              && *base_del_abspath == NULL)
-            *base_del_abspath = apr_pstrdup(result_pool, child_abspath);
+              && *base_del_relpath == NULL)
+            *base_del_relpath = apr_pstrdup(result_pool, child_relpath);
 
           /* We found whatever roots we needed. This BASE node and its
              ancestors are unchanged, so we're done.  */
@@ -6456,13 +6456,14 @@ svn_wc__db_scan_deletion(const char **ba
       work_presence = svn_sqlite__column_token(stmt, 1, presence_map);
 
       /* The starting node should be deleted.  */
-      if (current_abspath == local_abspath
+      if (current_relpath == local_relpath
           && work_presence != svn_wc__db_status_not_present
           && work_presence != svn_wc__db_status_base_deleted)
         return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS,
                                  svn_sqlite__reset(stmt),
                                  _("Expected node '%s' to be deleted."),
-                                 svn_dirent_local_style(local_abspath,
+                                 path_for_error_message(wcroot,
+                                                        local_relpath,
                                                         scratch_pool));
       SVN_ERR_ASSERT(work_presence == svn_wc__db_status_normal
                      || work_presence == svn_wc__db_status_not_present
@@ -6515,7 +6516,7 @@ svn_wc__db_scan_deletion(const char **ba
 
       /* Only grab the nearest ancestor.  */
       if (!found_moved_to &&
-          (moved_to_abspath != NULL || base_del_abspath != NULL)
+          (moved_to_relpath != NULL || base_del_relpath != NULL)
           && !svn_sqlite__column_is_null(stmt, 2 /* moved_to */))
         {
           /* There better be a BASE_NODE (that was moved-away).  */
@@ -6524,23 +6525,21 @@ svn_wc__db_scan_deletion(const char **ba
           found_moved_to = TRUE;
 
           /* This makes things easy. It's the BASE_DEL_ABSPATH!  */
-          if (base_del_abspath != NULL)
-            *base_del_abspath = apr_pstrdup(result_pool, current_abspath);
+          if (base_del_relpath != NULL)
+            *base_del_relpath = apr_pstrdup(result_pool, current_relpath);
 
-          if (moved_to_abspath != NULL)
-            *moved_to_abspath = svn_dirent_join(
-                                    wcroot->abspath,
-                                    svn_sqlite__column_text(stmt, 2, NULL),
-                                    result_pool);
+          if (moved_to_relpath != NULL)
+            *moved_to_relpath = apr_pstrdup(result_pool,
+                                    svn_sqlite__column_text(stmt, 2, NULL));
         }
 
-      if (work_del_abspath != NULL
+      if (work_del_relpath != NULL
           && work_presence == svn_wc__db_status_normal
           && child_presence == svn_wc__db_status_not_present)
         {
           /* Parent is normal, but child was deleted. Therefore, the child
              is the root of a WORKING subtree deletion.  */
-          *work_del_abspath = apr_pstrdup(result_pool, child_abspath);
+          *work_del_relpath = apr_pstrdup(result_pool, child_relpath);
         }
 
       /* We're all done examining the return values.  */
@@ -6548,7 +6547,7 @@ svn_wc__db_scan_deletion(const char **ba
 
       /* Move to the parent node. Remember the information about this node
          for our parent to use.  */
-      child_abspath = current_abspath;
+      child_relpath = current_relpath;
       child_presence = work_presence;
       child_has_base = have_base;
 
@@ -6557,7 +6556,57 @@ svn_wc__db_scan_deletion(const char **ba
       SVN_ERR_ASSERT(current_relpath[0] != '\0');
 
       current_relpath = svn_relpath_dirname(current_relpath, scratch_pool);
-      current_abspath = svn_dirent_dirname(current_abspath, scratch_pool);
+    }
+
+  return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_wc__db_scan_deletion(const char **base_del_abspath,
+                         svn_boolean_t *base_replaced,
+                         const char **moved_to_abspath,
+                         const char **work_del_abspath,
+                         svn_wc__db_t *db,
+                         const char *local_abspath,
+                         apr_pool_t *result_pool,
+                         apr_pool_t *scratch_pool)
+{
+  svn_wc__db_pdh_t *pdh;
+  const char *local_relpath;
+  const char *base_del_relpath, *moved_to_relpath, *work_del_relpath;
+
+  SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+
+  SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
+                              local_abspath, svn_sqlite__mode_readonly,
+                              scratch_pool, scratch_pool));
+  VERIFY_USABLE_PDH(pdh);
+
+  SVN_ERR(scan_deletion(&base_del_relpath, base_replaced, &moved_to_relpath,
+                        &work_del_relpath,
+                        pdh, local_relpath, result_pool, scratch_pool));
+
+  if (base_del_abspath)
+    {
+      *base_del_abspath = (base_del_relpath
+                           ? svn_dirent_join(pdh->wcroot->abspath,
+                                             base_del_relpath, result_pool)
+                           : NULL);
+    }
+  if (moved_to_abspath)
+    {
+      *moved_to_abspath = (moved_to_relpath
+                           ? svn_dirent_join(pdh->wcroot->abspath,
+                                             moved_to_relpath, result_pool)
+                           : NULL);
+    }
+  if (work_del_abspath)
+    {
+      *work_del_abspath = (work_del_relpath
+                           ? svn_dirent_join(pdh->wcroot->abspath,
+                                             work_del_relpath, result_pool)
+                           : NULL);
     }
 
   return SVN_NO_ERROR;