From f6b200be4c8b90c26886c6cdd5809abac8c4ac15 Mon Sep 17 00:00:00 2001 From: James Moger Date: Wed, 27 Mar 2013 12:46:05 -0400 Subject: Reorganized to Apache Standard Directory Layout & integrated Moxie This is a massive commit which reorganizes the entire project structure (although it is still monolithic), removes the Build classes, and switches to Moxie, a smarter Ant build tookit based on the original Gitblit Build classes. The Ant build script will likely require additional fine-tuning, but this is big step forward. --- .../com/gitblit/utils/GitWebDiffFormatter.java | 155 +++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 src/main/java/com/gitblit/utils/GitWebDiffFormatter.java (limited to 'src/main/java/com/gitblit/utils/GitWebDiffFormatter.java') diff --git a/src/main/java/com/gitblit/utils/GitWebDiffFormatter.java b/src/main/java/com/gitblit/utils/GitWebDiffFormatter.java new file mode 100644 index 00000000..e657dc58 --- /dev/null +++ b/src/main/java/com/gitblit/utils/GitWebDiffFormatter.java @@ -0,0 +1,155 @@ +/* + * Copyright 2011 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gitblit.utils; + +import static org.eclipse.jgit.lib.Constants.encode; +import static org.eclipse.jgit.lib.Constants.encodeASCII; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import org.eclipse.jgit.diff.DiffFormatter; +import org.eclipse.jgit.diff.RawText; +import org.eclipse.jgit.util.RawParseUtils; + +/** + * Returns an html snippet of the diff in the standard Gitweb style. + * + * @author James Moger + * + */ +public class GitWebDiffFormatter extends DiffFormatter { + + private final OutputStream os; + + public GitWebDiffFormatter(OutputStream os) { + super(os); + this.os = os; + } + + /** + * Output a hunk header + * + * @param aStartLine + * within first source + * @param aEndLine + * within first source + * @param bStartLine + * within second source + * @param bEndLine + * within second source + * @throws IOException + */ + @Override + protected void writeHunkHeader(int aStartLine, int aEndLine, int bStartLine, int bEndLine) + throws IOException { + os.write("
".getBytes()); + os.write('@'); + os.write('@'); + writeRange('-', aStartLine + 1, aEndLine - aStartLine); + writeRange('+', bStartLine + 1, bEndLine - bStartLine); + os.write(' '); + os.write('@'); + os.write('@'); + os.write("
".getBytes()); + } + + protected void writeRange(final char prefix, final int begin, final int cnt) throws IOException { + os.write(' '); + os.write(prefix); + switch (cnt) { + case 0: + // If the range is empty, its beginning number must + // be the + // line just before the range, or 0 if the range is + // at the + // start of the file stream. Here, begin is always 1 + // based, + // so an empty file would produce "0,0". + // + os.write(encodeASCII(begin - 1)); + os.write(','); + os.write('0'); + break; + + case 1: + // If the range is exactly one line, produce only + // the number. + // + os.write(encodeASCII(begin)); + break; + + default: + os.write(encodeASCII(begin)); + os.write(','); + os.write(encodeASCII(cnt)); + break; + } + } + + @Override + protected void writeLine(final char prefix, final RawText text, final int cur) + throws IOException { + switch (prefix) { + case '+': + os.write("".getBytes()); + break; + case '-': + os.write("".getBytes()); + break; + } + os.write(prefix); + String line = text.getString(cur); + line = StringUtils.escapeForHtml(line, false); + os.write(encode(line)); + switch (prefix) { + case '+': + case '-': + os.write("\n".getBytes()); + break; + default: + os.write('\n'); + } + } + + /** + * Workaround function for complex private methods in DiffFormatter. This + * sets the html for the diff headers. + * + * @return + */ + public String getHtml() { + ByteArrayOutputStream bos = (ByteArrayOutputStream) os; + String html = RawParseUtils.decode(bos.toByteArray()); + String[] lines = html.split("\n"); + StringBuilder sb = new StringBuilder(); + sb.append("
"); + for (String line : lines) { + if (line.startsWith("diff")) { + sb.append("
").append(StringUtils.convertOctal(line)).append("
"); + } else if (line.startsWith("---")) { + sb.append("").append(StringUtils.convertOctal(line)).append("
"); + } else if (line.startsWith("+++")) { + sb.append("").append(StringUtils.convertOctal(line)).append("
"); + } else { + sb.append(line).append('\n'); + } + } + sb.append("
\n"); + return sb.toString(); + } +} -- cgit v1.2.3