Index: subversion/libsvn_wc/revision_status.c =================================================================== --- subversion/libsvn_wc/revision_status.c (revision 922398) +++ subversion/libsvn_wc/revision_status.c (arbetskopia) @@ -41,7 +41,8 @@ }; /* An svn_wc__node_found_func_t callback function for analyzing the status - * of nodes */ + * of nodes. Optimized to avoid text compares and unneccessary checks of + * already set values. */ static svn_error_t * analyze_status(const char *local_abspath, void *baton, @@ -50,10 +51,9 @@ struct walk_baton *wb = baton; svn_revnum_t changed_rev; svn_revnum_t revision; + svn_revnum_t item_rev; svn_depth_t depth; svn_wc__db_status_t status; - svn_boolean_t wc_root; - svn_boolean_t switched; SVN_ERR(svn_wc__db_read_info(&status, NULL, &revision, NULL, NULL, NULL, &changed_rev, @@ -71,24 +71,36 @@ wb->result->sparse_checkout = TRUE; return SVN_NO_ERROR; } + else if (status == svn_wc__db_status_not_present) + { + return SVN_NO_ERROR; + } + else if (status == svn_wc__db_status_added + || status == svn_wc__db_status_obstructed_add + || status == svn_wc__db_status_deleted + || status == svn_wc__db_status_obstructed_delete) + { + wb->result->modified = TRUE; + } - if (status == svn_wc__db_status_not_present) - return SVN_NO_ERROR; - if (! wb->result->switched) { + svn_boolean_t wc_root; + svn_boolean_t switched; + SVN_ERR(svn_wc__check_wc_root(&wc_root, NULL, &switched, wb->db, local_abspath, scratch_pool)); wb->result->switched |= switched; } + item_rev = (wb->committed + ? changed_rev + : revision); + /* Added files have a revision of no interest */ - if (revision != SVN_INVALID_REVNUM) + if (item_rev != SVN_INVALID_REVNUM) { - svn_revnum_t item_rev = (wb->committed - ? changed_rev - : revision); if (wb->result->min_rev == SVN_INVALID_REVNUM || item_rev < wb->result->min_rev) @@ -101,22 +113,27 @@ if (! wb->result->modified) { - svn_boolean_t text_mod; svn_boolean_t props_mod; SVN_ERR(svn_wc__props_modified(&props_mod, wb->db, local_abspath, scratch_pool)); + wb->result->modified |= props_mod; + } + if (! wb->result->modified) + { + svn_boolean_t text_mod; + SVN_ERR(svn_wc__internal_text_modified_p(&text_mod, wb->db, local_abspath, FALSE, TRUE, scratch_pool)); - wb->result->modified |= (text_mod || props_mod); + wb->result->modified |= text_mod; } - wb->result->sparse_checkout |= ((depth != svn_depth_infinity - && depth != svn_depth_unknown)); + wb->result->sparse_checkout |= (depth != svn_depth_infinity + && depth != svn_depth_unknown); return SVN_NO_ERROR; }