private void removeSourceGap(SVNMergeRange range, SVNMergeRangeList implicitSrcGap) { if (implicitSrcGap != null) { SVNMergeRange gapRange = implicitSrcGap.getRanges()[0]; if (range.getStartRevision() < range.getEndRevision()) { if (gapRange.getStartRevision() == range.getStartRevision()) { range.setStartRevision(gapRange.getEndRevision()); } } else { if (gapRange.getStartRevision() == range.getEndRevision()) { range.setEndRevision(gapRange.getEndRevision()); } } } }
int j = 0; int lastInd = -1; SVNMergeRange whiteBoardElement = new SVNMergeRange(-1, -1, false); while (i < myRanges.length && j < eraserRangeList.myRanges.length) { SVNMergeRange range2 = eraserRangeList.myRanges[j]; if (i != lastInd) { SVNMergeRange tmpRange = myRanges[i]; range1 = tmpRange.dup(); whiteBoardElement = range1; lastInd = i; if (range2.contains(range1, considerInheritance)) { if (!remove) { lastRange = combineWithLastRange(ranges, lastRange, range1, true, considerInheritance); if (range1.getStartRevision() == range2.getStartRevision() && range1.getEndRevision() == range2.getEndRevision()) { j++; } else if (range2.intersects(range1, considerInheritance)) { if (range1.getStartRevision() < range2.getStartRevision()) { SVNMergeRange tmpRange = null; if (remove) { tmpRange = new SVNMergeRange(range1.getStartRevision(), range2.getStartRevision(), range1.isInheritable()); } else { tmpRange = new SVNMergeRange(range2.getStartRevision(), Math.min(range1.getEndRevision(), range2.getEndRevision()), range1.isInheritable());
/** * Runs through all merge ranges in this object and says, whether the specified <code>revision</code> * falls between start and end revision of any of those ranges. * * @param revision revision to find in ranges * @return <span class="javakeyword">true</span> if one of the ranges in this list includes the * specified <code>revision</code> */ public boolean includes(long revision) { for (int i = 0; i < myRanges.length; i++) { SVNMergeRange range = myRanges[i]; if (revision > range.getStartRevision() && revision <= range.getEndRevision()) { return true; } } return false; }
/** * Combines this merge range and the given <code>range</code> into a single one. * * <p/> * Combining may only occur if {@link #canCombine(SVNMergeRange, boolean)} returns <span class="javakeyword">true</span> * for the specified parameters. * * <p/> * Note: combining changes the state of this object. * * @param range range to combine with this range * @param considerInheritance whether inheritance information should be taken into account * @return if combining occurs, returns this object which is now a combination * of the two ranges; otherwise returns <code>range</code> */ public SVNMergeRange combine(SVNMergeRange range, boolean considerInheritance) { if (canCombine(range, considerInheritance)) { myStartRevision = Math.min(myStartRevision, range.getStartRevision()); myEndRevision = Math.max(myEndRevision, range.getEndRevision()); myIsInheritable = myIsInheritable || range.myIsInheritable; return this; } return range; }
boolean rangesHaveSameInheritance = false; if (lastRange != null) { if (lastRange.getStartRevision() <= mRange.getEndRevision() && mRange.getStartRevision() <= lastRange.getEndRevision()) { rangesIntersect = true; if (lastRange.isInheritable() == mRange.isInheritable()) { rangesHaveSameInheritance = true; pushedMRange1 = mRange.dup(); } else { pushedMRange1 = mRange; long tmpRevision = -1; if (rangesHaveSameInheritance) { lastRange.setStartRevision(Math.min(lastRange.getStartRevision(), mRange.getStartRevision())); lastRange.setEndRevision(Math.max(lastRange.getEndRevision(), mRange.getEndRevision())); lastRange.setInheritable(lastRange.isInheritable() || mRange.isInheritable()); } else { if (lastRange.getStartRevision() == mRange.getStartRevision()) { if (lastRange.getEndRevision() == mRange.getEndRevision()) { lastRange.setInheritable(true); } else if (lastRange.getEndRevision() > mRange.getEndRevision()) { if (!lastRange.isInheritable()) { tmpRevision = lastRange.getEndRevision(); lastRange.setEndRevision(mRange.getEndRevision()); lastRange.setInheritable(true); if (dupMRange) { pushedMRange1 = mRange.dup(); } else {
private void sliceRemainingRanges(Map<File, MergePath> childrenWithMergeInfo, boolean isRollBack, long endRevision) { for (MergePath child: childrenWithMergeInfo.values()) { if (child == null || child.absent) { continue; } if (!child.remainingRanges.isEmpty()) { SVNMergeRange[] originalRemainingRanges = child.remainingRanges.getRanges(); SVNMergeRange range = originalRemainingRanges[0]; if ((isRollBack && range.getStartRevision() > endRevision && range.getEndRevision() < endRevision) || (!isRollBack && range.getStartRevision() < endRevision && range.getEndRevision() > endRevision)) { SVNMergeRange splitRange1 = new SVNMergeRange(range.getStartRevision(), endRevision, range.isInheritable()); SVNMergeRange splitRange2 = new SVNMergeRange(endRevision, range.getEndRevision(), range.isInheritable()); SVNMergeRange[] remainingRanges = new SVNMergeRange[originalRemainingRanges.length + 1]; remainingRanges[0] = splitRange1; remainingRanges[1] = splitRange2; System.arraycopy(originalRemainingRanges, 1, remainingRanges, 2, originalRemainingRanges.length - 1); child.remainingRanges = new SVNMergeRangeList(remainingRanges); } } } }
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()) { 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", if (lastRange.isInheritable() == range.isInheritable()) { lastRange.setEndRevision(Math.max(range.getEndRevision(), lastRange.getEndRevision())); continue;
private SVNMergeRangeList filterNaturalHistoryFromMergeInfo(String srcPath, Map<String, SVNMergeRangeList> implicitMergeInfo, SVNMergeRange requestedRange) { SVNMergeRangeList requestedRangeList = new SVNMergeRangeList(requestedRange.dup()); SVNMergeRangeList filteredRangeList = null; if (implicitMergeInfo != null && requestedRange.getStartRevision() < requestedRange.getEndRevision()) { SVNMergeRangeList impliedRangeList = (SVNMergeRangeList) implicitMergeInfo.get(srcPath); if (impliedRangeList != null) { filteredRangeList = requestedRangeList.diff(impliedRangeList, false); } } if (filteredRangeList == null) { filteredRangeList = requestedRangeList; } return filteredRangeList; }
MergePath targetMergePath = childrenWithMergeInfo.values().iterator().next(); SVNNodeKind kind = context.readKind(addedPath, false); SVNMergeRange rng = range.dup(); if (kind == SVNNodeKind.FILE) { rng.setInheritable(true); } else { rng.setInheritable(!(depth == SVNDepth.INFINITY || depth == SVNDepth.IMMEDIATES)); mergeMergeino.put(addedMergeInfoPath, rangelist); SVNURL addedMergeInfoUrl = reposRootUrl.appendPath(addedMergeInfoPath, false); SVNRevision pegRevision = SVNRevision.create(Math.max(range.getStartRevision(), range.getEndRevision())); SVNURL oldUrl = ensureSessionURL(repos2, addedMergeInfoUrl); Math.max(range.getStartRevision(), range.getEndRevision()), Math.min(range.getStartRevision(), range.getEndRevision()));
for (SVNMergeRange range : ranges) { try { SVNURL startUrl = reposLocations(url, revision, reposRootUrl, reposUuid, range.getStartRevision() + 1, svnRepository); if (!startUrl.equals(mergeSourceUrl)) { adjustedRangeList.pushRange(range.getStartRevision(), range.getEndRevision(), range.isInheritable()); e.getErrorMessage().getErrorCode() == SVNErrorCode.FS_NOT_FOUND || e.getErrorMessage().getErrorCode() == SVNErrorCode.FS_NO_SUCH_REVISION) { adjustedRangeList.pushRange(range.getStartRevision(), range.getEndRevision(), range.isInheritable());
if (myAreSourcesAncestral) { MergePath item = new MergePath(targetWCPath); SVNMergeRange itemRange = new SVNMergeRange(revision1, revision2, true); item.myRemainingRanges = new SVNMergeRangeList(itemRange); myChildrenWithMergeInfo.add(item); SVNMergeRange range = new SVNMergeRange(revision1, revision2, inheritable); SVNRemoteDiffEditor editor = null; SVNErrorMessage err = null; long startRev = getMostInclusiveStartRevision(myChildrenWithMergeInfo, isRollBack); if (SVNRevision.isValidRevisionNumber(startRev)) { range.setStartRevision(startRev); long endRev = getMostInclusiveEndRevision(myChildrenWithMergeInfo, isRollBack); while (SVNRevision.isValidRevisionNumber(endRev)) { if (SVNRevision.isValidRevisionNumber(nextEndRev) && myConflictedPaths != null && !myConflictedPaths.isEmpty()) { SVNMergeRange conflictedRange = new SVNMergeRange(startRev, endRev, false); err = makeMergeConflictError(myTarget, conflictedRange); range.setEndRevision(endRev); break; SVNMergeRange rng = childMergeRanges[j]; if (childEntry.isFile()) { rng.setInheritable(true); } else { rng.setInheritable(!child.myHasMissingChildren && (depth == SVNDepth.INFINITY || depth == SVNDepth.IMMEDIATES));
SVNMergeRange range1 = myRanges[i]; SVNMergeRange range2 = rangeList.myRanges[j]; int res = range1.compareTo(range2); if (res == 0) { if (range1.isInheritable() || range2.isInheritable()) { range1.setInheritable(true);
SVNMergeRange youngestRange = masterInheritableRangeList.getRanges()[masterInheritableRangeList.getSize() - 1].dup(); SVNMergeRangeList youngestRangeList = new SVNMergeRangeList(youngestRange.getEndRevision() - 1, youngestRange.getEndRevision(), youngestRange.isInheritable()); for (String key : sourceHistory.keySet()) { SVNMergeRangeList subtreeMergedList = sourceHistory.get(key);
public SVNMergeRangeList mergeRevision(long revision) { if (getSize() > 0 && getRanges()[getSize() - 1].getEndRevision() == revision - 1) { getRanges()[getSize() - 1].setEndRevision(revision); return this; } pushRange(revision -1 , revision, true); return this; } }
/** * Creates a new merge range list initializing it with a single merge range which parameters are passed * to this constructor. * * @param start merge range start revision * @param end merge range end revision * @param inheritable inheritance information */ public SVNMergeRangeList(long start, long end, boolean inheritable) { this(new SVNMergeRange(start, end, inheritable)); }
protected boolean mergeInfoConflicts(SVNMergeRangeList rangeList, File path) { if (rangeList == null) { return false; } SVNMergeRange currentRange = new SVNMergeRange(Math.min(myRevision1, myRevision2), Math.max(myRevision1, myRevision2), false); SVNMergeRange[] ranges = rangeList.getRanges(); for (int i = 0; i < ranges.length; i++) { SVNMergeRange range = ranges[i]; if (currentRange.intersects(range, false)) { if (range.contains(currentRange, false)) { continue; } SVNDebugLog.getDefaultLog().logFine(SVNLogType.WC, "merge ext: merge info conflict found on " + path.getAbsolutePath()); return true; } } return false; }
private long getMostInclusiveEndRevision(Map<File, MergePath> childrenWithMergeInfo, boolean isRollBack) { long endRev = SVNRepository.INVALID_REVISION; for (MergePath child : childrenWithMergeInfo.values()) { if (child == null || child.absent) { continue; } if (child.remainingRanges.getSize() > 0) { SVNMergeRange ranges[] = child.remainingRanges.getRanges(); SVNMergeRange range = ranges[0]; if (!SVNRevision.isValidRevisionNumber(endRev) || (isRollBack && range.getEndRevision() > endRev) || (!isRollBack && range.getEndRevision() < endRev)) { endRev = range.getEndRevision(); } } } return endRev; }
SVNMergeRange range = new SVNMergeRange(startRev - 1, startRev, true); if (mergeInfo.length() > 0 && mergeInfo.charAt(0) == '-') { mergeInfo = mergeInfo.deleteCharAt(0); SVNErrorManager.error(err, SVNLogType.DEFAULT); range.setEndRevision(endRev); mergeInfo = mergeInfo.deleteCharAt(0); } else if (mergeInfo.length() > 0 && mergeInfo.charAt(0) == '*') { range.setInheritable(false); mergeInfo = mergeInfo.deleteCharAt(0); if (mergeInfo.length() == 0 || mergeInfo.charAt(0) == ',' || mergeInfo.charAt(0) == '\n') {
MergePath targetMergePath = (MergePath) myChildrenWithMergeInfo.get(0); SVNMergeRange rng = range.dup(); if (entry.isFile()) { rng.setInheritable(true); } else { rng.setInheritable(!(depth == SVNDepth.INFINITY || depth == SVNDepth.IMMEDIATES));
/** * Return a string representation of this object. * @return this object as a string */ public String toString() { String output = ""; if (myStartRevision == myEndRevision - 1) { output += String.valueOf(myEndRevision); } else { output += String.valueOf(myStartRevision + 1) + "-" + String.valueOf(myEndRevision); } if (!isInheritable()) { output += SVNMergeRangeList.MERGE_INFO_NONINHERITABLE_STRING; } return output; }