From 310a807f07ceeaa7d8fa0890d9061021707bbeb8 Mon Sep 17 00:00:00 2001 From: James Moger Date: Fri, 22 May 2015 13:39:17 -0400 Subject: [PATCH] Implement configurable tab length support for blob views --- src/main/distrib/data/defaults.properties | 5 +++ .../com/gitblit/service/LuceneService.java | 3 +- .../java/com/gitblit/utils/DiffUtils.java | 41 +++++++++++-------- .../gitblit/utils/GitBlitDiffFormatter.java | 11 +++-- .../java/com/gitblit/utils/StringUtils.java | 17 +++++++- .../com/gitblit/wicket/pages/BlamePage.java | 3 +- .../gitblit/wicket/pages/BlobDiffPage.java | 4 +- .../com/gitblit/wicket/pages/BlobPage.java | 3 +- .../gitblit/wicket/pages/CommitDiffPage.java | 4 +- .../com/gitblit/wicket/pages/ComparePage.java | 4 +- .../wicket/pages/ReviewProposalPage.java | 3 +- .../java/com/gitblit/tests/DiffUtilsTest.java | 6 +-- .../com/gitblit/tests/StringUtilsTest.java | 2 +- 13 files changed, 71 insertions(+), 35 deletions(-) diff --git a/src/main/distrib/data/defaults.properties b/src/main/distrib/data/defaults.properties index 59fa3996..c1750689 100644 --- a/src/main/distrib/data/defaults.properties +++ b/src/main/distrib/data/defaults.properties @@ -784,6 +784,11 @@ web.includePersonalRepositories = false # BASEFOLDER web.projectsFile = ${baseFolder}/projects.conf +# Defines the tab length for all blob views +# +# SINCE 1.7.0 +web.tabLength = 4 + # Either the full path to a user config file (users.conf) # OR a fully qualified class name that implements the IUserService interface. # diff --git a/src/main/java/com/gitblit/service/LuceneService.java b/src/main/java/com/gitblit/service/LuceneService.java index 3f7635f4..798edb0a 100644 --- a/src/main/java/com/gitblit/service/LuceneService.java +++ b/src/main/java/com/gitblit/service/LuceneService.java @@ -1104,6 +1104,7 @@ public class LuceneService implements Runnable { content = ""; } + int tabLength = storedSettings.getInteger(Keys.web.tabLength, 4); int fragmentLength = SearchObjectType.commit == result.type ? 512 : 150; QueryScorer scorer = new QueryScorer(query, "content"); @@ -1126,7 +1127,7 @@ public class LuceneService implements Runnable { if (fragment.length() > fragmentLength) { fragment = fragment.substring(0, fragmentLength) + "..."; } - return "
" + StringUtils.escapeForHtml(fragment, true) + "
"; + return "
" + StringUtils.escapeForHtml(fragment, true, tabLength) + "
"; } // make sure we have unique fragments diff --git a/src/main/java/com/gitblit/utils/DiffUtils.java b/src/main/java/com/gitblit/utils/DiffUtils.java index 09b8f801..cdebec1b 100644 --- a/src/main/java/com/gitblit/utils/DiffUtils.java +++ b/src/main/java/com/gitblit/utils/DiffUtils.java @@ -229,11 +229,12 @@ public class DiffUtils { * @param commit * @param comparator * @param outputType + * @param tabLength * @return the diff */ public static DiffOutput getCommitDiff(Repository repository, RevCommit commit, - DiffComparator comparator, DiffOutputType outputType) { - return getDiff(repository, null, commit, null, comparator, outputType); + DiffComparator comparator, DiffOutputType outputType, int tabLength) { + return getDiff(repository, null, commit, null, comparator, outputType, tabLength); } /** @@ -246,11 +247,12 @@ public class DiffUtils { * @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. + * @param tabLength * @return the diff */ public static DiffOutput getCommitDiff(Repository repository, RevCommit commit, - DiffComparator comparator, DiffOutputType outputType, BinaryDiffHandler handler) { - return getDiff(repository, null, commit, null, comparator, outputType, handler); + DiffComparator comparator, DiffOutputType outputType, BinaryDiffHandler handler, int tabLength) { + return getDiff(repository, null, commit, null, comparator, outputType, handler, tabLength); } @@ -263,11 +265,12 @@ public class DiffUtils { * @param path * @param comparator * @param outputType + * @param tabLength * @return the diff */ public static DiffOutput getDiff(Repository repository, RevCommit commit, String path, - DiffComparator comparator, DiffOutputType outputType) { - return getDiff(repository, null, commit, path, comparator, outputType); + DiffComparator comparator, DiffOutputType outputType, int tabLength) { + return getDiff(repository, null, commit, path, comparator, outputType, tabLength); } /** @@ -282,11 +285,12 @@ public class DiffUtils { * @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. + * @param tabLength * @return the diff */ public static DiffOutput getDiff(Repository repository, RevCommit commit, String path, - DiffComparator comparator, DiffOutputType outputType, BinaryDiffHandler handler) { - return getDiff(repository, null, commit, path, comparator, outputType, handler); + DiffComparator comparator, DiffOutputType outputType, BinaryDiffHandler handler, int tabLength) { + return getDiff(repository, null, commit, path, comparator, outputType, handler, tabLength); } /** @@ -297,11 +301,13 @@ public class DiffUtils { * @param commit * @param comparator * @param outputType + * @param tabLength + * * @return the diff */ public static DiffOutput getDiff(Repository repository, RevCommit baseCommit, RevCommit commit, - DiffComparator comparator, DiffOutputType outputType) { - return getDiff(repository, baseCommit, commit, null, comparator, outputType); + DiffComparator comparator, DiffOutputType outputType, int tabLength) { + return getDiff(repository, baseCommit, commit, null, comparator, outputType, tabLength); } /** @@ -315,11 +321,12 @@ public class DiffUtils { * @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. + * @param tabLength * @return the diff */ public static DiffOutput getDiff(Repository repository, RevCommit baseCommit, RevCommit commit, - DiffComparator comparator, DiffOutputType outputType, BinaryDiffHandler handler) { - return getDiff(repository, baseCommit, commit, null, comparator, outputType, handler); + DiffComparator comparator, DiffOutputType outputType, BinaryDiffHandler handler, int tabLength) { + return getDiff(repository, baseCommit, commit, null, comparator, outputType, handler, tabLength); } /** @@ -335,11 +342,12 @@ public class DiffUtils { * or folder. if unspecified, the diff is for the entire commit. * @param outputType * @param diffComparator + * @param tabLength * @return the diff */ public static DiffOutput getDiff(Repository repository, RevCommit baseCommit, RevCommit commit, - String path, DiffComparator diffComparator, DiffOutputType outputType) { - return getDiff(repository, baseCommit, commit, path, diffComparator, outputType, null); + String path, DiffComparator diffComparator, DiffOutputType outputType, int tabLength) { + return getDiff(repository, baseCommit, commit, path, diffComparator, outputType, null, tabLength); } /** @@ -358,10 +366,11 @@ public class DiffUtils { * @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. + * @param tabLength * @return the diff */ public static DiffOutput getDiff(Repository repository, RevCommit baseCommit, RevCommit commit, String path, - DiffComparator comparator, DiffOutputType outputType, final BinaryDiffHandler handler) { + DiffComparator comparator, DiffOutputType outputType, final BinaryDiffHandler handler, int tabLength) { DiffStat stat = null; String diff = null; try { @@ -370,7 +379,7 @@ public class DiffUtils { DiffFormatter df; switch (outputType) { case HTML: - df = new GitBlitDiffFormatter(commit.getName(), path, handler); + df = new GitBlitDiffFormatter(commit.getName(), path, handler, tabLength); break; case PLAIN: default: diff --git a/src/main/java/com/gitblit/utils/GitBlitDiffFormatter.java b/src/main/java/com/gitblit/utils/GitBlitDiffFormatter.java index 35549d4e..86b7ca2e 100644 --- a/src/main/java/com/gitblit/utils/GitBlitDiffFormatter.java +++ b/src/main/java/com/gitblit/utils/GitBlitDiffFormatter.java @@ -127,6 +127,8 @@ public class GitBlitDiffFormatter extends DiffFormatter { /** If {@link #truncated}, contains all entries skipped. */ private final List skipped = new ArrayList(); + private int tabLength; + /** * A {@link ResettableByteArrayOutputStream} that intercept the "Binary files differ" message produced * by the super implementation. Unfortunately the super implementation has far too many things private; @@ -162,11 +164,12 @@ public class GitBlitDiffFormatter extends DiffFormatter { } - public GitBlitDiffFormatter(String commitId, String path, BinaryDiffHandler handler) { + public GitBlitDiffFormatter(String commitId, String path, BinaryDiffHandler handler, int tabLength) { super(new DiffOutputStream()); this.os = (DiffOutputStream) getOutputStream(); this.os.setFormatter(this, handler); this.diffStat = new DiffStat(commitId); + this.tabLength = tabLength; // If we have a full commitdiff, install maxima to avoid generating a super-long diff listing that // will only tax the browser too much. maxDiffLinesPerFile = path != null ? -1 : getLimit(DIFF_LIMIT_PER_FILE_KEY, 500, DIFF_LIMIT_PER_FILE); @@ -453,14 +456,14 @@ public class GitBlitDiffFormatter extends DiffFormatter { // Highlight trailing whitespace on deleted/added lines. Matcher matcher = trailingWhitespace.matcher(line); if (matcher.find()) { - StringBuilder result = new StringBuilder(StringUtils.escapeForHtml(line.substring(0, matcher.start()), CONVERT_TABS)); + StringBuilder result = new StringBuilder(StringUtils.escapeForHtml(line.substring(0, matcher.start()), CONVERT_TABS, tabLength)); result.append(""); result.append(StringUtils.escapeForHtml(matcher.group(1), false)); result.append(""); return result.toString(); } } - return StringUtils.escapeForHtml(line, CONVERT_TABS); + return StringUtils.escapeForHtml(line, CONVERT_TABS, tabLength); } /** @@ -493,7 +496,7 @@ public class GitBlitDiffFormatter extends DiffFormatter { } else { sb.append(""); } - line = StringUtils.escapeForHtml(line.substring(1), CONVERT_TABS); + line = StringUtils.escapeForHtml(line.substring(1), CONVERT_TABS, tabLength); } sb.append(line); if (gitLinkDiff) { diff --git a/src/main/java/com/gitblit/utils/StringUtils.java b/src/main/java/com/gitblit/utils/StringUtils.java index 087de543..643c52c3 100644 --- a/src/main/java/com/gitblit/utils/StringUtils.java +++ b/src/main/java/com/gitblit/utils/StringUtils.java @@ -79,6 +79,19 @@ public class StringUtils { * @return plain text escaped for html */ public static String escapeForHtml(String inStr, boolean changeSpace) { + return escapeForHtml(inStr, changeSpace, 4); + } + + /** + * Prepare text for html presentation. Replace sensitive characters with + * html entities. + * + * @param inStr + * @param changeSpace + * @param tabLength + * @return plain text escaped for html + */ + public static String escapeForHtml(String inStr, boolean changeSpace, int tabLength) { StringBuilder retStr = new StringBuilder(); int i = 0; while (i < inStr.length()) { @@ -93,7 +106,9 @@ public class StringUtils { } else if (changeSpace && inStr.charAt(i) == ' ') { retStr.append(" "); } else if (changeSpace && inStr.charAt(i) == '\t') { - retStr.append("    "); + for (int j = 0; j < tabLength; j++) { + retStr.append(" "); + } } else { retStr.append(inStr.charAt(i)); } diff --git a/src/main/java/com/gitblit/wicket/pages/BlamePage.java b/src/main/java/com/gitblit/wicket/pages/BlamePage.java index 3c850f29..e45bbbc8 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlamePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlamePage.java @@ -154,6 +154,7 @@ public class BlamePage extends RepositoryPage { add(new Label("missingBlob").setVisible(false)); + final int tabLength = app().settings().getInteger(Keys.web.tabLength, 4); List lines = DiffUtils.blame(getRepository(), blobPath, objectId); final Map colorMap = initializeColors(activeBlameType, lines); ListDataProvider blameDp = new ListDataProvider(lines); @@ -212,7 +213,7 @@ public class BlamePage extends RepositoryPage { color = colorMap.get(entry.commitId); break; } - Component data = new Label("data", StringUtils.escapeForHtml(entry.data, true)).setEscapeModelStrings(false); + Component data = new Label("data", StringUtils.escapeForHtml(entry.data, true, tabLength)).setEscapeModelStrings(false); data.add(new SimpleAttributeModifier("style", "background-color: " + color + ";")); item.add(data); } diff --git a/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java b/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java index 187e4600..adf815e6 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java @@ -57,7 +57,7 @@ public class BlobDiffPage extends RepositoryPage { RevCommit parent = commit.getParentCount() == 0 ? null : commit.getParent(0); ImageDiffHandler handler = new ImageDiffHandler(this, repositoryName, parent.getName(), commit.getName(), imageExtensions); - diff = DiffUtils.getDiff(r, commit, blobPath, diffComparator, DiffOutputType.HTML, handler).content; + diff = DiffUtils.getDiff(r, commit, blobPath, diffComparator, DiffOutputType.HTML, handler, 3).content; if (handler.getImgDiffCount() > 0) { addBottomScript("scripts/imgdiff.js"); // Tiny support script for image diffs } @@ -68,7 +68,7 @@ public class BlobDiffPage extends RepositoryPage { RevCommit baseCommit = JGitUtils.getCommit(r, baseObjectId); ImageDiffHandler handler = new ImageDiffHandler(this, repositoryName, baseCommit.getName(), commit.getName(), imageExtensions); - diff = DiffUtils.getDiff(r, baseCommit, commit, blobPath, diffComparator, DiffOutputType.HTML, handler).content; + diff = DiffUtils.getDiff(r, baseCommit, commit, blobPath, diffComparator, DiffOutputType.HTML, handler, 3).content; if (handler.getImgDiffCount() > 0) { addBottomScript("scripts/imgdiff.js"); // Tiny support script for image diffs } diff --git a/src/main/java/com/gitblit/wicket/pages/BlobPage.java b/src/main/java/com/gitblit/wicket/pages/BlobPage.java index df30e4cc..1ef8f227 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlobPage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlobPage.java @@ -195,7 +195,8 @@ public class BlobPage extends RepositoryPage { } else { sb.append("
");
 		}
