From 7ba0ec1e871a1f7b5a40b3272e860ade13038e95 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Wed, 06 Apr 2011 17:25:23 -0400
Subject: [PATCH] Added placeholder for Admin links on main page.

---
 src/com/gitblit/wicket/pages/DiffPage.html         |    2 
 src/com/gitblit/wicket/pages/RepositoriesPage.java |    5 
 src/com/gitblit/wicket/RepositoryPage.java         |   49 +++++----
 src/com/gitblit/wicket/panels/PageFooter.java      |    2 
 src/com/gitblit/wicket/panels/PageLinksPanel.html  |    2 
 gitblit.properties                                 |   17 ++-
 src/com/gitblit/wicket/pages/TicGitTicketPage.java |   18 +++
 src/com/gitblit/GitBlitServer.java                 |   98 ++++++++++---------
 src/com/gitblit/wicket/panels/AdminLinksPanel.java |   16 +++
 src/com/gitblit/wicket/panels/PageLinksPanel.java  |   42 +++++++-
 src/com/gitblit/wicket/pages/RepositoriesPage.html |    6 +
 src/com/gitblit/wicket/pages/TicGitPage.html       |    2 
 resources/gitblit.css                              |   21 ++-
 src/com/gitblit/wicket/panels/AdminLinksPanel.html |    9 +
 14 files changed, 192 insertions(+), 97 deletions(-)

diff --git a/gitblit.properties b/gitblit.properties
index 560515a..b7a879b 100644
--- a/gitblit.properties
+++ b/gitblit.properties
@@ -1,6 +1,9 @@
 #
-# GIT Servlet Settings
+# Git Servlet Settings
 #
+
+# Allow push/pull over http/https with JGit servlet
+allowPushPull = true
 
 # Base folder for repositories
 # Use forward slashes on Windows!!
@@ -20,8 +23,8 @@
 # Authentication Settings
 #
 
-# Require authentication for http push/pull of git repositories
-authenticateAccess = true
+# Require authentication for http/https push/pull access of git repositories
+authenticatePushPull = true
 
 # Simple user realm file to authenticate users for push/pull
 realmFile = users.properties
@@ -42,16 +45,16 @@
 debug = true
 tempFolder = temp
 log4jPattern = %-5p %d{MM-dd HH:mm:ss.SSS}  %-20.20c{1}  %m%n
-# Aggressive garbage collection will run the collector on every generated page
-# this slows down page generation but improves heap consumption 
-aggressiveGC = true
+# Aggressive heap management will run the garbage collector on every generated
+# page.  This slows down page generation but improves heap consumption. 
+aggressiveHeapManagement = true
 
 #
 # Git:Blit UI Settings
 #
 siteName = Repositories
 allowAdministration = true
-indexMessage = Welcome to Git:Blit!<br>A quick and easy way to host your own GIT repositories.<br>Built with <a href="http://eclipse.org/jgit">JGit</a>, <a href="http://wicket.apache.org">Wicket</a>, <a href="http://code.google.com/p/google-code-prettify/">google-code-prettify</a>, <a href="http://eclipse.org/jetty">Jetty</a>, <a href="http://www.slf4j.org">SLF4J</a>, <a href="http://logging.apache.org/log4j">Log4j</a>, and <a href="http://jcommander.org">JCommander</a>.
+repositoriesMessage = Welcome to Git:Blit!<br>A quick and easy way to host your own Git repositories.<br>Built with <a href="http://eclipse.org/jgit">JGit</a>, <a href="http://wicket.apache.org">Wicket</a>, <a href="http://code.google.com/p/google-code-prettify/">google-code-prettify</a>, <a href="http://eclipse.org/jetty">Jetty</a>, <a href="http://www.slf4j.org">SLF4J</a>, <a href="http://logging.apache.org/log4j">Log4j</a>, and <a href="http://jcommander.org">JCommander</a>.
 
 # Date and Time formats
 timestampFormat = h:mm a
