def get_history_as_mergeinfo(self, ra_session, rel_path, rev, oldest_rev=core.SVN_INVALID_REVNUM): """Return the natural history of REL_PATH in REV, between OLDEST_REV and REV, as mergeinfo. If OLDEST_REV is core.SVN_INVALID_REVNUM, all of PATH's history prior to REV will be returned. REL_PATH is relative to the session URL of RA_SESSION. (Adapted from Subversion's svn_client__get_history_as_mergeinfo().)""" # Fetch the location segments in the history. location_segments = [] def _segment_receiver(segment, pool): location_segments.append(segment) ra.get_location_segments(ra_session, rel_path, rev, rev, oldest_rev, _segment_receiver) # Location segments come in youngest to oldest. But we rather # need oldest-to-youngest for proper revision range ordering. location_segments.sort(lambda a, b: cmp(a.range_start, b.range_start)) # Transform location segments into merge sources and ranges. mergeinfo = {} for segment in location_segments: if segment.path is None: continue source_path = '/' + segment.path path_ranges = mergeinfo.get(source_path, []) range = core.svn_merge_range_t() range.start = max(segment.range_start - 1, 0) range.end = segment.range_end range.inheritable = 1 path_ranges.append(range) mergeinfo[source_path] = path_ranges return mergeinfo