public static long[] getRangeEndPoints(Map mergeInfo) { // long[] { youngestRange, oldestRange } long[] rangePoints = {SVNRepository.INVALID_REVISION, SVNRepository.INVALID_REVISION}; if (mergeInfo != null) { for (Iterator mergeInfoIter = mergeInfo.keySet().iterator(); mergeInfoIter.hasNext(); ) { String path = (String) mergeInfoIter.next(); SVNMergeRangeList rangeList = (SVNMergeRangeList) mergeInfo.get(path); if (!rangeList.isEmpty()) { SVNMergeRange[] ranges = rangeList.getRanges(); SVNMergeRange range = ranges[ranges.length - 1]; if (!SVNRevision.isValidRevisionNumber(rangePoints[0]) || range.getEndRevision() > rangePoints[0]) { rangePoints[0] = range.getEndRevision(); } range = ranges[0]; if (!SVNRevision.isValidRevisionNumber(rangePoints[1]) || rangePoints[1] > range.getStartRevision()) { rangePoints[1] = range.getStartRevision(); } } } } return rangePoints; }
public static Map parseMergeInfo(StringBuffer mergeInfo, Map srcPathsToRangeLists) throws SVNException { srcPathsToRangeLists = srcPathsToRangeLists == null ? new TreeMap() : srcPathsToRangeLists; if (mergeInfo.length() == 0) { return srcPathsToRangeLists; } try { while (mergeInfo.length() > 0) { int eolInd = mergeInfo.indexOf("\n"); eolInd = eolInd < 0 ? mergeInfo.length() - 1 : eolInd; int ind = mergeInfo.lastIndexOf(":", eolInd); if (ind == -1) { SVNErrorMessage err = SVNErrorMessage.create( SVNErrorCode.MERGE_INFO_PARSE_ERROR, "Pathname not terminated by ':'"); SVNErrorManager.error(err, SVNLogType.DEFAULT); } if (ind == 0) { SVNErrorMessage err = SVNErrorMessage.create( SVNErrorCode.MERGE_INFO_PARSE_ERROR, "No pathname preceding ':'"); SVNErrorManager.error(err, SVNLogType.DEFAULT); } String path = null; if (mergeInfo.charAt(0) == '/') { path = mergeInfo.substring(0, ind); } else { String relativePath = mergeInfo.substring(0, ind); path = "/" + relativePath; } mergeInfo = mergeInfo.delete(0, ind + 1); SVNMergeRange[] ranges = parseRevisionList(mergeInfo, path); if (mergeInfo.length() != 0 && mergeInfo.charAt(0) != '\n') { SVNErrorMessage err = SVNErrorMessage.create( SVNErrorCode.MERGE_INFO_PARSE_ERROR, "Could not find end of line in range list line in ''{0}''", mergeInfo); SVNErrorManager.error(err, SVNLogType.DEFAULT); } if (mergeInfo.length() > 0) { mergeInfo = mergeInfo.deleteCharAt(0); } if (ranges.length > 1) { Arrays.sort(ranges); SVNMergeRange lastRange = ranges[0]; Collection newRanges = new ArrayList(); newRanges.add(lastRange); for (int i = 1; i < ranges.length; i++) { SVNMergeRange range = ranges[i]; if (lastRange.getStartRevision() <= range.getEndRevision() && range.getStartRevision() <= lastRange.getEndRevision()) { if (range.getStartRevision() < lastRange.getEndRevision() && range.isInheritable() != lastRange.isInheritable()) { // error. String r1 = lastRange.toString(); String r2 = range.toString(); SVNErrorMessage err = SVNErrorMessage.create( SVNErrorCode.MERGE_INFO_PARSE_ERROR, "Unable to parse overlapping revision ranges ''{0}'' and ''{1}'' with different inheritance types", new Object[] {r1, r2}); SVNErrorManager.error(err, SVNLogType.WC); } if (lastRange.isInheritable() == range.isInheritable()) { lastRange.setEndRevision( Math.max(range.getEndRevision(), lastRange.getEndRevision())); continue; } } newRanges.add(ranges[i]); lastRange = ranges[i]; } ranges = (SVNMergeRange[]) newRanges.toArray(new SVNMergeRange[newRanges.size()]); } SVNMergeRangeList existingRange = (SVNMergeRangeList) srcPathsToRangeLists.get(path); if (existingRange != null) { ranges = existingRange.merge(new SVNMergeRangeList(ranges)).getRanges(); } srcPathsToRangeLists.put(path, new SVNMergeRangeList(ranges)); } } catch (SVNException svne) { if (svne.getErrorMessage().getErrorCode() != SVNErrorCode.MERGE_INFO_PARSE_ERROR) { SVNErrorMessage err = SVNErrorMessage.create( SVNErrorCode.MERGE_INFO_PARSE_ERROR, "Could not parse mergeinfo string ''{0}''", mergeInfo.toString()); SVNErrorManager.error(err, svne, SVNLogType.DEFAULT); } throw svne; } return srcPathsToRangeLists; }