Author: pburba
Date: Thu Jul 21 15:37:21 2011
New Revision: 1149228
URL: http://svn.apache.org/viewvc?rev=1149228&view=rev
Log:
Stop creating invalid "backwards" rangelists; the svn_rangelist_* APIs
require rangelists ordered oldest to youngest.
Follow-up to fix for issue #3966 'log_noop_revs is far too slow' in r1149105.
* subversion/libsvn_client/merge.c
(rangelist_merge_revision): Add some more explanation for the purpose of
this peculiar helper. Tweak to expect incoming revision that is younger
than any in the list, rather than older, thus creating a valid rangelist.
(remove_noop_subtree_ranges): Make svn_ra_get_log2 request revs from
oldest to youngest so the svn_log_entry_receiver_t callback log_noop_revs
and its helper rangelist_merge_revision get the revisions in that order.
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=1149228&r1=1149227&r2=1149228&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Thu Jul 21 15:37:21 2011
@@ -7876,10 +7876,16 @@ typedef struct log_noop_baton_t
apr_pool_t *pool;
} log_noop_baton_t;
-/* Helper for log_noop_revs, this is not a general purpose rangelist
- merge. Merge the single revision range REVISION-1 to REVISION into
- RANGELIST. The existing ranges in RANGELIST must be ordered from
- highest/youngest to lowest/oldest. */
+/* Helper for log_noop_revs: Merge a svn_merge_range_t representation of
+ REVISION into RANGELIST. New elements added to rangelist are allocated
+ in RESULT_POOL.
+
+ This is *not* a general purpose rangelist merge but a special replacement
+ for svn_rangelist_merge when REVISION is guaranteed to be younger than any
+ element in RANGELIST. svn_rangelist_merge is O(n) worst-case (i.e. when
+ all the ranges in output rangelist are older than the incoming changes).
+ This turns the special case of a single incoming younger range into O(1).
+ */
static svn_error_t *
rangelist_merge_revision(apr_array_header_t *rangelist,
svn_revnum_t revision,
@@ -7890,9 +7896,11 @@ rangelist_merge_revision(apr_array_heade
{
svn_merge_range_t *range = APR_ARRAY_IDX(rangelist, rangelist->nelts - 1,
svn_merge_range_t *);
- if (range->start == revision)
+ if (range->end == revision - 1)
{
- range->start = revision - 1;
+ /* REVISION is adjacent to the youngest range in RANGELIST
+ so we can simply expand that range to encompass REVISION. */
+ range->end = revision;
return SVN_NO_ERROR;
}
}
@@ -8155,8 +8163,8 @@ remove_noop_subtree_ranges(const char *u
APR_ARRAY_PUSH(log_targets, const char *) = "";
- SVN_ERR(svn_ra_get_log2(ra_session, log_targets, youngest_gap_rev->end,
- oldest_gap_rev->start + 1, 0, TRUE, TRUE, FALSE,
+ SVN_ERR(svn_ra_get_log2(ra_session, log_targets, oldest_gap_rev->start + 1,
+ youngest_gap_rev->end, 0, TRUE, TRUE, FALSE,
apr_array_make(scratch_pool, 0,
sizeof(const char *)),
log_noop_revs, &log_gap_baton, scratch_pool));