You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2012/04/26 20:07:25 UTC

svn commit: r1331003 - /subversion/trunk/subversion/libsvn_client/merge.c

Author: pburba
Date: Thu Apr 26 18:07:25 2012
New Revision: 1331003

URL: http://svn.apache.org/viewvc?rev=1331003&view=rev
Log:
* subversion/libsvn_client/merge.c
  (notification_receiver_baton_t): Clarify the doc string for the
   added_abspaths member.

  (update_the_list_of_added_subtrees): New, factored out of 

  (notification_receiver): Call new helper.

Modified:
    subversion/trunk/subversion/libsvn_client/merge.c

Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1331003&r1=1331002&r2=1331003&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Thu Apr 26 18:07:25 2012
@@ -2674,10 +2674,8 @@ typedef struct notification_receiver_bat
      MERGE_B->REINTEGRATE_MERGE are both false. */
   apr_hash_t *skipped_abspaths;
 
-  /* A list of the absolute root paths of any added subtrees which might
-     require their own explicit mergeinfo.  Is NULL if
-     MERGE_B->SOURCES_ANCESTRAL and MERGE_B->REINTEGRATE_MERGE are both
-     false. */
+  /* A hash of (const char *) absolute WC paths mapped to the same which
+     represent the roots of subtrees added by the merge.  May be NULL. */
   apr_hash_t *added_abspaths;
 
   /* A list of tree conflict victim absolute paths which may be NULL.  Is NULL
@@ -2813,6 +2811,67 @@ notify_merge_completed(const char *targe
     }
 }
 
+/* Helper for notification_receiver: Cache the roots of subtrees added under
+   TARGET_ABSPATH.
+
+   If *ADDED_ABSPATHS is not null, then it is a hash of (const char *)
+   absolute WC paths mapped to the same.  If it is null, then allocate a
+   new hash in RESULT_POOL.
+
+   If ADDED_ABSPATH is a subtree of TARGET_ABSPATH, is not already found in
+   *ADDED_ABSPATHS, nor is a subtree of any path already found within the
+   hash, then add a copy of ADDED_ABSPATH to *ADDED_ABSPATHS.
+
+   All additions to *ADDED_ABSPATHS are allocated in RESULT_POOL.
+   SCRATCH_POOL is used for temporary allocations. */
+static void
+update_the_list_of_added_subtrees(const char *target_abspath,
+                                  const char *added_abspath,
+                                  apr_hash_t **added_abspaths,
+                                  apr_pool_t *result_pool,
+                                  apr_pool_t *scratch_pool)
+{
+  svn_boolean_t root_of_added_subtree = TRUE;
+
+  /* Stash the root path of any added subtrees. */
+  if (*added_abspaths == NULL)
+    {
+      /* The first added path is always a root. */
+      *added_abspaths = apr_hash_make(result_pool);
+    }
+  else
+    {
+      const char *added_path_parent =
+        svn_dirent_dirname(added_abspath, scratch_pool);
+      apr_pool_t *subpool = svn_pool_create(scratch_pool);
+
+      /* Is NOTIFY->PATH the root of an added subtree? */
+      while (strcmp(target_abspath, added_path_parent))
+        {
+          if (apr_hash_get(*added_abspaths,
+                           added_path_parent,
+                           APR_HASH_KEY_STRING))
+            {
+              root_of_added_subtree = FALSE;
+              break;
+            }
+
+          added_path_parent = svn_dirent_dirname(
+            added_path_parent, subpool);
+        }
+
+      svn_pool_destroy(subpool);
+    }
+
+  if (root_of_added_subtree)
+    {
+      const char *added_root_path = apr_pstrdup(result_pool,
+                                                added_abspath);
+      apr_hash_set(*added_abspaths, added_root_path,
+                   APR_HASH_KEY_STRING, added_root_path);
+    }
+}
+
 /* Is the notification the result of a real operative merge? */
 #define IS_OPERATIVE_NOTIFICATION(notify)  \
                     (notify->content_state == svn_wc_notify_state_conflicted \
@@ -2941,46 +3000,10 @@ notification_receiver(void *baton, const
 
       if (notify->action == svn_wc_notify_update_add)
         {
-          svn_boolean_t root_of_added_subtree = TRUE;
-
-          /* Stash the root path of any added subtrees. */
-          if (notify_b->added_abspaths == NULL)
-            {
-              /* The first added path is always a root. */
-              notify_b->added_abspaths = apr_hash_make(notify_b->pool);
-            }
-          else
-            {
-              const char *added_path_parent =
-                svn_dirent_dirname(notify_abspath, pool);
-              apr_pool_t *subpool = svn_pool_create(pool);
-
-              /* Is NOTIFY->PATH the root of an added subtree? */
-              while (strcmp(notify_b->merge_b->target->abspath,
-                            added_path_parent))
-                {
-                  if (apr_hash_get(notify_b->added_abspaths,
-                                   added_path_parent,
-                                   APR_HASH_KEY_STRING))
-                    {
-                      root_of_added_subtree = FALSE;
-                      break;
-                    }
-
-                  added_path_parent = svn_dirent_dirname(
-                    added_path_parent, subpool);
-                }
-
-              svn_pool_destroy(subpool);
-            }
-
-          if (root_of_added_subtree)
-            {
-              const char *added_root_path = apr_pstrdup(notify_b->pool,
-                                                        notify_abspath);
-              apr_hash_set(notify_b->added_abspaths, added_root_path,
-                           APR_HASH_KEY_STRING, added_root_path);
-            }
+          update_the_list_of_added_subtrees(notify_b->merge_b->target->abspath,
+                                            notify_abspath,
+                                            &(notify_b->added_abspaths),
+                                            notify_b->pool, pool);
         }
 
       if (notify->action == svn_wc_notify_update_delete



Re: svn commit: r1331003 - /subversion/trunk/subversion/libsvn_client/merge.c

Posted by Paul Burba <pt...@gmail.com>.
On Thu, Apr 26, 2012 at 3:12 PM, Greg Stein <gs...@gmail.com> wrote:
> On Thu, Apr 26, 2012 at 14:07,  <pb...@apache.org> wrote:
>>...
>> +++ subversion/trunk/subversion/libsvn_client/merge.c Thu Apr 26 18:07:25 2012
>>...
>> +update_the_list_of_added_subtrees(const char *target_abspath,
>> +                                  const char *added_abspath,
>> +                                  apr_hash_t **added_abspaths,
>> +                                  apr_pool_t *result_pool,
>> +                                  apr_pool_t *scratch_pool)
>> +{
>> +  svn_boolean_t root_of_added_subtree = TRUE;
>> +
>> +  /* Stash the root path of any added subtrees. */
>> +  if (*added_abspaths == NULL)
>> +    {
>> +      /* The first added path is always a root. */
>> +      *added_abspaths = apr_hash_make(result_pool);
>> +    }
>> +  else
>> +    {
>> +      const char *added_path_parent =
>> +        svn_dirent_dirname(added_abspath, scratch_pool);
>> +      apr_pool_t *subpool = svn_pool_create(scratch_pool);
>
> If you flip the order of these two, then ADDED_PATH_PARENT can go into
> the subpool.

Quite right, done in r1332290.

Paul

>>...
>
> Cheers,
> -g

Re: svn commit: r1331003 - /subversion/trunk/subversion/libsvn_client/merge.c

Posted by Greg Stein <gs...@gmail.com>.
On Thu, Apr 26, 2012 at 14:07,  <pb...@apache.org> wrote:
>...
> +++ subversion/trunk/subversion/libsvn_client/merge.c Thu Apr 26 18:07:25 2012
>...
> +update_the_list_of_added_subtrees(const char *target_abspath,
> +                                  const char *added_abspath,
> +                                  apr_hash_t **added_abspaths,
> +                                  apr_pool_t *result_pool,
> +                                  apr_pool_t *scratch_pool)
> +{
> +  svn_boolean_t root_of_added_subtree = TRUE;
> +
> +  /* Stash the root path of any added subtrees. */
> +  if (*added_abspaths == NULL)
> +    {
> +      /* The first added path is always a root. */
> +      *added_abspaths = apr_hash_make(result_pool);
> +    }
> +  else
> +    {
> +      const char *added_path_parent =
> +        svn_dirent_dirname(added_abspath, scratch_pool);
> +      apr_pool_t *subpool = svn_pool_create(scratch_pool);

If you flip the order of these two, then ADDED_PATH_PARENT can go into
the subpool.

>...

Cheers,
-g