You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2011/07/21 13:59:49 UTC
svn commit: r1149135 - /subversion/trunk/subversion/libsvn_client/merge.c
Author: julianfoad
Date: Thu Jul 21 11:59:48 2011
New Revision: 1149135
URL: http://svn.apache.org/viewvc?rev=1149135&view=rev
Log:
Factor out some functionality.
* subversion/libsvn_client/merge.c
(rangelist_intersect_range): New function.
(adjust_deleted_subtree_ranges): Use it in four places. Rename and
re-scope and remove redundant initialization of a variable.
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=1149135&r1=1149134&r2=1149135&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Thu Jul 21 11:59:48 2011
@@ -2722,6 +2722,43 @@ notification_receiver(void *baton, const
(*notify_b->wrapped_func)(notify_b->wrapped_baton, notify, pool);
}
+/* Set *OUT_RANGELIST to the intersection of IN_RANGELIST with the simple
+ * (inheritable) revision range REV1:REV2, according to CONSIDER_INHERITANCE.
+ * If REV1 is equal to REV2, the result is an empty rangelist, otherwise
+ * REV1 must be less than REV2.
+ *
+ * Note: If CONSIDER_INHERITANCE is FALSE, the effect is to treat any non-
+ * inheritable input ranges as if they were inheritable. If it is TRUE, the
+ * effect is to discard any non-inheritable input ranges. Therefore the
+ * ranges in *OUT_RANGELIST will always be inheritable. */
+static svn_error_t *
+rangelist_intersect_range(apr_array_header_t **out_rangelist,
+ const apr_array_header_t *in_rangelist,
+ svn_revnum_t rev1,
+ svn_revnum_t rev2,
+ svn_boolean_t consider_inheritance,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR_ASSERT(rev1 <= rev2);
+
+ if (rev1 < rev2)
+ {
+ apr_array_header_t *simple_rangelist =
+ svn_rangelist__initialize(rev1, rev2, TRUE, scratch_pool);
+
+ SVN_ERR(svn_rangelist_intersect(out_rangelist,
+ simple_rangelist, in_rangelist,
+ consider_inheritance, result_pool));
+ }
+ else
+ {
+ *out_rangelist = apr_array_make(result_pool, 0,
+ sizeof(svn_merge_range_t *));
+ }
+ return SVN_NO_ERROR;
+}
+
/* Helper for fix_deleted_subtree_ranges(). Like fix_deleted_subtree_ranges()
this function should only be called when honoring mergeinfo.
@@ -2820,7 +2857,6 @@ adjust_deleted_subtree_ranges(svn_client
svn_revnum_t younger_rev = is_rollback ? revision1 : revision2;
svn_revnum_t peg_rev = younger_rev;
svn_revnum_t older_rev = is_rollback ? revision2 : revision1;
- svn_revnum_t revision_primary_url_deleted = SVN_INVALID_REVNUM;
apr_array_header_t *segments;
const char *rel_source_path;
const char *session_url;
@@ -2875,20 +2911,20 @@ adjust_deleted_subtree_ranges(svn_client
}
else
{
- apr_array_header_t *exists_rangelist, *deleted_rangelist;
+ apr_array_header_t *deleted_rangelist;
+ svn_revnum_t rev_primary_url_deleted;
/* PRIMARY_URL@older_rev exists, so it was deleted at some
revision prior to peg_rev, find that revision. */
SVN_ERR(svn_ra_get_deleted_rev(ra_session, rel_source_path,
older_rev, younger_rev,
- &revision_primary_url_deleted,
+ &rev_primary_url_deleted,
scratch_pool));
/* PRIMARY_URL@older_rev exists and PRIMARY_URL@peg_rev doesn't,
so svn_ra_get_deleted_rev() should always find the revision
PRIMARY_URL@older_rev was deleted. */
- SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(
- revision_primary_url_deleted));
+ SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(rev_primary_url_deleted));
/* If this is a reverse merge reorder CHILD->REMAINING_RANGES and
PARENT->REMAINING_RANGES so both will work with the
@@ -2906,41 +2942,22 @@ adjust_deleted_subtree_ranges(svn_client
/* Find the intersection of CHILD->REMAINING_RANGES with the
range over which PRIMARY_URL@older_rev exists (ending at
the youngest revision at which it still exists). */
- if (revision_primary_url_deleted - 1 > older_rev)
- {
- /* It was not deleted immediately after OLDER_REV, so
- it has some relevant changes. */
- exists_rangelist =
- svn_rangelist__initialize(older_rev,
- revision_primary_url_deleted - 1,
- TRUE, scratch_pool);
- SVN_ERR(svn_rangelist_intersect(&(child->remaining_ranges),
- exists_rangelist,
- child->remaining_ranges,
- FALSE, scratch_pool));
- }
- else
- {
- /* It was deleted immediately after the OLDER rev, so
- it has no relevant changes. */
- child->remaining_ranges
- = apr_array_make(scratch_pool, 0,
- sizeof(svn_merge_range_t *));
- }
-
- /* Find the intersection of PARENT->REMAINING_RANGES with the
- range beginning when PRIMARY_URL@older_rev was deleted
- until younger_rev.
- Finally merge this rangelist with the rangelist above and
- store the result in CHILD->REMANING_RANGES. */
- deleted_rangelist =
- svn_rangelist__initialize(revision_primary_url_deleted - 1,
- peg_rev, TRUE, scratch_pool);
- SVN_ERR(svn_rangelist_intersect(&deleted_rangelist,
- deleted_rangelist,
- parent->remaining_ranges,
- FALSE, scratch_pool));
-
+ SVN_ERR(rangelist_intersect_range(&child->remaining_ranges,
+ child->remaining_ranges,
+ older_rev,
+ rev_primary_url_deleted - 1,
+ FALSE,
+ scratch_pool, scratch_pool));
+
+ /* Merge into CHILD->REMANING_RANGES the intersection of
+ PARENT->REMAINING_RANGES with the range beginning when
+ PRIMARY_URL@older_rev was deleted until younger_rev. */
+ SVN_ERR(rangelist_intersect_range(&deleted_rangelist,
+ parent->remaining_ranges,
+ rev_primary_url_deleted - 1,
+ peg_rev,
+ FALSE,
+ scratch_pool, scratch_pool));
SVN_ERR(svn_rangelist_merge(&(child->remaining_ranges),
deleted_rangelist, scratch_pool));
@@ -2962,7 +2979,7 @@ adjust_deleted_subtree_ranges(svn_client
}
else /* PRIMARY_URL@peg_rev exists. */
{
- apr_array_header_t *exists_rangelist, *non_existent_rangelist;
+ apr_array_header_t *non_existent_rangelist;
svn_location_segment_t *segment =
APR_ARRAY_IDX(segments, (segments->nelts - 1),
svn_location_segment_t *);
@@ -2993,23 +3010,18 @@ adjust_deleted_subtree_ranges(svn_client
exists. Since segment doesn't span older_rev:peg_rev we know
PRIMARY_URL@peg_rev didn't come into existence until
segment->range_start + 1. */
- exists_rangelist = svn_rangelist__initialize(segment->range_start,
- peg_rev, TRUE,
- scratch_pool);
- SVN_ERR(svn_rangelist_intersect(&(child->remaining_ranges),
- exists_rangelist,
- child->remaining_ranges,
- FALSE, scratch_pool));
-
- /* Merge into CHILD->REMANING_RANGES the intersection of the range before
- PRIMARY_URL@peg_rev came into existence and PARENT->REMAINING_RANGES. */
- non_existent_rangelist = svn_rangelist__initialize(older_rev,
- segment->range_start,
- TRUE, scratch_pool);
- SVN_ERR(svn_rangelist_intersect(&non_existent_rangelist,
- non_existent_rangelist,
- parent->remaining_ranges,
- FALSE, scratch_pool));
+ SVN_ERR(rangelist_intersect_range(&child->remaining_ranges,
+ child->remaining_ranges,
+ segment->range_start, peg_rev,
+ FALSE, scratch_pool, scratch_pool));
+
+ /* Merge into CHILD->REMANING_RANGES the intersection of
+ PARENT->REMAINING_RANGES with the range before PRIMARY_URL@peg_rev
+ came into existence. */
+ SVN_ERR(rangelist_intersect_range(&non_existent_rangelist,
+ parent->remaining_ranges,
+ older_rev, segment->range_start,
+ FALSE, scratch_pool, scratch_pool));
SVN_ERR(svn_rangelist_merge(&(child->remaining_ranges),
non_existent_rangelist, scratch_pool));