Hey,
These days I am trying to remove usage of adm_access from
svn_wc_walk_entries3(), But I find it is difficult because adm_access
and entry are closely related. I think it is better to create adm_access
inside the function, so other modules who call svn_wc_walk_entries3()
can avoid adm_access batons.
Log:
[[[
Add a new function svn_wc_walk_entries4() which is similar to
svn_wc_walk_entries3() but taking svn_wc_context_t as parameter.
* subversion/include/svn_wc.h
(svn_wc_walk_entries4): New.
(svn_wc_walk_entries3): Deprecated.
* subversion/libsvn_wc/deprecated.c
(svn_wc_walk_entries3): Reimplement as a wrapper.
* subversion/libsvn_wc/entries.c
(svn_wc_walk_entries4): New.
(svn_wc_walk_entries3): Remove.
]]]
Modified:
trunk/subversion/include/svn_wc.h
trunk/subversion/libsvn_wc/deprecated.c
trunk/subversion/libsvn_wc/entries.c
Index: subversion/include/svn_wc.h
===================================================================
--- subversion/include/svn_wc.h (版本 38903)
+++ subversion/include/svn_wc.h (工作副本)
@@ -2847,8 +2847,8 @@
* @a path, which can be a file or dir. Call callbacks in
* @a walk_callbacks, passing @a walk_baton to each. Use @a pool for
* looping, recursion, and to allocate all entries returned.
- * @a adm_access must be an access baton for @a path. The pool
- * passed to @a walk_callbacks is a temporary subpool of @a pool.
+ * @a access_abspath must be the absolute path of an access baton for
@a path.
+ * The pool passed to @a walk_callbacks is a temporary subpool of @a
pool.
*
* If @a depth is @c svn_depth_empty, invoke the callbacks on @a path
* and return without recursing further. If @c svn_depth_files, do
@@ -2874,8 +2874,28 @@
* distinguished by looking for @c SVN_WC_ENTRY_THIS_DIR in the 'name'
* field of the entry.
*
+ * @since New in 1.7.
+ */
+svn_error_t *
+svn_wc_walk_entries4(const char *path,
+ svn_wc_context_t *wc_ctx,
+ const char *access_abspath,
+ const svn_wc_entry_callbacks2_t *walk_callbacks,
+ void *walk_baton,
+ svn_depth_t walk_depth,
+ svn_boolean_t show_hidden,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Similar to svn_wc_walk_entries4(), but take adm_access as parameter.
+ *
+ * @deprecated Provided for backward compatibility with the 1.4 API.
* @since New in 1.5.
*/
+SVN_DEPRECATED
svn_error_t *
svn_wc_walk_entries3(const char *path,
svn_wc_adm_access_t *adm_access,
Index: subversion/libsvn_wc/deprecated.c
===================================================================
--- subversion/libsvn_wc/deprecated.c (版本 38903)
+++ subversion/libsvn_wc/deprecated.c (工作副本)
@@ -1419,6 +1419,30 @@
/*** From entries.c ***/
svn_error_t *
+svn_wc_walk_entries3(const char *path,
+ svn_wc_adm_access_t *adm_access,
+ const svn_wc_entry_callbacks2_t *walk_callbacks,
+ void *walk_baton,
+ svn_depth_t walk_depth,
+ svn_boolean_t show_hidden,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool)
+{
+ svn_wc_context_t *wc_ctx;
+
+ SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL,
+
svn_wc__adm_get_db(adm_access),
+ pool));
+ SVN_ERR(svn_wc_walk_entries4(path, wc_ctx,
+ svn_wc__adm_access_abspath(adm_access),
+ walk_callbacks, walk_baton,
+ walk_depth, show_hidden, cancel_func,
+ cancel_baton, pool, pool));
+ return svn_error_return(svn_wc_context_destroy(wc_ctx));
+}
+
+svn_error_t *
svn_wc_walk_entries2(const char *path,
svn_wc_adm_access_t *adm_access,
const svn_wc_entry_callbacks_t *walk_callbacks,
Index: subversion/libsvn_wc/entries.c
===================================================================
--- subversion/libsvn_wc/entries.c (版本 38903)
+++ subversion/libsvn_wc/entries.c (工作副本)
@@ -3294,26 +3294,29 @@
return svn_error_return(err);
}
-
/* The public API. */
svn_error_t *
-svn_wc_walk_entries3(const char *path,
- svn_wc_adm_access_t *adm_access,
+svn_wc_walk_entries4(const char *path,
+ svn_wc_context_t *wc_ctx,
+ const char *access_abspath,
const svn_wc_entry_callbacks2_t *walk_callbacks,
void *walk_baton,
svn_depth_t walk_depth,
svn_boolean_t show_hidden,
svn_cancel_func_t cancel_func,
void *cancel_baton,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
const char *abspath;
- svn_wc__db_t *db = svn_wc__adm_get_db(adm_access);
svn_error_t *err;
svn_wc__db_kind_t kind;
svn_depth_t depth;
+ svn_wc_adm_access_t *adm_access;
- SVN_ERR(svn_dirent_get_absolute(&abspath, path, pool));
+ SVN_ERR(svn_dirent_get_absolute(&abspath, path, scratch_pool));
+ adm_access = svn_wc__adm_retrieve_internal2(wc_ctx->db,
access_abspath,
+ scratch_pool);
err = svn_wc__db_read_info(NULL, &kind, NULL,
NULL, NULL, NULL,
NULL, NULL, NULL,
@@ -3323,8 +3326,8 @@
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
- db, abspath,
- pool, pool);
+ wc_ctx->db, abspath,
+ scratch_pool, scratch_pool);
if (err)
{
if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
@@ -3334,8 +3337,8 @@
return walk_callbacks->handle_error(
path, svn_error_createf(SVN_ERR_UNVERSIONED_RESOURCE, NULL,
_("'%s' is not under version control"),
- svn_dirent_local_style(path, pool)),
- walk_baton, pool);
+ svn_dirent_local_style(path,
scratch_pool)),
+ walk_baton, result_pool);
}
if (kind == svn_wc__db_kind_file || depth == svn_depth_exclude)
@@ -3349,7 +3352,7 @@
### gave us. let it deal with the problem before returning.
*/
/* This entry should be present. */
- SVN_ERR(svn_wc_entry(&entry, path, adm_access, TRUE, pool));
+ SVN_ERR(svn_wc_entry(&entry, path, adm_access, TRUE,
scratch_pool));
SVN_ERR_ASSERT(entry != NULL);
SVN_ERR(svn_wc__entry_is_hidden(&hidden, entry));
if (!show_hidden && hidden)
@@ -3364,13 +3367,14 @@
return walk_callbacks->handle_error(
path, svn_error_createf(SVN_ERR_UNVERSIONED_RESOURCE, NULL,
_("'%s' is not under version
control"),
- svn_dirent_local_style(path,
pool)),
- walk_baton, pool);
+ svn_dirent_local_style(path,
scratch_pool)),
+ walk_baton, result_pool);
}
- err = walk_callbacks->found_entry(path, entry, walk_baton, pool);
+ err = walk_callbacks->found_entry(path, entry, walk_baton,
result_pool);
if (err)
- return walk_callbacks->handle_error(path, err, walk_baton,
pool);
+ return walk_callbacks->handle_error(path, err, walk_baton,
+ result_pool);
return SVN_NO_ERROR;
}
@@ -3378,13 +3382,13 @@
if (kind == svn_wc__db_kind_dir)
return walker_helper(path, adm_access, walk_callbacks, walk_baton,
walk_depth, show_hidden, cancel_func,
cancel_baton,
- pool);
+ result_pool);
return walk_callbacks->handle_error(
path, svn_error_createf(SVN_ERR_NODE_UNKNOWN_KIND, NULL,
_("'%s' has an unrecognized node kind"),
- svn_dirent_local_style(path, pool)),
- walk_baton, pool);
+ svn_dirent_local_style(path,
scratch_pool)),
+ walk_baton, result_pool);
}
Best~
Huihuang
__________________________________________________
�Ͽ�ע���Ż��������������?
http://cn.mail.yahoo.com
------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=2386033
Received on 2009-08-21 17:01:16 CEST