From 9c7bb3d377a0637ff034be407cb9c03c606647a9 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sun, 27 Oct 2013 11:05:11 -0400
Subject: [PATCH] Add setting to automatically redirect http requests to the https port

---
 src/main/java/com/gitblit/wicket/pages/RepositoryPage.java |   81 ++++++++++++++++++++++++++++++++++++----
 1 files changed, 73 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
index e5ce22a..bc7dfa9 100644
--- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
@@ -16,6 +16,8 @@
 package com.gitblit.wicket.pages;
 
 import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -37,12 +39,13 @@
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.protocol.http.RequestUtils;
 import org.apache.wicket.request.target.basic.RedirectRequestTarget;
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
+import org.pegdown.LinkRenderer;
+import org.pegdown.ast.WikiLinkNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,7 +78,7 @@
 
 public abstract class RepositoryPage extends RootPage {
 
-	private final Logger logger = LoggerFactory.getLogger(getClass());
+	protected final Logger logger = LoggerFactory.getLogger(getClass());
 
 	private final String PARAM_STAR = "star";
 
@@ -204,7 +207,7 @@
 
 		// conditional links
 		// per-repository extra page links
-		if (model.showReadme || model.useDocs) {
+		if (model.useDocs) {
 			pages.put("docs", new PageRegistration("gb.docs", DocsPage.class, params, true));
 		}
 		if (JGitUtils.getPagesBranch(r) != null) {
@@ -397,6 +400,30 @@
 		}
 		getSubmodules(commit);
 		return commit;
+	}
+
+	protected String getBestCommitId(RevCommit commit) {
+		String head = null;
+		try {
+			head = r.resolve(getRepositoryModel().HEAD).getName();
+		} catch (Exception e) {
+		}
+
+		String id = commit.getName();
+		if (!StringUtils.isEmpty(head) && head.equals(id)) {
+			// match default branch
+			return Repository.shortenRefName(getRepositoryModel().HEAD);
+		}
+
+		// find first branch match
+		for (RefModel ref : JGitUtils.getLocalBranches(r, false, -1)) {
+			if (ref.getObjectId().getName().equals(id)) {
+				return ref.getName();
+			}
+		}
+
+		// return sha
+		return id;
 	}
 
 	protected Map<String, SubmoduleModel> getSubmodules(RevCommit commit) {
@@ -620,6 +647,47 @@
 		return isOwner;
 	}
 
+	/**
+	 * Returns a Pegdown/Markdown link renderer which renders WikiLinks.
+	 *
+	 * @return a link renderer
+	 */
+	protected LinkRenderer getMarkdownLinkRenderer() {
+		RevCommit head = JGitUtils.getCommit(r, "HEAD");
+		final String id = getBestCommitId(head);
+		LinkRenderer renderer = new LinkRenderer() {
+			@Override
+			public Rendering render(WikiLinkNode node) {
+				try {
+					String fsc = GitBlit.getString(Keys.web.forwardSlashCharacter, "/");
+					// adjust the request path
+					String path = node.getText().charAt(0) == '/' ? node.getText().substring(1) : node.getText();
+					path = URLEncoder.encode(path.replace(' ', '-'), "UTF-8").replace("%2F", fsc);
+
+					// extract document name
+					String name = node.getText().replace('_', ' ');
+					if (name.indexOf('/') > -1) {
+						name = name.substring(name.lastIndexOf('/') + 1);
+					}
+
+					// strip Markdown extension
+					for (String ext : GitBlit.getStrings(Keys.web.markdownExtensions)) {
+						String x = "." + ext;
+						if (name.endsWith(x)) {
+							name = name.substring(0, name.length() - x.length());
+							break;
+						}
+					}
+					String url = urlFor(MarkdownPage.class, WicketUtils.newPathParameter(repositoryName, id, path)).toString();
+					return new Rendering(url, name);
+				} catch (UnsupportedEncodingException e) {
+					throw new IllegalStateException();
+				}
+			}
+		};
+		return renderer;
+	}
+
 	private class SearchForm extends SessionlessForm<Void> implements Serializable {
 		private static final long serialVersionUID = 1L;
 
@@ -654,9 +722,7 @@
 			String searchString = searchBoxModel.getObject();
 			if (StringUtils.isEmpty(searchString)) {
 				// redirect to self to avoid wicket page update bug
-				PageParameters params = RepositoryPage.this.getPageParameters();
-				String relativeUrl = urlFor(RepositoryPage.this.getClass(), params).toString();
-				String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
+				String absoluteUrl = getCanonicalUrl();
 				getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
 				return;
 			}
@@ -678,8 +744,7 @@
 			// use an absolute url to workaround Wicket-Tomcat problems with
 			// mounted url parameters (issue-111)
 			PageParameters params = WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType);
-			String relativeUrl = urlFor(searchPageClass, params).toString();
-			String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
+			String absoluteUrl = getCanonicalUrl(searchPageClass, params);
 			getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
 		}
 	}

--
Gitblit v1.9.1