You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2010/06/06 15:00:45 UTC

svn commit: r951859 - /subversion/trunk/subversion/libsvn_wc/adm_ops.c

Author: rhuijben
Date: Sun Jun  6 13:00:45 2010
New Revision: 951859

URL: http://svn.apache.org/viewvc?rev=951859&view=rev
Log:
* subversion/libsvn_wc/adm_ops.c
  (tweak_node): Update some of the tests to use wc-db instead of entries.
    Reorder some code for maximum result.

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

Modified: subversion/trunk/subversion/libsvn_wc/adm_ops.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_ops.c?rev=951859&r1=951858&r2=951859&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/adm_ops.c (original)
+++ subversion/trunk/subversion/libsvn_wc/adm_ops.c Sun Jun  6 13:00:45 2010
@@ -125,38 +125,34 @@ tweak_node(svn_wc__db_t *db,
            svn_boolean_t allow_removal,
            apr_pool_t *scratch_pool)
 {
-  const svn_wc_entry_t *entry;
   svn_wc_entry_t tmp_entry;
   int modify_flags = 0;
+  svn_wc__db_status_t status;
+  svn_wc__db_kind_t db_kind;
+  svn_revnum_t revision;
+  const char *repos_relpath, *repos_root_url, *repos_uuid;
+  svn_error_t *err;
   svn_node_kind_t node_kind = (kind == svn_wc__db_kind_dir)
                                      ? svn_node_dir
                                      : svn_node_file;
 
-  SVN_ERR(svn_wc__get_entry(&entry, db, local_abspath, FALSE, node_kind,
-                            parent_stub, scratch_pool, scratch_pool));
+  err = svn_wc__db_base_get_info(&status, &db_kind, &revision,
+                                 &repos_relpath, &repos_root_url,
+                                 &repos_uuid, NULL, NULL, NULL, NULL, NULL,
+                                 NULL, NULL, NULL, NULL, db, local_abspath,
+                                 scratch_pool, scratch_pool);
 
-  if (new_repos_relpath != NULL)
+  if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
     {
-      const char *new_url = svn_path_url_add_component2(new_repos_root_url,
-                                                        new_repos_relpath,
-                                                        scratch_pool);
-      if (new_url != NULL
-          && (! entry->url || strcmp(new_url, entry->url)))
-        {
-          modify_flags |= SVN_WC__ENTRY_MODIFY_URL;
-          tmp_entry.url = new_url;
-        }
+      /* ### Tweaking should never be necessary for nodes that don't
+         ### have a base node, but we still get here from many tests */
+      svn_error_clear(err);
+      return SVN_NO_ERROR; /* No BASE_NODE -> Added node */
     }
+  else
+    SVN_ERR(err);
 
-  if ((SVN_IS_VALID_REVNUM(new_rev))
-      && (entry->schedule != svn_wc_schedule_add)
-      && (entry->schedule != svn_wc_schedule_replace)
-      && (entry->copied != TRUE)
-      && (entry->revision != new_rev))
-    {
-      modify_flags |= SVN_WC__ENTRY_MODIFY_REVISION;
-      tmp_entry.revision = new_rev;
-    }
+  SVN_ERR_ASSERT(db_kind == kind);
 
   /* As long as this function is only called as a helper to
      svn_wc__do_update_cleanup, then it's okay to remove any entry
@@ -174,14 +170,51 @@ tweak_node(svn_wc__db_t *db,
      ### appropriate, hence the ALLOW_REMOVAL flag.  It's all a bit of a
      ### mess. */
   if (allow_removal
-      && (entry->deleted || (entry->absent && entry->revision != new_rev)))
+      && (status == svn_wc__db_status_not_present
+          || (status == svn_wc__db_status_absent && revision != new_rev)))
     {
-      SVN_ERR(svn_wc__db_temp_op_remove_entry(db, local_abspath,
-                                              scratch_pool));
+      return svn_error_return(
+                svn_wc__db_temp_op_remove_entry(db, local_abspath,
+                                                scratch_pool));
+
+    }
+
+  if (new_repos_relpath != NULL)
+    {
+      if (!repos_relpath)
+        SVN_ERR(svn_wc__db_scan_base_repos(&repos_relpath, &repos_root_url,
+                                           &repos_uuid, db, local_abspath,
+                                           scratch_pool, scratch_pool));
+
+      if (strcmp(repos_relpath, new_repos_relpath)
+          || strcmp(repos_root_url, repos_root_url))
+        {
+          modify_flags |= SVN_WC__ENTRY_MODIFY_URL;
+          tmp_entry.url = svn_path_url_add_component2(new_repos_root_url,
+                                                      new_repos_relpath,
+                                                      scratch_pool);
+        }
     }
-  else if (modify_flags)
+
+  if (SVN_IS_VALID_REVNUM(new_rev) && new_rev != revision)
+    {
+      const svn_wc_entry_t *entry;
+      SVN_ERR(svn_wc__get_entry(&entry, db, local_abspath, FALSE, node_kind,
+                                parent_stub, scratch_pool, scratch_pool));
+
+      if ((entry->schedule != svn_wc_schedule_add)
+          && (entry->schedule != svn_wc_schedule_replace)
+          && (entry->copied != TRUE)
+          && (entry->revision != new_rev))
+        {
+          modify_flags |= SVN_WC__ENTRY_MODIFY_REVISION;
+          tmp_entry.revision = new_rev;
+        }
+    }
+
+  if (modify_flags)
     {
-      if (entry->kind == svn_node_dir && parent_stub)
+      if (db_kind == svn_wc__db_kind_dir && parent_stub)
         SVN_ERR(svn_wc__entry_modify_stub(db, local_abspath,
                                           &tmp_entry, modify_flags,
                                           scratch_pool));