diff options
Diffstat (limited to 'subversion/include/svn_mergeinfo.h')
-rw-r--r-- | subversion/include/svn_mergeinfo.h | 118 |
1 files changed, 88 insertions, 30 deletions
diff --git a/subversion/include/svn_mergeinfo.h b/subversion/include/svn_mergeinfo.h index 77dd399..ada70a2 100644 --- a/subversion/include/svn_mergeinfo.h +++ b/subversion/include/svn_mergeinfo.h @@ -113,8 +113,8 @@ extern "C" { * * (a) Strings (@c svn_string_t *) containing "unparsed mergeinfo". * - * (b) A "rangelist". An array (@c apr_array_header_t *) of non-overlapping - * merge ranges (@c svn_merge_range_t *), sorted as said by + * (b) @c svn_rangelist_t, called a "rangelist". An array of non- + * overlapping merge ranges (@c svn_merge_range_t *), sorted as said by * @c svn_sort_compare_ranges(). An empty range list is represented by * an empty array. Unless specifically noted otherwise, all APIs require * rangelists that describe only forward ranges, i.e. the range's start @@ -139,6 +139,7 @@ extern "C" { * else, such as an RA session root. */ +typedef apr_array_header_t svn_rangelist_t; typedef apr_hash_t *svn_mergeinfo_t; typedef apr_hash_t *svn_mergeinfo_catalog_t; @@ -166,8 +167,10 @@ svn_mergeinfo_parse(svn_mergeinfo_t *mergeinfo, const char *input, apr_pool_t *pool); /** Calculate the delta between two mergeinfos, @a mergefrom and @a mergeto - * (which may be @c NULL), and place the result in @a *deleted and @a - * *added (neither output argument may be @c NULL). + * (either or both of which may be @c NULL meaning an empty mergeinfo). + * Place the result in @a *deleted and @a *added (neither output argument + * may be @c NULL), both allocated in @a result_pool. The resulting + * @a *deleted and @a *added will not be null. * * @a consider_inheritance determines how the rangelists in the two * hashes are compared for equality. If @a consider_inheritance is FALSE, @@ -184,8 +187,21 @@ svn_mergeinfo_parse(svn_mergeinfo_t *mergeinfo, const char *input, * '/trunk: 1,3-4*,5' == '/trunk: 1,3-4*,5' * '/trunk: 1,3-4,5' == '/trunk: 1,3-4,5' * + * @since New in 1.8. + */ +svn_error_t * +svn_mergeinfo_diff2(svn_mergeinfo_t *deleted, svn_mergeinfo_t *added, + svn_mergeinfo_t mergefrom, svn_mergeinfo_t mergeto, + svn_boolean_t consider_inheritance, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + +/** Similar to svn_mergeinfo_diff2(), but users only one pool. + * + * @deprecated Provided for backward compatibility with the 1.7 API. * @since New in 1.5. */ +SVN_DEPRECATED svn_error_t * svn_mergeinfo_diff(svn_mergeinfo_t *deleted, svn_mergeinfo_t *added, svn_mergeinfo_t mergefrom, svn_mergeinfo_t mergeto, @@ -195,6 +211,10 @@ svn_mergeinfo_diff(svn_mergeinfo_t *deleted, svn_mergeinfo_t *added, /** Merge a shallow copy of one mergeinfo, @a changes, into another mergeinfo * @a mergeinfo. * + * Rangelists for merge source paths common to @a changes and @a mergeinfo may + * result in new rangelists; these are allocated in @a result_pool. + * Temporary allocations are made in @a scratch_pool. + * * When intersecting rangelists for a path are merged, the inheritability of * the resulting svn_merge_range_t depends on the inheritability of the * operands. If two non-inheritable ranges are merged the result is always @@ -203,10 +223,22 @@ svn_mergeinfo_diff(svn_mergeinfo_t *deleted, svn_mergeinfo_t *added, * e.g. '/A: 1,3-4' merged with '/A: 1,3,4*,5' --> '/A: 1,3-5' * '/A: 1,3-4*' merged with '/A: 1,3,4*,5' --> '/A: 1,3,4*,5' * - * @since New in 1.5. + * @since New in 1.8. + */ +svn_error_t * +svn_mergeinfo_merge2(svn_mergeinfo_t mergeinfo, + svn_mergeinfo_t changes, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + +/** Like svn_mergeinfo_merge2, but uses only one pool. + * + * @deprecated Provided for backward compatibility with the 1.5 API. */ +SVN_DEPRECATED svn_error_t * -svn_mergeinfo_merge(svn_mergeinfo_t mergeinfo, svn_mergeinfo_t changes, +svn_mergeinfo_merge(svn_mergeinfo_t mergeinfo, + svn_mergeinfo_t changes, apr_pool_t *pool); /** Combine one mergeinfo catalog, @a changes_catalog, into another mergeinfo @@ -264,29 +296,54 @@ svn_mergeinfo_remove2(svn_mergeinfo_t *mergeinfo, * @since New in 1.5. */ svn_error_t * -svn_rangelist_diff(apr_array_header_t **deleted, apr_array_header_t **added, - const apr_array_header_t *from, const apr_array_header_t *to, +svn_rangelist_diff(svn_rangelist_t **deleted, svn_rangelist_t **added, + const svn_rangelist_t *from, const svn_rangelist_t *to, svn_boolean_t consider_inheritance, apr_pool_t *pool); /** Merge two rangelists consisting of @c svn_merge_range_t * - * elements, @a *rangelist and @a changes, placing the results in - * @a *rangelist. Either rangelist may be empty. + * elements, @a rangelist and @a changes, placing the results in + * @a rangelist. New elements added to @a rangelist are allocated + * in @a result_pool. Either rangelist may be empty. * * When intersecting rangelists are merged, the inheritability of * the resulting svn_merge_range_t depends on the inheritability of the * operands: see svn_mergeinfo_merge(). * - * Note: @a *rangelist and @a changes must be sorted as said by @c - * svn_sort_compare_ranges(). @a *rangelist is guaranteed to remain + * Note: @a rangelist and @a changes must be sorted as said by @c + * svn_sort_compare_ranges(). @a rangelist is guaranteed to remain * in sorted order and be compacted to the minimal number of ranges * needed to represent the merged result. * + * If the original rangelist contains non-collapsed adjacent ranges, + * the final result is not guaranteed to be compacted either. + * + * Use @a scratch_pool for temporary allocations. + * + * @since New in 1.8. + */ +svn_error_t * +svn_rangelist_merge2(svn_rangelist_t *rangelist, + const svn_rangelist_t *changes, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + +/** Like svn_rangelist_merge2(), but with @a rangelist as an input/output + * argument. This function always allocates a new rangelist in @a pool and + * returns its result in @a *rangelist. It does not modify @a *rangelist + * in place. If not used carefully, this function can use up a lot of memory + * if called in a loop. + * + * It performs an extra adjacent range compaction round to make sure non + * collapsed input ranges are compacted in the result. + * * @since New in 1.5. + * @deprecated Provided for backward compatibility with the 1.7 API. */ +SVN_DEPRECATED svn_error_t * -svn_rangelist_merge(apr_array_header_t **rangelist, - const apr_array_header_t *changes, +svn_rangelist_merge(svn_rangelist_t **rangelist, + const svn_rangelist_t *changes, apr_pool_t *pool); /** Removes @a eraser (the subtrahend) from @a whiteboard (the @@ -303,8 +360,8 @@ svn_rangelist_merge(apr_array_header_t **rangelist, * @since New in 1.5. */ svn_error_t * -svn_rangelist_remove(apr_array_header_t **output, const apr_array_header_t *eraser, - const apr_array_header_t *whiteboard, +svn_rangelist_remove(svn_rangelist_t **output, const svn_rangelist_t *eraser, + const svn_rangelist_t *whiteboard, svn_boolean_t consider_inheritance, apr_pool_t *pool); @@ -345,7 +402,7 @@ svn_mergeinfo_intersect(svn_mergeinfo_t *mergeinfo, * @a consider_inheritance determines how to account for the inheritability * of the two rangelist's ranges when calculating the intersection, * @see svn_mergeinfo_diff(). If @a consider_inheritance is FALSE then - * ranges with different inheritance can intersect, but the the resulting + * ranges with different inheritance can intersect, but the resulting * @a *rangelist is non-inheritable only if the corresponding ranges from * both @a rangelist1 and @a rangelist2 are non-inheritable. * If @a consider_inheritance is TRUE, then ranges with different @@ -357,9 +414,9 @@ svn_mergeinfo_intersect(svn_mergeinfo_t *mergeinfo, * @since New in 1.5. */ svn_error_t * -svn_rangelist_intersect(apr_array_header_t **rangelist, - const apr_array_header_t *rangelist1, - const apr_array_header_t *rangelist2, +svn_rangelist_intersect(svn_rangelist_t **rangelist, + const svn_rangelist_t *rangelist1, + const svn_rangelist_t *rangelist2, svn_boolean_t consider_inheritance, apr_pool_t *pool); @@ -374,7 +431,7 @@ svn_rangelist_intersect(apr_array_header_t **rangelist, * @since New in 1.5. */ svn_error_t * -svn_rangelist_reverse(apr_array_header_t *rangelist, apr_pool_t *pool); +svn_rangelist_reverse(svn_rangelist_t *rangelist, apr_pool_t *pool); /** Take an array of svn_merge_range_t *'s in @a rangelist, and convert it * back to a text format rangelist in @a output. If @a rangelist contains @@ -384,7 +441,7 @@ svn_rangelist_reverse(apr_array_header_t *rangelist, apr_pool_t *pool); */ svn_error_t * svn_rangelist_to_string(svn_string_t **output, - const apr_array_header_t *rangelist, + const svn_rangelist_t *rangelist, apr_pool_t *pool); /** Return a deep copy of @c svn_merge_range_t *'s in @a rangelist excluding @@ -399,8 +456,8 @@ svn_rangelist_to_string(svn_string_t **output, * @since New in 1.7. */ svn_error_t * -svn_rangelist_inheritable2(apr_array_header_t **inheritable_rangelist, - const apr_array_header_t *rangelist, +svn_rangelist_inheritable2(svn_rangelist_t **inheritable_rangelist, + const svn_rangelist_t *rangelist, svn_revnum_t start, svn_revnum_t end, svn_boolean_t inheritable, @@ -414,8 +471,8 @@ svn_rangelist_inheritable2(apr_array_header_t **inheritable_rangelist, */ SVN_DEPRECATED svn_error_t * -svn_rangelist_inheritable(apr_array_header_t **inheritable_rangelist, - const apr_array_header_t *rangelist, +svn_rangelist_inheritable(svn_rangelist_t **inheritable_rangelist, + const svn_rangelist_t *rangelist, svn_revnum_t start, svn_revnum_t end, apr_pool_t *pool); @@ -502,8 +559,8 @@ svn_mergeinfo_dup(svn_mergeinfo_t mergeinfo, apr_pool_t *pool); * * @since New in 1.5. */ -apr_array_header_t * -svn_rangelist_dup(const apr_array_header_t *rangelist, apr_pool_t *pool); +svn_rangelist_t * +svn_rangelist_dup(const svn_rangelist_t *rangelist, apr_pool_t *pool); /** @@ -521,8 +578,9 @@ typedef enum svn_mergeinfo_inheritance_t ancestor. */ svn_mergeinfo_inherited, - /** Mergeinfo on target's nearest (path-wise, not history-wise) - ancestor, regardless of whether target has explicit mergeinfo. */ + /** Mergeinfo inherited from a target's nearest (path-wise, not + history-wise) ancestor, regardless of whether target has explicit + mergeinfo. */ svn_mergeinfo_nearest_ancestor } svn_mergeinfo_inheritance_t; |