in vault-diff/src/main/java/org/apache/jackrabbit/vault/util/diff/Hunk.java [116:195]
public Hunk write(DiffWriter out, int numContextLines) throws IOException {
if (type == UNMODIFIED) {
//writeData(out, left, " ");
return next;
} else {
Hunk last = next;
Hunk prevLast = this;
// search hunk that is big enough to hold 2 x numContextLines or is
// the last hunk.
while (last != null) {
if (last.type == UNMODIFIED
&&
(last.left.len() > 2*numContextLines || last.next == null)) {
break;
}
prevLast = last;
last = last.next;
}
// get new ranges for diff line
Range prevRange;
if (prev == null) {
// this is the very first hunk, so no previous context lines
prevRange = new Range(left.doc, left.low, left.low);
} else {
// the search above ensures that the previous one never overlaps
// this hunk. we just need to guard the very first hunk
prevRange = new Range(left.doc, Math.max(left.low - numContextLines, 0), left.low);
}
Range lastRange;
if (last == null) {
// if we did not find a last hunk, create an empty range
// with the bounds of the hunk previous to the last
lastRange = new Range(left.doc, prevLast.left.high, prevLast.left.high);
} else {
// we are not allowed to enlarge the range
lastRange = new Range(left.doc, last.left.low, Math.min(last.left.high, last.left.low + numContextLines));
}
// handle special case where our diff differs from the GNU diff
// i reckon this is a bug in {@link Diff} where the line number
// of a deletion or insertion is 1 too big.
int prevLen0 = prevRange.len();
int lastLen0 = lastRange.len();
int prevLen1 = prevRange.len();
int lastLen1 = lastRange.len();
if (left.len() == 0 && numContextLines == 0) {
prevLen0 = 1;
lastLen0--;
}
if (right.len() == 0 && numContextLines == 0) {
prevLen1 = 1;
lastLen1--;
}
Range newLeft = new Range(left.doc,
left.low - prevLen0,
prevLast.left.high + lastLen0);
Range newRight = new Range(right.doc,
right.low - prevLen1,
prevLast.right.high + lastLen1);
out.write("@@ -");
out.write(newLeft.toRangeString());
out.write(" +");
out.write(newRight.toRangeString());
out.write(" @@");
out.writeNewLine();
// output previous context line
writeData(out, prevRange, " ");
Hunk h = this;
while (h != last) {
h.writeBody(out);
h = h.next;
}
writeData(out, lastRange, " ");
return last;
}
}