-		lines = StringUtils.escapeForHtml(source, true).split("\n");
+		final int tabLength = app().settings().getInteger(Keys.web.tabLength, 4);
+		lines = StringUtils.escapeForHtml(source, true, tabLength).split("\n");
 
 		sb.append("");
 
diff --git a/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java b/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java
index 95580ed1..3754f3ef 100644
--- a/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java
@@ -87,8 +87,8 @@ public class CommitDiffPage extends RepositoryPage {
 		final List imageExtensions = app().settings().getStrings(Keys.web.imageExtensions);
 		final ImageDiffHandler handler = new ImageDiffHandler(this, repositoryName,
 				parents.isEmpty() ? null : parents.get(0), commit.getName(), imageExtensions);
-
-		final DiffOutput diff = DiffUtils.getCommitDiff(r, commit, diffComparator, DiffOutputType.HTML, handler);
+		final int tabLength = app().settings().getInteger(Keys.web.tabLength, 4);
+		final DiffOutput diff = DiffUtils.getCommitDiff(r, commit, diffComparator, DiffOutputType.HTML, handler, tabLength);
 		if (handler.getImgDiffCount() > 0) {
 			addBottomScript("scripts/imgdiff.js"); // Tiny support script for image diffs
 		}
diff --git a/src/main/java/com/gitblit/wicket/pages/ComparePage.java b/src/main/java/com/gitblit/wicket/pages/ComparePage.java
index d1710446..7e7ac2f5 100644
--- a/src/main/java/com/gitblit/wicket/pages/ComparePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ComparePage.java
@@ -119,9 +119,9 @@ public class ComparePage extends RepositoryPage {
 			final List imageExtensions = app().settings().getStrings(Keys.web.imageExtensions);
 			final ImageDiffHandler handler = new ImageDiffHandler(this, repositoryName,
 					fromCommit.getName(), toCommit.getName(), imageExtensions);
-
 			final DiffComparator diffComparator = WicketUtils.getDiffComparator(params);
-			final DiffOutput diff = DiffUtils.getDiff(r, fromCommit, toCommit, diffComparator, DiffOutputType.HTML, handler);
+			final int tabLength = app().settings().getInteger(Keys.web.tabLength, 4);
+			final DiffOutput diff = DiffUtils.getDiff(r, fromCommit, toCommit, diffComparator, DiffOutputType.HTML, handler, tabLength);
 			if (handler.getImgDiffCount() > 0) {
 				addBottomScript("scripts/imgdiff.js"); // Tiny support script for image diffs
 			}
diff --git a/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java b/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java
index 8aec9e63..ceca1ec2 100644
--- a/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java
@@ -76,8 +76,9 @@ public class ReviewProposalPage extends RootSubPage {
 		sb.append(asParam(p, proposal.name, "exclude", ""));
 		sb.append(asParam(p, proposal.name, "include", ""));
 
+		final int tabLength = app().settings().getInteger(Keys.web.tabLength, 4);
 		add(new Label("definition", StringUtils.breakLinesForHtml(StringUtils.escapeForHtml(sb
-				.toString().trim(), true))).setEscapeModelStrings(false));
+				.toString().trim(), true, tabLength))).setEscapeModelStrings(false));
 
 		List repositories = new ArrayList(
 				proposal.repositories.values());
