Author: philip Date: Fri Apr 1 18:24:55 2011 New Revision: 1087838 URL: http://svn.apache.org/viewvc?rev=1087838&view=rev Log: Make the new revert code notify for all reverted paths. Use the term list rather than cache for the temporary table.
* subversion/libsvn_wc/adm_ops.c (revert_restore): Use renamed function, call extra notification function, add iteration pool for recursion. (new_revert_internal): Call extra notification function. * subversion/libsvn_wc/wc-queries.sql (STMT_CREATE_REVERT_CACHE): Rename to... (STMT_CREATE_REVERT_LIST): ...this, rename triggers. (STMT_DROP_REVERT_CACHE_TRIGGERS): Rename to... (STMT_DROP_REVERT_LIST_TRIGGERS): this, rename triggers, drop trailing semi-colon. (STMT_SELECT_REVERT_CACHE): Rename to... (STMT_SELECT_REVERT_LIST): ...this. (STMT_SELECT_REVERT_CACHE_RECURSIVE): Delete. (STMT_DELETE_REVERT_LIST, STMT_SELECT_REVERT_LIST_RECURSIVE, STMT_DELETE_REVERT_LIST_RECURSIVE): New. * subversion/libsvn_wc/wc_db.h (svn_wc__db_op_revert): Tweak comment. (svn_wc__db_reverted): Renamed to... (svn_wc__db_revert_list_read): ...this. (svn_wc__db_revert_list_notify): New. * subversion/libsvn_wc/wc_db.c (svn_wc__db_op_revert): Use renamed queries. (struct revert_list_read_baton_t): New. (revert_list_read): New, guts from svn_wc__db_reverted, use renamed queries, delete row. (svn_wc__db_reverted): Renamed to... (svn_wc__db_revert_list_read): ...this, calls revert_list_read in a txn. (svn_wc__db_revert_list_notify): New. Modified: subversion/trunk/subversion/libsvn_wc/adm_ops.c subversion/trunk/subversion/libsvn_wc/wc-queries.sql subversion/trunk/subversion/libsvn_wc/wc_db.c subversion/trunk/subversion/libsvn_wc/wc_db.h Modified: subversion/trunk/subversion/libsvn_wc/adm_ops.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_ops.c?rev=1087838&r1=1087837&r2=1087838&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/adm_ops.c (original) +++ subversion/trunk/subversion/libsvn_wc/adm_ops.c Fri Apr 1 18:24:55 2011 @@ -1385,10 +1385,11 @@ revert_restore(svn_wc__db_t *db, if (cancel_func) SVN_ERR(cancel_func(cancel_baton)); - SVN_ERR(svn_wc__db_reverted(¬ify_required, - &conflict_old, &conflict_new, &conflict_working, - &prop_reject, - db, local_abspath, scratch_pool, scratch_pool)); + SVN_ERR(svn_wc__db_revert_list_read(¬ify_required, + &conflict_old, &conflict_new, + &conflict_working, &prop_reject, + db, local_abspath, + scratch_pool, scratch_pool)); err = svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -1407,6 +1408,10 @@ revert_restore(svn_wc__db_t *db, scratch_pool), scratch_pool); + if (notify_func) + SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton, + db, local_abspath, scratch_pool)); + return SVN_NO_ERROR; } else if (err) @@ -1529,28 +1534,39 @@ revert_restore(svn_wc__db_t *db, if (depth == svn_depth_infinity && kind == svn_wc__db_kind_dir) { + apr_pool_t *iterpool = svn_pool_create(scratch_pool); const apr_array_header_t *children; int i; SVN_ERR(svn_wc__db_read_children_of_working_node(&children, db, local_abspath, scratch_pool, - scratch_pool)); + iterpool)); for (i = 0; i < children->nelts; ++i) { - const char *child_abspath - = svn_dirent_join(local_abspath, - APR_ARRAY_IDX(children, i, const char *), - scratch_pool); + const char *child_abspath; + + svn_pool_clear(iterpool); + + child_abspath = svn_dirent_join(local_abspath, + APR_ARRAY_IDX(children, i, + const char *), + iterpool); SVN_ERR(revert_restore(db, revert_root, child_abspath, depth, use_commit_times, changelist_hash, cancel_func, cancel_baton, notify_func, notify_baton, - scratch_pool)); + iterpool)); } + + svn_pool_destroy(iterpool); } + if (notify_func) + SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton, + db, local_abspath, scratch_pool)); + return SVN_NO_ERROR; } @@ -1576,6 +1592,10 @@ new_revert_internal(svn_wc__db_t *db, notify_func, notify_baton, scratch_pool)); + if (notify_func) + SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton, + db, local_abspath, scratch_pool)); + return SVN_NO_ERROR; } #endif Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=1087838&r1=1087837&r2=1087838&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original) +++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Fri Apr 1 18:24:55 2011 @@ -909,10 +909,9 @@ CREATE UNIQUE INDEX temp__node_props_cac SELECT local_relpath, kind, properties FROM temp__node_props_cache ORDER BY local_relpath -/* Perhaps revert log would be a better term? */ --- STMT_CREATE_REVERT_CACHE -DROP TABLE IF EXISTS revert_cache; -CREATE TEMPORARY TABLE revert_cache ( +-- STMT_CREATE_REVERT_LIST +DROP TABLE IF EXISTS revert_list; +CREATE TEMPORARY TABLE revert_list ( local_relpath TEXT PRIMARY KEY, conflict_old TEXT, conflict_new TEXT, @@ -920,18 +919,19 @@ CREATE TEMPORARY TABLE revert_cache ( prop_reject TEXT, notify INTEGER ); -DROP TRIGGER IF EXISTS trigger_revert_cache_nodes; -CREATE TEMPORARY TRIGGER trigger_revert_cache_nodes +CREATE UNIQUE INDEX revert_list_index ON revert_list(local_relpath); +DROP TRIGGER IF EXISTS trigger_revert_list_nodes; +CREATE TEMPORARY TRIGGER trigger_revert_list_nodes BEFORE DELETE ON nodes BEGIN - INSERT OR REPLACE INTO revert_cache(local_relpath, notify) + INSERT OR REPLACE INTO revert_list(local_relpath, notify) SELECT OLD.local_relpath, 1; END; -DROP TRIGGER IF EXISTS trigger_revert_cache_actual; -CREATE TEMPORARY TRIGGER trigger_revert_cache_actual_delete +DROP TRIGGER IF EXISTS trigger_revert_list_actual_delete; +CREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete BEFORE DELETE ON actual_node BEGIN - INSERT OR REPLACE INTO revert_cache(local_relpath, conflict_old, + INSERT OR REPLACE INTO revert_list(local_relpath, conflict_old, conflict_new, conflict_working, prop_reject, notify) SELECT OLD.local_relpath, @@ -939,11 +939,11 @@ BEGIN OLD.prop_reject, CASE WHEN OLD.properties IS NOT NULL THEN 1 ELSE NULL END; END; -DROP TRIGGER IF EXISTS trigger_revert_cache_update; -CREATE TEMPORARY TRIGGER trigger_revert_cache_actual_update +DROP TRIGGER IF EXISTS trigger_revert_list_actual_update; +CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update BEFORE UPDATE ON actual_node BEGIN - INSERT OR REPLACE INTO revert_cache(local_relpath, conflict_old, + INSERT OR REPLACE INTO revert_list(local_relpath, conflict_old, conflict_new, conflict_working, prop_reject, notify) SELECT OLD.local_relpath, @@ -952,20 +952,28 @@ BEGIN CASE WHEN OLD.properties IS NOT NULL THEN 1 ELSE NULL END; END --- STMT_DROP_REVERT_CACHE_TRIGGERS -DROP TRIGGER IF EXISTS trigger_revert_cache_nodes; -DROP TRIGGER IF EXISTS trigger_revert_cache_actual_delete; -DROP TRIGGER IF EXISTS trigger_revert_cache_actual_update; +-- STMT_DROP_REVERT_LIST_TRIGGERS +DROP TRIGGER IF EXISTS trigger_revert_list_nodes; +DROP TRIGGER IF EXISTS trigger_revert_list_actual_delete; +DROP TRIGGER IF EXISTS trigger_revert_list_actual_update --- STMT_SELECT_REVERT_CACHE +-- STMT_SELECT_REVERT_LIST SELECT conflict_old, conflict_new, conflict_working, prop_reject, notify -FROM revert_cache +FROM revert_list WHERE local_relpath = ?1 --- STMT_SELECT_REVERT_CACHE_RECURSIVE -SELECT local_relpath, conflict_old, conflict_new, conflict_working, prop_reject -FROM revert_cache -WHERE local_relpath LIKE ?1 ESCAPE '#' ORDER BY local_relpath +-- STMT_DELETE_REVERT_LIST +DELETE FROM revert_list WHERE local_relpath = ?1 + +-- STMT_SELECT_REVERT_LIST_RECURSIVE +SELECT local_relpath, notify +FROM revert_list +WHERE local_relpath = ?1 or local_relpath LIKE ?2 ESCAPE '#' +ORDER BY local_relpath + +-- STMT_DELETE_REVERT_LIST_RECURSIVE +DELETE FROM revert_list +WHERE local_relpath = ?1 OR local_relpath LIKE ?2 ESCAPE '#' /* ------------------------------------------------------------------------- */ Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1087838&r1=1087837&r2=1087838&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/wc_db.c (original) +++ subversion/trunk/subversion/libsvn_wc/wc_db.c Fri Apr 1 18:24:55 2011 @@ -3708,35 +3708,107 @@ svn_wc__db_op_revert(svn_wc__db_t *db, /* We MUST remove the triggers and not leave them to affect subsequent operations. */ - err = svn_sqlite__exec_statements(wcroot->sdb, STMT_CREATE_REVERT_CACHE); + err = svn_sqlite__exec_statements(wcroot->sdb, STMT_CREATE_REVERT_LIST); if (err) return svn_error_compose_create(err, svn_sqlite__exec_statements(wcroot->sdb, - STMT_DROP_REVERT_CACHE_TRIGGERS)); + STMT_DROP_REVERT_LIST_TRIGGERS)); err = svn_wc__db_with_txn(wcroot, local_relpath, txn_func, NULL, scratch_pool); err = svn_error_compose_create(err, svn_sqlite__exec_statements(wcroot->sdb, - STMT_DROP_REVERT_CACHE_TRIGGERS)); + STMT_DROP_REVERT_LIST_TRIGGERS)); return err; } +struct revert_list_read_baton { + svn_boolean_t *reverted; + const char **conflict_old; + const char **conflict_new; + const char **conflict_working; + const char **prop_reject; + apr_pool_t *result_pool; +}; + +static svn_error_t * +revert_list_read(void *baton, + svn_wc__db_wcroot_t *wcroot, + const char *local_relpath, + apr_pool_t *scratch_pool) +{ + struct revert_list_read_baton *b = baton; + svn_sqlite__stmt_t *stmt; + svn_boolean_t have_row; + + SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, + STMT_SELECT_REVERT_LIST)); + SVN_ERR(svn_sqlite__bindf(stmt, "s", local_relpath)); + SVN_ERR(svn_sqlite__step(&have_row, stmt)); + if (have_row) + { + *(b->reverted) = !svn_sqlite__column_is_null(stmt, 4); + *(b->conflict_new) = svn_sqlite__column_text(stmt, 0, b->result_pool); + *(b->conflict_old) = svn_sqlite__column_text(stmt, 1, b->result_pool); + *(b->conflict_working) = svn_sqlite__column_text(stmt, 2, b->result_pool); + *(b->prop_reject) = svn_sqlite__column_text(stmt, 3, b->result_pool); + } + else + { + *(b->reverted) = FALSE; + *(b->conflict_new) = *(b->conflict_old) = *(b->conflict_working) = NULL; + *(b->prop_reject) = NULL; + } + SVN_ERR(svn_sqlite__reset(stmt)); + + if (have_row) + { + SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, + STMT_DELETE_REVERT_LIST)); + SVN_ERR(svn_sqlite__bindf(stmt, "s", local_relpath)); + SVN_ERR(svn_sqlite__step_done(stmt)); + } + + return SVN_NO_ERROR; +} + svn_error_t * -svn_wc__db_reverted(svn_boolean_t *reverted, - const char **conflict_old, - const char **conflict_new, - const char **conflict_working, - const char **prop_reject, - svn_wc__db_t *db, - const char *local_abspath, - apr_pool_t *result_pool, - apr_pool_t *scratch_pool) +svn_wc__db_revert_list_read(svn_boolean_t *reverted, + const char **conflict_old, + const char **conflict_new, + const char **conflict_working, + const char **prop_reject, + svn_wc__db_t *db, + const char *local_abspath, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { svn_wc__db_wcroot_t *wcroot; const char *local_relpath; + struct revert_list_read_baton b = {reverted, conflict_old, conflict_new, + conflict_working, prop_reject, + result_pool}; + + SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, + db, local_abspath, scratch_pool, scratch_pool)); + VERIFY_USABLE_WCROOT(wcroot); + + SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, revert_list_read, &b, + scratch_pool)); + return SVN_NO_ERROR; +} + +svn_error_t * +svn_wc__db_revert_list_notify(svn_wc_notify_func2_t notify_func, + void *notify_baton, + svn_wc__db_t *db, + const char *local_abspath, + apr_pool_t *scratch_pool) +{ + svn_wc__db_wcroot_t *wcroot; + const char *local_relpath, *like_arg; svn_sqlite__stmt_t *stmt; svn_boolean_t have_row; @@ -3744,25 +3816,39 @@ svn_wc__db_reverted(svn_boolean_t *rever db, local_abspath, scratch_pool, scratch_pool)); VERIFY_USABLE_WCROOT(wcroot); + like_arg = construct_like_arg(local_relpath, scratch_pool); + SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, - STMT_SELECT_REVERT_CACHE)); - SVN_ERR(svn_sqlite__bindf(stmt, "s", local_relpath)); + STMT_SELECT_REVERT_LIST_RECURSIVE)); + SVN_ERR(svn_sqlite__bindf(stmt, "ss", local_relpath, like_arg)); SVN_ERR(svn_sqlite__step(&have_row, stmt)); - if (have_row) - { - *reverted = !svn_sqlite__column_is_null(stmt, 4); - *conflict_new = svn_sqlite__column_text(stmt, 0, result_pool); - *conflict_old = svn_sqlite__column_text(stmt, 1, result_pool); - *conflict_working = svn_sqlite__column_text(stmt, 2, result_pool); - *prop_reject = svn_sqlite__column_text(stmt, 3, result_pool); - } - else + if (!have_row) + return svn_error_return(svn_sqlite__reset(stmt)); /* optimise for no row */ + while (have_row) { - *reverted = FALSE; - *conflict_new = *conflict_old = *conflict_working = *prop_reject = NULL; + const char *notify_relpath = svn_sqlite__column_text(stmt, 0, NULL); + + if (svn_sqlite__column_int64(stmt, 1)) + { + const char *notify_abspath = svn_dirent_join(wcroot->abspath, + notify_relpath, + scratch_pool); + notify_func(notify_baton, + svn_wc_create_notify(notify_abspath, svn_wc_notify_revert, + scratch_pool), + scratch_pool); + + /* ### Need cancel_func? */ + } + SVN_ERR(svn_sqlite__step(&have_row, stmt)); } SVN_ERR(svn_sqlite__reset(stmt)); + SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, + STMT_DELETE_REVERT_LIST_RECURSIVE)); + SVN_ERR(svn_sqlite__bindf(stmt, "ss", local_relpath, like_arg)); + SVN_ERR(svn_sqlite__step_done(stmt)); + return SVN_NO_ERROR; } @@ -3811,7 +3897,6 @@ read_all_tree_conflicts(apr_hash_t **tre SVN_ERR(svn_sqlite__step(&have_row, stmt)); } - SVN_ERR(svn_sqlite__reset(stmt)); svn_pool_destroy(iterpool); Modified: subversion/trunk/subversion/libsvn_wc/wc_db.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.h?rev=1087838&r1=1087837&r2=1087838&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/wc_db.h (original) +++ subversion/trunk/subversion/libsvn_wc/wc_db.h Fri Apr 1 18:24:55 2011 @@ -1248,10 +1248,8 @@ svn_wc__db_op_revert_actual(svn_wc__db_t * * At present only depth=empty and depth=infinity are supported. * - * This function populates the revert cache that can be queried to + * This function populates the revert list that can be queried to * determine what was reverted. - * - * ### Need a way to drop the cache. */ svn_error_t * svn_wc__db_op_revert(svn_wc__db_t *db, @@ -1260,21 +1258,37 @@ svn_wc__db_op_revert(svn_wc__db_t *db, apr_pool_t *result_pool, apr_pool_t *scratch_pool); -/* Query the revert cache for LOCAL_ABSPATH and set *REVERTED if the +/* Query the revert list for LOCAL_ABSPATH and set *REVERTED if the * path was reverted. Set *CONFLICT_OLD, *CONFLICT_NEW, * *CONFLICT_WORKING and *PROP_REJECT to the names of the conflict * files, or NULL if the names are not stored. + * + * Removes the row for LOCAL_ABSPATH from the revert list. */ svn_error_t * -svn_wc__db_reverted(svn_boolean_t *reverted, - const char **conflict_old, - const char **conflict_new, - const char **conflict_working, - const char **prop_reject, - svn_wc__db_t *db, - const char *local_abspath, - apr_pool_t *result_pool, - apr_pool_t *scratch_pool); +svn_wc__db_revert_list_read(svn_boolean_t *reverted, + const char **conflict_old, + const char **conflict_new, + const char **conflict_working, + const char **prop_reject, + svn_wc__db_t *db, + const char *local_abspath, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + +/* Make revert notifications for all paths in the revert list that are + * equal to LOCAL_ABSPATH or below LOCAL_ABSPATH. + * + * Removes all the corresponding rows from the revert list. + * + * ### Pass in cancel_func? + */ +svn_error_t * +svn_wc__db_revert_list_notify(svn_wc_notify_func2_t notify_func, + void *notify_baton, + svn_wc__db_t *db, + const char *local_abspath, + apr_pool_t *scratch_pool); /* Return a hash @a *tree_conflicts of all the children of @a