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/07 22:25:42 UTC

svn commit: r952416 - in /subversion/trunk/subversion: include/svn_wc.h libsvn_wc/status.c libsvn_wc/util.c

Author: rhuijben
Date: Mon Jun  7 20:25:42 2010
New Revision: 952416

URL: http://svn.apache.org/viewvc?rev=952416&view=rev
Log:
Remove the svn_wc_entry_t field from svn_wc_status3_t.

* subversion/include/svn_wc.h
  (svn_wc_status3_t): Remove entry field and move versioned up to its old
    place, to make this important boolean more visible.

* subversion/libsvn_wc/status.c
  (assemble_status): Only retrieve an entry to determine the exact add
     state. Retrieve more useful values from _read_info() to optimize
     some other code paths with data we already read.

* subversion/libsvn_wc/util.c
  (svn_wc__status2_from_3): Load entry like assemble_status() did.

Modified:
    subversion/trunk/subversion/include/svn_wc.h
    subversion/trunk/subversion/libsvn_wc/status.c
    subversion/trunk/subversion/libsvn_wc/util.c

Modified: subversion/trunk/subversion/include/svn_wc.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=952416&r1=952415&r2=952416&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_wc.h (original)
+++ subversion/trunk/subversion/include/svn_wc.h Mon Jun  7 20:25:42 2010
@@ -3532,8 +3532,9 @@ typedef struct svn_wc_status3_t
    * (#svn_depth_unknown for files or when no depth is set) */
   svn_depth_t depth;
 
-  /** Can be @c NULL if not under version control. */
-  const svn_wc_entry_t *entry;
+  /** If the path is under version control, versioned is TRUE, otherwise
+   * FALSE. */
+  svn_boolean_t versioned;
 
   /** The status of the entry itself, including its text if it is a file. */
   enum svn_wc_status_kind text_status;
@@ -3652,9 +3653,6 @@ typedef struct svn_wc_status3_t
   /** Set to TRUE if the item is the victim of a conflict. */
   svn_boolean_t conflicted;
 
-  /** If the path is under version control, versioned is TRUE. */
-  svn_boolean_t versioned;
-
   /** Which changelist this item is part of, or NULL if not part of any. */
   const char *changelist;
 

Modified: subversion/trunk/subversion/libsvn_wc/status.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/status.c?rev=952416&r1=952415&r2=952416&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/status.c (original)
+++ subversion/trunk/subversion/libsvn_wc/status.c Mon Jun  7 20:25:42 2010
@@ -291,6 +291,7 @@ assemble_status(svn_wc_status3_t **statu
   svn_boolean_t switched_p = FALSE;
   const svn_wc_conflict_description2_t *tree_conflict;
   svn_boolean_t file_external_p = FALSE;
+  svn_boolean_t prop_modified_p;
   svn_wc__db_lock_t *lock;
   svn_revnum_t revision;
   svn_revnum_t changed_rev;
@@ -299,7 +300,8 @@ assemble_status(svn_wc_status3_t **statu
   const char *changelist;
   svn_boolean_t base_shadowed;
   svn_boolean_t conflicted;
-  const svn_wc_entry_t *entry;
+  svn_boolean_t copied = FALSE;
+  svn_depth_t depth;
   svn_error_t *err;
 
   /* Defaults for two main variables. */
@@ -309,14 +311,6 @@ assemble_status(svn_wc_status3_t **statu
   enum svn_wc_status_kind pristine_text_status = svn_wc_status_none;
   enum svn_wc_status_kind pristine_prop_status = svn_wc_status_none;
 
-  err = svn_wc__get_entry(&entry, db, local_abspath, FALSE, svn_node_unknown,
-                          FALSE, result_pool, scratch_pool);
-
-  if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
-    svn_error_clear(err);
-  else
-    SVN_ERR(err);
-
   /* Find out whether the path is a tree conflict victim.
    * This function will set tree_conflict to NULL if the path
    * is not a victim. */
@@ -326,11 +320,11 @@ assemble_status(svn_wc_status3_t **statu
   SVN_ERR(svn_wc__db_read_info(&db_status, &db_kind, &revision,
                                &repos_relpath, &repos_root_url, NULL,
                                &changed_rev, &changed_date,
-                               &changed_author, NULL, NULL, NULL, NULL,
+                               &changed_author, NULL, &depth, NULL, NULL,
                                NULL, &changelist, NULL, NULL, NULL, NULL,
-                               NULL, NULL, &base_shadowed, &conflicted,
-                               &lock, db, local_abspath, result_pool,
-                               scratch_pool));
+                               NULL, &prop_modified_p, &base_shadowed,
+                               &conflicted, &lock, db, local_abspath,
+                               result_pool, scratch_pool));
 
   /* ### Temporary until we've revved svn_wc_status3_t to only use
    * ### repos_{root_url,relpath} */
@@ -422,7 +416,6 @@ assemble_status(svn_wc_status3_t **statu
   if (final_text_status == svn_wc_status_normal)
     {
       svn_boolean_t has_props;
-      svn_boolean_t prop_modified_p = FALSE;
       svn_boolean_t text_modified_p = FALSE;
 #ifdef HAVE_SYMLINK
       svn_boolean_t wc_special;
@@ -434,18 +427,26 @@ assemble_status(svn_wc_status3_t **statu
             Together, these two stati are of lowest precedence, and C has
             precedence over M. */
 
-      /* Does the entry have props? */
-      {
-        apr_hash_t *pristine;
-        apr_hash_t *actual;
+      /* Does the node have props? */
+      if (prop_modified_p)
+        has_props = TRUE;
+      else
+        {
+          apr_hash_t *props;
+        
+          SVN_ERR(svn_wc__get_pristine_props(&props, db, local_abspath,
+                                             scratch_pool, scratch_pool));
+        
+          if (props != NULL && apr_hash_count(props) > 0)
+            has_props = TRUE;
+          else
+            {
+              SVN_ERR(svn_wc__get_actual_props(&props, db, local_abspath,
+                                               scratch_pool, scratch_pool));
 
-        SVN_ERR(svn_wc__get_pristine_props(&pristine, db, local_abspath,
-                                           scratch_pool, scratch_pool));
-        SVN_ERR(svn_wc__get_actual_props(&actual, db, local_abspath,
-                                         scratch_pool, scratch_pool));
-        has_props = ((pristine != NULL && apr_hash_count(pristine) > 0)
-                     || (actual != NULL && apr_hash_count(actual) > 0));
-      }
+              has_props = (props != NULL && apr_hash_count(props) > 0);
+            }
+        }
       if (has_props)
         final_prop_status = svn_wc_status_normal;
 
@@ -454,8 +455,11 @@ assemble_status(svn_wc_status3_t **statu
          ### fetched above. but for now, there is some trickery we may
          ### need to rely upon in ths function. keep it for now.  */
       /* ### see r944980 as an example of the brittleness of this stuff.  */
-      SVN_ERR(svn_wc__props_modified(&prop_modified_p, db, local_abspath,
-                                     scratch_pool));
+#if (SVN_WC__VERSION < SVN_WC__PROPS_IN_DB)
+      if (has_props)
+        SVN_ERR(svn_wc__props_modified(&prop_modified_p, db, local_abspath,
+                                       scratch_pool));
+#endif
 
       /* Record actual property status */
       pristine_prop_status = prop_modified_p ? svn_wc_status_modified
@@ -506,8 +510,7 @@ assemble_status(svn_wc_status3_t **statu
       if (prop_modified_p)
         final_prop_status = svn_wc_status_modified;
 
-      if (entry->prejfile || entry->conflict_old ||
-          entry->conflict_new || entry->conflict_wrk)
+      if (conflicted)
         {
           svn_boolean_t text_conflict_p, prop_conflict_p;
 
@@ -534,28 +537,43 @@ assemble_status(svn_wc_status3_t **statu
       /* ### db_status, base_shadowed, and fetching base_status can
          ### fully replace entry->schedule here.  */
 
-      if (entry->schedule == svn_wc_schedule_add
-          && final_text_status != svn_wc_status_conflicted)
+      if (db_status == svn_wc__db_status_added)
         {
-          final_text_status = svn_wc_status_added;
-          final_prop_status = svn_wc_status_none;
-        }
+          const svn_wc_entry_t *entry;
 
-      else if (entry->schedule == svn_wc_schedule_replace
-               && final_text_status != svn_wc_status_conflicted)
-        {
-          final_text_status = svn_wc_status_replaced;
-          final_prop_status = svn_wc_status_none;
-        }
+          err = svn_wc__get_entry(&entry, db, local_abspath, FALSE,
+                                  svn_node_unknown, FALSE, result_pool,
+                                  scratch_pool);
+
+          if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
+            svn_error_clear(err);
+          else
+            SVN_ERR(err);
+
+          copied = entry->copied;
+
+          if (entry->schedule == svn_wc_schedule_add
+              && final_text_status != svn_wc_status_conflicted)
+            {
+              final_text_status = svn_wc_status_added;
+              final_prop_status = svn_wc_status_none;
+            }
 
-      else if (entry->schedule == svn_wc_schedule_delete
+          else if (entry->schedule == svn_wc_schedule_replace
+                   && final_text_status != svn_wc_status_conflicted)
+            {
+              final_text_status = svn_wc_status_replaced;
+              final_prop_status = svn_wc_status_none;
+            }
+        }
+      else if (db_status == svn_wc__db_status_deleted
                && final_text_status != svn_wc_status_conflicted)
         {
+          /* ### Set copied for working_node only delete? */
           final_text_status = svn_wc_status_deleted;
           final_prop_status = svn_wc_status_none;
         }
 
-
       /* 3. Highest precedence:
 
             a. check to see if file or dir is just missing, or
@@ -569,7 +587,7 @@ assemble_status(svn_wc_status3_t **statu
 
          4. Check for locked directory (only for directories). */
 
-      if (entry->incomplete
+      if (db_status == svn_wc__db_status_incomplete
           && (final_text_status != svn_wc_status_deleted)
           && (final_text_status != svn_wc_status_added))
         {
@@ -620,9 +638,21 @@ assemble_status(svn_wc_status3_t **statu
   /* 6. Build and return a status structure. */
 
   stat = apr_pcalloc(result_pool, sizeof(**status));
-  stat->kind = entry->kind;
-  stat->depth = entry->depth;
-  stat->entry = entry;
+
+  switch (db_kind)
+    {
+      case svn_wc__db_kind_dir:
+        stat->kind = svn_node_dir;
+        break;
+      case svn_wc__db_kind_file:
+      case svn_wc__db_kind_symlink:
+        stat->kind = svn_node_file;
+        break;
+      case svn_wc__db_kind_unknown:
+      default:
+        stat->kind = svn_node_unknown;
+    }
+  stat->depth = depth;
   stat->text_status = final_text_status;
   stat->prop_status = final_prop_status;
   stat->repos_text_status = svn_wc_status_none;   /* default */
@@ -630,7 +660,7 @@ assemble_status(svn_wc_status3_t **statu
   stat->locked = locked_p;
   stat->switched = switched_p;
   stat->file_external = file_external_p;
-  stat->copied = entry->copied;
+  stat->copied = copied;
   stat->repos_lock = repos_lock;
   stat->url = url;
   stat->revision = revision;
@@ -2640,9 +2670,6 @@ svn_wc_dup_status3(const svn_wc_status3_
   *new_stat = *orig_stat;
 
   /* Now go back and dup the deep items into this pool. */
-  if (orig_stat->entry)
-    new_stat->entry = svn_wc_entry_dup(orig_stat->entry, pool);
-
   if (orig_stat->repos_lock)
     new_stat->repos_lock = svn_lock_dup(orig_stat->repos_lock, pool);
 

Modified: subversion/trunk/subversion/libsvn_wc/util.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/util.c?rev=952416&r1=952415&r2=952416&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/util.c (original)
+++ subversion/trunk/subversion/libsvn_wc/util.c Mon Jun  7 20:25:42 2010
@@ -565,9 +565,17 @@ svn_wc__status2_from_3(svn_wc_status2_t 
   *status = apr_pcalloc(result_pool, sizeof(**status));
 
   if (old_status->versioned)
-    SVN_ERR(svn_wc__get_entry(&entry, wc_ctx->db, local_abspath, TRUE,
-                              svn_node_unknown, FALSE, result_pool,
-                              scratch_pool));
+    {
+      svn_error_t *err;
+      err= svn_wc__get_entry(&entry, wc_ctx->db, local_abspath, FALSE,
+                             svn_node_unknown, FALSE, result_pool,
+                             scratch_pool);
+
+      if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
+        svn_error_clear(err);
+      else
+        SVN_ERR(err);
+    }
 
   SVN_ERR(svn_wc__db_op_read_tree_conflict(&tree_conflict, wc_ctx->db,
                                            local_abspath, scratch_pool,