You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2010/03/02 23:26:21 UTC

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

Author: rhuijben
Date: Tue Mar  2 22:26:20 2010
New Revision: 918226

URL: http://svn.apache.org/viewvc?rev=918226&view=rev
Log:
Update the incomplete presence directly via the wc_db apis instead of via
entries during update. Also make sure we don't propagate incomplete from
BASE_NODE to WORKING_NODE while handling tree conflicts.

* subversion/libsvn_wc/update_editor.c
  (complete_directory): Remove incomplete status via wc_db temp api.
  (open_root): Mark incomplete via wc_db temp api.
  (add_directory): When handling an addition below a deleted tree, remove
    the incomplete status or an invalid incomplete state will be introduced
    in the WORKING tree.
  (open_directory): Mark the BASE_NODE incomplete via wc_db.

* subversion/libsvn_wc/wc-queries.sql
  (STMT_UPDATE_BASE_PRESENCE): New query.

* subversion/libsvn_wc/wc_db.c
  (svn_wc__db_temp_op_set_base_incomplete): New function.
  (svn_wc__db_temp_op_set_working_incomplete): New function.

* subversion/libsvn_wc/wc_db.h
  (svn_wc__db_temp_op_set_base_incomplete): New function.
  (svn_wc__db_temp_op_set_working_incomplete): New function.

Modified:
    subversion/trunk/subversion/libsvn_wc/update_editor.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/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/update_editor.c?rev=918226&r1=918225&r2=918226&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/trunk/subversion/libsvn_wc/update_editor.c Tue Mar  2 22:26:20 2010
@@ -663,7 +663,6 @@
   const apr_array_header_t *children;
   int i;
   apr_pool_t *iterpool;
-  svn_wc_entry_t tmp_entry;
 
   /* If this is the root directory and there is a target, we can't
      mark this directory complete. */
@@ -718,10 +717,24 @@
     }
 
   /* Mark THIS_DIR complete. */
-  tmp_entry.incomplete = FALSE;
-  SVN_ERR(svn_wc__entry_modify2(eb->db, local_abspath, svn_node_dir, FALSE,
-                                &tmp_entry, SVN_WC__ENTRY_MODIFY_INCOMPLETE,
-                                pool));
+  SVN_ERR(svn_wc__db_temp_op_set_base_incomplete(eb->db, local_abspath, FALSE,
+                                                 pool));
+
+  /* ### If we are updating below a delete-* treeconflict, all the
+         entries are moved to the copied state. This duplicates the incomplete
+         state to WORKING_NODE, so also clear it there. */
+  {
+    svn_wc__db_status_t status;
+    SVN_ERR(svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL, NULL,
+                                 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                                 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                                 NULL, NULL, NULL,
+                                 eb->db, local_abspath, pool, pool));
+
+    if (status == svn_wc__db_status_incomplete)
+      SVN_ERR(svn_wc__db_temp_op_set_working_incomplete(eb->db, local_abspath,
+                                                        FALSE, pool));
+  }
 
   if (eb->depth_is_sticky)
     {
@@ -1365,7 +1378,7 @@
       svn_depth_t depth;
       svn_wc__db_status_t status;
       apr_uint64_t flags = SVN_WC__ENTRY_MODIFY_REVISION |
-        SVN_WC__ENTRY_MODIFY_URL | SVN_WC__ENTRY_MODIFY_INCOMPLETE;
+        SVN_WC__ENTRY_MODIFY_URL;
 
       /* Read the depth from the entry. */
       SVN_ERR(svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -1381,11 +1394,13 @@
       /* Mark directory as being at target_revision, but incomplete. */
       tmp_entry.revision = *(eb->target_revision);
       tmp_entry.url = db->new_URL;
-      tmp_entry.incomplete = TRUE;
       SVN_ERR(svn_wc__entry_modify2(eb->db, db->local_abspath, svn_node_dir,
                                     FALSE,
                                     &tmp_entry, flags,
                                     pool));
+
+      SVN_ERR(svn_wc__db_temp_op_set_base_incomplete(eb->db, db->local_abspath,
+                                                     TRUE, pool));
     }
 
   return SVN_NO_ERROR;
@@ -2903,6 +2918,11 @@
                                     svn_node_dir, TRUE,
                                     &tmp_entry, modify_flags, pool));
 
