From 7dd99fe7474604f314c01bcd4123eb7cbacfb583 Mon Sep 17 00:00:00 2001 From: Tom Date: Tue, 11 Nov 2014 07:52:15 +0100 Subject: Image diffs Ticket 88: https://dev.gitblit.com/tickets/gitblit.git/88 Based on Lea Verou's pure CSS slider: http://lea.verou.me/2014/07/image-comparison-slider-with-pure-css/ * Add a callback interface, pass it through DiffUtils to the GitBlitDiffFormatter. Is needed because the rendering needs access to the repositoryName and other things that are known only at higher levels. * New class ImageDiffHandler responsible for rendering an image diff. Called for all binary diffs, doesn't do anything if it's not an image. HTML is generated via JSoup: no worries about forgetting to close a tag, not about HTML escaping, nor about XSS. * The 3 diff pages set up such an ImageDIffHandler and pass it along. * CSS changes: from Lea Verou, with some minor improvements. I think in the long run there'll be no way around rewriting the HTML diff formatter from scratch, not using the standard JGit DiffFormatter at all. --- src/main/java/com/gitblit/utils/DiffUtils.java | 97 +++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) (limited to 'src/main/java/com/gitblit/utils/DiffUtils.java') diff --git a/src/main/java/com/gitblit/utils/DiffUtils.java b/src/main/java/com/gitblit/utils/DiffUtils.java index f597b946..b30a203d 100644 --- a/src/main/java/com/gitblit/utils/DiffUtils.java +++ b/src/main/java/com/gitblit/utils/DiffUtils.java @@ -51,6 +51,27 @@ public class DiffUtils { private static final Logger LOGGER = LoggerFactory.getLogger(DiffUtils.class); + /** + * Callback interface for binary diffs. All the getDiff methods here take an optional handler; + * if given and the {@link DiffOutputType} is {@link DiffOutputType#HTML HTML}, it is responsible + * for displaying a binary diff. + */ + public interface BinaryDiffHandler { + + /** + * Renders a binary diff. The result must be valid HTML, it will be inserted into an HTML table cell. + * May return {@code null} if the default behavior (which is typically just a textual note "Bnary + * files differ") is desired. + * + * @param diffEntry + * current diff entry + * + * @return the rendered diff as HTML, or {@code null} if the default is desired. + */ + public String renderBinaryDiff(final DiffEntry diffEntry); + + } + /** * Enumeration for the diff output types. */ @@ -180,6 +201,23 @@ public class DiffUtils { return getDiff(repository, null, commit, null, outputType); } + /** + * Returns the complete diff of the specified commit compared to its primary parent. + * + * @param repository + * @param commit + * @param outputType + * @param handler + * to use for rendering binary diffs if {@code outputType} is {@link DiffOutputType#HTML HTML}. + * May be {@code null}, resulting in the default behavior. + * @return the diff + */ + public static DiffOutput getCommitDiff(Repository repository, RevCommit commit, + DiffOutputType outputType, BinaryDiffHandler handler) { + return getDiff(repository, null, commit, null, outputType, handler); + } + + /** * Returns the diff for the specified file or folder from the specified * commit compared to its primary parent. @@ -195,6 +233,24 @@ public class DiffUtils { return getDiff(repository, null, commit, path, outputType); } + /** + * Returns the diff for the specified file or folder from the specified + * commit compared to its primary parent. + * + * @param repository + * @param commit + * @param path + * @param outputType + * @param handler + * to use for rendering binary diffs if {@code outputType} is {@link DiffOutputType#HTML HTML}. + * May be {@code null}, resulting in the default behavior. + * @return the diff + */ + public static DiffOutput getDiff(Repository repository, RevCommit commit, String path, + DiffOutputType outputType, BinaryDiffHandler handler) { + return getDiff(repository, null, commit, path, outputType, handler); + } + /** * Returns the complete diff between the two specified commits. * @@ -209,6 +265,23 @@ public class DiffUtils { return getDiff(repository, baseCommit, commit, null, outputType); } + /** + * Returns the complete diff between the two specified commits. + * + * @param repository + * @param baseCommit + * @param commit + * @param outputType + * @param handler + * to use for rendering binary diffs if {@code outputType} is {@link DiffOutputType#HTML HTML}. + * May be {@code null}, resulting in the default behavior. + * @return the diff + */ + public static DiffOutput getDiff(Repository repository, RevCommit baseCommit, RevCommit commit, + DiffOutputType outputType, BinaryDiffHandler handler) { + return getDiff(repository, baseCommit, commit, null, outputType, handler); + } + /** * Returns the diff between two commits for the specified file. * @@ -225,6 +298,28 @@ public class DiffUtils { */ public static DiffOutput getDiff(Repository repository, RevCommit baseCommit, RevCommit commit, String path, DiffOutputType outputType) { + return getDiff(repository, baseCommit, commit, path, outputType, null); + } + + /** + * Returns the diff between two commits for the specified file. + * + * @param repository + * @param baseCommit + * if base commit is null the diff is to the primary parent of + * the commit. + * @param commit + * @param path + * if the path is specified, the diff is restricted to that file + * or folder. if unspecified, the diff is for the entire commit. + * @param outputType + * @param handler + * to use for rendering binary diffs if {@code outputType} is {@link DiffOutputType#HTML HTML}. + * May be {@code null}, resulting in the default behavior. + * @return the diff + */ + public static DiffOutput getDiff(Repository repository, RevCommit baseCommit, RevCommit commit, String path, DiffOutputType outputType, + final BinaryDiffHandler handler) { DiffStat stat = null; String diff = null; try { @@ -233,7 +328,7 @@ public class DiffUtils { DiffFormatter df; switch (outputType) { case HTML: - df = new GitBlitDiffFormatter(commit.getName(), path); + df = new GitBlitDiffFormatter(commit.getName(), path, handler); break; case PLAIN: default: -- cgit v1.2.3