summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Milanesio <luca.milanesio@gmail.com>2022-07-21 01:34:34 +0100
committerJacek Centkowski <geminica.programs@gmail.com>2022-08-14 08:33:11 +0200
commit09d6669f4d5c32ee2b5c4f79b6d995e689061853 (patch)
tree6a9c5570b37eeee5b54f6a5ea43cc1ccc2be5a64
parentd77e8d0ce600af9d34463c604e8c61a64a57593b (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.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();