#include <apr_pools.h>
#include <apr_tables.h>
#include <apr_hash.h>
#include "svn_error.h"
Go to the source code of this file.
Typedefs | |
| typedef apr_hash_t * | svn_mergeinfo_t |
| Terminology for data structures that contain mergeinfo. | |
| typedef apr_hash_t * | svn_mergeinfo_catalog_t |
Enumerations | |
| enum | svn_mergeinfo_inheritance_t { svn_mergeinfo_explicit, svn_mergeinfo_inherited, svn_mergeinfo_nearest_ancestor } |
| The three ways to request mergeinfo affecting a given path. More... | |
Functions | |
| svn_error_t * | svn_mergeinfo_parse (svn_mergeinfo_t *mergeinfo, const char *input, apr_pool_t *pool) |
| Parse the mergeinfo from input into *mergeinfo. | |
| svn_error_t * | svn_mergeinfo_diff (svn_mergeinfo_t *deleted, svn_mergeinfo_t *added, svn_mergeinfo_t mergefrom, svn_mergeinfo_t mergeto, svn_boolean_t consider_inheritance, apr_pool_t *pool) |
Calculate the delta between two mergeinfos, mergefrom and mergeto (which may be NULL), and place the result in *deleted and *added (neither output argument may be NULL). | |
| svn_error_t * | svn_mergeinfo_merge (svn_mergeinfo_t mergeinfo, svn_mergeinfo_t changes, apr_pool_t *pool) |
| Merge one mergeinfo, changes, into another mergeinfo mergeinfo. | |
| svn_error_t * | svn_mergeinfo_remove (svn_mergeinfo_t *mergeinfo, svn_mergeinfo_t eraser, svn_mergeinfo_t whiteboard, apr_pool_t *pool) |
| Removes eraser (the subtrahend) from whiteboard (the minuend), and places the resulting difference in *mergeinfo. | |
| svn_error_t * | svn_rangelist_diff (apr_array_header_t **deleted, apr_array_header_t **added, apr_array_header_t *from, apr_array_header_t *to, svn_boolean_t consider_inheritance, apr_pool_t *pool) |
Calculate the delta between two rangelists consisting of svn_merge_range_t * elements (sorted in ascending order), from and to, and place the result in deleted and added (neither output argument will ever be NULL). | |
| svn_error_t * | svn_rangelist_merge (apr_array_header_t **rangelist, apr_array_header_t *changes, apr_pool_t *pool) |
Merge two rangelists consisting of svn_merge_range_t * elements, *rangelist and changes, placing the results in *rangelist. | |
| svn_error_t * | svn_rangelist_remove (apr_array_header_t **output, apr_array_header_t *eraser, apr_array_header_t *whiteboard, svn_boolean_t consider_inheritance, apr_pool_t *pool) |
| Removes eraser (the subtrahend) from whiteboard (the minuend), and places the resulting difference in output. | |
| svn_error_t * | svn_mergeinfo_intersect (svn_mergeinfo_t *mergeinfo, svn_mergeinfo_t mergeinfo1, svn_mergeinfo_t mergeinfo2, apr_pool_t *pool) |
| Find the intersection of two mergeinfos, mergeinfo1 and mergeinfo2, and place the result in *mergeinfo, which is (deeply) allocated in pool. | |
| svn_error_t * | svn_rangelist_intersect (apr_array_header_t **rangelist, apr_array_header_t *rangelist1, apr_array_header_t *rangelist2, svn_boolean_t consider_inheritance, apr_pool_t *pool) |
Find the intersection of two rangelists consisting of svn_merge_range_t * elements, rangelist1 and rangelist2, and place the result in *rangelist (which is never NULL). | |
| svn_error_t * | svn_rangelist_reverse (apr_array_header_t *rangelist, apr_pool_t *pool) |
Reverse rangelist, and the start and end fields of each range in rangelist, in place. | |
| svn_error_t * | svn_rangelist_to_string (svn_string_t **output, const apr_array_header_t *rangelist, apr_pool_t *pool) |
| Take an array of svn_merge_range_t *'s in rangelist, and convert it back to a text format rangelist in output. | |
| svn_error_t * | svn_rangelist_inheritable (apr_array_header_t **inheritable_rangelist, apr_array_header_t *rangelist, svn_revnum_t start, svn_revnum_t end, apr_pool_t *pool) |
Return a deep copy of svn_merge_range_t *'s in rangelist excluding all non-inheritable svn_merge_range_t. | |
| svn_error_t * | svn_mergeinfo_inheritable (svn_mergeinfo_t *inheritable_mergeinfo, svn_mergeinfo_t mergeinfo, const char *path, svn_revnum_t start, svn_revnum_t end, apr_pool_t *pool) |
Return a deep copy of mergeinfo, excluding all non-inheritable svn_merge_range_t. | |
| svn_error_t * | svn_mergeinfo_to_string (svn_string_t **output, svn_mergeinfo_t mergeinput, apr_pool_t *pool) |
| Take a mergeinfo in MERGEINPUT, and convert it back to unparsed mergeinfo in *OUTPUT. | |
| svn_error_t * | svn_mergeinfo_sort (svn_mergeinfo_t mergeinfo, apr_pool_t *pool) |
| Take a hash of mergeinfo in mergeinfo, and sort the rangelists associated with each key (in place). | |
| svn_mergeinfo_t | svn_mergeinfo_dup (svn_mergeinfo_t mergeinfo, apr_pool_t *pool) |
| Return a deep copy of mergeinfo, allocated in pool. | |
| apr_array_header_t * | svn_rangelist_dup (apr_array_header_t *rangelist, apr_pool_t *pool) |
| Return a deep copy of rangelist, allocated in pool. | |
| const char * | svn_inheritance_to_word (svn_mergeinfo_inheritance_t inherit) |
| Return a constant string expressing inherit as an English word, i.e., "explicit" (default), "inherited", or "nearest_ancestor". | |
| svn_mergeinfo_inheritance_t | svn_inheritance_from_word (const char *word) |
Return the appropriate svn_mergeinfo_inheritance_t for word. | |
Definition in file svn_mergeinfo.h.
| typedef apr_hash_t* svn_mergeinfo_t |
Terminology for data structures that contain mergeinfo.
Subversion commonly uses several data structures to represent mergeinfo in RAM:
(a) Strings (svn_string_t *) containing "unparsed mergeinfo".
(b) Hashes mapping merge source paths (const char *, starting with slashes) to non-empty arrays (apr_array_header_t *) of merge ranges (svn_merge_range_t *), ordered from smallest revision range to largest. These hashes are called "mergeinfo" and are represented by svn_mergeinfo_t. The sorted arrays are called "rangelists". A NULL hash is used to represent no mergeinfo and an empty hash is used to represent empty mergeinfo.
(c) Hashes mapping paths (const char *, starting with slashes) to svn_mergeinfo_t. These hashes are called "mergeinfo catalogs" and are represented by svn_mergeinfo_catalog_t.
Both svn_mergeinfo_t and svn_mergeinfo_catalog_t are just typedefs for apr_hash_t *; there is no static type-checking, and you still use standard apr_hash_t functions to interact with them.
Note that while the keys of mergeinfos are always relative to the repository root, the keys of a catalog may be relative to something else, such as an RA session root.
Definition at line 133 of file svn_mergeinfo.h.
The three ways to request mergeinfo affecting a given path.
Definition at line 392 of file svn_mergeinfo.h.
| svn_mergeinfo_inheritance_t svn_inheritance_from_word | ( | const char * | word | ) |
Return the appropriate svn_mergeinfo_inheritance_t for word.
word is as returned from svn_inheritance_to_word(). Defaults to svn_mergeinfo_explicit.
| const char* svn_inheritance_to_word | ( | svn_mergeinfo_inheritance_t | inherit | ) |
Return a constant string expressing inherit as an English word, i.e., "explicit" (default), "inherited", or "nearest_ancestor".
The string is not localized, as it may be used for client<->server communications.
| svn_error_t* svn_mergeinfo_diff | ( | svn_mergeinfo_t * | deleted, | |
| svn_mergeinfo_t * | added, | |||
| svn_mergeinfo_t | mergefrom, | |||
| svn_mergeinfo_t | mergeto, | |||
| svn_boolean_t | consider_inheritance, | |||
| apr_pool_t * | pool | |||
| ) |
Calculate the delta between two mergeinfos, mergefrom and mergeto (which may be NULL), and place the result in *deleted and *added (neither output argument may be NULL).
consider_inheritance determines how the rangelists in the two hashes are compared for equality. If consider_inheritance is FALSE, then the start and end revisions of the svn_merge_range_t's being compared are the only factors considered when determining equality.
e.g. '/trunk: 1,3-4*,5' == '/trunk: 1,3-5'
If consider_inheritance is TRUE, then the inheritability of the svn_merge_range_t's is also considered and must be the same for two otherwise identical ranges to be judged equal.
e.g. '/trunk: 1,3-4*,5' != '/trunk: 1,3-5' '/trunk: 1,3-4*,5' == '/trunk: 1,3-4*,5' '/trunk: 1,3-4,5' == '/trunk: 1,3-4,5'
| svn_mergeinfo_t svn_mergeinfo_dup | ( | svn_mergeinfo_t | mergeinfo, | |
| apr_pool_t * | pool | |||
| ) |
Return a deep copy of mergeinfo, allocated in pool.
| svn_error_t* svn_mergeinfo_inheritable | ( | svn_mergeinfo_t * | inheritable_mergeinfo, | |
| svn_mergeinfo_t | mergeinfo, | |||
| const char * | path, | |||
| svn_revnum_t | start, | |||
| svn_revnum_t | end, | |||
| apr_pool_t * | pool | |||
| ) |
Return a deep copy of mergeinfo, excluding all non-inheritable svn_merge_range_t.
If start and end are valid revisions and start is less than or equal to end, then exclude only the non-inheritable revisions that intersect inclusively with the range defined by start and end. If path is not NULL remove non-inheritable ranges only for path. Allocate the copy in pool.
| svn_error_t* svn_mergeinfo_intersect | ( | svn_mergeinfo_t * | mergeinfo, | |
| svn_mergeinfo_t | mergeinfo1, | |||
| svn_mergeinfo_t | mergeinfo2, | |||
| apr_pool_t * | pool | |||
| ) |
Find the intersection of two mergeinfos, mergeinfo1 and mergeinfo2, and place the result in *mergeinfo, which is (deeply) allocated in pool.
| svn_error_t* svn_mergeinfo_merge | ( | svn_mergeinfo_t | mergeinfo, | |
| svn_mergeinfo_t | changes, | |||
| apr_pool_t * | pool | |||
| ) |
Merge one mergeinfo, changes, into another mergeinfo mergeinfo.
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 non-inheritable, in all other cases the resulting range is inheritable.
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'
| svn_error_t* svn_mergeinfo_parse | ( | svn_mergeinfo_t * | mergeinfo, | |
| const char * | input, | |||
| apr_pool_t * | pool | |||
| ) |
Parse the mergeinfo from input into *mergeinfo.
If no mergeinfo is available, return an empty mergeinfo (never NULL). Perform temporary allocations in pool.
If input is not a grammatically correct SVN_PROP_MERGEINFO property, contains overlapping or unordered revision ranges, or revision ranges with a start revision greater than or equal to its end revision, or contains paths mapped to empty revision ranges, then return SVN_ERR_MERGEINFO_PARSE_ERROR.
| svn_error_t* svn_mergeinfo_remove | ( | svn_mergeinfo_t * | mergeinfo, | |
| svn_mergeinfo_t | eraser, | |||
| svn_mergeinfo_t | whiteboard, | |||
| apr_pool_t * | pool | |||
| ) |
Removes eraser (the subtrahend) from whiteboard (the minuend), and places the resulting difference in *mergeinfo.
| svn_error_t* svn_mergeinfo_sort | ( | svn_mergeinfo_t | mergeinfo, | |
| apr_pool_t * | pool | |||
| ) |
Take a hash of mergeinfo in mergeinfo, and sort the rangelists associated with each key (in place).
TODO(miapi): mergeinfos should *always* be sorted. This should be a private function.
| svn_error_t* svn_mergeinfo_to_string | ( | svn_string_t ** | output, | |
| svn_mergeinfo_t | mergeinput, | |||
| apr_pool_t * | pool | |||
| ) |
Take a mergeinfo in MERGEINPUT, and convert it back to unparsed mergeinfo in *OUTPUT.
If INPUT contains no elements, return the empty string.
| svn_error_t* svn_rangelist_diff | ( | apr_array_header_t ** | deleted, | |
| apr_array_header_t ** | added, | |||
| apr_array_header_t * | from, | |||
| apr_array_header_t * | to, | |||
| svn_boolean_t | consider_inheritance, | |||
| apr_pool_t * | pool | |||
| ) |
Calculate the delta between two rangelists consisting of svn_merge_range_t * elements (sorted in ascending order), from and to, and place the result in deleted and added (neither output argument will ever be NULL).
consider_inheritance determines how to account for the inheritability of the two rangelist's ranges when calculating the diff,
| apr_array_header_t* svn_rangelist_dup | ( | apr_array_header_t * | rangelist, | |
| apr_pool_t * | pool | |||
| ) |
Return a deep copy of rangelist, allocated in pool.
| svn_error_t* svn_rangelist_inheritable | ( | apr_array_header_t ** | inheritable_rangelist, | |
| apr_array_header_t * | rangelist, | |||
| svn_revnum_t | start, | |||
| svn_revnum_t | end, | |||
| apr_pool_t * | pool | |||
| ) |
Return a deep copy of svn_merge_range_t *'s in rangelist excluding all non-inheritable svn_merge_range_t.
If start and end are valid revisions and start is less than or equal to end, then exclude only the non-inheritable revision ranges that intersect inclusively with the range defined by start and end. If rangelist contains no elements, return an empty array. Allocate the copy in pool.
| svn_error_t* svn_rangelist_intersect | ( | apr_array_header_t ** | rangelist, | |
| apr_array_header_t * | rangelist1, | |||
| apr_array_header_t * | rangelist2, | |||
| svn_boolean_t | consider_inheritance, | |||
| apr_pool_t * | pool | |||
| ) |
Find the intersection of two rangelists consisting of svn_merge_range_t * elements, rangelist1 and rangelist2, and place the result in *rangelist (which is never NULL).
consider_inheritance determines how to account for the inheritability of the two rangelist's ranges when calculating the intersection,
svn_sort_compare_ranges(). *rangelist is guaranteed to be in sorted order. | svn_error_t* svn_rangelist_merge | ( | apr_array_header_t ** | rangelist, | |
| apr_array_header_t * | changes, | |||
| apr_pool_t * | pool | |||
| ) |
Merge two rangelists consisting of svn_merge_range_t * elements, *rangelist and changes, placing the results in *rangelist.
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,
svn_sort_compare_ranges(). *rangelist is guaranteed to remain in sorted order and be compacted to the minimal number of ranges needed to represent the merged result.
| svn_error_t* svn_rangelist_remove | ( | apr_array_header_t ** | output, | |
| apr_array_header_t * | eraser, | |||
| apr_array_header_t * | whiteboard, | |||
| svn_boolean_t | consider_inheritance, | |||
| apr_pool_t * | pool | |||
| ) |
Removes eraser (the subtrahend) from whiteboard (the minuend), and places the resulting difference in output.
Note: eraser and whiteboard must be sorted as said by svn_sort_compare_ranges(). output is guaranteed to be in sorted order.
consider_inheritance determines how to account for the svn_merge_range_t inheritable field when comparing whiteboard's and *eraser's rangelists for equality.
| svn_error_t* svn_rangelist_reverse | ( | apr_array_header_t * | rangelist, | |
| apr_pool_t * | pool | |||
| ) |
Reverse rangelist, and the start and end fields of each range in rangelist, in place.
TODO(miapi): Is this really a valid function? Rangelists that aren't sorted, or rangelists containing reverse ranges, are generally not valid in mergeinfo code. Can we rewrite the two places where this is used?
| svn_error_t* svn_rangelist_to_string | ( | svn_string_t ** | output, | |
| const apr_array_header_t * | rangelist, | |||
| apr_pool_t * | pool | |||
| ) |
Take an array of svn_merge_range_t *'s in rangelist, and convert it back to a text format rangelist in output.
If rangelist contains no elements, sets output to the empty string.
1.5.1