diff --git a/resources/gitblit.css b/resources/gitblit.css
index 96815bd..675a258 100644
--- a/resources/gitblit.css
+++ b/resources/gitblit.css
@@ -63,6 +63,10 @@
 	padding: 8px;
 }
 
+div.repositories_message {
+	line-height: inherit;
+}
+
 div.header {
 	background-color: #D2C3AF;
 	padding: 3px;
@@ -176,27 +180,27 @@
 	border-width: 1px 0px 1px;
 }
 
-div.bug_open {
+div.bug_open, span.bug_open {
 	padding: 2px;
 	background-color: #800000;
 	color: white;	
 	text-align: center;
 }
 
-div.bug_resolved {
+div.bug_resolved, span.bug_resolved {
 	padding: 2px;
 	background-color: #008000;
 	color: white;
 	text-align: center;
 }
 
-div.bug_invalid {
+div.bug_invalid, span.bug_invalid {
 	padding: 2px;
 	background-color: gray;
 	text-align: center;
 }
 
-div.bug_hold {
+div.bug_hold, span.bug_hold {
 	padding: 2px;
 	background-color: orange;
 	text-align: center;
@@ -304,9 +308,9 @@
 }
 
 table.repositories th {
-	background-color:#000070;
+	background-color:#D2C3AF;
 	padding: 4px;
-	border-bottom: 1px solid #bbb;
+	border-bottom: 1px solid #808080;
 }
 
 table.repositories td {
@@ -314,7 +318,7 @@
 }
 
 table.repositories th a {
-	color:#ddd;
+	color:black;/*#ddd;*/
 	text-decoration: none;
 	font-weight: normal;
 }
@@ -324,7 +328,8 @@
 }
 
 table.repositories th.wicket_orderDown a, table.repositories th.wicket_orderUp a {
-	color: yellow;
+	color: black;
+	font-weight: bold;
 }
 
 tr th a { padding-right: 15px; background-position: right; background-repeat:no-repeat; }
diff --git a/src/com/gitblit/GitBlitServer.java b/src/com/gitblit/GitBlitServer.java
index ae542e8..9991a75 100644
--- a/src/com/gitblit/GitBlitServer.java
+++ b/src/com/gitblit/GitBlitServer.java
@@ -40,7 +40,6 @@
 import org.eclipse.jetty.webapp.WebAppContext;
 import org.eclipse.jgit.http.server.GitServlet;
 
-
 import com.beust.jcommander.JCommander;
 import com.beust.jcommander.Parameter;
 import com.beust.jcommander.ParameterException;
@@ -134,7 +133,7 @@
 			Connector httpConnector = createConnector(params.useNIO, params.port);
 			connectors.add(httpConnector);
 		}
-		
+
 		if (params.securePort > 0) {
 			if (new File("keystore").exists()) {
 				Connector secureConnector = createSSLConnector(params.useNIO, params.securePort, params.storePassword);
@@ -176,51 +175,58 @@
 		wicketFilter.setInitParameter(WicketFilter.FILTER_MAPPING_PARAM, wicketPathSpec);
 		rootContext.addFilter(wicketFilter, wicketPathSpec, FilterMapping.DEFAULT);
 
-		// GIT Servlet
-		String gitServletPathSpec = "/git/*";
-		ServletHolder gitServlet = rootContext.addServlet(GitServlet.class, gitServletPathSpec);
-		gitServlet.setInitParameter("base-path", params.repositoriesFolder);
-		gitServlet.setInitParameter("export-all", params.exportAll ? "1" : "0");
-
-		String realmUsers = params.realmFile;
-
-		// Authentication Realm
 		Handler handler;
-		if (realmUsers != null && new File(realmUsers).exists() && params.authenticateAccess) {
-			List<String> list = StoredSettings.getStrings("gitRoles");
-			String[] roles;
-			if (list.size() == 0) {
-				roles = new String[] { "*" };
+
+		// Git Servlet
+		ServletHolder gitServlet = null;
+		String gitServletPathSpec = "/git/*";
+		if (StoredSettings.getBoolean("allowPushPull", true)) {
+			gitServlet = rootContext.addServlet(GitServlet.class, gitServletPathSpec);
+			gitServlet.setInitParameter("base-path", params.repositoriesFolder);
+			gitServlet.setInitParameter("export-all", params.exportAll ? "1" : "0");
+			String realmUsers = params.realmFile;
+
+			if (realmUsers != null && new File(realmUsers).exists() && params.authenticatePushPull) {
+				// Authenticate Pull/Push
+				List<String> list = StoredSettings.getStrings("gitRoles");
+				String[] roles;
+				if (list.size() == 0) {
+					roles = new String[] { "*" };
+				} else {
+					roles = list.toArray(new String[list.size()]);
+				}
+				logger.info("Authentication required for git servlet pull/push access");
+				logger.info("Setting up realm from " + realmUsers);
+				HashLoginService loginService = new HashLoginService(Constants.NAME, realmUsers);
+
+				Constraint constraint = new Constraint();
+				constraint.setName("auth");
+				constraint.setAuthenticate(true);
+				constraint.setRoles(roles);
+
+				ConstraintMapping mapping = new ConstraintMapping();
+				mapping.setPathSpec(gitServletPathSpec);
+				mapping.setConstraint(constraint);
+
+				ConstraintSecurityHandler security = new ConstraintSecurityHandler();
+				security.addConstraintMapping(mapping);
+				for (String role : roles) {
+					security.addRole(role);
+				}
+				security.setAuthenticator(new BasicAuthenticator());
+				security.setLoginService(loginService);
+				security.setStrict(false);
+
+				security.setHandler(rootContext);
+
+				handler = security;
 			} else {
-				roles = list.toArray(new String[list.size()]);
+				// Anonymous Pull/Push
+				logger.info("Setting up anonymous git servlet pull/push access");
+				handler = rootContext;
 			}
-			logger.info("Authentication required for GIT access");
-			logger.info("Setting up realm from " + realmUsers);
-			HashLoginService loginService = new HashLoginService(Constants.NAME, realmUsers);
-
-			Constraint constraint = new Constraint();
-			constraint.setName("auth");
-			constraint.setAuthenticate(true);
-			constraint.setRoles(roles);
-
-			ConstraintMapping mapping = new ConstraintMapping();
-			mapping.setPathSpec(gitServletPathSpec);
-			mapping.setConstraint(constraint);
-
-			ConstraintSecurityHandler security = new ConstraintSecurityHandler();
-			security.addConstraintMapping(mapping);
-			for (String role : roles) {
-				security.addRole(role);
-			}
-			security.setAuthenticator(new BasicAuthenticator());
-			security.setLoginService(loginService);
-			security.setStrict(false);
-
-			security.setHandler(rootContext);
-
-			handler = security;
 		} else {
-			logger.info("Setting up anonymous access");
+			logger.info("Git servlet pull/push disabled");
 			handler = rootContext;
 		}
 
@@ -356,7 +362,7 @@
 		/*
 		 * GIT Servlet Parameters
 		 */
-		@Parameter(names = { "--repos" }, description = "GIT Repositories Folder")
+		@Parameter(names = { "--repos" }, description = "Git Repositories Folder")
 		public String repositoriesFolder = StoredSettings.getString("repositoriesFolder", "repos");
 
 		@Parameter(names = { "--exportAll" }, description = "Export All Found Repositories")
@@ -365,8 +371,8 @@
 		/*
 		 * Authentication Parameters
 		 */
-		@Parameter(names = { "--authenticateAccess" }, description = "Authenticate GIT access")
-		public Boolean authenticateAccess = StoredSettings.getBoolean("authenticateAccess", true);
+		@Parameter(names = { "--authenticatePushPull" }, description = "Authenticate Git Push/Pull access")
+		public Boolean authenticatePushPull = StoredSettings.getBoolean("authenticatePushPull", true);
 
 		@Parameter(names = { "--realm" }, description = "Users Realm Hash File")
 		public String realmFile = StoredSettings.getString("realmFile", "users.properties");
diff --git a/src/com/gitblit/wicket/RepositoryPage.java b/src/com/gitblit/wicket/RepositoryPage.java
index b4f6fdc..2f2b967 100644
--- a/src/com/gitblit/wicket/RepositoryPage.java
+++ b/src/com/gitblit/wicket/RepositoryPage.java
@@ -20,12 +20,13 @@
 import com.gitblit.wicket.panels.PageLinksPanel;
 import com.gitblit.wicket.panels.RefsPanel;
 
-
 public abstract class RepositoryPage extends BasePage {
 
 	protected final String repositoryName;
 	protected final String commitId;
 	protected String description;
+
+	private transient Repository r = null;
 
 	public RepositoryPage(PageParameters params, String pageName) {
 		super(params);
@@ -36,23 +37,28 @@
 		repositoryName = params.getString("p", "");
 		commitId = params.getString("h", "");
 
+		Repository r = getRepository();
+
 		add(new PageHeader("pageHeader", repositoryName, "/ " + pageName));
-		add(new PageLinksPanel("pageLinks", repositoryName, pageName));
+		add(new PageLinksPanel("pageLinks", r, repositoryName, pageName));
 		setStatelessHint(true);
 	}
 
 	protected Repository getRepository() {
-		ServletWebRequest servletWebRequest = (ServletWebRequest) getRequest();
-		HttpServletRequest req = servletWebRequest.getHttpServletRequest();
-		req.getServerName();
-
-		Repository r = GitBlitWebApp.get().getRepository(req, repositoryName);
 		if (r == null) {
-			error("Can not load repository " + repositoryName);
-			redirectToInterceptPage(new RepositoriesPage());
-			return null;
+			ServletWebRequest servletWebRequest = (ServletWebRequest) getRequest();
+			HttpServletRequest req = servletWebRequest.getHttpServletRequest();
+			req.getServerName();
+
+			Repository r = GitBlitWebApp.get().getRepository(req, repositoryName);
+			if (r == null) {
+				error("Can not load repository " + repositoryName);
+				redirectToInterceptPage(new RepositoriesPage());
+				return null;
+			}
+			description = JGitUtils.getRepositoryDescription(r);
+			this.r = r;
 		}
-		description = JGitUtils.getRepositoryDescription(r);
 		return r;
 	}
 
@@ -64,22 +70,22 @@
 		String html = WicketUtils.breakLines(text);
 		if (substituteRegex) {
 			Map<String, String> map = new HashMap<String, String>();
-			// global regex keys			
+			// global regex keys
 			for (String key : StoredSettings.getAllKeys("regex.global")) {
 				String subKey = key.substring(key.lastIndexOf('.') + 1);
 				map.put(subKey, StoredSettings.getString(key, ""));
 			}
-			
+
 			// repository-specific regex keys
 			List<String> keys = StoredSettings.getAllKeys("regex." + repositoryName.toLowerCase());
 			for (String key : keys) {
 				String subKey = key.substring(key.lastIndexOf('.') + 1);
 				map.put(subKey, StoredSettings.getString(key, ""));
 			}
-			
+
 			for (String key : map.keySet()) {
 				String definition = map.get(key).trim();
-				String [] chunks = definition.split("!!!");
+				String[] chunks = definition.split("!!!");
 				if (chunks.length == 2) {
 					html = html.replaceAll(chunks[0], chunks[1]);
 				} else {
@@ -91,28 +97,29 @@
 	}
 
 	protected void addFooter() {
+		r.close();
 		add(new PageFooter("pageFooter", description));
 	}
 
 	protected PageParameters newRepositoryParameter() {
-		return new PageParameters("p=" + repositoryName);	
+		return new PageParameters("p=" + repositoryName);
 	}
-	
+
 	protected PageParameters newCommitParameter() {
 		return newCommitParameter(commitId);
 	}
-	
+
 	protected PageParameters newCommitParameter(String commitId) {
 		if (commitId == null || commitId.trim().length() == 0) {
-			return newRepositoryParameter();	
+			return newRepositoryParameter();
 		}
 		return new PageParameters("p=" + repositoryName + ",h=" + commitId);
 	}
 
-	protected PageParameters newPathParameter(String path) {		
+	protected PageParameters newPathParameter(String path) {
 		if (path == null || path.trim().length() == 0) {
 			return newCommitParameter();
 		}
 		return new PageParameters("p=" + repositoryName + ",h=" + commitId + ",f=" + path);
-	}	
+	}
 }
diff --git a/src/com/gitblit/wicket/pages/DiffPage.html b/src/com/gitblit/wicket/pages/DiffPage.html
index b7aa03b..b001dea 100644
--- a/src/com/gitblit/wicket/pages/DiffPage.html
+++ b/src/com/gitblit/wicket/pages/DiffPage.html
@@ -4,7 +4,7 @@
    	<link href="prettify/prettify.css" type="text/css" rel="stylesheet" />
 	<script type="text/javascript" src="prettify/prettify.js"></script>
 </head>
-<body onload="prettyPrint()">
+<body>
 	<!-- page header -->
 	<div wicket:id="pageHeader"></div>
 
diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.html b/src/com/gitblit/wicket/pages/RepositoriesPage.html
index 0a7b270..43168bb 100644
--- a/src/com/gitblit/wicket/pages/RepositoriesPage.html
+++ b/src/com/gitblit/wicket/pages/RepositoriesPage.html
@@ -2,7 +2,11 @@
 <html xmlns="http://www.w3.org/1999/xhtml" >
 <body>
 	<div wicket:id="pageHeader"></div>
-	<div class="repositories_message" wicket:id="indexInclude"></div>	
+	
+	<div wicket:id="adminPanel"></div>
+	
+	<div class="repositories_message" wicket:id="repositoriesMessage"></div>
+		
 	<table class="repositories">
 		<tr>
 			<th wicket:id="orderByRepository">Repository</th>
diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.java b/src/com/gitblit/wicket/pages/RepositoriesPage.java
index 50bcba2..4755e41 100644
--- a/src/com/gitblit/wicket/pages/RepositoriesPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -22,6 +22,7 @@
 import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.models.RepositoryModel;
+import com.gitblit.wicket.panels.AdminLinksPanel;
 import com.gitblit.wicket.panels.PageFooter;
 import com.gitblit.wicket.panels.PageHeader;
 
@@ -31,7 +32,9 @@
 	public RepositoriesPage() {
 		add(new PageHeader("pageHeader"));
 
-		add(new Label("indexInclude", StoredSettings.getString("indexMessage", "")).setEscapeModelStrings(false));
+		add(new AdminLinksPanel("adminPanel").setVisible(StoredSettings.getBoolean("allowAdministration", false)));
+		
+		add(new Label("repositoriesMessage", StoredSettings.getString("repositoriesMessage", "")).setEscapeModelStrings(false));
 
 		List<RepositoryModel> rows = GitBlitWebApp.get().getRepositories(getRequest());
 		DataProvider dp = new DataProvider(rows);
diff --git a/src/com/gitblit/wicket/pages/TicGitPage.html b/src/com/gitblit/wicket/pages/TicGitPage.html
index e3b9ed8..451058d 100644
--- a/src/com/gitblit/wicket/pages/TicGitPage.html
+++ b/src/com/gitblit/wicket/pages/TicGitPage.html
@@ -12,7 +12,7 @@
 	<table style="width:100%" class="pretty">
 		<tbody>
        		<tr wicket:id="ticket">
-         		<td style="padding:0; margin:0;" ><div wicket:id="ticketState"></div></td>
+         		<td style="padding:0; margin:0;"><div wicket:id="ticketState"></div></td>
          		<td class="date"><span wicket:id="ticketDate"></span></td>
          		<td><div wicket:id="ticketHandler"></div></td>
          		<td><div wicket:id="ticketTitle"></div></td>
diff --git a/src/com/gitblit/wicket/pages/TicGitTicketPage.java b/src/com/gitblit/wicket/pages/TicGitTicketPage.java
index 6390500..c73a3ce 100644
--- a/src/com/gitblit/wicket/pages/TicGitTicketPage.java
+++ b/src/com/gitblit/wicket/pages/TicGitTicketPage.java
@@ -19,7 +19,7 @@
 public class TicGitTicketPage extends RepositoryPage {
 
 	public TicGitTicketPage(PageParameters params) {
-		super(params, "ticgit ticket");
+		super(params, "ticket");
 
 		final String ticketFolder = params.getString("f", "");
 
@@ -32,7 +32,21 @@
 		add(new Label("ticketHandler", t.handler));
 		String openDate = GitBlitWebSession.get().formatDateTimeLong(t.date);
 		add(new Label("ticketOpenDate", openDate));
-		add(new Label("ticketState", t.state));
+		Label stateLabel = new Label("ticketState", t.state);
+		String css = null;
+		if (t.state.equals("open")) {
+			css = "bug_open";
+		} else if (t.state.equals("hold")) {
+			css = "bug_hold";
+		} else if (t.state.equals("resolved")) {
+			css = "bug_resolved";
+		} else if (t.state.equals("invalid")) {
+			css = "bug_invalid";
+		}
+		if (css != null) {
+			WicketUtils.setCssClass(stateLabel, css);
+		}
+		add(stateLabel);
 		add(new Label("ticketTags", flattenStrings(t.tags)));
 
 		ListDataProvider<Comment> commentsDp = new ListDataProvider<Comment>(t.comments);
diff --git a/src/com/gitblit/wicket/panels/AdminLinksPanel.html b/src/com/gitblit/wicket/panels/AdminLinksPanel.html
new file mode 100644
index 0000000..5643c84
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/AdminLinksPanel.html
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<wicket:panel>
+	<!-- page nav links -->	
+	<div class="page_nav">
+		<span wicket:id="newRepository"></span> | <span wicket:id="newUser"></span>
+	</div>	
+</wicket:panel>
+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/AdminLinksPanel.java b/src/com/gitblit/wicket/panels/AdminLinksPanel.java
new file mode 100644
index 0000000..2089f48
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/AdminLinksPanel.java
@@ -0,0 +1,16 @@
+package com.gitblit.wicket.panels;
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.panel.Panel;
+
+public class AdminLinksPanel extends Panel {
+
+	private static final long serialVersionUID = 1L;
+
+	public AdminLinksPanel(String id) {
+		super(id);
+
+		add(new Label("newRepository", "new repository"));
+		add(new Label("newUser", "new user"));
+	}
+}
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/PageFooter.java b/src/com/gitblit/wicket/panels/PageFooter.java
index b7440e8..a6a691f 100644
--- a/src/com/gitblit/wicket/panels/PageFooter.java
+++ b/src/com/gitblit/wicket/panels/PageFooter.java
@@ -19,7 +19,7 @@
 		super(id);		
 		add(new Label("footerText", description));
 		add(new Label("gbVersion", "v" + Constants.VERSION));
-		if (StoredSettings.getBoolean("aggressiveGC", false)) {
+		if (StoredSettings.getBoolean("aggressiveHeapManagement", false)) {
 			System.gc();
 		}
 	}
diff --git a/src/com/gitblit/wicket/panels/PageLinksPanel.html b/src/com/gitblit/wicket/panels/PageLinksPanel.html
index 072221f..0aabffc 100644
--- a/src/com/gitblit/wicket/panels/PageLinksPanel.html
+++ b/src/com/gitblit/wicket/panels/PageLinksPanel.html
@@ -3,7 +3,7 @@
 <wicket:panel>
 	<!-- page nav links -->	
 	<div class="page_nav">
-		<span wicket:id="summary"></span> | <span wicket:id="shortlog"></span> | <span wicket:id="branches"></span> | <span wicket:id="tags"></span> | <span wicket:id="tree"></span>
+		<span wicket:id="summary"></span> | <span wicket:id="shortlog"></span> | <span wicket:id="branches"></span> | <span wicket:id="tags"></span> | <span wicket:id="tree"></span> <span wicket:id="extra"><span wicket:id="extraSeparator"></span><span wicket:id="extraLink"></span></span>
 	</div>	
 </wicket:panel>
 </html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/PageLinksPanel.java b/src/com/gitblit/wicket/panels/PageLinksPanel.java
index 23f3383..d203426 100644
--- a/src/com/gitblit/wicket/panels/PageLinksPanel.java
+++ b/src/com/gitblit/wicket/panels/PageLinksPanel.java
@@ -1,24 +1,32 @@
 package com.gitblit.wicket.panels;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.ListDataProvider;
+import org.eclipse.jgit.lib.Repository;
 
+import com.gitblit.utils.JGitUtils;
 import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.pages.BranchesPage;
-import com.gitblit.wicket.pages.CommitPage;
 import com.gitblit.wicket.pages.ShortLogPage;
 import com.gitblit.wicket.pages.SummaryPage;
 import com.gitblit.wicket.pages.TagsPage;
+import com.gitblit.wicket.pages.TicGitPage;
 import com.gitblit.wicket.pages.TreePage;
-
 
 public class PageLinksPanel extends Panel {
 
 	private static final long serialVersionUID = 1L;
 
-	public PageLinksPanel(String id, String repositoryName, String pageName) {
+	public PageLinksPanel(String id, Repository r, final String repositoryName, String pageName) {
 		super(id);
+
 		// summary
 		if (pageName.equals("summary")) {
 			add(new Label("summary", pageName));
@@ -32,26 +40,46 @@
 		} else {
 			add(new LinkPanel("shortlog", null, "shortlog", ShortLogPage.class, new PageParameters("p=" + repositoryName)));
 		}
-		
+
 		// branches
 		if (pageName.equals("branches")) {
 			add(new Label("branches", pageName));
 		} else {
 			add(new LinkPanel("branches", null, "branches", BranchesPage.class, new PageParameters("p=" + repositoryName)));
 		}
-		
+
 		// tags
 		if (pageName.equals("tags")) {
 			add(new Label("tags", pageName));
 		} else {
 			add(new LinkPanel("tags", null, "tags", TagsPage.class, new PageParameters("p=" + repositoryName)));
 		}
-		
+
 		// tree
 		if (pageName.equals("tree")) {
 			add(new Label("tree", pageName));
 		} else {
 			add(new LinkPanel("tree", null, "tree", TreePage.class, new PageParameters("p=" + repositoryName + ",h=HEAD")));
-		}		
+		}
+
+		// Add dynamic repository extras
+		List<String> extras = new ArrayList<String>();
+		if (JGitUtils.getTicGitBranch(r) != null) {
+			extras.add("ticgit");
+		}
+
+		ListDataProvider<String> extrasDp = new ListDataProvider<String>(extras);
+		DataView<String> extrasView = new DataView<String>("extra", extrasDp) {
+			private static final long serialVersionUID = 1L;
+
+			public void populateItem(final Item<String> item) {
+				String extra = item.getModelObject();
+				if (extra.equals("ticgit")) {
+					item.add(new Label("extraSeparator", " | "));
+					item.add(new LinkPanel("extraLink", null, "ticgit", TicGitPage.class, new PageParameters("p=" + repositoryName)));
+				}
+			}
+		};
+		add(extrasView);
 	}
 }
\ No newline at end of file

--
Gitblit v1.9.1