diff options
Diffstat (limited to 'java/com/google/gerrit/httpd/gitweb/GitwebServlet.java')
-rw-r--r-- | java/com/google/gerrit/httpd/gitweb/GitwebServlet.java | 41 |
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(); |