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)
{