From 0625197d132c54e08896447299f7aaea580da537 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 11 Sep 2014 10:48:03 -0400
Subject: [PATCH] Preserve refs in commits, tree, & docs navbar links

---
 src/main/java/com/gitblit/wicket/pages/DocsPage.java       |   16 +++++++++-------
 src/main/java/com/gitblit/wicket/pages/RepositoryPage.java |   24 ++++++++++++++++++------
 src/main/java/com/gitblit/wicket/GitBlitWebApp.java        |    2 +-
 3 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java
index 38dbf57..0c97861 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java
@@ -208,7 +208,7 @@
 		mount("/mytickets", MyTicketsPage.class, "r", "h");
 
 		// setup the markup document urls
-		mount("/docs", DocsPage.class, "r");
+		mount("/docs", DocsPage.class, "r", "h");
 		mount("/doc", DocPage.class, "r", "h", "f");
 
 		// federation urls
diff --git a/src/main/java/com/gitblit/wicket/pages/DocsPage.java b/src/main/java/com/gitblit/wicket/pages/DocsPage.java
index a3d0f21..97b1604 100644
--- a/src/main/java/com/gitblit/wicket/pages/DocsPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/DocsPage.java
@@ -49,11 +49,14 @@
 	public DocsPage(PageParameters params) {
 		super(params);
 
+		String objectId = WicketUtils.getObject(params);
+
 		MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter());
 
 		Repository r = getRepository();
-		RevCommit head = JGitUtils.getCommit(r, null);
+		RevCommit head = JGitUtils.getCommit(r, objectId);
 		final String commitId = getBestCommitId(head);
+
 		List<String> extensions = processor.getAllExtensions();
 		List<PathModel> paths = JGitUtils.getDocuments(r, extensions);
 
@@ -127,7 +130,6 @@
 		}
 
 		// document list
-		final String id = getBestCommitId(head);
 		final ByteFormat byteFormat = new ByteFormat();
 		Fragment docs = new Fragment("documents", "documentsFragment", this);
 		ListDataProvider<PathModel> pathsDp = new ListDataProvider<PathModel>(paths);
@@ -141,17 +143,17 @@
 				item.add(WicketUtils.newImage("docIcon", "file_world_16x16.png"));
 				item.add(new Label("docSize", byteFormat.format(entry.size)));
 				item.add(new LinkPanel("docName", "list", StringUtils.stripFileExtension(entry.name),
-						DocPage.class, WicketUtils.newPathParameter(repositoryName, id, entry.path)));
+						DocPage.class, WicketUtils.newPathParameter(repositoryName, commitId, entry.path)));
 
 				// links
 				item.add(new BookmarkablePageLink<Void>("view", DocPage.class, WicketUtils
-						.newPathParameter(repositoryName, id, entry.path)));
-				String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, id, entry.path);
+						.newPathParameter(repositoryName, commitId, entry.path)));
+				String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, commitId, entry.path);
 				item.add(new ExternalLink("raw", rawUrl));
 				item.add(new BookmarkablePageLink<Void>("blame", BlamePage.class, WicketUtils
-						.newPathParameter(repositoryName, id, entry.path)));
+						.newPathParameter(repositoryName, commitId, entry.path)));
 				item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils
-						.newPathParameter(repositoryName, id, entry.path)));
+						.newPathParameter(repositoryName, commitId, entry.path)));
 				WicketUtils.setAlternatingBackground(item, counter);
 				counter++;
 			}
diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
index 2bd9dc6..b3250a6 100644
--- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
@@ -191,14 +191,26 @@
 	}
 
 	private List<NavLink> registerNavLinks() {
+		Repository r = getRepository();
+		RepositoryModel model = getRepositoryModel();
+
 		PageParameters params = null;
+		PageParameters objectParams = null;
 		if (!StringUtils.isEmpty(repositoryName)) {
 			params = WicketUtils.newRepositoryParameter(getRepositoryName());
+			objectParams = params;
+
+			// preserve the objectid iff the objectid directly (or indirectly) refers to a ref
+			if (!StringUtils.isEmpty(objectId)) {
+				RevCommit commit = JGitUtils.getCommit(r, objectId);
+				String bestId = getBestCommitId(commit);
+				if (!commit.getName().equals(bestId)) {
+					objectParams = WicketUtils.newObjectParameter(getRepositoryName(), bestId);
+				}
+			}
 		}
 		List<NavLink> navLinks = new ArrayList<NavLink>();
 
-		Repository r = getRepository();
-		RepositoryModel model = getRepositoryModel();
 
 		// standard links
 		if (RefLogUtils.getRefLogBranch(r) == null) {
@@ -213,13 +225,13 @@
 			return navLinks;
 		}
 
-		navLinks.add(new PageNavLink("gb.commits", LogPage.class, params));
-		navLinks.add(new PageNavLink("gb.tree", TreePage.class, params));
+		navLinks.add(new PageNavLink("gb.commits", LogPage.class, objectParams));
+		navLinks.add(new PageNavLink("gb.tree", TreePage.class, objectParams));
 		if (app().tickets().isReady() && (app().tickets().isAcceptingNewTickets(model) || app().tickets().hasTickets(model))) {
 			PageParameters tParams = WicketUtils.newOpenTicketsParameter(getRepositoryName());
 			navLinks.add(new PageNavLink("gb.tickets", TicketsPage.class, tParams));
 		}
-		navLinks.add(new PageNavLink("gb.docs", DocsPage.class, params, true));
+		navLinks.add(new PageNavLink("gb.docs", DocsPage.class, objectParams, true));
 		if (app().settings().getBoolean(Keys.web.allowForking, true)) {
 			navLinks.add(new PageNavLink("gb.forks", ForksPage.class, params, true));
 		}
@@ -453,7 +465,7 @@
 		// find first branch match
 		for (RefModel ref : JGitUtils.getLocalBranches(r, false, -1)) {
 			if (ref.getObjectId().getName().equals(id)) {
-				return ref.getName();
+				return Repository.shortenRefName(ref.getName());
 			}
 		}
 

--
Gitblit v1.9.1