Author: julianfoad Date: Tue Oct 11 14:57:57 2011 New Revision: 1181819 URL: http://svn.apache.org/viewvc?rev=1181819&view=rev Log: On the 'tree-read-api' branch: Implement svn_wc_read_base_kind() and svn_wc__base_get_children() functions.
* subversion/include/private/svn_wc_private.h (svn_wc__base_get_children): New function. * subversion/include/svn_wc.h (svn_wc_read_base_kind): New function. * subversion/libsvn_wc/node.c (make_absolute, filter_hidden_base_nodes, svn_wc__node_get_children, convert_db_kind_to_node_kind2): New functions. Modified: subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h subversion/branches/tree-read-api/subversion/include/svn_wc.h subversion/branches/tree-read-api/subversion/libsvn_wc/node.c Modified: subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h?rev=1181819&r1=1181818&r2=1181819&view=diff ============================================================================== --- subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h (original) +++ subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h Tue Oct 11 14:57:57 2011 @@ -352,6 +352,17 @@ svn_wc__node_get_children(const apr_arra apr_pool_t *result_pool, apr_pool_t *scratch_pool); +/** + * Like svn_wc__node_get_children_of_working_node(), except for the base + * rather than the working version. + */ +svn_error_t * +svn_wc__base_get_children(const apr_array_header_t **children, + svn_wc_context_t *wc_ctx, + const char *dir_abspath, + svn_boolean_t show_hidden, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); /** * Fetch the repository root information for a given @a local_abspath into Modified: subversion/branches/tree-read-api/subversion/include/svn_wc.h URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/include/svn_wc.h?rev=1181819&r1=1181818&r2=1181819&view=diff ============================================================================== --- subversion/branches/tree-read-api/subversion/include/svn_wc.h (original) +++ subversion/branches/tree-read-api/subversion/include/svn_wc.h Tue Oct 11 14:57:57 2011 @@ -7856,6 +7856,24 @@ svn_wc_exclude(svn_wc_context_t *wc_ctx, /** @} */ +/** Set @a kind to the node kind of @a abspath. Use @a wc_ctx + * to access the working copy, and @a scratch_pool for all temporary + * allocations. + * + * If @a abspath is not under version control, set @a kind to #svn_node_none. + * + * Like svn_wc_read_kind2() except for the base rather than the working + * version. + * + * @since New in 1.8. + */ +svn_error_t * +svn_wc_read_base_kind(svn_kind_t *kind, + svn_wc_context_t *wc_ctx, + const char *abspath, + svn_boolean_t show_hidden, + apr_pool_t *scratch_pool); + /** * Set @a kind to the node kind of @a abspath. Use @a wc_ctx * to access the working copy, and @a scratch_pool for all temporary @@ -7881,7 +7899,10 @@ svn_wc_read_kind2(svn_kind_t *kind, svn_boolean_t show_hidden, apr_pool_t *scratch_pool); -/* @deprecated +/* Like svn_wc_read_kind2() but using svn_node_kind_t and thus reporting + * symlinks as files. + * + * @deprecated Provided for backward compatibility with the 1.6 API. * @since New in 1.7. */ svn_error_t * Modified: subversion/branches/tree-read-api/subversion/libsvn_wc/node.c URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/libsvn_wc/node.c?rev=1181819&r1=1181818&r2=1181819&view=diff ============================================================================== --- subversion/branches/tree-read-api/subversion/libsvn_wc/node.c (original) +++ subversion/branches/tree-read-api/subversion/libsvn_wc/node.c Tue Oct 11 14:57:57 2011 @@ -54,6 +54,70 @@ /* Set *CHILDREN_ABSPATHS to a new array of the full paths formed by joining + * each name in REL_CHILDREN onto DIR_ABSPATH. + * + * Allocate the output array and its elements in RESULT_POOL. */ +static svn_error_t * +make_absolute(const apr_array_header_t **children_abspaths, + const char *dir_abspath, + const apr_array_header_t *rel_children, + apr_pool_t *result_pool) +{ + apr_array_header_t *children; + int i; + + children = apr_array_make(result_pool, rel_children->nelts, + sizeof (const char *)); + for (i = 0; i < rel_children->nelts; i++) + { + const char *child_abspath + = svn_dirent_join(dir_abspath, + APR_ARRAY_IDX(rel_children, i, const char *), + result_pool); + + APR_ARRAY_PUSH(children, const char *) = child_abspath; + } + + *children_abspaths = children; + return SVN_NO_ERROR; +} + +/* Set *CHILDREN_OUT to a shallow copy of CHILDREN_IN, but omitting any + * paths that are reported as 'hidden' by svn_wc__db_node_hidden(). + * + * Allocate the output array and its elements in RESULT_POOL. */ +static svn_error_t * +filter_hidden_base_nodes(const apr_array_header_t **children_out, + svn_wc_context_t *wc_ctx, + const apr_array_header_t *children_in, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) +{ + apr_array_header_t *children; + int i; + + children = apr_array_make(result_pool, children_in->nelts, + sizeof(const char *)); + for (i = 0; i < children_in->nelts; i++) + { + const char *child_abspath = APR_ARRAY_IDX(children_in, i, const char *); + svn_boolean_t child_is_hidden; + + /* Don't add hidden nodes to *CHILDREN. */ + /* ### What's the correct call here? */ + SVN_ERR(svn_wc__db_node_hidden(&child_is_hidden, wc_ctx->db, + child_abspath, scratch_pool)); + if (child_is_hidden) + continue; + + APR_ARRAY_PUSH(children, const char *) = child_abspath; + } + + *children_out = children; + return SVN_NO_ERROR; +} + +/* Set *CHILDREN_ABSPATHS to a new array of the full paths formed by joining * each name in REL_CHILDREN onto DIR_ABSPATH. If SHOW_HIDDEN is false then * omit any paths that are reported as 'hidden' by svn_wc__db_node_hidden(). * @@ -137,6 +201,22 @@ svn_wc__node_get_children(const apr_arra return SVN_NO_ERROR; } +svn_error_t * +svn_wc__base_get_children(const apr_array_header_t **children, + svn_wc_context_t *wc_ctx, + const char *dir_abspath, + svn_boolean_t show_hidden, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) +{ + SVN_ERR(svn_wc__db_base_get_children(children, wc_ctx->db, dir_abspath, + scratch_pool, scratch_pool)); + SVN_ERR(make_absolute(children, dir_abspath, *children, result_pool)); + if (! show_hidden) + SVN_ERR(filter_hidden_base_nodes(children, wc_ctx, *children, + result_pool, scratch_pool)); + return SVN_NO_ERROR; +} svn_error_t * svn_wc__internal_get_repos_info(const char **repos_root_url, @@ -320,6 +400,37 @@ convert_db_kind_to_node_kind2(svn_kind_t } svn_error_t * +svn_wc_read_base_kind(svn_kind_t *kind, + svn_wc_context_t *wc_ctx, + const char *local_abspath, + svn_boolean_t show_hidden, + apr_pool_t *scratch_pool) +{ + svn_wc__db_status_t db_status; + svn_wc__db_kind_t db_kind; + svn_error_t *err; + + err = svn_wc__db_base_get_info(&db_status, &db_kind, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, + wc_ctx->db, local_abspath, + scratch_pool, scratch_pool); + + if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND) + { + svn_error_clear(err); + *kind = svn_node_none; + return SVN_NO_ERROR; + } + else + SVN_ERR(err); + + SVN_ERR(convert_db_kind_to_node_kind2(kind, db_kind, db_status, show_hidden)); + + return SVN_NO_ERROR; +} + +svn_error_t * svn_wc_read_kind2(svn_kind_t *kind, svn_wc_context_t *wc_ctx, const char *local_abspath,