public Hunk write()

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;
        }
    }