You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2013/01/25 15:43:49 UTC
svn commit: r1438542 - in /subversion/trunk/subversion/libsvn_wc:
wc-queries.sql wc_db_update_move.c
Author: philip
Date: Fri Jan 25 14:43:49 2013
New Revision: 1438542
URL: http://svn.apache.org/viewvc?rev=1438542&view=rev
Log:
Have move-update create workqueue items to delete working files
and directories.
* subversion/libsvn_wc/wc_db_update_move.c
(tc_editor_delete): Adjust how local modification indicators are used,
create workqueue items.
* subversion/libsvn_wc/wc-queries.sql
(STMT_SELECT_CHILDREN_OP_DEPTH):
Modified:
subversion/trunk/subversion/libsvn_wc/wc-queries.sql
subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c
Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=1438542&r1=1438541&r2=1438542&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Fri Jan 25 14:43:49 2013
@@ -239,6 +239,14 @@ WHERE wc_id = ?1
AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
AND op_depth = ?3
+-- STMT_SELECT_CHILDREN_OP_DEPTH
+SELECT local_relpath, kind
+FROM nodes
+WHERE wc_id = ?1
+ AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
+ AND op_depth = ?3
+ORDER BY local_relpath DESC
+
-- STMT_COPY_NODE_MOVE
INSERT OR REPLACE INTO nodes (
wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
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=1438542&r1=1438541&r2=1438542&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c Fri Jan 25 14:43:49 2013
@@ -837,8 +837,12 @@ tc_editor_delete(void *baton,
svn_sqlite__stmt_t *stmt;
int op_depth = relpath_depth(b->move_root_dst_relpath);
svn_boolean_t is_conflicted;
+ const char *local_abspath = svn_dirent_join(b->wcroot->abspath, relpath,
+ scratch_pool);
- /* Check before retracting delete to catch delete-delete conflicts. */
+ /* Check before retracting delete to catch delete-delete
+ conflicts. This catches conflicts on the node itself; deleted
+ children are caught as local modifications below.*/
SVN_ERR(check_tree_conflict(&is_conflicted, b, relpath, svn_node_unknown,
svn_wc_conflict_action_delete,
scratch_pool));
@@ -848,45 +852,104 @@ tc_editor_delete(void *baton,
svn_boolean_t is_modified, is_all_deletes;
SVN_ERR(svn_wc__node_has_local_mods(&is_modified, &is_all_deletes, b->db,
- svn_dirent_join(b->wcroot->abspath,
- relpath,
- scratch_pool),
+ local_abspath,
NULL, NULL, scratch_pool));
if (is_modified)
{
- /* No conflict means no NODES rows at the relpath op-depth
- so it's easy to convert the modified tree into a copy. */
- SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_UPDATE_OP_DEPTH_RECURSIVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isdd", b->wcroot->wc_id, relpath,
- op_depth, relpath_depth(relpath)));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ svn_wc_conflict_reason_t reason;
+ if (!is_all_deletes)
+ {
+ /* No conflict means no NODES rows at the relpath op-depth
+ so it's easy to convert the modified tree into a copy. */
+ SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
+ STMT_UPDATE_OP_DEPTH_RECURSIVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isdd", b->wcroot->wc_id, relpath,
+ op_depth, relpath_depth(relpath)));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+
+ reason = svn_wc_conflict_reason_edited;
+ is_conflicted = TRUE;
+ }
+ else
+ {
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
+ STMT_DELETE_WORKING_OP_DEPTH_ABOVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", b->wcroot->wc_id, relpath,
+ op_depth));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+
+ reason = svn_wc_conflict_reason_deleted;
+ /* Don't set is_conflicted so working files/dirs are deleted. */
+ }
SVN_ERR(mark_tree_conflict(b, relpath,
/* ### kinds? */
- svn_node_dir, svn_node_dir,
- svn_wc_conflict_reason_edited,
+ svn_node_dir, svn_node_dir, reason,
svn_wc_conflict_action_delete, NULL,
scratch_pool));
- is_conflicted = TRUE;
}
- else if (is_all_deletes)
+ }
+
+ if (!is_conflicted)
+ {
+ svn_boolean_t have_row;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ svn_skel_t *work_item;
+ svn_kind_t del_kind;
+ const char *del_abspath;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
+ STMT_SELECT_CHILDREN_OP_DEPTH));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isd", b->wcroot->wc_id, relpath,
+ op_depth));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ while (have_row)
{
- SVN_ERR(mark_tree_conflict(b, relpath,
- /* ### kinds? */
- svn_node_dir, svn_node_dir,
- svn_wc_conflict_reason_deleted,
- svn_wc_conflict_action_delete, NULL,
- scratch_pool));
+ svn_error_t *err;
- SVN_ERR(svn_sqlite__get_statement(&stmt, b->wcroot->sdb,
- STMT_DELETE_WORKING_OP_DEPTH_ABOVE));
- SVN_ERR(svn_sqlite__bindf(stmt, "isd", b->wcroot->wc_id, relpath,
- op_depth));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ svn_pool_clear(iterpool);
- is_conflicted = TRUE;
+ del_kind = svn_sqlite__column_token(stmt, 1, kind_map);
+ del_abspath = svn_dirent_join(b->wcroot->abspath,
+ svn_sqlite__column_text(stmt, 0, NULL),
+ iterpool);
+ if (del_kind == svn_kind_dir)
+ err = svn_wc__wq_build_dir_remove(&work_item, b->db,
+ b->wcroot->abspath, del_abspath,
+ FALSE /* recursive */,
+ iterpool, iterpool);
+ else
+ err = svn_wc__wq_build_file_remove(&work_item, b->db,
+ b->wcroot->abspath, del_abspath,
+ iterpool, iterpool);
+ if (!err)
+ err = svn_wc__db_wq_add(b->db, b->wcroot->abspath, work_item,
+ iterpool);
+ if (err)
+ return svn_error_compose_create(err, svn_sqlite__reset(stmt));
+
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ SVN_ERR(svn_wc__db_depth_get_info(NULL, &del_kind, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL,
+ b->wcroot, relpath, op_depth,
+ iterpool, iterpool));
+ if (del_kind == svn_kind_dir)
+ SVN_ERR(svn_wc__wq_build_dir_remove(&work_item, b->db,
+ b->wcroot->abspath, local_abspath,
+ FALSE /* recursive */,
+ iterpool, iterpool));
+ else
+ SVN_ERR(svn_wc__wq_build_file_remove(&work_item, b->db,
+ b->wcroot->abspath, local_abspath,
+ iterpool, iterpool));
+ SVN_ERR(svn_wc__db_wq_add(b->db, b->wcroot->abspath, work_item,
+ iterpool));
+ svn_pool_destroy(iterpool);
}
/* Deleting the ROWS is valid so long as we update the parent before
@@ -900,11 +963,6 @@ tc_editor_delete(void *baton,
SVN_ERR(svn_wc__db_retract_parent_delete(b->wcroot, relpath, op_depth,
scratch_pool));
- if (is_conflicted)
- return SVN_NO_ERROR;
-
- /* ### TODO delete working files/dirs */
-
return SVN_NO_ERROR;
}