Author: rhuijben
Date: Mon Feb 23 14:35:18 2015
New Revision: 1661682
URL: http://svn.apache.org/r1661682
Log:
Consolidate all places in libsvn_wc where we 'determine if a tree has
modifications', because all of them had similar shortcomings where
they missed certain kinds of changes.
This consolidates the svnversion, crop and update checks for
modifications to a single function that handles all cases.
* subversion/include/private/svn_wc_private.h
(svn_wc__has_local_mods): Add ignore_unversioned argument.
* subversion/libsvn_client/copy.c
(pin_externals_prop): Update caller.
* subversion/libsvn_client/merge.c
(ensure_wc_is_suitable_merge_target): Update caller.
* subversion/libsvn_wc/crop.c
(modcheck_baton_t): Remove struct.
(modcheck_callback,
allow_crop): Remove function.
* subversion/libsvn_wc/questions.c
(modcheck_baton_t,
modcheck_callback): Move here from update_editor.c.
Support ignore_unversioned.
(svn_wc__node_has_local_mods): Move here. Perform db changes check first.
(svn_wc__has_local_mods): Use svn_wc__node_has_local_mods.
* subversion/libsvn_wc/revision_status.c
(svn_wc_revision_status2): Update caller.
* subversion/libsvn_wc/update_editor.c
(modcheck_baton_t,
modcheck_callback,
svn_wc__node_has_local_mods): Move to questions.c.
(check_tree_conflict): Update caller.
* subversion/libsvn_wc/wc-queries.sql
(STMT_SELECT_BASE_FILES_RECURSIVE): Remove statement.
* subversion/libsvn_wc/wc.h
(svn_wc__node_has_local_mods): Add argument.
* subversion/libsvn_wc/wc_db.c
(has_local_mods): Rename to...
(has_db_mods): ... and leave walking the working copy to the status walker.
(svn_wc__db_has_local_mods): Rename to...
(svn_wc__db_has_db_mods): ... this.
* subversion/libsvn_wc/wc_db.h
(svn_wc__db_revision_status): Remove cancel callbacks. Update documentation.
* subversion/libsvn_wc/wc_db_update_move.c
(tc_editor_delete): Update caller.
Modified:
subversion/trunk/subversion/include/private/svn_wc_private.h
subversion/trunk/subversion/libsvn_client/copy.c
subversion/trunk/subversion/libsvn_client/merge.c
subversion/trunk/subversion/libsvn_wc/crop.c
subversion/trunk/subversion/libsvn_wc/questions.c
subversion/trunk/subversion/libsvn_wc/revision_status.c
subversion/trunk/subversion/libsvn_wc/update_editor.c
subversion/trunk/subversion/libsvn_wc/wc-queries.sql
subversion/trunk/subversion/libsvn_wc/wc.h
subversion/trunk/subversion/libsvn_wc/wc_db.c
subversion/trunk/subversion/libsvn_wc/wc_db.h
subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c
Modified: subversion/trunk/subversion/include/private/svn_wc_private.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_wc_private.h?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_wc_private.h (original)
+++ subversion/trunk/subversion/include/private/svn_wc_private.h Mon Feb 23
14:35:18 2015
@@ -917,15 +917,17 @@ svn_wc__get_excluded_subtrees(apr_hash_t
/* Indicate in @a *is_modified whether the working copy has local
* modifications, using context @a wc_ctx.
- * Use @a scratch_pool for temporary allocations.
*
- * This function provides a subset of the functionality of
- * svn_wc_revision_status2() and is more efficient if the caller
- * doesn't need all information returned by svn_wc_revision_status2(). */
+ * If IGNORE_UNVERSIONED, unversioned paths inside the tree rooted by
+ * LOCAL_ABSPATH are not seen as a change, otherwise they are.
+ * (svn:ignored paths are always ignored)
+ *
+ * Use @a scratch_pool for temporary allocations. */
svn_error_t *
svn_wc__has_local_mods(svn_boolean_t *is_modified,
svn_wc_context_t *wc_ctx,
const char *local_abspath,
+ svn_boolean_t ignore_unversioned,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool);
Modified: subversion/trunk/subversion/libsvn_client/copy.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/copy.c?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/copy.c (original)
+++ subversion/trunk/subversion/libsvn_client/copy.c Mon Feb 23 14:35:18 2015
@@ -477,7 +477,7 @@ pin_externals_prop(svn_string_t **pinned
SVN_PROP_EXTERNALS);
SVN_ERR(svn_wc__has_local_mods(&is_modified, ctx->wc_ctx,
- external_abspath,
+ external_abspath, TRUE,
ctx->cancel_func,
ctx->cancel_baton,
iterpool));
Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Mon Feb 23 14:35:18 2015
@@ -10271,7 +10271,7 @@ ensure_wc_is_suitable_merge_target(const
svn_boolean_t is_modified;
SVN_ERR(svn_wc__has_local_mods(&is_modified, ctx->wc_ctx,
- target_abspath,
+ target_abspath, TRUE,
ctx->cancel_func,
ctx->cancel_baton,
scratch_pool));
Modified: subversion/trunk/subversion/libsvn_wc/crop.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/crop.c?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/crop.c (original)
+++ subversion/trunk/subversion/libsvn_wc/crop.c Mon Feb 23 14:35:18 2015
@@ -35,97 +35,6 @@
#include "svn_private_config.h"
-/* A baton for use with modcheck_found_entry(). */
-typedef struct modcheck_baton_t {
- svn_wc__db_t *db; /* wc_db to access nodes */
- svn_boolean_t found_mod; /* whether a modification has been found */
- svn_boolean_t found_not_delete; /* Found a not-delete modification */
-} modcheck_baton_t;
-
-/* An implementation of svn_wc_status_func4_t, similar to a function
- with the same name in update_editor.c, but with slightly different
- behavior around unversioned items */
-static svn_error_t *
-modcheck_callback(void *baton,
- const char *local_abspath,
- const svn_wc_status3_t *status,
- apr_pool_t *scratch_pool)
-{
- modcheck_baton_t *mb = baton;
-
- switch (status->node_status)
- {
- case svn_wc_status_normal:
- case svn_wc_status_incomplete:
- case svn_wc_status_ignored:
- case svn_wc_status_none:
- case svn_wc_status_external:
- break;
-
- case svn_wc_status_deleted:
- mb->found_mod = TRUE;
- break;
-
- case svn_wc_status_missing:
- case svn_wc_status_obstructed:
- mb->found_mod = TRUE;
- mb->found_not_delete = TRUE;
- /* Exit from the status walker: We know what we want to know */
- return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
-
- default:
- case svn_wc_status_added:
- case svn_wc_status_replaced:
- case svn_wc_status_modified:
- case svn_wc_status_unversioned:
- mb->found_mod = TRUE;
- mb->found_not_delete = TRUE;
- /* Exit from the status walker: We know what we want to know */
- return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
- }
-
- return SVN_NO_ERROR;
-}
-
-
-/* Set *ALLOW to true if the path can be safely deleted by the crop operation,
- otherwise to false. */
-static svn_error_t *
-allow_crop(svn_boolean_t *allow,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- modcheck_baton_t modcheck_baton = { NULL, FALSE, FALSE };
- svn_error_t *err;
-
- modcheck_baton.db = db;
-
- /* Walk the WC tree for status with depth infinity, looking for any local
- * modifications. If it's a "sparse" directory, that's OK: there can be
- * no local mods in the pieces that aren't present in the WC. */
-
- err = svn_wc__internal_walk_status(db, local_abspath,
- svn_depth_infinity,
- FALSE, FALSE, FALSE, NULL,
- modcheck_callback, &modcheck_baton,
- cancel_func, cancel_baton,
- scratch_pool);
-
- if (err && err->apr_err == SVN_ERR_CEASE_INVOCATION)
- svn_error_clear(err);
- else
- SVN_ERR(err);
-
- *allow = !modcheck_baton.found_mod || (modcheck_baton.found_mod
- && !modcheck_baton.found_not_delete);
-
- return SVN_NO_ERROR;
-}
-
-
/* Helper function that crops the children of the LOCAL_ABSPATH, under the
* constraint of NEW_DEPTH. The DIR_PATH itself will never be cropped. The
* whole subtree should have been locked.
@@ -194,17 +103,17 @@ crop_children(svn_wc__db_t *db,
if (have_work)
{
- svn_boolean_t allow;
+ svn_boolean_t modified, all_deletes;
if (child_status != svn_wc__db_status_deleted)
continue; /* Leave local additions alone */
- SVN_ERR(allow_crop(&allow,
- db, child_abspath,
- cancel_func, cancel_baton,
- iterpool));
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, &all_deletes,
+ db, child_abspath, FALSE,
+ cancel_func, cancel_baton,
+ iterpool));
- if (!allow)
+ if (modified && !all_deletes)
continue; /* Something interesting is still there */
}
@@ -228,14 +137,14 @@ crop_children(svn_wc__db_t *db,
if (new_depth < remove_below)
{
- svn_boolean_t allow;
+ svn_boolean_t modified, all_deletes;
- SVN_ERR(allow_crop(&allow,
- db, child_abspath,
- cancel_func, cancel_baton,
- iterpool));
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, &all_deletes,
+ db, child_abspath, FALSE,
+ cancel_func, cancel_baton,
+ iterpool));
- if (allow)
+ if (!modified || all_deletes)
{
SVN_ERR(svn_wc__db_base_remove(db, child_abspath,
FALSE, FALSE, FALSE,
@@ -285,7 +194,7 @@ svn_wc_exclude(svn_wc_context_t *wc_ctx,
svn_node_kind_t kind;
svn_revnum_t revision;
svn_depth_t depth;
- svn_boolean_t allow;
+ svn_boolean_t modified, all_deletes;
const char *repos_relpath, *repos_root, *repos_uuid;
SVN_ERR(svn_wc__db_is_switched(&is_root, &is_switched, NULL,
@@ -347,11 +256,12 @@ svn_wc_exclude(svn_wc_context_t *wc_ctx,
break; /* Ok to exclude */
}
- SVN_ERR(allow_crop(&allow, wc_ctx->db, local_abspath,
- cancel_func, cancel_baton,
- scratch_pool));
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, &all_deletes,
+ wc_ctx->db, local_abspath, FALSE,
+ cancel_func, cancel_baton,
+ scratch_pool));
- if (allow)
+ if (!modified || all_deletes)
{
/* Remove all working copy data below local_abspath */
SVN_ERR(svn_wc__db_base_remove(wc_ctx->db, local_abspath,
Modified: subversion/trunk/subversion/libsvn_wc/questions.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/questions.c?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/questions.c (original)
+++ subversion/trunk/subversion/libsvn_wc/questions.c Mon Feb 23 14:35:18 2015
@@ -596,18 +596,138 @@ svn_wc__has_switched_subtrees(svn_boolea
}
+/* A baton for use with modcheck_found_entry(). */
+typedef struct modcheck_baton_t {
+ svn_boolean_t ignore_unversioned;
+ svn_boolean_t found_mod; /* whether a modification has been found */
+ svn_boolean_t found_not_delete; /* Found a not-delete modification */
+} modcheck_baton_t;
+
+/* An implementation of svn_wc_status_func4_t. */
+static svn_error_t *
+modcheck_callback(void *baton,
+ const char *local_abspath,
+ const svn_wc_status3_t *status,
+ apr_pool_t *scratch_pool)
+{
+ modcheck_baton_t *mb = baton;
+
+ switch (status->node_status)
+ {
+ case svn_wc_status_normal:
+ case svn_wc_status_incomplete:
+ case svn_wc_status_ignored:
+ case svn_wc_status_none:
+ case svn_wc_status_external:
+ break;
+
+ case svn_wc_status_deleted:
+ mb->found_mod = TRUE;
+ if (!mb->ignore_unversioned
+ && status->actual_kind != svn_node_none
+ && status->actual_kind != svn_node_unknown)
+ {
+ /* The delete is obstructed by something unversioned */
+ mb->found_not_delete = TRUE;
+ return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
+ }
+ break;
+
+ case svn_wc_status_unversioned:
+ if (mb->ignore_unversioned)
+ break;
+ /* else fall through */
+ case svn_wc_status_missing:
+ case svn_wc_status_obstructed:
+ mb->found_mod = TRUE;
+ mb->found_not_delete = TRUE;
+ /* Exit from the status walker: We know what we want to know */
+ return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
+
+ default:
+ case svn_wc_status_added:
+ case svn_wc_status_replaced:
+ case svn_wc_status_modified:
+ mb->found_mod = TRUE;
+ mb->found_not_delete = TRUE;
+ /* Exit from the status walker: We know what we want to know */
+ return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
+/* Set *MODIFIED to true iff there are any local modifications within the
+ * tree rooted at LOCAL_ABSPATH, using DB. If *MODIFIED
+ * is set to true and all the local modifications were deletes then set
+ * *ALL_EDITS_ARE_DELETES to true, set it to false otherwise. LOCAL_ABSPATH
+ * may be a file or a directory. */
+svn_error_t *
+svn_wc__node_has_local_mods(svn_boolean_t *modified,
+ svn_boolean_t *all_edits_are_deletes,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ svn_boolean_t ignore_unversioned,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool)
+{
+ modcheck_baton_t modcheck_baton = { FALSE, FALSE, FALSE };
+ svn_error_t *err;
+
+ if (!all_edits_are_deletes)
+ {
+ SVN_ERR(svn_wc__db_has_db_mods(modified, db, local_abspath,
+ scratch_pool));
+
+ if (*modified)
+ return SVN_NO_ERROR;
+ }
+
+ modcheck_baton.ignore_unversioned = ignore_unversioned;
+
+ /* Walk the WC tree for status with depth infinity, looking for any local
+ * modifications. If it's a "sparse" directory, that's OK: there can be
+ * no local mods in the pieces that aren't present in the WC. */
+
+ err = svn_wc__internal_walk_status(db, local_abspath,
+ svn_depth_infinity,
+ FALSE, FALSE, FALSE, NULL,
+ modcheck_callback, &modcheck_baton,
+ cancel_func, cancel_baton,
+ scratch_pool);
+
+ if (err && err->apr_err == SVN_ERR_CEASE_INVOCATION)
+ svn_error_clear(err);
+ else
+ SVN_ERR(err);
+
+ *modified = modcheck_baton.found_mod;
+ if (all_edits_are_deletes)
+ *all_edits_are_deletes = (modcheck_baton.found_mod
+ && !modcheck_baton.found_not_delete);
+
+ return SVN_NO_ERROR;
+}
+
svn_error_t *
svn_wc__has_local_mods(svn_boolean_t *is_modified,
svn_wc_context_t *wc_ctx,
const char *local_abspath,
+ svn_boolean_t ignore_unversioned,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool)
{
- return svn_error_trace(svn_wc__db_has_local_mods(is_modified,
- wc_ctx->db,
- local_abspath,
- cancel_func,
- cancel_baton,
- scratch_pool));
+ svn_boolean_t modified;
+
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, NULL,
+ wc_ctx->db, local_abspath,
+ ignore_unversioned,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
+ *is_modified = modified;
+ return SVN_NO_ERROR;
}
Modified: subversion/trunk/subversion/libsvn_wc/revision_status.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/revision_status.c?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/revision_status.c (original)
+++ subversion/trunk/subversion/libsvn_wc/revision_status.c Mon Feb 23 14:35:18
2015
@@ -60,8 +60,14 @@ svn_wc_revision_status2(svn_wc_revision_
&result->modified,
&result->switched,
wc_ctx->db, local_abspath, trail_url,
- committed, cancel_func, cancel_baton,
+ committed,
scratch_pool));
+ if (!result->modified)
+ SVN_ERR(svn_wc__node_has_local_mods(&result->modified, NULL,
+ wc_ctx->db, local_abspath, TRUE,
+ cancel_func, cancel_baton,
+ scratch_pool));
+
return SVN_NO_ERROR;
}
Modified: subversion/trunk/subversion/libsvn_wc/update_editor.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/update_editor.c?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/trunk/subversion/libsvn_wc/update_editor.c Mon Feb 23 14:35:18
2015
@@ -1310,106 +1310,6 @@ open_root(void *edit_baton,
/* ===================================================================== */
/* Checking for local modifications. */
-/* A baton for use with modcheck_found_entry(). */
-typedef struct modcheck_baton_t {
- svn_wc__db_t *db; /* wc_db to access nodes */
- svn_boolean_t found_mod; /* whether a modification has been found */
- svn_boolean_t found_not_delete; /* Found a not-delete modification */
-} modcheck_baton_t;
-
-/* An implementation of svn_wc_status_func4_t. */
-static svn_error_t *
-modcheck_callback(void *baton,
- const char *local_abspath,
- const svn_wc_status3_t *status,
- apr_pool_t *scratch_pool)
-{
- modcheck_baton_t *mb = baton;
-
- switch (status->node_status)
- {
- case svn_wc_status_normal:
- case svn_wc_status_incomplete:
- case svn_wc_status_ignored:
- case svn_wc_status_none:
- case svn_wc_status_external:
- break;
-
- case svn_wc_status_deleted:
- mb->found_mod = TRUE;
- if (status->actual_kind != svn_node_none
- && status->actual_kind != svn_node_unknown)
- {
- /* The delete is obstructed by something unversioned */
- mb->found_not_delete = TRUE;
- return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
- }
- break;
-
- case svn_wc_status_unversioned:
- case svn_wc_status_missing:
- case svn_wc_status_obstructed:
- mb->found_mod = TRUE;
- mb->found_not_delete = TRUE;
- /* Exit from the status walker: We know what we want to know */
- return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
-
- default:
- case svn_wc_status_added:
- case svn_wc_status_replaced:
- case svn_wc_status_modified:
- mb->found_mod = TRUE;
- mb->found_not_delete = TRUE;
- /* Exit from the status walker: We know what we want to know */
- return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
- }
-
- return SVN_NO_ERROR;
-}
-
-
-/* Set *MODIFIED to true iff there are any local modifications within the
- * tree rooted at LOCAL_ABSPATH, using DB. If *MODIFIED
- * is set to true and all the local modifications were deletes then set
- * *ALL_EDITS_ARE_DELETES to true, set it to false otherwise. LOCAL_ABSPATH
- * may be a file or a directory. */
-svn_error_t *
-svn_wc__node_has_local_mods(svn_boolean_t *modified,
- svn_boolean_t *all_edits_are_deletes,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- modcheck_baton_t modcheck_baton = { NULL, FALSE, FALSE };
- svn_error_t *err;
-
- modcheck_baton.db = db;
-
- /* Walk the WC tree for status with depth infinity, looking for any local
- * modifications. If it's a "sparse" directory, that's OK: there can be
- * no local mods in the pieces that aren't present in the WC. */
-
- err = svn_wc__internal_walk_status(db, local_abspath,
- svn_depth_infinity,
- FALSE, FALSE, FALSE, NULL,
- modcheck_callback, &modcheck_baton,
- cancel_func, cancel_baton,
- scratch_pool);
-
- if (err && err->apr_err == SVN_ERR_CEASE_INVOCATION)
- svn_error_clear(err);
- else
- SVN_ERR(err);
-
- *modified = modcheck_baton.found_mod;
- *all_edits_are_deletes = (modcheck_baton.found_mod
- && !modcheck_baton.found_not_delete);
-
- return SVN_NO_ERROR;
-}
-
/* Indicates an unset svn_wc_conflict_reason_t. */
#define SVN_WC_CONFLICT_REASON_NONE (svn_wc_conflict_reason_t)(-1)
@@ -1444,7 +1344,6 @@ check_tree_conflict(svn_skel_t **pconfli
{
svn_wc_conflict_reason_t reason = SVN_WC_CONFLICT_REASON_NONE;
svn_boolean_t modified = FALSE;
- svn_boolean_t all_mods_are_deletes = FALSE;
const char *move_src_op_root_abspath = NULL;
*pconflict = NULL;
@@ -1554,8 +1453,8 @@ check_tree_conflict(svn_skel_t **pconfli
* not visit the subdirectories of a directory that it wants to delete.
* Therefore, we need to start a separate crawl here. */
- SVN_ERR(svn_wc__node_has_local_mods(&modified, &all_mods_are_deletes,
- eb->db, local_abspath,
+ SVN_ERR(svn_wc__node_has_local_mods(&modified, NULL,
+ eb->db, local_abspath, FALSE,
eb->cancel_func, eb->cancel_baton,
scratch_pool));
Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Mon Feb 23 14:35:18
2015
@@ -1580,16 +1580,6 @@ WHERE wc_id = ?1
AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath)
LIMIT 1
--- STMT_SELECT_BASE_FILES_RECURSIVE
-SELECT local_relpath, translated_size, last_mod_time FROM nodes AS n
-WHERE wc_id = ?1
- AND (local_relpath = ?2
- OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
- AND op_depth = 0
- AND kind=MAP_FILE
- AND presence=MAP_NORMAL
- AND file_external IS NULL
-
-- STMT_SELECT_MOVED_FROM_RELPATH
SELECT local_relpath, op_depth FROM nodes
WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
Modified: subversion/trunk/subversion/libsvn_wc/wc.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc.h?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc.h Mon Feb 23 14:35:18 2015
@@ -722,6 +722,7 @@ svn_wc__node_has_local_mods(svn_boolean_
svn_boolean_t *all_edits_are_deletes,
svn_wc__db_t *db,
const char *local_abspath,
+ svn_boolean_t ignore_unversioned,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool);
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Mon Feb 23 14:35:18 2015
@@ -15419,17 +15419,14 @@ svn_wc__db_get_excluded_subtrees(apr_has
return SVN_NO_ERROR;
}
-/* Like svn_wc__db_has_local_mods(),
+/* Like svn_wc__db_has_db_mods(),
* but accepts a WCROOT/LOCAL_RELPATH pair.
* ### This needs a DB as well as a WCROOT/RELPATH pair... */
static svn_error_t *
-has_local_mods(svn_boolean_t *is_modified,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- svn_wc__db_t *db,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
+has_db_mods(svn_boolean_t *is_modified,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
@@ -15441,9 +15438,6 @@ has_local_mods(svn_boolean_t *is_modifie
SVN_ERR(svn_sqlite__step(is_modified, stmt));
SVN_ERR(svn_sqlite__reset(stmt));
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
if (! *is_modified)
{
/* Check for property modifications. */
@@ -15453,96 +15447,6 @@ has_local_mods(svn_boolean_t *is_modifie
/* If this query returns a row, the working copy is modified. */
SVN_ERR(svn_sqlite__step(is_modified, stmt));
SVN_ERR(svn_sqlite__reset(stmt));
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
- }
-
- if (! *is_modified)
- {
- apr_pool_t *iterpool = NULL;
- svn_boolean_t have_row;
-
- /* Check for text modifications. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_BASE_FILES_RECURSIVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (have_row)
- iterpool = svn_pool_create(scratch_pool);
- while (have_row)
- {
- const char *node_abspath;
- svn_filesize_t recorded_size;
- apr_time_t recorded_time;
- svn_boolean_t skip_check = FALSE;
- svn_error_t *err;
-
- if (cancel_func)
- {
- err = cancel_func(cancel_baton);
- if (err)
- return svn_error_trace(svn_error_compose_create(
- err,
- svn_sqlite__reset(stmt)));
- }
-
- svn_pool_clear(iterpool);
-
- node_abspath = svn_dirent_join(wcroot->abspath,
- svn_sqlite__column_text(stmt, 0,
- iterpool),
- iterpool);
-
- recorded_size = get_recorded_size(stmt, 1);
- recorded_time = svn_sqlite__column_int64(stmt, 2);
-
- if (recorded_size != SVN_INVALID_FILESIZE
- && recorded_time != 0)
- {
- const svn_io_dirent2_t *dirent;
-
- err = svn_io_stat_dirent2(&dirent, node_abspath, FALSE, TRUE,
- iterpool, iterpool);
- if (err)
- return svn_error_trace(svn_error_compose_create(
- err,
- svn_sqlite__reset(stmt)));
-
- if (dirent->kind != svn_node_file)
- {
- *is_modified = TRUE; /* Missing or obstruction */
- break;
- }
- else if (dirent->filesize == recorded_size
- && dirent->mtime == recorded_time)
- {
- /* The file is not modified */
- skip_check = TRUE;
- }
- }
-
- if (! skip_check)
- {
- err = svn_wc__internal_file_modified_p(is_modified,
- db, node_abspath,
- FALSE, iterpool);
-
- if (err)
- return svn_error_trace(svn_error_compose_create(
- err,
- svn_sqlite__reset(stmt)));
-
- if (*is_modified)
- break;
- }
-
- SVN_ERR(svn_sqlite__step(&have_row, stmt));
- }
- if (iterpool)
- svn_pool_destroy(iterpool);
-
- SVN_ERR(svn_sqlite__reset(stmt));
}
return SVN_NO_ERROR;
@@ -15550,12 +15454,10 @@ has_local_mods(svn_boolean_t *is_modifie
svn_error_t *
-svn_wc__db_has_local_mods(svn_boolean_t *is_modified,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
+svn_wc__db_has_db_mods(svn_boolean_t *is_modified,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
@@ -15567,9 +15469,8 @@ svn_wc__db_has_local_mods(svn_boolean_t
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- return svn_error_trace(has_local_mods(is_modified, wcroot, local_relpath,
- db, cancel_func, cancel_baton,
- scratch_pool));
+ return svn_error_trace(has_db_mods(is_modified, wcroot, local_relpath,
+ scratch_pool));
}
@@ -15586,8 +15487,6 @@ revision_status_txn(svn_revnum_t *min_re
svn_wc__db_t *db,
const char *trail_url,
svn_boolean_t committed,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_error_t *err;
@@ -15607,16 +15506,10 @@ revision_status_txn(svn_revnum_t *min_re
SVN_ERR(get_min_max_revisions(min_revision, max_revision, wcroot,
local_relpath, committed, scratch_pool));
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
/* Determine sparseness. */
SVN_ERR(is_sparse_checkout_internal(is_sparse_checkout, wcroot,
local_relpath, scratch_pool));
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
/* Check for switched nodes. */
{
err = has_switched_subtrees(is_switched, wcroot, local_relpath,
@@ -15632,12 +15525,8 @@ revision_status_txn(svn_revnum_t *min_re
}
}
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /* Check for local mods. */
- SVN_ERR(has_local_mods(is_modified, wcroot, local_relpath, db,
- cancel_func, cancel_baton, scratch_pool));
+ /* Check for db mods. */
+ SVN_ERR(has_db_mods(is_modified, wcroot, local_relpath, scratch_pool));
return SVN_NO_ERROR;
}
@@ -15653,8 +15542,6 @@ svn_wc__db_revision_status(svn_revnum_t
const char *local_abspath,
const char *trail_url,
svn_boolean_t committed,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
@@ -15671,7 +15558,7 @@ svn_wc__db_revision_status(svn_revnum_t
revision_status_txn(min_revision, max_revision,
is_sparse_checkout, is_modified, is_switched,
wcroot, local_relpath, db,
- trail_url, committed, cancel_func, cancel_baton,
+ trail_url, committed,
scratch_pool),
wcroot);
return SVN_NO_ERROR;
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.h?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.h Mon Feb 23 14:35:18 2015
@@ -3270,7 +3270,8 @@ svn_wc__db_get_not_present_descendants(c
*
* Indicate in *IS_SPARSE_CHECKOUT whether any of the nodes within
* LOCAL_ABSPATH is sparse.
- * Indicate in *IS_MODIFIED whether the working copy has local modifications.
+ * Indicate in *IS_MODIFIED whether the working copy has local modifications
+ * recorded for it in DB.
*
* Indicate in *IS_SWITCHED whether any node beneath LOCAL_ABSPATH
* is switched. If TRAIL_URL is non-NULL, use it to determine if LOCAL_ABSPATH
@@ -3291,8 +3292,6 @@ svn_wc__db_revision_status(svn_revnum_t
const char *local_abspath,
const char *trail_url,
svn_boolean_t committed,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
apr_pool_t *scratch_pool);
/* Set *MIN_REVISION and *MAX_REVISION to the lowest and highest revision
@@ -3353,16 +3352,13 @@ svn_wc__db_get_excluded_subtrees(apr_has
/* Indicate in *IS_MODIFIED whether the working copy has local modifications,
* using DB. Use SCRATCH_POOL for temporary allocations.
*
- * This function provides a subset of the functionality of
- * svn_wc__db_revision_status() and is more efficient if the caller
- * doesn't need all information returned by svn_wc__db_revision_status(). */
+ * This function does not check the working copy state, but is a lot more
+ * efficient than a full status walk. */
svn_error_t *
-svn_wc__db_has_local_mods(svn_boolean_t *is_modified,
- svn_wc__db_t *db,
- const char *local_abspath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool);
+svn_wc__db_has_db_mods(svn_boolean_t *is_modified,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool);
/* Verify the consistency of metadata concerning the WC that contains
Modified: subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c?rev=1661682&r1=1661681&r2=1661682&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c Mon Feb 23
14:35:18 2015
@@ -1228,7 +1228,7 @@ tc_editor_delete(node_move_baton_t *nmb,
local_abspath = svn_dirent_join(b->wcroot->abspath, relpath, scratch_pool);
SVN_ERR(svn_wc__node_has_local_mods(&is_modified, &is_all_deletes,
- nmb->umb->db, local_abspath,
+ nmb->umb->db, local_abspath, FALSE,
NULL, NULL, scratch_pool));
if (is_modified)
{