Author: julianfoad
Date: Thu Oct 13 11:02:53 2011
New Revision: 1182778

URL: http://svn.apache.org/viewvc?rev=1182778&view=rev
Log:
Factor out a rangelist calculation.

* subversion/include/private/svn_mergeinfo_private.h,
  subversion/libsvn_subr/mergeinfo.c
  (svn_rangelist__merge_many): New function, factored out ...

* subversion/libsvn_client/merge.c
  (find_gaps_in_merge_source_history): ... from here ...
  (find_unsynced_ranges): ... and here ...

* subversion/libsvn_client/mergeinfo.c
  (svn_client_mergeinfo_log): ... and three or four places in here,
    depending on how you count places.

Modified:
    subversion/trunk/subversion/include/private/svn_mergeinfo_private.h
    subversion/trunk/subversion/libsvn_client/merge.c
    subversion/trunk/subversion/libsvn_client/mergeinfo.c
    subversion/trunk/subversion/libsvn_subr/mergeinfo.c

Modified: subversion/trunk/subversion/include/private/svn_mergeinfo_private.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_mergeinfo_private.h?rev=1182778&r1=1182777&r2=1182778&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_mergeinfo_private.h 
(original)
+++ subversion/trunk/subversion/include/private/svn_mergeinfo_private.h Thu Oct 
13 11:02:53 2011
@@ -252,6 +252,17 @@ svn_mergeinfo__mergeinfo_from_segments(s
                                        const apr_array_header_t *segments,
                                        apr_pool_t *pool);
 
+/* Merge every rangelist in MERGEINFO into the given MERGED_RANGELIST,
+ * ignoring the source paths of MERGEINFO. MERGED_RANGELIST may
+ * initially be empty. New elements added to @a rangelist are allocated in
+ * @a result_pool. See svn_rangelist_merge2() for details of inheritability
+ * etc. */
+svn_error_t *
+svn_rangelist__merge_many(apr_array_header_t *merged_rangelist,
+                          svn_mergeinfo_t mergeinfo,
+                          apr_pool_t *result_pool,
+                          apr_pool_t *scratch_pool);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1182778&r1=1182777&r2=1182778&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Thu Oct 13 11:02:53 2011
@@ -4142,21 +4142,10 @@ find_gaps_in_merge_source_history(svn_re
       apr_array_header_t *implicit_rangelist =
         apr_array_make(scratch_pool, 2, sizeof(svn_merge_range_t *));
       apr_array_header_t *gap_rangelist;
-      apr_hash_index_t *hi;
-      apr_pool_t *iterpool = svn_pool_create(scratch_pool);
-
-      for (hi = apr_hash_first(scratch_pool, implicit_src_mergeinfo);
-           hi;
-           hi = apr_hash_next(hi))
-        {
-          apr_array_header_t *value = svn__apr_hash_index_val(hi);
-
-          svn_pool_clear(iterpool);
 
-          SVN_ERR(svn_rangelist_merge2(implicit_rangelist, value,
-                                       scratch_pool, iterpool));
-        }
-      svn_pool_destroy(iterpool);
+      SVN_ERR(svn_rangelist__merge_many(implicit_rangelist,
+                                        implicit_src_mergeinfo,
+                                        scratch_pool, scratch_pool));
       SVN_ERR(svn_rangelist_remove(&gap_rangelist, implicit_rangelist,
                                    requested_rangelist, FALSE,
                                    scratch_pool));
@@ -9969,21 +9958,10 @@ find_unsynced_ranges(const char *source_
            hi_catalog = apr_hash_next(hi_catalog))
         {
           svn_mergeinfo_t mergeinfo = svn__apr_hash_index_val(hi_catalog);
-          apr_hash_index_t *hi_mergeinfo;
-          apr_pool_t *iterpool = svn_pool_create(scratch_pool);
-
-          for (hi_mergeinfo = apr_hash_first(scratch_pool, mergeinfo);
-               hi_mergeinfo;
-               hi_mergeinfo = apr_hash_next(hi_mergeinfo))
-            {
-              apr_array_header_t *rangelist =
-                svn__apr_hash_index_val(hi_mergeinfo);
 
-              svn_pool_clear(iterpool);
-              SVN_ERR(svn_rangelist_merge2(potentially_unmerged_ranges,
-                                           rangelist, scratch_pool, iterpool));
-            }
-          svn_pool_destroy(iterpool);
+          SVN_ERR(svn_rangelist__merge_many(potentially_unmerged_ranges,
+                                            mergeinfo,
+                                            scratch_pool, scratch_pool));
         }
     }
 

