[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r1089058 - in /subversion/trunk/subversion: libsvn_wc/wc_db.c tests/libsvn_wc/op-depth-test.c

From: Stefan Sperling <stsp_at_elego.de>
Date: Tue, 5 Apr 2011 16:58:50 +0200

On Tue, Apr 05, 2011 at 02:18:01PM -0000, rhuijben_at_apache.org wrote:
> Author: rhuijben
> Date: Tue Apr 5 14:18:00 2011
> New Revision: 1089058
>
> URL: http://svn.apache.org/viewvc?rev=1089058&view=rev
> Log:
> Start recording mixed-revision copies as multiple op_depths. Do this by
> adding not-present nodes at the op-depth of the parent operation. Before this
> patch we created multiple copy operations at the same op depth when you
> were using a simple 'svn cp DIR DIR2', while using separate operations
> could give you multiple layers with the same result on commit.
>
> This change doesn't introduce new database states that couldn't exist before,
> but it does bring the working copy closer to the model used for committing
> (and the formal tree model we used for designing WC-NG).
>
> This change also slightly changes the behavior of delete and revert on
> children of a copy operation as it allows you to revert the separate commands
> that will be performed on commit.
>
> On top of that this commit will finally allow the commit processing to use
> depth handling.

Here is my patch that introduces depth to post-commit processing.

Last I tried, tests failed with it. I don't have time to look at
it today but in case it helps I thought I'd share it.

Index: subversion/include/svn_wc.h
===================================================================
--- subversion/include/svn_wc.h (revision 1086444)
+++ subversion/include/svn_wc.h (working copy)
@@ -4753,9 +4753,11 @@ svn_wc_committed_queue_create(apr_pool_t *pool);
  * identify the node's pristine text.
  * ### NOT YET IMPLEMENTED.
  *
- * If @a recurse is TRUE and @a local_abspath is a directory, then bump every
- * versioned object at or under @a local_abspath. This is usually done for
- * copied trees.
+ * If @a local_abspath is a directory, then bump every versioned object
+ * within the specified @a depth at or under @a local_abspath.
+ * This is usually done for copied trees.
+ * @a depth must be greater or equal @c svn_depth_empty.
+ * It must NOT be @c svn_depth_unknown or @c svn_depth_exclude.
  *
  * ### In the present implementation, if a recursive directory item is in
  * the queue, then any children (at any depth) of that directory that
@@ -4771,7 +4773,7 @@ svn_wc_committed_queue_create(apr_pool_t *pool);
  * 'remove_changelist' from the recursive parent item;
  * 'md5_checksum' = NULL ### means what?
  *
- * @note the @a recurse parameter should be used with extreme care since
+ * @note the @a depth infinity should be used with extreme care since
  * it will bump ALL nodes under the directory, regardless of their
  * actual inclusion in the new revision.
  *
@@ -4788,7 +4790,7 @@ svn_error_t *
 svn_wc_queue_committed3(svn_wc_committed_queue_t *queue,
                         svn_wc_context_t *wc_ctx,
                         const char *local_abspath,
- svn_boolean_t recurse,
+ svn_depth_t depth,
                         const apr_array_header_t *wcprop_changes,
                         svn_boolean_t remove_lock,
                         svn_boolean_t remove_changelist,
@@ -4797,8 +4799,8 @@ svn_wc_queue_committed3(svn_wc_committed_queue_t *
                         apr_pool_t *scratch_pool);
 
 /** Same as svn_wc_queue_committed3() except @a path doesn't have to be an
- * abspath and @a adm_access is unused and a SHA-1 checksum cannot be
- * specified.
+ * abspath, and @a adm_access is unused, and a SHA-1 checksum cannot be
+ * specified, and there is a boolean parameter @a recurse instead of depth.
  *
  * @since New in 1.6.
  *
Index: subversion/include/svn_client.h
===================================================================
--- subversion/include/svn_client.h (revision 1086444)
+++ subversion/include/svn_client.h (working copy)
@@ -473,6 +473,11 @@ typedef struct svn_client_commit_item3_t
    * same lifetime as this data structure.
    */
   apr_array_header_t *outgoing_prop_changes;
+
+ /** The depth this item was committed with. This is needed to retain
+ * local mods (such as deleted children) within copied directories that
+ * are committed with depth less than infinity. */
+ svn_depth_t depth;
 } svn_client_commit_item3_t;
 
 /** The commit candidate structure.
Index: subversion/libsvn_wc/deprecated.c
===================================================================
--- subversion/libsvn_wc/deprecated.c (revision 1086444)
+++ subversion/libsvn_wc/deprecated.c (working copy)
@@ -664,7 +664,8 @@ svn_wc_process_committed4(const char *path,
   SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
 
   wcprop_changes_hash = svn_wc__prop_array_to_hash(wcprop_changes, pool);
- SVN_ERR(svn_wc__process_committed_internal(db, local_abspath, recurse, TRUE,
+ SVN_ERR(svn_wc__process_committed_internal(db, local_abspath,
+ svn_depth_infinity, TRUE,
                                              new_revnum, new_date, rev_author,
                                              wcprop_changes_hash,
                                              !remove_lock, !remove_changelist,
Index: subversion/libsvn_wc/wc.h
===================================================================
--- subversion/libsvn_wc/wc.h (revision 1086444)
+++ subversion/libsvn_wc/wc.h (working copy)
@@ -270,7 +270,7 @@ svn_wc__get_committed_queue_pool(const struct svn_
 svn_error_t *
 svn_wc__process_committed_internal(svn_wc__db_t *db,
                                    const char *local_abspath,
- svn_boolean_t recurse,
+ svn_depth_t depth,
                                    svn_boolean_t top_of_recurse,
                                    svn_revnum_t new_revnum,
                                    apr_time_t new_date,
Index: subversion/libsvn_wc/adm_ops.c
===================================================================
--- subversion/libsvn_wc/adm_ops.c (revision 1086444)
+++ subversion/libsvn_wc/adm_ops.c (working copy)
@@ -70,14 +70,14 @@ struct svn_wc_committed_queue_t
   apr_pool_t *pool;
   /* Mapping (const char *) local_abspath to (committed_queue_item_t *). */
   apr_hash_t *queue;
- /* Is any item in the queue marked as 'recursive'? */
- svn_boolean_t have_recursive;
+ /* Is any item in the queue committed with depth > 'empty'? */
+ svn_boolean_t have_depth_greater_empty;
 };
 
 typedef struct committed_queue_item_t
 {
   const char *local_abspath;
- svn_boolean_t recurse;
+ svn_depth_t depth;
   svn_boolean_t no_unlock;
   svn_boolean_t keep_changelist;
 
@@ -225,7 +225,7 @@ process_committed_leaf(svn_wc__db_t *db,
 svn_error_t *
 svn_wc__process_committed_internal(svn_wc__db_t *db,
                                    const char *local_abspath,
- svn_boolean_t recurse,
+ svn_depth_t depth,
                                    svn_boolean_t top_of_recurse,
                                    svn_revnum_t new_revnum,
                                    apr_time_t new_date,
@@ -239,9 +239,25 @@ svn_wc__process_committed_internal(svn_wc__db_t *d
                                    apr_pool_t *scratch_pool)
 {
   svn_wc__db_kind_t kind;
+ svn_depth_t depth_below_here;
 
   SVN_ERR(svn_wc__db_read_kind(&kind, db, local_abspath, TRUE, scratch_pool));
 
+ switch (depth)
+ {
+ case svn_depth_empty:
+ case svn_depth_files:
+ case svn_depth_immediates:
+ depth_below_here = svn_depth_empty;
+ break;
+ case svn_depth_infinity:
+ depth_below_here = svn_depth_infinity;
+ break;
+ default:
+ SVN_ERR_MALFUNCTION();
+ }
+
+
   SVN_ERR(process_committed_leaf(db, local_abspath, !top_of_recurse,
                                  new_revnum, new_date, rev_author,
                                  new_dav_cache,
@@ -249,7 +265,7 @@ svn_wc__process_committed_internal(svn_wc__db_t *d
                                  sha1_checksum,
                                  scratch_pool));
 
- if (recurse && kind == svn_wc__db_kind_dir)
+ if (depth > svn_depth_empty && kind == svn_wc__db_kind_dir)
     {
       const apr_array_header_t *children;
       apr_pool_t *iterpool = svn_pool_create(scratch_pool);
@@ -331,7 +347,7 @@ svn_wc__process_committed_internal(svn_wc__db_t *d
              ones present in the current call are only applicable to
              this one committed item. */
           SVN_ERR(svn_wc__process_committed_internal(db, this_abspath,
- TRUE /* recurse */,
+ depth_below_here,
                                                      FALSE,
                                                      new_revnum, new_date,
                                                      rev_author,
@@ -384,7 +400,7 @@ svn_wc_committed_queue_create(apr_pool_t *pool)
   q = apr_palloc(pool, sizeof(*q));
   q->pool = pool;
   q->queue = apr_hash_make(pool);
- q->have_recursive = FALSE;
+ q->have_depth_greater_empty = FALSE;
 
   return q;
 }
@@ -393,7 +409,7 @@ svn_error_t *
 svn_wc_queue_committed3(svn_wc_committed_queue_t *queue,
                         svn_wc_context_t *wc_ctx,
                         const char *local_abspath,
- svn_boolean_t recurse,
+ svn_depth_t depth,
                         const apr_array_header_t *wcprop_changes,
                         svn_boolean_t remove_lock,
                         svn_boolean_t remove_changelist,
@@ -405,7 +421,7 @@ svn_wc_queue_committed3(svn_wc_committed_queue_t *
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
 
- queue->have_recursive |= recurse;
+ queue->have_depth_greater_empty |= (depth > svn_depth_empty);
 
   /* Use the same pool as the one QUEUE was allocated in,
      to prevent lifetime issues. Intermediate operations
@@ -414,7 +430,7 @@ svn_wc_queue_committed3(svn_wc_committed_queue_t *
   /* Add to the array with paths and options */
   cqi = apr_palloc(queue->pool, sizeof(*cqi));
   cqi->local_abspath = local_abspath;
- cqi->recurse = recurse;
+ cqi->depth = depth;
   cqi->no_unlock = !remove_lock;
   cqi->keep_changelist = !remove_changelist;
   cqi->md5_checksum = md5_checksum;
@@ -443,13 +459,31 @@ have_recursive_parent(apr_hash_t *queue,
   for (hi = apr_hash_first(scratch_pool, queue); hi; hi = apr_hash_next(hi))
     {
       const committed_queue_item_t *qi = svn__apr_hash_index_val(hi);
+ const char *child_remainder;
 
       if (qi == item)
         continue;
 
- if (qi->recurse && svn_dirent_is_child(qi->local_abspath, local_abspath,
- NULL))
- return TRUE;
+ child_remainder = svn_dirent_is_child(qi->local_abspath,
+ local_abspath, NULL);
+ if (child_remainder == NULL)
+ continue;
+
+ /* Check if the item is within reach of the parent's commit depth. */
+ switch (qi->depth)
+ {
+ case svn_depth_empty:
+ continue;
+ case svn_depth_files:
+ case svn_depth_immediates:
+ if (svn_path_component_count(child_remainder) == 1)
+ return TRUE;
+ continue;
+ case svn_depth_infinity:
+ return TRUE;
+ default:
+ SVN_ERR_MALFUNCTION_NO_RETURN();
+ }
     }
 
   return FALSE;
@@ -488,12 +522,12 @@ svn_wc_process_committed_queue2(svn_wc_committed_q
       /* Skip this item if it is a child of a recursive item, because it has
          been (or will be) accounted for when that recursive item was (or
          will be) processed. */
- if (queue->have_recursive && have_recursive_parent(queue->queue, cqi,
- iterpool))
+ if (queue->have_depth_greater_empty &&
+ have_recursive_parent(queue->queue, cqi, iterpool))
         continue;
 
       SVN_ERR(svn_wc__process_committed_internal(wc_ctx->db, cqi->local_abspath,
- cqi->recurse, TRUE, new_revnum,
+ cqi->depth, TRUE, new_revnum,
                                                  new_date, rev_author,
                                                  cqi->new_dav_cache,
                                                  cqi->no_unlock,
Index: subversion/libsvn_client/commit_util.c
===================================================================
--- subversion/libsvn_client/commit_util.c (revision 1086444)
+++ subversion/libsvn_client/commit_util.c (working copy)
@@ -84,6 +84,7 @@ add_committable(apr_hash_t *committables,
                 const char *copyfrom_relpath,
                 svn_revnum_t copyfrom_rev,
                 apr_byte_t state_flags,
+ svn_depth_t depth,
                 apr_pool_t *result_pool,
                 apr_pool_t *scratch_pool)
 {
@@ -126,6 +127,7 @@ add_committable(apr_hash_t *committables,
   new_item->state_flags = state_flags;
   new_item->incoming_prop_changes = apr_array_make(result_pool, 1,
                                                    sizeof(svn_prop_t *));
+ new_item->depth = depth;
 
   /* Now, add the commit item to the array. */
   APR_ARRAY_PUSH(array, svn_client_commit_item3_t *) = new_item;
@@ -717,6 +719,7 @@ harvest_committables(apr_hash_t *committables,
                                   cf_relpath,
                                   cf_rev,
                                   state_flags,
+ depth,
                                   result_pool, scratch_pool));
           if (state_flags & SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN)
             apr_hash_set(lock_tokens,
Index: subversion/libsvn_client/commit.c
===================================================================
--- subversion/libsvn_client/commit.c (revision 1086444)
+++ subversion/libsvn_client/commit.c (working copy)
@@ -925,19 +925,13 @@ post_process_commit_item(svn_wc_committed_queue_t
                          const svn_checksum_t *sha1_checksum,
                          apr_pool_t *scratch_pool)
 {
- svn_boolean_t loop_recurse = FALSE;
   svn_boolean_t remove_lock;
 
- if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)
- && (item->kind == svn_node_dir)
- && (item->copyfrom_url))
- loop_recurse = TRUE;
-
   remove_lock = (! keep_locks && (item->state_flags
                                        & SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN));
 
   return svn_wc_queue_committed3(queue, wc_ctx, item->path,
- loop_recurse, item->incoming_prop_changes,
+ item->depth, item->incoming_prop_changes,
                                  remove_lock, !keep_changelists,
                                  md5_checksum, sha1_checksum, scratch_pool);
 }
Received on 2011-04-05 16:59:25 CEST

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.