1251881Speter/** 2251881Speter * @copyright 3251881Speter * ==================================================================== 4251881Speter * Licensed to the Apache Software Foundation (ASF) under one 5251881Speter * or more contributor license agreements. See the NOTICE file 6251881Speter * distributed with this work for additional information 7251881Speter * regarding copyright ownership. The ASF licenses this file 8251881Speter * to you under the Apache License, Version 2.0 (the 9251881Speter * "License"); you may not use this file except in compliance 10251881Speter * with the License. You may obtain a copy of the License at 11251881Speter * 12251881Speter * http://www.apache.org/licenses/LICENSE-2.0 13251881Speter * 14251881Speter * Unless required by applicable law or agreed to in writing, 15251881Speter * software distributed under the License is distributed on an 16251881Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17251881Speter * KIND, either express or implied. See the License for the 18251881Speter * specific language governing permissions and limitations 19251881Speter * under the License. 20251881Speter * ==================================================================== 21251881Speter * @endcopyright 22251881Speter * 23251881Speter * @file svn_mergeinfo_private.h 24251881Speter * @brief Subversion-internal mergeinfo APIs. 25251881Speter */ 26251881Speter 27251881Speter#ifndef SVN_MERGEINFO_PRIVATE_H 28251881Speter#define SVN_MERGEINFO_PRIVATE_H 29251881Speter 30251881Speter#include <apr_pools.h> 31251881Speter 32251881Speter#include "svn_types.h" 33251881Speter#include "svn_error.h" 34251881Speter#include "svn_mergeinfo.h" 35251881Speter 36251881Speter#ifdef __cplusplus 37251881Speterextern "C" { 38251881Speter#endif /* __cplusplus */ 39251881Speter 40251881Speter 41251881Speter/* Set inheritability of all ranges in RANGELIST to INHERITABLE. 42251881Speter If RANGELIST is NULL do nothing. */ 43251881Spetervoid 44251881Spetersvn_rangelist__set_inheritance(svn_rangelist_t *rangelist, 45251881Speter svn_boolean_t inheritable); 46251881Speter 47251881Speter/* Parse a rangelist from the string STR. Set *RANGELIST to the result, 48251881Speter * allocated in RESULT_POOL. Return an error if the rangelist is not 49251881Speter * well-formed (for example, if it contains invalid characters or if 50251881Speter * R1 >= R2 in a "R1-R2" range element). 51251881Speter * 52251881Speter * Unlike svn_mergeinfo_parse(), this does not sort the ranges into order 53251881Speter * or combine adjacent and overlapping ranges. 54251881Speter * 55362181Sdim * The compaction can be done with svn_rangelist__canonicalize(). 56251881Speter */ 57251881Spetersvn_error_t * 58251881Spetersvn_rangelist__parse(svn_rangelist_t **rangelist, 59251881Speter const char *str, 60251881Speter apr_pool_t *result_pool); 61251881Speter 62362181Sdim/* Return TRUE, if all ranges in RANGELIST are in ascending order and do 63362181Sdim* not overlap and are not adjacent. 64362181Sdim* 65362181Sdim* If this returns FALSE, you probaly want to call 66362181Sdim* svn_rangelist__canonicalize(). 67362181Sdim*/ 68362181Sdimsvn_boolean_t 69362181Sdimsvn_rangelist__is_canonical(const svn_rangelist_t *rangelist); 70251881Speter 71286506Speter/** Canonicalize the @a rangelist: sort the ranges, and combine adjacent or 72286506Speter * overlapping ranges into single ranges where possible. 73286506Speter * 74286506Speter * If overlapping ranges have different inheritability, return an error. 75286506Speter * 76286506Speter * Modify @a rangelist in place. Use @a scratch_pool for temporary 77286506Speter * allocations. 78286506Speter */ 79286506Spetersvn_error_t * 80286506Spetersvn_rangelist__canonicalize(svn_rangelist_t *rangelist, 81286506Speter apr_pool_t *scratch_pool); 82286506Speter 83286506Speter/** Canonicalize the revision range lists in the @a mergeinfo. 84286506Speter * 85286506Speter * Modify @a mergeinfo in place. Use @a scratch_pool for temporary 86286506Speter * allocations. 87286506Speter */ 88286506Spetersvn_error_t * 89286506Spetersvn_mergeinfo__canonicalize_ranges(svn_mergeinfo_t mergeinfo, 90286506Speter apr_pool_t *scratch_pool); 91286506Speter 92251881Speter/* Set inheritability of all rangelists in MERGEINFO to INHERITABLE. 93251881Speter If MERGEINFO is NULL do nothing. If a rangelist in MERGEINFO is 94251881Speter NULL leave it alone. */ 95251881Spetervoid 96251881Spetersvn_mergeinfo__set_inheritance(svn_mergeinfo_t mergeinfo, 97251881Speter svn_boolean_t inheritable, 98251881Speter apr_pool_t *scratch_pool); 99251881Speter 100251881Speter/* Return whether INFO1 and INFO2 are equal in *IS_EQUAL. 101251881Speter 102251881Speter CONSIDER_INHERITANCE determines how the rangelists in the two 103251881Speter hashes are compared for equality. If CONSIDER_INHERITANCE is FALSE, 104251881Speter then the start and end revisions of the svn_merge_range_t's being 105251881Speter compared are the only factors considered when determining equality. 106251881Speter 107251881Speter e.g. '/trunk: 1,3-4*,5' == '/trunk: 1,3-5' 108251881Speter 109251881Speter If CONSIDER_INHERITANCE is TRUE, then the inheritability of the 110251881Speter svn_merge_range_t's is also considered and must be the same for two 111251881Speter otherwise identical ranges to be judged equal. 112251881Speter 113251881Speter e.g. '/trunk: 1,3-4*,5' != '/trunk: 1,3-5' 114251881Speter '/trunk: 1,3-4*,5' == '/trunk: 1,3-4*,5' 115251881Speter '/trunk: 1,3-4,5' == '/trunk: 1,3-4,5' 116251881Speter 117251881Speter Use POOL for temporary allocations. */ 118251881Spetersvn_error_t * 119251881Spetersvn_mergeinfo__equals(svn_boolean_t *is_equal, 120251881Speter svn_mergeinfo_t info1, 121251881Speter svn_mergeinfo_t info2, 122251881Speter svn_boolean_t consider_inheritance, 123251881Speter apr_pool_t *pool); 124251881Speter 125289180Speter/* Remove all paths from MERGEINFO which map to empty rangelists. 126289180Speter 127289180Speter Return TRUE if any paths were removed and FALSE if none were 128251881Speter removed or MERGEINFO is NULL. */ 129251881Spetersvn_boolean_t 130251881Spetersvn_mergeinfo__remove_empty_rangelists(svn_mergeinfo_t mergeinfo, 131289180Speter apr_pool_t *scratch_pool); 132251881Speter 133251881Speter/* Make a shallow (ie, mergeinfos are not duped, or altered at all; 134251881Speter keys share storage) copy of IN_CATALOG in *OUT_CATALOG, removing 135251881Speter PREFIX_PATH from the beginning of each key in the catalog. 136251881Speter PREFIX_PATH and the keys of IN_CATALOG are absolute 'fspaths', 137251881Speter starting with '/'. It is illegal for any key to not start with 138251881Speter PREFIX_PATH. The keys of *OUT_CATALOG are relpaths. The new hash 139251881Speter and temporary values are allocated in POOL. (This is useful for 140251881Speter making the return value from svn_ra_get_mergeinfo relative to the 141251881Speter session root, say.) */ 142251881Spetersvn_error_t * 143251881Spetersvn_mergeinfo__remove_prefix_from_catalog(svn_mergeinfo_catalog_t *out_catalog, 144251881Speter svn_mergeinfo_catalog_t in_catalog, 145251881Speter const char *prefix_path, 146251881Speter apr_pool_t *pool); 147251881Speter 148251881Speter/* Make a shallow (ie, mergeinfos are not duped, or altered at all; 149251881Speter though keys are reallocated) copy of IN_CATALOG in *OUT_CATALOG, 150251881Speter adding PREFIX_PATH to the beginning of each key in the catalog. 151251881Speter 152251881Speter The new hash keys are allocated in RESULT_POOL. SCRATCH_POOL 153251881Speter is used for any temporary allocations.*/ 154251881Spetersvn_error_t * 155251881Spetersvn_mergeinfo__add_prefix_to_catalog(svn_mergeinfo_catalog_t *out_catalog, 156251881Speter svn_mergeinfo_catalog_t in_catalog, 157251881Speter const char *prefix_path, 158251881Speter apr_pool_t *result_pool, 159251881Speter apr_pool_t *scratch_pool); 160251881Speter 161251881Speter/* Set *OUT_MERGEINFO to a shallow copy of MERGEINFO with the relpath 162251881Speter SUFFIX_RELPATH added to the end of each key path. 163251881Speter 164251881Speter Allocate *OUT_MERGEINFO and the new keys in RESULT_POOL. Use 165251881Speter SCRATCH_POOL for any temporary allocations. */ 166251881Spetersvn_error_t * 167251881Spetersvn_mergeinfo__add_suffix_to_mergeinfo(svn_mergeinfo_t *out_mergeinfo, 168251881Speter svn_mergeinfo_t mergeinfo, 169251881Speter const char *suffix_relpath, 170251881Speter apr_pool_t *result_pool, 171251881Speter apr_pool_t *scratch_pool); 172251881Speter 173251881Speter/* Create a string representation of CATALOG in *OUTPUT, allocated in POOL. 174251881Speter The hash keys of CATALOG and the merge source paths of each key's mergeinfo 175251881Speter are represented in sorted order as per svn_sort_compare_items_as_paths. 176251881Speter If CATALOG is empty or NULL then *OUTPUT->DATA is set to "\n". If SVN_DEBUG 177251881Speter is true, then a NULL or empty CATALOG causes *OUTPUT to be set to an 178251881Speter appropriate newline terminated string. If KEY_PREFIX is not NULL then 179251881Speter prepend KEY_PREFIX to each key (path) in *OUTPUT. if VAL_PREFIX is not 180251881Speter NULL then prepend VAL_PREFIX to each merge source:rangelist line in 181251881Speter *OUTPUT. 182251881Speter 183251881Speter Any relative merge source paths in the mergeinfo in CATALOG are converted 184251881Speter to absolute paths in *OUTPUT. */ 185251881Spetersvn_error_t * 186251881Spetersvn_mergeinfo__catalog_to_formatted_string(svn_string_t **output, 187251881Speter svn_mergeinfo_catalog_t catalog, 188251881Speter const char *key_prefix, 189251881Speter const char *val_prefix, 190251881Speter apr_pool_t *pool); 191251881Speter 192251881Speter/* Set *YOUNGEST_REV and *OLDEST_REV to the youngest and oldest revisions 193251881Speter found in the rangelists within MERGEINFO. Note that *OLDEST_REV is 194251881Speter exclusive and *YOUNGEST_REV is inclusive. If MERGEINFO is NULL or empty 195251881Speter set *YOUNGEST_REV and *OLDEST_REV to SVN_INVALID_REVNUM. */ 196251881Spetersvn_error_t * 197251881Spetersvn_mergeinfo__get_range_endpoints(svn_revnum_t *youngest_rev, 198251881Speter svn_revnum_t *oldest_rev, 199251881Speter svn_mergeinfo_t mergeinfo, 200251881Speter apr_pool_t *pool); 201251881Speter 202251881Speter/* Set *FILTERED_MERGEINFO to a deep copy of MERGEINFO, allocated in 203251881Speter RESULT_POOL, less any revision ranges that fall outside of the range 204251881Speter OLDEST_REV:YOUNGEST_REV (exclusive:inclusive) if INCLUDE_RANGE is true, 205251881Speter or less any ranges within OLDEST_REV:YOUNGEST_REV if INCLUDE_RANGE 206251881Speter is false. If all the rangelists mapped to a given path are filtered 207251881Speter then filter that path as well. If all paths are filtered or MERGEINFO is 208251881Speter empty or NULL then *FILTERED_MERGEINFO is set to an empty hash. 209251881Speter 210251881Speter Use SCRATCH_POOL for any temporary allocations. */ 211251881Spetersvn_error_t * 212251881Spetersvn_mergeinfo__filter_mergeinfo_by_ranges(svn_mergeinfo_t *filtered_mergeinfo, 213251881Speter svn_mergeinfo_t mergeinfo, 214251881Speter svn_revnum_t youngest_rev, 215251881Speter svn_revnum_t oldest_rev, 216251881Speter svn_boolean_t include_range, 217251881Speter apr_pool_t *result_pool, 218251881Speter apr_pool_t *scratch_pool); 219251881Speter 220251881Speter/* Filter each mergeinfo in CATALOG as per 221251881Speter svn_mergeinfo__filter_mergeinfo_by_ranges() and put a deep copy of the 222251881Speter result in *FILTERED_CATALOG, allocated in RESULT_POOL. If any mergeinfo 223251881Speter is filtered to an empty hash then filter that path/mergeinfo as well. 224251881Speter If all mergeinfo is filtered or CATALOG is NULL then set *FILTERED_CATALOG 225251881Speter to an empty hash. 226251881Speter 227251881Speter Use SCRATCH_POOL for any temporary allocations. */ 228251881Spetersvn_error_t* 229251881Spetersvn_mergeinfo__filter_catalog_by_ranges( 230251881Speter svn_mergeinfo_catalog_t *filtered_catalog, 231251881Speter svn_mergeinfo_catalog_t catalog, 232251881Speter svn_revnum_t youngest_rev, 233251881Speter svn_revnum_t oldest_rev, 234251881Speter svn_boolean_t include_range, 235251881Speter apr_pool_t *result_pool, 236251881Speter apr_pool_t *scratch_pool); 237251881Speter 238251881Speter/* If MERGEINFO is non-inheritable return TRUE, return FALSE otherwise. 239251881Speter MERGEINFO may be NULL or empty. */ 240251881Spetersvn_boolean_t 241251881Spetersvn_mergeinfo__is_noninheritable(svn_mergeinfo_t mergeinfo, 242251881Speter apr_pool_t *scratch_pool); 243251881Speter 244251881Speter/* Return a rangelist with one svn_merge_range_t * element defined by START, 245251881Speter END, and INHERITABLE. The rangelist and its contents are allocated in 246251881Speter RESULT_POOL. */ 247251881Spetersvn_rangelist_t * 248251881Spetersvn_rangelist__initialize(svn_revnum_t start, 249251881Speter svn_revnum_t end, 250251881Speter svn_boolean_t inheritable, 251251881Speter apr_pool_t *result_pool); 252251881Speter 253251881Speter/* Adjust in-place MERGEINFO's rangelists by OFFSET. If OFFSET is negative 254251881Speter and would adjust any part of MERGEINFO's source revisions to 0 or less, 255251881Speter then those revisions are dropped. If all the source revisions for a merge 256251881Speter source path are dropped, then the path itself is dropped. If all merge 257251881Speter source paths are dropped, then *ADJUSTED_MERGEINFO is set to an empty 258251881Speter hash. *ADJUSTED_MERGEINFO is allocated in RESULT_POOL. SCRATCH_POOL is 259251881Speter used for any temporary allocations. */ 260251881Spetersvn_error_t * 261251881Spetersvn_mergeinfo__adjust_mergeinfo_rangelists(svn_mergeinfo_t *adjusted_mergeinfo, 262251881Speter svn_mergeinfo_t mergeinfo, 263251881Speter svn_revnum_t offset, 264251881Speter apr_pool_t *result_pool, 265251881Speter apr_pool_t *scratch_pool); 266251881Speter 267251881Speter/* Translates an array SEGMENTS (of svn_location_segment_t *), like the one 268251881Speter returned from svn_client__repos_location_segments, into a mergeinfo 269251881Speter *MERGEINFO_P, allocated in POOL. 270251881Speter 271251881Speter Note: A svn_location_segment_t segment may legitimately describe only revision 0, 272251881Speter but there is no way to describe that using svn_mergeinfo_t. Any such 273251881Speter segment in SEGMENTS are ignored. */ 274251881Spetersvn_error_t * 275251881Spetersvn_mergeinfo__mergeinfo_from_segments(svn_mergeinfo_t *mergeinfo_p, 276251881Speter const apr_array_header_t *segments, 277251881Speter apr_pool_t *pool); 278251881Speter 279251881Speter/* Merge every rangelist in MERGEINFO into the given MERGED_RANGELIST, 280251881Speter * ignoring the source paths of MERGEINFO. MERGED_RANGELIST may 281251881Speter * initially be empty. New elements added to RANGELIST are allocated in 282251881Speter * RESULT_POOL. See svn_rangelist_merge2() for details of inheritability 283251881Speter * etc. */ 284251881Spetersvn_error_t * 285251881Spetersvn_rangelist__merge_many(svn_rangelist_t *merged_rangelist, 286251881Speter svn_mergeinfo_t mergeinfo, 287251881Speter apr_pool_t *result_pool, 288251881Speter apr_pool_t *scratch_pool); 289251881Speter 290251881Speter#ifdef __cplusplus 291251881Speter} 292251881Speter#endif /* __cplusplus */ 293251881Speter 294251881Speter#endif /* SVN_MERGEINFO_PRIVATE_H */ 295