while (aCur < aEnd || bCur < bEnd) {
if (aCur < curEdit.getBeginA() || endIdx + 1 < curIdx) {
- writeLine(out, ' ', a, aCur);
+ writeContextLine(out, a, aCur, isEndOfLineMissing(a, aCur));
aCur++;
bCur++;
-
} else if (aCur < curEdit.getEndA()) {
- writeLine(out, '-', a, aCur++);
-
+ writeRemovedLine(out, a, aCur, isEndOfLineMissing(a, aCur));
+ aCur++;
} else if (bCur < curEdit.getEndB()) {
- writeLine(out, '+', b, bCur++);
+ writeAddedLine(out, b, bCur, isEndOfLineMissing(b, bCur));
+ bCur++;
}
if (end(curEdit, aCur, bCur) && ++curIdx < edits.size())
}
}
- private void writeHunkHeader(final OutputStream out, int aCur, int aEnd,
- int bCur, int bEnd) throws IOException {
+ /**
+ * Output a line of diff context
+ *
+ * @param out
+ * OutputStream
+ * @param text
+ * RawText for accessing raw data
+ * @param line
+ * the line number within text
+ * @param endOfLineMissing
+ * true if we should add the GNU end of line missing warning
+ * @throws IOException
+ */
+ protected void writeContextLine(final OutputStream out, final RawText text,
+ final int line, boolean endOfLineMissing) throws IOException {
+ writeLine(out, ' ', text, line, endOfLineMissing);
+ }
+
+ private boolean isEndOfLineMissing(final RawText text, final int line) {
+ return line + 1 == text.size() && text.isMissingNewlineAtEnd();
+ }
+
+ /**
+ * Output an added line
+ *
+ * @param out
+ * OutputStream
+ * @param text
+ * RawText for accessing raw data
+ * @param line
+ * the line number within text
+ * @param endOfLineMissing
+ * true if we should add the gnu end of line missing warning
+ * @throws IOException
+ */
+ protected void writeAddedLine(final OutputStream out, final RawText text, final int line, boolean endOfLineMissing)
+ throws IOException {
+ writeLine(out, '+', text, line, endOfLineMissing);
+ }
+
+ /**
+ * Output a removed line
+ *
+ * @param out
+ * OutputStream
+ * @param text
+ * RawText for accessing raw data
+ * @param line
+ * the line number within text
+ * @param endOfLineMissing
+ * true if we should add the gnu end of line missing warning
+ * @throws IOException
+ */
+ protected void writeRemovedLine(final OutputStream out, final RawText text,
+ final int line, boolean endOfLineMissing) throws IOException {
+ writeLine(out, '-', text, line, endOfLineMissing);
+ }
+
+ /**
+ * Output a hunk header
+ *
+ * @param out
+ * OutputStream
+ * @param aStartLine
+ * within first source
+ * @param aEndLine
+ * within first source
+ * @param bStartLine
+ * within second source
+ * @param bEndLine
+ * within second source
+ * @throws IOException
+ */
+ protected void writeHunkHeader(final OutputStream out, int aStartLine, int aEndLine,
+ int bStartLine, int bEndLine) throws IOException {
out.write('@');
out.write('@');
- writeRange(out, '-', aCur + 1, aEnd - aCur);
- writeRange(out, '+', bCur + 1, bEnd - bCur);
+ writeRange(out, '-', aStartLine + 1, aEndLine - aStartLine);
+ writeRange(out, '+', bStartLine + 1, bEndLine - bStartLine);
out.write(' ');
out.write('@');
out.write('@');
}
private static void writeLine(final OutputStream out, final char prefix,
- final RawText text, final int cur) throws IOException {
+ final RawText text, final int cur, boolean noNewLineIndicator) throws IOException {
out.write(prefix);
text.writeLine(out, cur);
out.write('\n');
- if (cur + 1 == text.size() && text.isMissingNewlineAtEnd())
- out.write(noNewLine);
+ if (noNewLineIndicator)
+ writeNoNewLine(out);
+ }
+
+ private static void writeNoNewLine(final OutputStream out)
+ throws IOException {
+ out.write(noNewLine);
}
private int findCombinedEnd(final List<Edit> edits, final int i) {