/** * @copyright * ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * ==================================================================== * @endcopyright * * @file svn_mergeinfo_private.h * @brief Subversion-internal mergeinfo APIs. */ #ifndef SVN_MERGEINFO_PRIVATE_H #define SVN_MERGEINFO_PRIVATE_H #include #include "svn_types.h" #include "svn_error.h" #include "svn_mergeinfo.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Set inheritability of all ranges in RANGELIST to INHERITABLE. If RANGELIST is NULL do nothing. */ void svn_rangelist__set_inheritance(svn_rangelist_t *rangelist, svn_boolean_t inheritable); /* Parse a rangelist from the string STR. Set *RANGELIST to the result, * allocated in RESULT_POOL. Return an error if the rangelist is not * well-formed (for example, if it contains invalid characters or if * R1 >= R2 in a "R1-R2" range element). * * Unlike svn_mergeinfo_parse(), this does not sort the ranges into order * or combine adjacent and overlapping ranges. * * The compaction can be done with svn_rangelist__combine_adjacent_ranges(). */ svn_error_t * svn_rangelist__parse(svn_rangelist_t **rangelist, const char *str, apr_pool_t *result_pool); /* In-place combines adjacent ranges in a rangelist. SCRATCH_POOL is just used for providing error messages. */ svn_error_t * svn_rangelist__combine_adjacent_ranges(svn_rangelist_t *rangelist, apr_pool_t *scratch_pool); /* Set inheritability of all rangelists in MERGEINFO to INHERITABLE. If MERGEINFO is NULL do nothing. If a rangelist in MERGEINFO is NULL leave it alone. */ void svn_mergeinfo__set_inheritance(svn_mergeinfo_t mergeinfo, svn_boolean_t inheritable, apr_pool_t *scratch_pool); /* Return whether INFO1 and INFO2 are equal in *IS_EQUAL. 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' Use POOL for temporary allocations. */ svn_error_t * svn_mergeinfo__equals(svn_boolean_t *is_equal, svn_mergeinfo_t info1, svn_mergeinfo_t info2, svn_boolean_t consider_inheritance, apr_pool_t *pool); /* Examine MERGEINFO, removing all paths from the hash which map to empty rangelists. POOL is used only to allocate the apr_hash_index_t iterator. Returns TRUE if any paths were removed and FALSE if none were removed or MERGEINFO is NULL. */ svn_boolean_t svn_mergeinfo__remove_empty_rangelists(svn_mergeinfo_t mergeinfo, apr_pool_t *pool); /* Make a shallow (ie, mergeinfos are not duped, or altered at all; keys share storage) copy of IN_CATALOG in *OUT_CATALOG, removing PREFIX_PATH from the beginning of each key in the catalog. PREFIX_PATH and the keys of IN_CATALOG are absolute 'fspaths', starting with '/'. It is illegal for any key to not start with PREFIX_PATH. The keys of *OUT_CATALOG are relpaths. The new hash and temporary values are allocated in POOL. (This is useful for making the return value from svn_ra_get_mergeinfo relative to the session root, say.) */ svn_error_t * svn_mergeinfo__remove_prefix_from_catalog(svn_mergeinfo_catalog_t *out_catalog, svn_mergeinfo_catalog_t in_catalog, const char *prefix_path, apr_pool_t *pool); /* Make a shallow (ie, mergeinfos are not duped, or altered at all; though keys are reallocated) copy of IN_CATALOG in *OUT_CATALOG, adding PREFIX_PATH to the beginning of each key in the catalog. The new hash keys are allocated in RESULT_POOL. SCRATCH_POOL is used for any temporary allocations.*/ svn_error_t * svn_mergeinfo__add_prefix_to_catalog(svn_mergeinfo_catalog_t *out_catalog, svn_mergeinfo_catalog_t in_catalog, const char *prefix_path, apr_pool_t *result_pool, apr_pool_t *scratch_pool); /* Set *OUT_MERGEINFO to a shallow copy of MERGEINFO with the relpath SUFFIX_RELPATH added to the end of each key path. Allocate *OUT_MERGEINFO and the new keys in RESULT_POOL. Use SCRATCH_POOL for any temporary allocations. */ svn_error_t * svn_mergeinfo__add_suffix_to_mergeinfo(svn_mergeinfo_t *out_mergeinfo, svn_mergeinfo_t mergeinfo, const char *suffix_relpath, apr_pool_t *result_pool, apr_pool_t *scratch_pool); /* Create a string representation of CATALOG in *OUTPUT, allocated in POOL. The hash keys of CATALOG and the merge source paths of each key's mergeinfo are represented in sorted order as per svn_sort_compare_items_as_paths. If CATALOG is empty or NULL then *OUTPUT->DATA is set to "\n". If SVN_DEBUG is true, then a NULL or empty CATALOG causes *OUTPUT to be set to an appropriate newline terminated string. If KEY_PREFIX is not NULL then prepend KEY_PREFIX to each key (path) in *OUTPUT. if VAL_PREFIX is not NULL then prepend VAL_PREFIX to each merge source:rangelist line in *OUTPUT. Any relative merge source paths in the mergeinfo in CATALOG are converted to absolute paths in *OUTPUT. */ svn_error_t * svn_mergeinfo__catalog_to_formatted_string(svn_string_t **output, svn_mergeinfo_catalog_t catalog, const char *key_prefix, const char *val_prefix, apr_pool_t *pool); /* Set *YOUNGEST_REV and *OLDEST_REV to the youngest and oldest revisions found in the rangelists within MERGEINFO. Note that *OLDEST_REV is exclusive and *YOUNGEST_REV is inclusive. If MERGEINFO is NULL or empty set *YOUNGEST_REV and *OLDEST_REV to SVN_INVALID_REVNUM. */ svn_error_t * svn_mergeinfo__get_range_endpoints(svn_revnum_t *youngest_rev, svn_revnum_t *oldest_rev, svn_mergeinfo_t mergeinfo, apr_pool_t *pool); /* Set *FILTERED_MERGEINFO to a deep copy of MERGEINFO, allocated in RESULT_POOL, less any revision ranges that fall outside of the range OLDEST_REV:YOUNGEST_REV (exclusive:inclusive) if INCLUDE_RANGE is true, or less any ranges within OLDEST_REV:YOUNGEST_REV if INCLUDE_RANGE is false. If all the rangelists mapped to a given path are filtered then filter that path as well. If all paths are filtered or MERGEINFO is empty or NULL then *FILTERED_MERGEINFO is set to an empty hash. Use SCRATCH_POOL for any temporary allocations. */ svn_error_t * svn_mergeinfo__filter_mergeinfo_by_ranges(svn_mergeinfo_t *filtered_mergeinfo, svn_mergeinfo_t mergeinfo, svn_revnum_t youngest_rev, svn_revnum_t oldest_rev, svn_boolean_t include_range, apr_pool_t *result_pool, apr_pool_t *scratch_pool); /* Filter each mergeinfo in CATALOG as per svn_mergeinfo__filter_mergeinfo_by_ranges() and put a deep copy of the result in *FILTERED_CATALOG, allocated in RESULT_POOL. If any mergeinfo is filtered to an empty hash then filter that path/mergeinfo as well. If all mergeinfo is filtered or CATALOG is NULL then set *FILTERED_CATALOG to an empty hash. Use SCRATCH_POOL for any temporary allocations. */ svn_error_t* svn_mergeinfo__filter_catalog_by_ranges( svn_mergeinfo_catalog_t *filtered_catalog, svn_mergeinfo_catalog_t catalog, svn_revnum_t youngest_rev, svn_revnum_t oldest_rev, svn_boolean_t include_range, apr_pool_t *result_pool, apr_pool_t *scratch_pool); /* If MERGEINFO is non-inheritable return TRUE, return FALSE otherwise. MERGEINFO may be NULL or empty. */ svn_boolean_t svn_mergeinfo__is_noninheritable(svn_mergeinfo_t mergeinfo, apr_pool_t *scratch_pool); /* Return a rangelist with one svn_merge_range_t * element defined by START, END, and INHERITABLE. The rangelist and its contents are allocated in RESULT_POOL. */ svn_rangelist_t * svn_rangelist__initialize(svn_revnum_t start, svn_revnum_t end, svn_boolean_t inheritable, apr_pool_t *result_pool); /* Adjust in-place MERGEINFO's rangelists by OFFSET. If OFFSET is negative and would adjust any part of MERGEINFO's source revisions to 0 or less, then those revisions are dropped. If all the source revisions for a merge source path are dropped, then the path itself is dropped. If all merge source paths are dropped, then *ADJUSTED_MERGEINFO is set to an empty hash. *ADJUSTED_MERGEINFO is allocated in RESULT_POOL. SCRATCH_POOL is used for any temporary allocations. */ svn_error_t * svn_mergeinfo__adjust_mergeinfo_rangelists(svn_mergeinfo_t *adjusted_mergeinfo, svn_mergeinfo_t mergeinfo, svn_revnum_t offset, apr_pool_t *result_pool, apr_pool_t *scratch_pool); /* Translates an array SEGMENTS (of svn_location_segment_t *), like the one returned from svn_client__repos_location_segments, into a mergeinfo *MERGEINFO_P, allocated in POOL. Note: A svn_location_segment_t segment may legitimately describe only revision 0, but there is no way to describe that using svn_mergeinfo_t. Any such segment in SEGMENTS are ignored. */ svn_error_t * svn_mergeinfo__mergeinfo_from_segments(svn_mergeinfo_t *mergeinfo_p, const apr_array_header_t *segments, apr_pool_t *pool); /* Merge every rangelist in MERGEINFO into the given MERGED_RANGELIST, * ignoring the source paths of MERGEINFO. MERGED_RANGELIST may * initially be empty. New elements added to RANGELIST are allocated in * RESULT_POOL. See svn_rangelist_merge2() for details of inheritability * etc. */ svn_error_t * svn_rangelist__merge_many(svn_rangelist_t *merged_rangelist, svn_mergeinfo_t mergeinfo, apr_pool_t *result_pool, apr_pool_t *scratch_pool); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* SVN_MERGEINFO_PRIVATE_H */