diff --git a/src/test/java/com/gitblit/tests/DiffUtilsTest.java b/src/test/java/com/gitblit/tests/DiffUtilsTest.java
index c73e4783..e8e839a5 100644
--- a/src/test/java/com/gitblit/tests/DiffUtilsTest.java
+++ b/src/test/java/com/gitblit/tests/DiffUtilsTest.java
@@ -41,7 +41,7 @@ public class DiffUtilsTest extends GitblitUnitTest {
 		Repository repository = GitBlitSuite.getHelloworldRepository();
 		RevCommit commit = JGitUtils.getCommit(repository,
 				"1d0c2933a4ae69c362f76797d42d6bd182d05176");
-		String diff = DiffUtils.getCommitDiff(repository, commit, DiffComparator.SHOW_WHITESPACE, DiffOutputType.PLAIN).content;
+		String diff = DiffUtils.getCommitDiff(repository, commit, DiffComparator.SHOW_WHITESPACE, DiffOutputType.PLAIN, 3).content;
 		repository.close();
 		assertTrue(diff != null && diff.length() > 0);
 		String expected = "-		system.out.println(\"Hello World\");\n+		System.out.println(\"Hello World\"";
@@ -55,7 +55,7 @@ public class DiffUtilsTest extends GitblitUnitTest {
 				"8baf6a833b5579384d9b9ceb8a16b5d0ea2ec4ca");
 		RevCommit commit = JGitUtils.getCommit(repository,
 				"1d0c2933a4ae69c362f76797d42d6bd182d05176");
-		String diff = DiffUtils.getDiff(repository, baseCommit, commit, DiffComparator.SHOW_WHITESPACE, DiffOutputType.PLAIN).content;
+		String diff = DiffUtils.getDiff(repository, baseCommit, commit, DiffComparator.SHOW_WHITESPACE, DiffOutputType.PLAIN, 3).content;
 		repository.close();
 		assertTrue(diff != null && diff.length() > 0);
 		String expected = "-		system.out.println(\"Hello World\");\n+		System.out.println(\"Hello World\"";
@@ -67,7 +67,7 @@ public class DiffUtilsTest extends GitblitUnitTest {
 		Repository repository = GitBlitSuite.getHelloworldRepository();
 		RevCommit commit = JGitUtils.getCommit(repository,
 				"1d0c2933a4ae69c362f76797d42d6bd182d05176");
-		String diff = DiffUtils.getDiff(repository, commit, "java.java", DiffComparator.SHOW_WHITESPACE, DiffOutputType.PLAIN).content;
+		String diff = DiffUtils.getDiff(repository, commit, "java.java", DiffComparator.SHOW_WHITESPACE, DiffOutputType.PLAIN, 3).content;
 		repository.close();
 		assertTrue(diff != null && diff.length() > 0);
 		String expected = "-		system.out.println(\"Hello World\");\n+		System.out.println(\"Hello World\"";
diff --git a/src/test/java/com/gitblit/tests/StringUtilsTest.java b/src/test/java/com/gitblit/tests/StringUtilsTest.java
index 0fd42aad..7176b88c 100644
--- a/src/test/java/com/gitblit/tests/StringUtilsTest.java
+++ b/src/test/java/com/gitblit/tests/StringUtilsTest.java
@@ -50,7 +50,7 @@ public class StringUtilsTest extends GitblitUnitTest {
 	public void testEscapeForHtml() throws Exception {
 		String input = "& < > \" \t";
 		String outputNoChange = "& < > " \t";
-		String outputChange = "& < > "     ";
+		String outputChange = "& < > "     ";
 		assertEquals(outputNoChange, StringUtils.escapeForHtml(input, false));
 		assertEquals(outputChange, StringUtils.escapeForHtml(input, true));
 	}
-- 
2.39.5