Modified: subversion/trunk/subversion/libsvn_client/mergeinfo.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/mergeinfo.c?rev=1182778&r1=1182777&r2=1182778&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/mergeinfo.c (original)
+++ subversion/trunk/subversion/libsvn_client/mergeinfo.c Thu Oct 13 11:02:53 
2011
@@ -1937,23 +1937,9 @@ svn_client_mergeinfo_log(svn_boolean_t f
 
       /* Keep track of all ranges partially merged to any and all
          subtrees. */
-      if (apr_hash_count(merged_noninheritable))
-        {
-          apr_pool_t *iterpool2 = svn_pool_create(iterpool);
-
-          for (hi = apr_hash_first(iterpool, merged_noninheritable);
-               hi;
-               hi = apr_hash_next(hi))
-            {
-              apr_array_header_t *list = svn__apr_hash_index_val(hi);
-              svn_pool_clear(iterpool2);
-              SVN_ERR(svn_rangelist_merge2(
-                master_noninheritable_rangelist,
-                svn_rangelist_dup(list, scratch_pool),
-                scratch_pool, iterpool2));
-            }
-          svn_pool_destroy(iterpool2);
-        }
+      SVN_ERR(svn_rangelist__merge_many(master_noninheritable_rangelist,
+                                        merged_noninheritable,
+                                        scratch_pool, iterpool));
 
       /* Find the intersection of the inheritable part of TGT_MERGEINFO
          and SOURCE_HISTORY. */
@@ -1970,25 +1956,11 @@ svn_client_mergeinfo_log(svn_boolean_t f
              to SUBTREE_PATH. */
           apr_array_header_t *subtree_merged_rangelist =
             apr_array_make(scratch_pool, 1, sizeof(svn_merge_range_t *));
-          apr_pool_t *iterpool2 = svn_pool_create(iterpool);
 
-          for (hi = apr_hash_first(iterpool, merged);
-               hi;
-               hi = apr_hash_next(hi))
-            {
-              apr_array_header_t *list = svn__apr_hash_index_val(hi);
-
-              svn_pool_clear(iterpool2);
-              SVN_ERR(svn_rangelist_merge2(master_inheritable_rangelist,
-                                           svn_rangelist_dup(list,
-                                                             scratch_pool),
-                                           scratch_pool, iterpool2));
-              SVN_ERR(svn_rangelist_merge2(subtree_merged_rangelist,
-                                           svn_rangelist_dup(list,
-                                                            scratch_pool),
-                                           scratch_pool, iterpool2));
-            }
-          svn_pool_destroy(iterpool2);
+          SVN_ERR(svn_rangelist__merge_many(master_inheritable_rangelist,
+                                            merged, scratch_pool, iterpool));
+          SVN_ERR(svn_rangelist__merge_many(subtree_merged_rangelist,
+                                            merged, scratch_pool, iterpool));
 
           apr_hash_set(inheritable_subtree_merges,
                        apr_pstrdup(scratch_pool, subtree_path),
@@ -2062,18 +2034,9 @@ svn_client_mergeinfo_log(svn_boolean_t f
       apr_array_header_t *source_master_rangelist =
         apr_array_make(scratch_pool, 1, sizeof(svn_merge_range_t *));
 
-      for (hi = apr_hash_first(scratch_pool, source_history);
-           hi;
-           hi = apr_hash_next(hi))
-        {
-          apr_array_header_t *subtree_merged_rangelist =
-            svn__apr_hash_index_val(hi);
-
-          svn_pool_clear(iterpool);
-          SVN_ERR(svn_rangelist_merge2(source_master_rangelist,
-                                       subtree_merged_rangelist,
-                                       scratch_pool, iterpool));
-        }
+      SVN_ERR(svn_rangelist__merge_many(source_master_rangelist,
+                                        source_history,
+                                        scratch_pool, scratch_pool));
 
       /* From what might be eligible subtract what we know is partially merged
          and then merge that back. */

Modified: subversion/trunk/subversion/libsvn_subr/mergeinfo.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/mergeinfo.c?rev=1182778&r1=1182777&r2=1182778&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/mergeinfo.c (original)
+++ subversion/trunk/subversion/libsvn_subr/mergeinfo.c Thu Oct 13 11:02:53 2011
@@ -2608,6 +2608,33 @@ svn_mergeinfo__mergeinfo_from_segments(s
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_rangelist__merge_many(apr_array_header_t *merged_rangelist,
+                          svn_mergeinfo_t merge_history,
+                          apr_pool_t *result_pool,
+                          apr_pool_t *scratch_pool)
+{
+  if (apr_hash_count(merge_history))
+    {
+      apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+      apr_hash_index_t *hi;
+
+      for (hi = apr_hash_first(scratch_pool, merge_history);
+           hi;
+           hi = apr_hash_next(hi))
+        {
+          apr_array_header_t *subtree_rangelist = svn__apr_hash_index_val(hi);
+
+          svn_pool_clear(iterpool);
+          SVN_ERR(svn_rangelist_merge2(merged_rangelist, subtree_rangelist,
+                                       result_pool, iterpool));
+        }
+      svn_pool_destroy(iterpool);
+    }
+  return SVN_NO_ERROR;
+}
+
+
 const char *
 svn_inheritance_to_word(svn_mergeinfo_inheritance_t inherit)
 {


Reply via email to