Пример #1
0
  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;
  }
Пример #2
0
  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;
  }