Index: subversion/libsvn_wc/revision_status.c =================================================================== --- subversion/libsvn_wc/revision_status.c (revision 920439) +++ subversion/libsvn_wc/revision_status.c (arbetskopia) @@ -23,64 +23,89 @@ #include "svn_wc.h" #include "svn_dirent_uri.h" +#include "wc_db.h" +#include "wc.h" +#include "props.h" #include "private/svn_wc_private.h" #include "svn_private_config.h" /* A baton for analyze_status(). */ -struct status_baton +struct walk_baton { svn_wc_revision_status_t *result; /* where to put the result */ svn_boolean_t committed; /* examine last committed revisions */ const char *local_abspath; /* path whose URL we're looking for */ const char *wc_url; /* URL for the path whose URL we're looking for */ + svn_wc_context_t *wc_ctx; apr_pool_t *pool; /* pool in which to store alloc-needy things */ }; -/* An svn_wc_status_func4_t callback function for analyzing status - structures. */ +/* An svn_wc__node_found_funct_t callback function for analyzing the status + * of nodes */ static svn_error_t * -analyze_status(void *baton, - const char *local_abspath, - const svn_wc_status2_t *status, - apr_pool_t *pool) +analyze_status(const char *local_abspath, + void *baton, + apr_pool_t *scratch_pool) { - struct status_baton *sb = baton; + struct walk_baton *wb = baton; + svn_revnum_t changed_rev; + svn_revnum_t revision; + svn_depth_t depth; + svn_wc__db_status_t status; + const char *repos_root; + const char *repos_relpath; + svn_boolean_t text_mod; + svn_boolean_t props_mod; + svn_boolean_t switched; + svn_boolean_t wc_root; - if (! status->entry) - return SVN_NO_ERROR; + SVN_ERR(svn_wc__db_read_info(&status, NULL, &revision, &repos_relpath, + &repos_root, NULL, &changed_rev, + NULL, NULL, NULL, &depth, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, wb->wc_ctx->db, + local_abspath, scratch_pool, scratch_pool)); + SVN_ERR(svn_wc__check_wc_root(&wc_root, NULL, &switched, wb->wc_ctx->db, + local_abspath, scratch_pool)); + + SVN_ERR(svn_wc__props_modified(&props_mod, wb->wc_ctx->db, local_abspath, + scratch_pool)); + + SVN_ERR(svn_wc_text_modified_p2(&text_mod, wb->wc_ctx, local_abspath, + FALSE, /* force_comparison */ + scratch_pool)); + /* Added files have a revision of no interest */ - if (status->text_status != svn_wc_status_added) + if (status != svn_wc__db_status_added) { - svn_revnum_t item_rev = (sb->committed - ? status->entry->cmt_rev - : status->entry->revision); + svn_revnum_t item_rev = (wb->committed + ? changed_rev + : revision); - if (sb->result->min_rev == SVN_INVALID_REVNUM - || item_rev < sb->result->min_rev) - sb->result->min_rev = item_rev; + if (wb->result->min_rev == SVN_INVALID_REVNUM + || item_rev < wb->result->min_rev) + wb->result->min_rev = item_rev; - if (sb->result->max_rev == SVN_INVALID_REVNUM - || item_rev > sb->result->max_rev) - sb->result->max_rev = item_rev; + if (wb->result->max_rev == SVN_INVALID_REVNUM + || item_rev > wb->result->max_rev) + wb->result->max_rev = item_rev; } - if (status->entry->depth != svn_depth_exclude) + if (status != svn_wc__db_status_excluded) { - sb->result->switched |= status->switched; - sb->result->modified |= (status->text_status != svn_wc_status_normal); - sb->result->modified |= (status->prop_status != svn_wc_status_normal - && status->prop_status != svn_wc_status_none); + wb->result->switched |= switched; + wb->result->modified |= (text_mod || props_mod); } - sb->result->sparse_checkout |= (status->entry->depth != svn_depth_infinity); + wb->result->sparse_checkout |= (depth != svn_depth_infinity + && depth != svn_depth_unknown); - if (sb->local_abspath - && (! sb->wc_url) - && (strcmp(local_abspath, sb->local_abspath) == 0) - && (status->entry)) - sb->wc_url = apr_pstrdup(sb->pool, status->entry->url); + if (wb->local_abspath + && (! wb->wc_url) + && (strcmp(local_abspath, wb->local_abspath) == 0)) + wb->wc_url = svn_uri_join(repos_root, repos_relpath, wb->pool); return SVN_NO_ERROR; } @@ -96,7 +121,7 @@ apr_pool_t *result_pool, apr_pool_t *scratch_pool) { - struct status_baton sb; + struct walk_baton wb; svn_wc_revision_status_t *result = apr_palloc(result_pool, sizeof(*result)); *result_p = result; @@ -110,23 +135,19 @@ result->sparse_checkout = FALSE; /* initialize walking baton */ - sb.result = result; - sb.committed = committed; - sb.local_abspath = local_abspath; - sb.wc_url = NULL; - sb.pool = scratch_pool; + wb.result = result; + wb.committed = committed; + wb.local_abspath = local_abspath; + wb.wc_url = NULL; + wb.pool = scratch_pool; - SVN_ERR(svn_wc_walk_status(wc_ctx, - local_abspath, - svn_depth_infinity, - TRUE /* get_all */, - FALSE /* no_ignore */, - TRUE, /* get_excluded */ - NULL /* ignore_patterns */, - analyze_status, &sb, - NULL, NULL, - cancel_func, cancel_baton, - scratch_pool)); + SVN_ERR(svn_wc__node_walk_children(wc_ctx, + local_abspath, + FALSE /* show_hidden */, + analyze_status, &wb, + svn_depth_infinity, + cancel_func, cancel_baton, + scratch_pool)); if ((! result->switched) && (trail_url != NULL)) @@ -134,15 +155,15 @@ /* If the trailing part of the URL of the working copy directory does not match the given trailing URL then the whole working copy is switched. */ - if (! sb.wc_url) + if (! wb.wc_url) { result->switched = TRUE; } else { apr_size_t len1 = strlen(trail_url); - apr_size_t len2 = strlen(sb.wc_url); - if ((len1 > len2) || strcmp(sb.wc_url + len2 - len1, trail_url)) + apr_size_t len2 = strlen(wb.wc_url); + if ((len1 > len2) || strcmp(wb.wc_url + len2 - len1, trail_url)) result->switched = TRUE; } }