summaryrefslogtreecommitdiff
path: root/subversion/include/svn_mergeinfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/include/svn_mergeinfo.h')
-rw-r--r--subversion/include/svn_mergeinfo.h118
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;