summaryrefslogtreecommitdiffstats
path: root/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/google/gerrit/httpd/gitweb/GitwebServlet.java')
-rw-r--r--java/com/google/gerrit/httpd/gitweb/GitwebServlet.java41
1 files changed, 32 insertions, 9 deletions
diff --git a/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java b/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
index 897d96f1b5..0875317542 100644
--- a/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
+++ b/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
@@ -43,12 +43,13 @@ import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.server.AnonymousUser;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.GitwebCgiConfig;
import com.google.gerrit.server.config.GitwebConfig;
import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.DelegateRepository;
import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.LocalDiskRepositoryManager;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.permissions.ProjectPermission;
@@ -85,6 +86,7 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.Repository;
@@ -101,7 +103,7 @@ class GitwebServlet extends HttpServlet {
private final Set<String> deniedActions;
private final Path gitwebCgi;
private final URI gitwebUrl;
- private final LocalDiskRepositoryManager repoManager;
+ private final GitRepositoryManager repoManager;
private final ProjectCache projectCache;
private final PermissionBackend permissionBackend;
private final Provider<AnonymousUser> anonymousUserProvider;
@@ -119,12 +121,10 @@ class GitwebServlet extends HttpServlet {
SshInfo sshInfo,
Provider<AnonymousUser> anonymousUserProvider,
GitwebConfig gitwebConfig,
- GitwebCgiConfig gitwebCgiConfig)
+ GitwebCgiConfig gitwebCgiConfig,
+ AllProjectsName allProjects)
throws IOException {
- if (!(repoManager instanceof LocalDiskRepositoryManager)) {
- throw new ProvisionException("Gitweb can only be used with LocalDiskRepositoryManager");
- }
- this.repoManager = (LocalDiskRepositoryManager) repoManager;
+ this.repoManager = repoManager;
this.projectCache = projectCache;
this.permissionBackend = permissionBackend;
this.anonymousUserProvider = anonymousUserProvider;
@@ -132,6 +132,9 @@ class GitwebServlet extends HttpServlet {
this.gitwebCgi = gitwebCgiConfig.getGitwebCgi();
this.deniedActions = new HashSet<>();
+ // ensure that Gitweb works on supported repository type by checking All-Projects project
+ getProjectRoot(allProjects);
+
final String url = gitwebConfig.getUrl();
if ((url != null) && (!url.equals("gitweb"))) {
URI uri = null;
@@ -537,7 +540,8 @@ class GitwebServlet extends HttpServlet {
}
}
- private String[] makeEnv(HttpServletRequest req, ProjectState projectState) {
+ private String[] makeEnv(HttpServletRequest req, ProjectState projectState)
+ throws RepositoryNotFoundException, IOException {
final EnvList env = new EnvList(_env);
final int contentLength = Math.max(0, req.getContentLength());
@@ -579,7 +583,7 @@ class GitwebServlet extends HttpServlet {
env.set("GERRIT_CONTEXT_PATH", req.getContextPath() + "/");
env.set("GERRIT_PROJECT_NAME", nameKey.get());
- env.set("GITWEB_PROJECTROOT", repoManager.getBasePath(nameKey).toAbsolutePath().toString());
+ env.set("GITWEB_PROJECTROOT", getProjectRoot(nameKey));
if (projectState.statePermitsRead()
&& permissionBackend
@@ -636,6 +640,25 @@ class GitwebServlet extends HttpServlet {
return env.getEnvArray();
}
+ private String getProjectRoot(Project.NameKey nameKey)
+ throws RepositoryNotFoundException, IOException {
+ try (Repository repo = repoManager.openRepository(nameKey)) {
+ return getProjectRoot(repo);
+ }
+ }
+
+ private String getProjectRoot(Repository repo) {
+ if (repo instanceof DelegateRepository) {
+ return getProjectRoot(((DelegateRepository) repo).delegate());
+ }
+
+ if (repo instanceof FileRepository) {
+ return repo.getDirectory().getAbsolutePath();
+ }
+
+ throw new ProvisionException("Gitweb can only be used with FileRepository");
+ }
+
private void copyContentToCGI(HttpServletRequest req, OutputStream dst) throws IOException {
final int contentLength = req.getContentLength();
final InputStream src = req.getInputStream();