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 2011/05/05 15:58:14 UTC
svn commit: r1099807 - /subversion/trunk/subversion/libsvn_wc/status.c
Author: rhuijben
Date: Thu May 5 13:58:14 2011
New Revision: 1099807
URL: http://svn.apache.org/viewvc?rev=1099807&view=rev
Log:
In the status crawler, fold a function into its only caller to make the
recursion easier to follow.
* subversion/libsvn_wc/status.c
(get_dir_status): Remove prototype.
(handle_dir_entry): Remove function... folding it into ...
(get_dir_status): ... this function. Always call send_status_structure
instead of asking the callee to do that for us.
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=1099807&r1=1099806&r2=1099807&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/status.c (original)
+++ subversion/trunk/subversion/libsvn_wc/status.c Thu May 5 13:58:14 2011
@@ -939,104 +939,6 @@ send_unversioned_item(const struct walk_
return SVN_NO_ERROR;
}
-
-/* Prototype for untangling a tango-ing two-some. */
-static svn_error_t *
-get_dir_status(const struct walk_status_baton *wb,
- const char *local_abspath,
- const char *selected,
- svn_boolean_t skip_this_dir,
- const char *parent_repos_root_url,
- const char *parent_repos_relpath,
- const struct svn_wc__db_info_t *dir_info,
- const svn_io_dirent2_t *dirent,
- const apr_array_header_t *ignores,
- svn_depth_t depth,
- svn_boolean_t get_all,
- svn_boolean_t no_ignore,
- svn_boolean_t had_props,
- svn_wc_status_func4_t status_func,
- void *status_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool);
-
-/* Handle LOCAL_ABSPATH (whose entry is ENTRY). All other arguments
- are the same as those passed to get_dir_status(), the function
- for which this one is a helper. */
-static svn_error_t *
-handle_dir_entry(const struct walk_status_baton *wb,
- const char *local_abspath,
- svn_wc__db_status_t status,
- svn_wc__db_kind_t db_kind,
- const char *dir_repos_root_url,
- const char *dir_repos_relpath,
- const struct svn_wc__db_info_t *entry_info,
- svn_io_dirent2_t *dirent,
- const apr_array_header_t *ignores,
- svn_depth_t depth,
- svn_boolean_t get_all,
- svn_boolean_t no_ignore,
- svn_boolean_t had_props,
- svn_wc_status_func4_t status_func,
- void *status_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
-{
- /* We are looking at a directory on-disk.
- With a db per directory the directory must exist to recurse, but
- with single-db we only have to check for obstructions.
-
- (Without recursing you would only see the root of a delete operation
- in single db mode.)
- ### TODO: Should we recurse on obstructions anyway?
- ### (Requires changes to the test suite)
- */
- if (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 ((depth == svn_depth_unknown
- || depth == svn_depth_immediates
- || depth == svn_depth_infinity))
- {
- SVN_ERR(get_dir_status(wb, local_abspath, NULL, FALSE,
- dir_repos_root_url, dir_repos_relpath,
- entry_info,
- dirent, ignores, depth, get_all, no_ignore,
- had_props,
- status_func, status_baton, cancel_func,
- cancel_baton,
- pool));
- }
- else
- {
- /* ENTRY is a child entry (file or parent stub). Or we have a
- directory entry but DEPTH is limiting our recursion. */
- SVN_ERR(send_status_structure(wb, local_abspath,
- dir_repos_root_url,
- dir_repos_relpath,
- entry_info, dirent, get_all,
- status_func, status_baton, pool));
- }
- }
- else
- {
- /* 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,
- entry_info, dirent, get_all,
- status_func, status_baton, pool));
- }
-
- return SVN_NO_ERROR;
-}
-
-
/* Helper for get_dir_status. If LOCAL_ABSPATH has "svn:externals" property
set on it, send the name and value to WB->external_func, along with
this directory's depth, but skip this step if LOCAL_ABSPATH is the anchor
@@ -1230,27 +1132,39 @@ get_dir_status(const struct walk_status_
&& info->status != svn_wc__db_status_excluded
&& info->status != svn_wc__db_status_absent)
{
+ svn_depth_t dir_depth;
if (depth == svn_depth_files && info->kind == svn_wc__db_kind_dir)
continue;
/* Handle this entry (possibly recursing). */
- SVN_ERR(handle_dir_entry(wb,
- node_abspath,
- info->status,
- info->kind,
- dir_repos_root_url,
- dir_repos_relpath,
- info,
- dirent_p,
- ignore_patterns,
- depth == svn_depth_infinity
- ? depth
- : svn_depth_empty,
- get_all,
- no_ignore,
- info->had_props,
- status_func, status_baton,
- cancel_func, cancel_baton, iterpool));
+ dir_depth = (depth == svn_depth_infinity) ? depth
+ : svn_depth_empty;
+
+ SVN_ERR(send_status_structure(wb, node_abspath,
+ dir_repos_root_url,
+ dir_repos_relpath,
+ info, dirent_p, get_all,
+ status_func, status_baton,
+ iterpool));
+
+ /* Descend only if the subdirectory is a working copy directory
+ and if DEPTH permits it. */
+ if ((info->kind == svn_wc__db_kind_dir)
+ && ((dir_depth == svn_depth_unknown
+ || dir_depth >= svn_depth_immediates)))
+ {
+ SVN_ERR(get_dir_status(wb, node_abspath, NULL, TRUE,
+ dir_repos_root_url, dir_repos_relpath,
+ info,
+ dirent_p, ignore_patterns,
+ dir_depth, get_all,
+ no_ignore,
+ info->had_props,
+ status_func, status_baton,
+ cancel_func, cancel_baton,
+ iterpool));
+ }
+
continue;
}
}
@@ -1322,7 +1236,7 @@ hash_stash(void *baton,
{
apr_hash_t *stat_hash = baton;
apr_pool_t *hash_pool = apr_hash_pool_get(stat_hash);
- assert(! apr_hash_get(stat_hash, path, APR_HASH_KEY_STRING));
+ SVN_ERR_ASSERT(! apr_hash_get(stat_hash, path, APR_HASH_KEY_STRING));
apr_hash_set(stat_hash, apr_pstrdup(hash_pool, path),
APR_HASH_KEY_STRING, svn_wc_dup_status3(status, hash_pool));
Re: svn commit: r1099807 - /subversion/trunk/subversion/libsvn_wc/status.c
Posted by Greg Stein <gs...@gmail.com>.
On Thu, May 5, 2011 at 09:58, <rh...@apache.org> wrote:
>...
> +++ subversion/trunk/subversion/libsvn_wc/status.c Thu May 5 13:58:14 2011
>...
> @@ -1230,27 +1132,39 @@ get_dir_status(const struct walk_status_
> && info->status != svn_wc__db_status_excluded
> && info->status != svn_wc__db_status_absent)
> {
> + svn_depth_t dir_depth;
> if (depth == svn_depth_files && info->kind == svn_wc__db_kind_dir)
> continue;
>
> /* Handle this entry (possibly recursing). */
> - SVN_ERR(handle_dir_entry(wb,
> - node_abspath,
> - info->status,
> - info->kind,
> - dir_repos_root_url,
> - dir_repos_relpath,
> - info,
> - dirent_p,
> - ignore_patterns,
> - depth == svn_depth_infinity
> - ? depth
> - : svn_depth_empty,
> - get_all,
> - no_ignore,
> - info->had_props,
> - status_func, status_baton,
> - cancel_func, cancel_baton, iterpool));
> + dir_depth = (depth == svn_depth_infinity) ? depth
> + : svn_depth_empty;
To clarify this, the interior 'depth' term can just be the
svn_depth_infinity constant. But then... this localvar isn't really
needed. See below.
> + SVN_ERR(send_status_structure(wb, node_abspath,
> + dir_repos_root_url,
> + dir_repos_relpath,
> + info, dirent_p, get_all,
> + status_func, status_baton,
> + iterpool));
> +
> + /* Descend only if the subdirectory is a working copy directory
> + and if DEPTH permits it. */
> + if ((info->kind == svn_wc__db_kind_dir)
> + && ((dir_depth == svn_depth_unknown
> + || dir_depth >= svn_depth_immediates)))
And the above check becomes simplified:
&& (depth == svn_depth_infinity)
>...
> @@ -1322,7 +1236,7 @@ hash_stash(void *baton,
> {
> apr_hash_t *stat_hash = baton;
> apr_pool_t *hash_pool = apr_hash_pool_get(stat_hash);
> - assert(! apr_hash_get(stat_hash, path, APR_HASH_KEY_STRING));
> + SVN_ERR_ASSERT(! apr_hash_get(stat_hash, path, APR_HASH_KEY_STRING));
> apr_hash_set(stat_hash, apr_pstrdup(hash_pool, path),
> APR_HASH_KEY_STRING, svn_wc_dup_status3(status, hash_pool));
This is not mentioned in the log message. Intentional?
Cheers,
-g