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 2011/04/01 20:24:55 UTC

svn commit: r1087838 - in /subversion/trunk/subversion/libsvn_wc: adm_ops.c wc-queries.sql wc_db.c wc_db.h

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(&notify_required,
-                              &conflict_old, &conflict_new, &conflict_working,
-                              &prop_reject,
-                              db, local_abspath, scratch_pool, scratch_pool));
+  SVN_ERR(svn_wc__db_revert_list_read(&notify_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