+      /* ### HACK: Remove the incomplete status or the next entry_modify2
+                    will move the incomplete status to WORKING_NODE */
+      SVN_ERR(svn_wc__db_temp_op_set_base_incomplete(eb->db, db->local_abspath,
+                                                     FALSE, pool));
+
       /* Mark PATH's 'this dir' entry as scheduled for deletion. */
       SVN_ERR(svn_wc__entry_modify2(eb->db, db->local_abspath,
                                     svn_node_dir, FALSE,
@@ -2947,7 +2967,7 @@
   struct edit_baton *eb = pb->edit_baton;
   svn_wc_entry_t tmp_entry;
   apr_uint64_t flags = SVN_WC__ENTRY_MODIFY_REVISION |
-    SVN_WC__ENTRY_MODIFY_URL | SVN_WC__ENTRY_MODIFY_INCOMPLETE;
+    SVN_WC__ENTRY_MODIFY_URL;
 
   svn_boolean_t already_conflicted;
   svn_wc_conflict_description2_t *tree_conflict = NULL;
@@ -3052,12 +3072,16 @@
   /* Mark directory as being at target_revision and URL, but incomplete. */
   tmp_entry.revision = *(eb->target_revision);
   tmp_entry.url = db->new_URL;
-  tmp_entry.incomplete = TRUE;
 
-  return svn_wc__entry_modify2(eb->db, db->local_abspath,
-                               svn_node_dir, FALSE,
-                              &tmp_entry, flags,
-                              pool);
+  SVN_ERR(svn_wc__entry_modify2(eb->db, db->local_abspath,
+                                svn_node_dir, FALSE,
+                                &tmp_entry, flags,
+                                pool));
+
+  SVN_ERR(svn_wc__db_temp_op_set_base_incomplete(eb->db, db->local_abspath,
+                                                 TRUE, pool));
+
+  return SVN_NO_ERROR;
 }
 
 

Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=918226&r1=918225&r2=918226&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Tue Mar  2 22:26:20 2010
@@ -235,6 +235,10 @@
 update working_node set depth = ?3
 where wc_id = ?1 and local_relpath = ?2;
 
+-- STMT_UPDATE_BASE_PRESENCE
+update base_node set presence= ?3
+where wc_id = ?1 and local_relpath = ?2;
+
 -- STMT_UPDATE_WORKING_PRESENCE
 update working_node set presence = ?3
 where wc_id = ?1 and local_relpath =?2;
@@ -368,7 +372,6 @@
 update base_node set file_external = ?3
 where wc_id = ?1 and local_relpath = ?2;
 
-
 /* ------------------------------------------------------------------------- */
 
 /* these are used in upgrade.c  */

Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=918226&r1=918225&r2=918226&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Tue Mar  2 22:26:20 2010
@@ -6153,3 +6153,76 @@
   return SVN_NO_ERROR;
 
 }
+
+svn_error_t *
+svn_wc__db_temp_op_set_base_incomplete(svn_wc__db_t *db,
+                                       const char *local_dir_abspath,
+                                       svn_boolean_t incomplete,
+                                       apr_pool_t *scratch_pool)
+{
+  svn_sqlite__stmt_t *stmt;
+  svn_wc__db_pdh_t *pdh;
+  int affected_rows;
+  svn_wc__db_status_t base_status;
+
+  SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL, NULL, NULL, NULL, NULL,
+                                   NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                                   NULL, NULL,
+                                   db, local_dir_abspath,
+                                   scratch_pool, scratch_pool));
+
+  SVN_ERR_ASSERT(base_status == svn_wc__db_status_normal ||
+                 base_status == svn_wc__db_status_incomplete);
+
+  SVN_ERR(get_statement_for_path(&stmt, db, local_dir_abspath,
+                                 STMT_UPDATE_BASE_PRESENCE, scratch_pool));
+
+  SVN_ERR(svn_sqlite__bind_text(stmt, 3, incomplete ? "incomplete" : "normal"));
+
+  SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+
+  if (affected_rows > 0)
+   {
+     pdh = get_or_create_pdh(db, local_dir_abspath, FALSE, scratch_pool);
+     flush_entries(pdh);
+   }
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_wc__db_temp_op_set_working_incomplete(svn_wc__db_t *db,
+                                       const char *local_dir_abspath,
+                                       svn_boolean_t incomplete,
+                                       apr_pool_t *scratch_pool)
+{
+  svn_sqlite__stmt_t *stmt;
+  svn_wc__db_pdh_t *pdh;
+  int affected_rows;
+  svn_wc__db_status_t status;
+
+  SVN_ERR(svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL, NULL,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                               NULL,
+                               db, local_dir_abspath,
+                               scratch_pool, scratch_pool));
+
+  SVN_ERR_ASSERT(status == svn_wc__db_status_normal ||
+                 status == svn_wc__db_status_incomplete);
+
+  SVN_ERR(get_statement_for_path(&stmt, db, local_dir_abspath,
+                                 STMT_UPDATE_WORKING_PRESENCE, scratch_pool));
+
+  SVN_ERR(svn_sqlite__bind_text(stmt, 3, incomplete ? "incomplete" : "normal"));
+
+  SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+
+  if (affected_rows > 0)
+   {
+     pdh = get_or_create_pdh(db, local_dir_abspath, FALSE, scratch_pool);
+     flush_entries(pdh);
+   }
+
+  return SVN_NO_ERROR;
+}
\ No newline at end of file

Modified: subversion/trunk/subversion/libsvn_wc/wc_db.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.h?rev=918226&r1=918225&r2=918226&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.h Tue Mar  2 22:26:20 2010
@@ -2021,6 +2021,18 @@
                          const char *local_dir_abspath,
                          apr_pool_t *scratch_pool);
 
+svn_error_t *
+svn_wc__db_temp_op_set_base_incomplete(svn_wc__db_t *db,
+                                       const char *local_dir_abspath,
+                                       svn_boolean_t incomplete,
+                                       apr_pool_t *scratch_pool);
+
+svn_error_t *
+svn_wc__db_temp_op_set_working_incomplete(svn_wc__db_t *db,
+                                          const char *local_dir_abspath,
+                                          svn_boolean_t incomplete,
+                                          apr_pool_t *scratch_pool);
+
 
 /** @} */