public SVNStatusType mergeText(File baseFile, File localFile, File latestFile, boolean dryRun, SVNDiffOptions options, OutputStream result) throws SVNException { FSMergerBySequence merger = new FSMergerBySequence(myStart, mySeparator, myEnd); int mergeResult = 0; RandomAccessFile localIS = null; QSequenceLineRAData localData = new QSequenceLineRAFileData(localIS); QSequenceLineRAData latestData = new QSequenceLineRAFileData(latestIS); mergeResult = merger.merge(baseData, localData, latestData, options, result); } catch (IOException e) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.IO_ERROR, e.getLocalizedMessage());
private int createConflict(OutputStream result, QSequenceDifferenceBlock localStart, QSequenceDifferenceBlock localEnd, QSequenceDifferenceBlock latestStart, QSequenceDifferenceBlock latestEnd, QSequenceLineCache localLines, QSequenceLineCache latestLines, int baseLineIndex, List transformedLocalLines) throws IOException { final int minBaseFrom = Math.min(localStart.getLeftFrom(), latestStart.getLeftFrom()); final int maxBaseTo = Math.max(localEnd.getLeftTo(), latestEnd.getLeftTo()); appendTransformedLocalLines(baseLineIndex, minBaseFrom, transformedLocalLines, result); final int localFrom = Math.max(0, localStart.getRightFrom() - (localStart.getLeftFrom() - minBaseFrom)); final int localTo = Math.min(localLines.getLineCount() - 1, localEnd.getRightTo() + (maxBaseTo - localEnd.getLeftTo())); final int latestFrom = Math.max(0, latestStart.getRightFrom() - (latestStart.getLeftFrom() - minBaseFrom)); final int latestTo = Math.min(latestLines.getLineCount() - 1, latestEnd.getRightTo() + (maxBaseTo - latestEnd.getLeftTo())); writeBytesAndEol(result, myConflictStart); for (int index = localFrom; index <= localTo; index++) { writeLine(result, localLines.getLine(index)); } writeBytesAndEol(result, myConflictSeparator); for (int index = latestFrom; index <= latestTo; index++) { writeLine(result, latestLines.getLine(index)); } writeBytesAndEol(result, myConflictEnd); return maxBaseTo; }
private boolean checkConflict(FSMergerBySequenceList localChanges, FSMergerBySequenceList latestChanges, QSequenceLineCache localLines, QSequenceLineCache latestLines, int baseLineCount) throws IOException { boolean conflict = false; while (intersect(localChanges.current(), latestChanges.current(), baseLineCount) && !isEqualChange(localChanges.current(), latestChanges.current(), localLines, latestLines)) { conflict = true; if (localChanges.current().getLeftTo() <= latestChanges.current().getLeftTo()) { if (localChanges.hasNext() && intersect(localChanges.peekNext(), latestChanges.current(), baseLineCount)) { localChanges.forward(); } else { break; } } else { if (latestChanges.hasNext() && intersect(localChanges.current(), latestChanges.peekNext(), baseLineCount)) { latestChanges.forward(); } else { break; } } } return conflict; }
private int appendLines(OutputStream result, QSequenceDifferenceBlock block, QSequenceLineCache changedLines, int baseLineIndex, List transformedLocalLines) throws IOException { appendTransformedLocalLines(baseLineIndex, block.getLeftFrom(), transformedLocalLines, result); for (int changedLineIndex = block.getRightFrom(); changedLineIndex <= block.getRightTo(); changedLineIndex++) { writeLine(result, changedLines.getLine(changedLineIndex)); } return block.getLeftTo(); }
final QSequenceLineTeeSimplifier mySimplifer = createSimplifier(options); try { localResult = QSequenceLineMedia.createBlocks(baseData, localData, mySimplifer); final FSMergerBySequenceList local = new FSMergerBySequenceList(localResult.getBlocks()); final FSMergerBySequenceList latest = new FSMergerBySequenceList(latestResult.getBlocks()); final List transformedLocalLines = transformLocalLines(localResult.getBlocks(), localLines); if (local.hasCurrent() && latest.hasCurrent() && isEqualChange(local.current(), latest.current(), localLines, latestLines)) { baseLineIndex = appendLines(result, local.current(), localLines, baseLineIndex, transformedLocalLines); local.forward(); latest.forward(); final QSequenceDifferenceBlock localStartBlock = local.current(); final QSequenceDifferenceBlock latestStartBlock = latest.current(); if (checkConflict(local, latest, localLines, latestLines, baseLines.getLineCount())) { baseLineIndex = createConflict(result, localStartBlock, local.current(), latestStartBlock, latest.current(), localLines, latestLines, baseLineIndex, transformedLocalLines); local.forward(); latest.forward(); if (local.hasCurrent() && isBefore(local.current(), latest.hasCurrent() ? latest.current() : null)) { baseLineIndex = appendLines(result, local.current(), localLines, baseLineIndex, transformedLocalLines); local.forward(); merged = true; baseLineIndex = appendLines(result, latest.current(), latestLines, baseLineIndex, transformedLocalLines); latest.forward(); merged = true;
final QSequenceLineTeeSimplifier mySimplifer = createSimplifier(options); try { localResult = QSequenceLineMedia.createBlocks(baseData, localData, mySimplifer); final FSMergerBySequenceList local = new FSMergerBySequenceList(localResult.getBlocks()); final FSMergerBySequenceList latest = new FSMergerBySequenceList(latestResult.getBlocks()); final List transformedLocalLines = transformLocalLines(localResult.getBlocks(), localLines); if (local.hasCurrent() && latest.hasCurrent() && isEqualChange(local.current(), latest.current(), localLines, latestLines)) { baseLineIndex = appendLines(result, local.current(), localLines, baseLineIndex, transformedLocalLines); local.forward(); latest.forward(); final QSequenceDifferenceBlock localStartBlock = local.current(); final QSequenceDifferenceBlock latestStartBlock = latest.current(); if (checkConflict(local, latest, localLines, latestLines, baseLines.getLineCount())) { if (style == SVNDiffConflictChoiceStyle.CHOOSE_LATEST) { baseLineIndex = appendLines(result, latest.current(), latestLines, baseLineIndex, transformedLocalLines); local.forward(); latest.forward(); merged = true; } else if (style == SVNDiffConflictChoiceStyle.CHOOSE_MODIFIED) { baseLineIndex = appendLines(result, local.current(), localLines, baseLineIndex, transformedLocalLines); local.forward(); latest.forward(); baseLineIndex = createConflict(result, localStartBlock, local.current(), latestStartBlock, latest.current(), localLines, latestLines, baseLineIndex, transformedLocalLines); local.forward(); latest.forward();
private int appendLines(OutputStream result, QSequenceDifferenceBlock block, QSequenceLineCache changedLines, int baseLineIndex, List transformedLocalLines) throws IOException { appendTransformedLocalLines(baseLineIndex, block.getLeftFrom(), transformedLocalLines, result); for (int changedLineIndex = block.getRightFrom(); changedLineIndex <= block.getRightTo(); changedLineIndex++) { writeLine(result, changedLines.getLine(changedLineIndex)); } return block.getLeftTo(); }
final QSequenceLineTeeSimplifier mySimplifer = createSimplifier(options); try { localResult = QSequenceLineMedia.createBlocks(baseData, localData, mySimplifer); final FSMergerBySequenceList local = new FSMergerBySequenceList(localResult.getBlocks()); final FSMergerBySequenceList latest = new FSMergerBySequenceList(latestResult.getBlocks()); final List transformedLocalLines = transformLocalLines(localResult.getBlocks(), localLines); if (local.hasCurrent() && latest.hasCurrent() && isEqualChange(local.current(), latest.current(), localLines, latestLines)) { baseLineIndex = appendLines(result, local.current(), localLines, baseLineIndex, transformedLocalLines); local.forward(); latest.forward(); final QSequenceDifferenceBlock localStartBlock = local.current(); final QSequenceDifferenceBlock latestStartBlock = latest.current(); if (checkConflict(local, latest, localLines, latestLines, baseLines.getLineCount())) { baseLineIndex = createConflict(result, localStartBlock, local.current(), latestStartBlock, latest.current(), localLines, latestLines, baseLineIndex, transformedLocalLines); local.forward(); latest.forward(); if (local.hasCurrent() && isBefore(local.current(), latest.hasCurrent() ? latest.current() : null)) { baseLineIndex = appendLines(result, local.current(), localLines, baseLineIndex, transformedLocalLines); local.forward(); merged = true; baseLineIndex = appendLines(result, latest.current(), latestLines, baseLineIndex, transformedLocalLines); latest.forward(); merged = true;
private void showConflictedChunks(SVNMergeFileSet files) throws SVNException { byte[] conflictStartMarker = "<<<<<<< MINE (select with 'mc')".getBytes(); byte[] conflictSeparator = "=======".getBytes(); byte[] conflictEndMarker = ">>>>>>> THEIRS (select with 'tc')".getBytes(); byte[] conflictOriginalMarker = "||||||| ORIGINAL".getBytes(); SVNDiffOptions options = new SVNDiffOptions(false, false, true); FSMergerBySequence merger = new FSMergerBySequence(conflictStartMarker, conflictSeparator, conflictEndMarker, conflictOriginalMarker); RandomAccessFile localIS = null; RandomAccessFile latestIS = null; RandomAccessFile baseIS = null; try { localIS = new RandomAccessFile(files.getWCFile(), "r"); latestIS = new RandomAccessFile(files.getRepositoryFile(), "r"); baseIS = new RandomAccessFile(files.getBaseFile(), "r"); QSequenceLineRAData baseData = new QSequenceLineRAFileData(baseIS); QSequenceLineRAData localData = new QSequenceLineRAFileData(localIS); QSequenceLineRAData latestData = new QSequenceLineRAFileData(latestIS); merger.merge(baseData, localData, latestData, options, mySVNEnvironment.getOut(), SVNDiffConflictChoiceStyle.CHOOSE_ONLY_CONFLICTS); } catch (IOException e) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.IO_ERROR, e.getLocalizedMessage()); SVNErrorManager.error(err, e, SVNLogType.WC); } finally { SVNFileUtil.closeFile(localIS); SVNFileUtil.closeFile(baseIS); SVNFileUtil.closeFile(latestIS); } }
private int createConflict(OutputStream result, QSequenceDifferenceBlock localStart, QSequenceDifferenceBlock localEnd, QSequenceDifferenceBlock latestStart, QSequenceDifferenceBlock latestEnd, QSequenceLineCache localLines, QSequenceLineCache latestLines, int baseLineIndex, List transformedLocalLines) throws IOException { final int minBaseFrom = Math.min(localStart.getLeftFrom(), latestStart.getLeftFrom()); final int maxBaseTo = Math.max(localEnd.getLeftTo(), latestEnd.getLeftTo()); appendTransformedLocalLines(baseLineIndex, minBaseFrom, transformedLocalLines, result); final int localFrom = Math.max(0, localStart.getRightFrom() - (localStart.getLeftFrom() - minBaseFrom)); final int localTo = Math.min(localLines.getLineCount() - 1, localEnd.getRightTo() + (maxBaseTo - localEnd.getLeftTo())); final int latestFrom = Math.max(0, latestStart.getRightFrom() - (latestStart.getLeftFrom() - minBaseFrom)); final int latestTo = Math.min(latestLines.getLineCount() - 1, latestEnd.getRightTo() + (maxBaseTo - latestEnd.getLeftTo())); writeBytesAndEol(result, myConflictStart); for (int index = localFrom; index <= localTo; index++) { writeLine(result, localLines.getLine(index)); } writeBytesAndEol(result, myConflictSeparator); for (int index = latestFrom; index <= latestTo; index++) { writeLine(result, latestLines.getLine(index)); } writeBytesAndEol(result, myConflictEnd); return maxBaseTo; }
private int appendLines(OutputStream result, QSequenceDifferenceBlock block, QSequenceLineCache changedLines, int baseLineIndex, List transformedLocalLines) throws IOException { appendTransformedLocalLines(baseLineIndex, block.getLeftFrom(), transformedLocalLines, result); for (int changedLineIndex = block.getRightFrom(); changedLineIndex <= block.getRightTo(); changedLineIndex++) { writeLine(result, changedLines.getLine(changedLineIndex)); } return block.getLeftTo(); }
private boolean checkConflict(FSMergerBySequenceList localChanges, FSMergerBySequenceList latestChanges, QSequenceLineCache localLines, QSequenceLineCache latestLines, int baseLineCount) throws IOException { boolean conflict = false; while (intersect(localChanges.current(), latestChanges.current(), baseLineCount) && !isEqualChange(localChanges.current(), latestChanges.current(), localLines, latestLines)) { conflict = true; if (localChanges.current().getLeftTo() <= latestChanges.current().getLeftTo()) { if (localChanges.hasNext() && intersect(localChanges.peekNext(), latestChanges.current(), baseLineCount)) { localChanges.forward(); } else { break; } } else { if (latestChanges.hasNext() && intersect(localChanges.current(), latestChanges.peekNext(), baseLineCount)) { latestChanges.forward(); } else { break; } } } return conflict; }
final QSequenceLineTeeSimplifier mySimplifer = createSimplifier(options); try { localResult = QSequenceLineMedia.createBlocks(baseData, localData, mySimplifer); final FSMergerBySequenceList local = new FSMergerBySequenceList(localResult.getBlocks()); final FSMergerBySequenceList latest = new FSMergerBySequenceList(latestResult.getBlocks()); final List transformedLocalLines = transformLocalLines(localResult.getBlocks(), localLines); if (local.hasCurrent() && latest.hasCurrent() && isEqualChange(local.current(), latest.current(), localLines, latestLines)) { baseLineIndex = appendLines(result, local.current(), localLines, baseLineIndex, transformedLocalLines); local.forward(); latest.forward(); final QSequenceDifferenceBlock localStartBlock = local.current(); final QSequenceDifferenceBlock latestStartBlock = latest.current(); if (checkConflict(local, latest, localLines, latestLines, baseLines.getLineCount())) { if (style == SVNDiffConflictChoiceStyle.CHOOSE_LATEST) { baseLineIndex = createConflict(result, localStartBlock, local.current(), latestStartBlock, latest.current(), localLines, latestLines, baseLineIndex, transformedLocalLines, style); local.forward(); merged = true; } else if (style == SVNDiffConflictChoiceStyle.CHOOSE_MODIFIED) { baseLineIndex = createConflict(result, localStartBlock, local.current(), latestStartBlock, latest.current(), localLines, latestLines, baseLineIndex, transformedLocalLines, style); local.forward(); merged = true; } else if (style == SVNDiffConflictChoiceStyle.CHOOSE_MODIFIED_LATEST || style == SVNDiffConflictChoiceStyle.CHOOSE_MODIFIED_ORIGINAL_LATEST) {
private void showConflictedChunks(SVNMergeFileSet files) throws SVNException { byte[] conflictStartMarker = "<<<<<<< MINE (select with 'mc')".getBytes(); byte[] conflictSeparator = "=======".getBytes(); byte[] conflictEndMarker = ">>>>>>> THEIRS (select with 'tc')".getBytes(); byte[] conflictOriginalMarker = "||||||| ORIGINAL".getBytes(); SVNDiffOptions options = new SVNDiffOptions(false, false, true); FSMergerBySequence merger = new FSMergerBySequence(conflictStartMarker, conflictSeparator, conflictEndMarker, conflictOriginalMarker); RandomAccessFile localIS = null; RandomAccessFile latestIS = null; RandomAccessFile baseIS = null; try { localIS = new RandomAccessFile(files.getWCFile(), "r"); latestIS = new RandomAccessFile(files.getRepositoryFile(), "r"); baseIS = new RandomAccessFile(files.getBaseFile(), "r"); QSequenceLineRAData baseData = new QSequenceLineRAFileData(baseIS); QSequenceLineRAData localData = new QSequenceLineRAFileData(localIS); QSequenceLineRAData latestData = new QSequenceLineRAFileData(latestIS); merger.merge(baseData, localData, latestData, options, mySVNEnvironment.getOut(), SVNDiffConflictChoiceStyle.CHOOSE_ONLY_CONFLICTS); } catch (IOException e) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.IO_ERROR, e.getLocalizedMessage()); SVNErrorManager.error(err, e, SVNLogType.WC); } finally { SVNFileUtil.closeFile(localIS); SVNFileUtil.closeFile(baseIS); SVNFileUtil.closeFile(latestIS); } }
private int createConflict(OutputStream result, QSequenceDifferenceBlock localStart, QSequenceDifferenceBlock localEnd, QSequenceDifferenceBlock latestStart, QSequenceDifferenceBlock latestEnd, QSequenceLineCache localLines, QSequenceLineCache latestLines, int baseLineIndex, List transformedLocalLines) throws IOException { final int minBaseFrom = Math.min(localStart.getLeftFrom(), latestStart.getLeftFrom()); final int maxBaseTo = Math.max(localEnd.getLeftTo(), latestEnd.getLeftTo()); appendTransformedLocalLines(baseLineIndex, minBaseFrom, transformedLocalLines, result); final int localFrom = Math.max(0, localStart.getRightFrom() - (localStart.getLeftFrom() - minBaseFrom)); final int localTo = Math.min(localLines.getLineCount() - 1, localEnd.getRightTo() + (maxBaseTo - localEnd.getLeftTo())); final int latestFrom = Math.max(0, latestStart.getRightFrom() - (latestStart.getLeftFrom() - minBaseFrom)); final int latestTo = Math.min(latestLines.getLineCount() - 1, latestEnd.getRightTo() + (maxBaseTo - latestEnd.getLeftTo())); writeBytesAndEol(result, myConflictStart); for (int index = localFrom; index <= localTo; index++) { writeLine(result, localLines.getLine(index)); } writeBytesAndEol(result, myConflictSeparator); for (int index = latestFrom; index <= latestTo; index++) { writeLine(result, latestLines.getLine(index)); } writeBytesAndEol(result, myConflictEnd); return maxBaseTo; }
private int appendLines(OutputStream result, QSequenceDifferenceBlock block, QSequenceLineCache changedLines, int baseLineIndex, List transformedLocalLines) throws IOException { appendTransformedLocalLines(baseLineIndex, block.getLeftFrom(), transformedLocalLines, result); for (int changedLineIndex = block.getRightFrom(); changedLineIndex <= block.getRightTo(); changedLineIndex++) { writeLine(result, changedLines.getLine(changedLineIndex)); } return block.getLeftTo(); }
private boolean checkConflict(FSMergerBySequenceList localChanges, FSMergerBySequenceList latestChanges, QSequenceLineCache localLines, QSequenceLineCache latestLines, int baseLineCount) throws IOException { boolean conflict = false; while (intersect(localChanges.current(), latestChanges.current(), baseLineCount) && !isEqualChange(localChanges.current(), latestChanges.current(), localLines, latestLines)) { conflict = true; if (localChanges.current().getLeftTo() <= latestChanges.current().getLeftTo()) { if (localChanges.hasNext() && intersect(localChanges.peekNext(), latestChanges.current(), baseLineCount)) { localChanges.forward(); } else { break; } } else { if (latestChanges.hasNext() && intersect(localChanges.current(), latestChanges.peekNext(), baseLineCount)) { latestChanges.forward(); } else { break; } } } return conflict; }
String leftMarker = markersInfo.leftMarker; String rightMarker = markersInfo.rightMarker; FSMergerBySequence merger = new FSMergerBySequence(targetMarker.getBytes(), SVNWCContext.CONFLICT_SEPARATOR, rightMarker.getBytes(), leftMarker.getBytes()); int mergeResult = 0; RandomAccessFile localIS = null; QSequenceLineRAData localData = new QSequenceLineRAFileData(localIS); QSequenceLineRAData latestData = new QSequenceLineRAFileData(latestIS); mergeResult = merger.merge(baseData, localData, latestData, options, result, style); } catch (IOException e) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.IO_ERROR, e.getLocalizedMessage());
final int maxBaseTo = Math.max(localEnd.getLeftTo(), latestEnd.getLeftTo()); appendTransformedLocalLines(baseLineIndex, minBaseFrom, transformedLocalLines, result); writeBytesAndEol(result, myConflictStart); writeLine(result, localLines.getLine(index)); writeBytesAndEol(result, myOriginalMarker); writeBytesAndEol(result, myConflictSeparator); writeLine(result, latestLines.getLine(index)); writeBytesAndEol(result, myConflictEnd);
private boolean checkConflict(FSMergerBySequenceList localChanges, FSMergerBySequenceList latestChanges, QSequenceLineCache localLines, QSequenceLineCache latestLines, int baseLineCount) throws IOException { boolean conflict = false; while (intersect(localChanges.current(), latestChanges.current(), baseLineCount) && !isEqualChange(localChanges.current(), latestChanges.current(), localLines, latestLines)) { conflict = true; if (localChanges.current().getLeftTo() <= latestChanges.current().getLeftTo()) { if (localChanges.hasNext() && intersect(localChanges.peekNext(), latestChanges.current(), baseLineCount)) { localChanges.forward(); } else { break; } } else { if (latestChanges.hasNext() && intersect(localChanges.current(), latestChanges.peekNext(), baseLineCount)) { latestChanges.forward(); } else { break; } } } return conflict; }