diff options
author | Luca Milanesio <luca.milanesio@gmail.com> | 2022-07-21 01:34:34 +0100 |
---|---|---|
committer | Jacek Centkowski <geminica.programs@gmail.com> | 2022-08-14 08:33:11 +0200 |
commit | 09d6669f4d5c32ee2b5c4f79b6d995e689061853 (patch) | |
tree | 6a9c5570b37eeee5b54f6a5ea43cc1ccc2be5a64 | |
parent | d77e8d0ce600af9d34463c604e8c61a64a57593b (diff) |
GitwebServlet: Retrieve git path from FileRepository
Instead of retrieving git base path from repository manager, open the
repository and get it directly from its git directory path.
Also, redirect the delegate repository wrapper to the underlying
implementation, allowing to use GitWeb in combination with the
multi-site plugin and the cached-refdb.
The advantage of doing it: we don't need to cast GitRepositoryManager to
the LocalDiskRepositoryManager, so that other implementations would also
work.
Release-Notes: allow using GitWeb with multi-site and cached-refdb
Change-Id: If9da36214063d73953677473082cd16f8f95163a
-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(); |