From 1cfce55191f8ae63b1830892fc0883506fd8507d Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Wed, 23 Apr 2014 12:06:59 -0400
Subject: [PATCH] Improve pages servlet raw navigation (issue-411)

---
 src/main/java/com/gitblit/servlet/PagesServlet.java |   45 ++++++++++++++++++++++++++++++---------------
 1 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/src/main/java/com/gitblit/servlet/PagesServlet.java b/src/main/java/com/gitblit/servlet/PagesServlet.java
index 8b91b48..f4e8bb2 100644
--- a/src/main/java/com/gitblit/servlet/PagesServlet.java
+++ b/src/main/java/com/gitblit/servlet/PagesServlet.java
@@ -23,13 +23,12 @@
 import java.util.Set;
 import java.util.TreeSet;
 
-import javax.inject.Inject;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevTree;
@@ -39,8 +38,8 @@
 import com.gitblit.Constants;
 import com.gitblit.IStoredSettings;
 import com.gitblit.Keys;
+import com.gitblit.dagger.DaggerServlet;
 import com.gitblit.manager.IRepositoryManager;
-import com.gitblit.manager.IRuntimeManager;
 import com.gitblit.models.PathModel;
 import com.gitblit.models.RefModel;
 import com.gitblit.utils.ArrayUtils;
@@ -51,29 +50,28 @@
 import com.gitblit.wicket.MarkupProcessor;
 import com.gitblit.wicket.MarkupProcessor.MarkupDocument;
 
+import dagger.ObjectGraph;
+
 /**
  * Serves the content of a gh-pages branch.
  *
  * @author James Moger
  *
  */
-public class PagesServlet extends HttpServlet {
+public class PagesServlet extends DaggerServlet {
 
 	private static final long serialVersionUID = 1L;
 
 	private transient Logger logger = LoggerFactory.getLogger(PagesServlet.class);
 
-	private final IStoredSettings settings;
+	private IStoredSettings settings;
 
-	private final IRepositoryManager repositoryManager;
+	private IRepositoryManager repositoryManager;
 
-	public PagesServlet(
-			IRuntimeManager runtimeManager,
-			IRepositoryManager repositoryManager) {
-
-		super();
-		this.settings = runtimeManager.getSettings();
-		this.repositoryManager = repositoryManager;
+	@Override
+	protected void inject(ObjectGraph dagger) {
+		this.settings = dagger.get(IStoredSettings.class);
+		this.repositoryManager = dagger.get(IRepositoryManager.class);
 	}
 
 	/**
@@ -112,6 +110,10 @@
 		if (path.charAt(0) == '/') {
 			// strip leading /
 			path = path.substring(1);
+		}
+		if (path.charAt(path.length() - 1) == '/') {
+			// strip trailing slash
+			path = path.substring(0, path.length() - 1);
 		}
 
 		// determine repository and resource from url
@@ -231,11 +233,24 @@
 					response.getWriter().append("<thead><tr><th>path</th><th>mode</th><th>size</th></tr>");
 					response.getWriter().append("</thead>");
 					response.getWriter().append("<tbody>");
-					String pattern = "<tr><td><a href=\"{0}\">{0}</a></td><td>{1}</td><td>{2}</td></tr>";
+					String pattern = "<tr><td><a href=\"{0}/{1}\">{1}</a></td><td>{2}</td><td>{3}</td></tr>";
 					final ByteFormat byteFormat = new ByteFormat();
 					List<PathModel> entries = JGitUtils.getFilesInPath(r, resource, commit);
+					if (!entries.isEmpty()) {
+						if (entries.get(0).path.indexOf('/') > -1) {
+							// we are in a subdirectory, add parent directory link
+							entries.add(0, new PathModel("..", resource + "/..", 0, FileMode.TREE.getBits(), null, null));
+						}
+					}
+
+					String basePath = request.getServletPath() + request.getPathInfo();
+					if (basePath.charAt(basePath.length() - 1) == '/') {
+						// strip trailing slash
+						basePath = basePath.substring(0, basePath.length() - 1);
+					}
 					for (PathModel entry : entries) {
-						response.getWriter().append(MessageFormat.format(pattern, entry.name, JGitUtils.getPermissionsFromMode(entry.mode), byteFormat.format(entry.size)));
+						response.getWriter().append(MessageFormat.format(pattern, basePath, entry.name,
+								JGitUtils.getPermissionsFromMode(entry.mode), byteFormat.format(entry.size)));
 					}
 					response.getWriter().append("</tbody>");
 					response.getWriter().append("</table>");

--
Gitblit v1.9.1