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 18:46:34 UTC

svn commit: r952329 - /subversion/trunk/subversion/libsvn_wc/status.c

Author: rhuijben
Date: Mon Jun  7 16:46:34 2010
New Revision: 952329

URL: http://svn.apache.org/viewvc?rev=952329&view=rev
Log:
* subversion/libsvn_wc/status.c
  (handle_dir_entry): Accept db_status and db_kind instead of entry to allow
    detecting different kinds of obstructions.
  (get_dir_status): Update caller. Remove entry retrieval and handle
    excluded/absent/not-present working nodes.

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

Modified: subversion/trunk/subversion/libsvn_wc/status.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/status.c?rev=952329&r1=952328&r2=952329&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/status.c (original)
+++ subversion/trunk/subversion/libsvn_wc/status.c Mon Jun  7 16:46:34 2010
@@ -960,7 +960,8 @@ get_dir_status(const struct walk_status_
 static svn_error_t *
 handle_dir_entry(const struct walk_status_baton *wb,
                  const char *local_abspath,
-                 const svn_wc_entry_t *entry,
+                 svn_wc__db_status_t status,
+                 svn_wc__db_kind_t db_kind,
                  const char *dir_repos_root_url,
                  const char *dir_repos_relpath,
                  svn_node_kind_t path_kind,
@@ -976,12 +977,16 @@ handle_dir_entry(const struct walk_statu
                  apr_pool_t *pool)
 {
   /* We are looking at a directory on-disk.  */
-  if (path_kind == svn_node_dir)
+  if (path_kind == svn_node_dir
+      && db_kind == svn_wc__db_kind_dir)
     {
       /* Descend only if the subdirectory is a working copy directory (which
          we've discovered because we got a THIS_DIR entry. And only descend
          if DEPTH permits it, of course.  */
-      if (*entry->name == '\0'
+
+      if (status != svn_wc__db_status_obstructed
+          && status != svn_wc__db_status_obstructed_add
+          && status != svn_wc__db_status_obstructed_delete
           && (depth == svn_depth_unknown
               || depth == svn_depth_immediates
               || depth == svn_depth_infinity))
@@ -1007,7 +1012,7 @@ handle_dir_entry(const struct walk_statu
     }
   else
     {
-      /* This is a file/symlink on-disk.  */
+      /* This is a file/symlink on-disk or not a directory in the db.  */
       SVN_ERR(send_status_structure(wb, local_abspath,
                                     dir_repos_root_url,
                                     dir_repos_relpath, path_kind,
@@ -1241,52 +1246,35 @@ get_dir_status(const struct walk_status_
       if (apr_hash_get(nodes, key, klen))
         {
           /* Versioned node */
-          svn_error_t *err;
-          const svn_wc_entry_t *entry;
+          svn_wc__db_status_t node_status;
+          svn_wc__db_kind_t node_kind;
           svn_boolean_t hidden;
 
+          SVN_ERR(svn_wc__db_read_info(&node_status, &node_kind, NULL, NULL,
+                                   NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                                   NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                                   NULL, NULL, NULL, NULL, NULL, NULL,
+                                   wb->db, node_abspath, iterpool, iterpool));
+
           SVN_ERR(svn_wc__db_node_hidden(&hidden, wb->db, node_abspath,
                                          iterpool));
 
-          if (!hidden)
+          /* Hidden looks in the parent stubs, which should not be necessary
+             later. Also skip excluded/absent/not-present working nodes, which
+             only have an implied status via their parent. */
+          if (!hidden
+              && node_status != svn_wc__db_status_excluded
+              && node_status != svn_wc__db_status_absent
+              && node_status != svn_wc__db_status_not_present)
             {
-              err = svn_wc__get_entry(&entry, wb->db, node_abspath, FALSE,
-                                      svn_node_unknown, FALSE,
-                                      iterpool, iterpool);
-              if (err)
-                {
-                  if (err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
-                    {
-                      /* We asked for the contents, but got the stub.  */
-                      svn_error_clear(err);
-                    }
-                  else if (err && err->apr_err == SVN_ERR_WC_MISSING)
-                    {
-                      svn_error_clear(err);
-
-                      /* Most likely the parent refers to a missing child;
-                       * retrieve the stub stored in the parent */
-
-                      err = svn_wc__get_entry(&entry, wb->db, node_abspath,
-                                              FALSE, svn_node_dir, TRUE,
-                                              iterpool, iterpool);
-
-                      if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND)
-                        svn_error_clear(err);
-                      else
-                        SVN_ERR(err);
-                    }
-                  else
-                    return svn_error_return(err);
-                }
-
-              if (depth == svn_depth_files && entry->kind == svn_node_dir)
+              if (depth == svn_depth_files && node_kind == svn_wc__db_kind_dir)
                 continue;
 
               /* Handle this entry (possibly recursing). */
               SVN_ERR(handle_dir_entry(wb,
                                        node_abspath,
-                                       entry,
+                                       node_status,
+                                       node_kind,
                                        dir_repos_root_url,
                                        dir_repos_relpath,
                                        dirent_p ? dirent_p->kind