summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java374
1 files changed, 0 insertions, 374 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
deleted file mode 100644
index 91eaf3c7d3..0000000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
+++ /dev/null
@@ -1,374 +0,0 @@
-// Copyright (C) 2009 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.gerrit.server.config;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Strings.emptyToNull;
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static com.google.common.base.Strings.nullToEmpty;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.GitwebType;
-import com.google.gerrit.common.data.ParameterizedString;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.extensions.webui.BranchWebLink;
-import com.google.gerrit.extensions.webui.FileHistoryWebLink;
-import com.google.gerrit.extensions.webui.FileWebLink;
-import com.google.gerrit.extensions.webui.ParentWebLink;
-import com.google.gerrit.extensions.webui.PatchSetWebLink;
-import com.google.gerrit.extensions.webui.ProjectWebLink;
-import com.google.gerrit.extensions.webui.TagWebLink;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.net.MalformedURLException;
-import java.net.URL;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GitwebConfig {
- private static final Logger log = LoggerFactory.getLogger(GitwebConfig.class);
-
- public static boolean isDisabled(Config cfg) {
- return isEmptyString(cfg, "gitweb", null, "url")
- || isEmptyString(cfg, "gitweb", null, "cgi")
- || "disabled".equals(cfg.getString("gitweb", null, "type"));
- }
-
- public static class LegacyModule extends AbstractModule {
- private final Config cfg;
-
- public LegacyModule(Config cfg) {
- this.cfg = cfg;
- }
-
- @Override
- protected void configure() {
- GitwebType type = typeFromConfig(cfg);
- if (type != null) {
- bind(GitwebType.class).toInstance(type);
-
- if (!isNullOrEmpty(type.getBranch())) {
- DynamicSet.bind(binder(), BranchWebLink.class).to(GitwebLinks.class);
- }
-
- if (!isNullOrEmpty(type.getTag())) {
- DynamicSet.bind(binder(), TagWebLink.class).to(GitwebLinks.class);
- }
-
- if (!isNullOrEmpty(type.getFile()) || !isNullOrEmpty(type.getRootTree())) {
- DynamicSet.bind(binder(), FileWebLink.class).to(GitwebLinks.class);
- }
-
- if (!isNullOrEmpty(type.getFileHistory())) {
- DynamicSet.bind(binder(), FileHistoryWebLink.class).to(GitwebLinks.class);
- }
-
- if (!isNullOrEmpty(type.getRevision())) {
- DynamicSet.bind(binder(), PatchSetWebLink.class).to(GitwebLinks.class);
- DynamicSet.bind(binder(), ParentWebLink.class).to(GitwebLinks.class);
- }
-
- if (!isNullOrEmpty(type.getProject())) {
- DynamicSet.bind(binder(), ProjectWebLink.class).to(GitwebLinks.class);
- }
- }
- }
- }
-
- private static boolean isEmptyString(Config cfg, String section, String subsection, String name) {
- // This is currently the only way to check for the empty string in a JGit
- // config. Fun!
- String[] values = cfg.getStringList(section, subsection, name);
- return values.length > 0 && isNullOrEmpty(values[0]);
- }
-
- private static GitwebType typeFromConfig(Config cfg) {
- GitwebType defaultType = defaultType(cfg.getString("gitweb", null, "type"));
- if (defaultType == null) {
- return null;
- }
- GitwebType type = new GitwebType();
-
- type.setLinkName(
- firstNonNull(cfg.getString("gitweb", null, "linkname"), defaultType.getLinkName()));
- type.setBranch(firstNonNull(cfg.getString("gitweb", null, "branch"), defaultType.getBranch()));
- type.setTag(firstNonNull(cfg.getString("gitweb", null, "tag"), defaultType.getTag()));
- type.setProject(
- firstNonNull(cfg.getString("gitweb", null, "project"), defaultType.getProject()));
- type.setRevision(
- firstNonNull(cfg.getString("gitweb", null, "revision"), defaultType.getRevision()));
- type.setRootTree(
- firstNonNull(cfg.getString("gitweb", null, "roottree"), defaultType.getRootTree()));
- type.setFile(firstNonNull(cfg.getString("gitweb", null, "file"), defaultType.getFile()));
- type.setFileHistory(
- firstNonNull(cfg.getString("gitweb", null, "filehistory"), defaultType.getFileHistory()));
- type.setUrlEncode(cfg.getBoolean("gitweb", null, "urlencode", defaultType.getUrlEncode()));
- String pathSeparator = cfg.getString("gitweb", null, "pathSeparator");
- if (pathSeparator != null) {
- if (pathSeparator.length() == 1) {
- char c = pathSeparator.charAt(0);
- if (isValidPathSeparator(c)) {
- type.setPathSeparator(firstNonNull(c, defaultType.getPathSeparator()));
- } else {
- log.warn("Invalid gitweb.pathSeparator: " + c);
- }
- } else {
- log.warn("gitweb.pathSeparator is not a single character: " + pathSeparator);
- }
- }
- return type;
- }
-
- private static GitwebType defaultType(String typeName) {
- GitwebType type = new GitwebType();
- switch (nullToEmpty(typeName)) {
- case "gitweb":
- type.setLinkName("gitweb");
- type.setProject("?p=${project}.git;a=summary");
- type.setRevision("?p=${project}.git;a=commit;h=${commit}");
- type.setBranch("?p=${project}.git;a=shortlog;h=${branch}");
- type.setTag("?p=${project}.git;a=tag;h=${tag}");
- type.setRootTree("?p=${project}.git;a=tree;hb=${commit}");
- type.setFile("?p=${project}.git;hb=${commit};f=${file}");
- type.setFileHistory("?p=${project}.git;a=history;hb=${branch};f=${file}");
- break;
- case "cgit":
- type.setLinkName("cgit");
- type.setProject("${project}.git/summary");
- type.setRevision("${project}.git/commit/?id=${commit}");
- type.setBranch("${project}.git/log/?h=${branch}");
- type.setTag("${project}.git/tag/?h=${tag}");
- type.setRootTree("${project}.git/tree/?h=${commit}");
- type.setFile("${project}.git/tree/${file}?h=${commit}");
- type.setFileHistory("${project}.git/log/${file}?h=${branch}");
- break;
- case "custom":
- // For a custom type with no explicit link name, just reuse "gitweb".
- type.setLinkName("gitweb");
- type.setProject("");
- type.setRevision("");
- type.setBranch("");
- type.setTag("");
- type.setRootTree("");
- type.setFile("");
- type.setFileHistory("");
- break;
- case "":
- case "disabled":
- default:
- return null;
- }
- return type;
- }
-
- private final String url;
- private final GitwebType type;
-
- @Inject
- GitwebConfig(
- GitwebCgiConfig cgiConfig,
- @GerritServerConfig Config cfg,
- @Nullable @CanonicalWebUrl String gerritUrl)
- throws MalformedURLException {
- if (isDisabled(cfg)) {
- type = null;
- url = null;
- } else {
- String cfgUrl = cfg.getString("gitweb", null, "url");
- type = typeFromConfig(cfg);
- if (type == null) {
- url = null;
- } else if (cgiConfig.getGitwebCgi() == null) {
- // Use an externally managed gitweb instance, and not an internal one.
- url = cfgUrl;
- } else {
- String baseGerritUrl;
- if (gerritUrl != null) {
- URL u = new URL(gerritUrl);
- baseGerritUrl = u.getPath();
- } else {
- baseGerritUrl = "/";
- }
- url = firstNonNull(cfgUrl, baseGerritUrl + "gitweb");
- }
- }
- }
-
- /** @return GitwebType for gitweb viewer. */
- @Nullable
- public GitwebType getGitwebType() {
- return type;
- }
-
- /**
- * @return URL of the entry point into gitweb. This URL may be relative to our context if gitweb
- * is hosted by ourselves; or absolute if its hosted elsewhere; or null if gitweb has not been
- * configured.
- */
- public String getUrl() {
- return url;
- }
-
- /**
- * Determines if a given character can be used unencoded in an URL as a replacement for the path
- * separator '/'.
- *
- * <p>Reasoning: http://www.ietf.org/rfc/rfc1738.txt ยง 2.2:
- *
- * <p>... only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used
- * for their reserved purposes may be used unencoded within a URL.
- *
- * <p>The following characters might occur in file names, however:
- *
- * <p>alphanumeric characters,
- *
- * <p>"$-_.+!',"
- */
- static boolean isValidPathSeparator(char c) {
- switch (c) {
- case '*':
- case '(':
- case ')':
- return true;
- default:
- return false;
- }
- }
-
- @Singleton
- static class GitwebLinks
- implements BranchWebLink,
- FileHistoryWebLink,
- FileWebLink,
- PatchSetWebLink,
- ParentWebLink,
- ProjectWebLink,
- TagWebLink {
- private final String url;
- private final GitwebType type;
- private final ParameterizedString branch;
- private final ParameterizedString file;
- private final ParameterizedString fileHistory;
- private final ParameterizedString project;
- private final ParameterizedString revision;
- private final ParameterizedString tag;
-
- @Inject
- GitwebLinks(GitwebConfig config, GitwebType type) {
- this.url = config.getUrl();
- this.type = type;
- this.branch = parse(type.getBranch());
- this.file = parse(firstNonNull(emptyToNull(type.getFile()), nullToEmpty(type.getRootTree())));
- this.fileHistory = parse(type.getFileHistory());
- this.project = parse(type.getProject());
- this.revision = parse(type.getRevision());
- this.tag = parse(type.getTag());
- }
-
- @Override
- public WebLinkInfo getBranchWebLink(String projectName, String branchName) {
- if (branch != null) {
- return link(
- branch
- .replace("project", encode(projectName))
- .replace("branch", encode(branchName))
- .toString());
- }
- return null;
- }
-
- @Override
- public WebLinkInfo getTagWebLink(String projectName, String tagName) {
- if (tag != null) {
- return link(
- tag.replace("project", encode(projectName)).replace("tag", encode(tagName)).toString());
- }
- return null;
- }
-
- @Override
- public WebLinkInfo getFileHistoryWebLink(String projectName, String revision, String fileName) {
- if (fileHistory != null) {
- return link(
- fileHistory
- .replace("project", encode(projectName))
- .replace("branch", encode(revision))
- .replace("file", encode(fileName))
- .toString());
- }
- return null;
- }
-
- @Override
- public WebLinkInfo getFileWebLink(String projectName, String revision, String fileName) {
- if (file != null) {
- return link(
- file.replace("project", encode(projectName))
- .replace("commit", encode(revision))
- .replace("file", encode(fileName))
- .toString());
- }
- return null;
- }
-
- @Override
- public WebLinkInfo getPatchSetWebLink(String projectName, String commit) {
- if (revision != null) {
- return link(
- revision
- .replace("project", encode(projectName))
- .replace("commit", encode(commit))
- .toString());
- }
- return null;
- }
-
- @Override
- public WebLinkInfo getParentWebLink(String projectName, String commit) {
- // For Gitweb treat parent revision links the same as patch set links
- return getPatchSetWebLink(projectName, commit);
- }
-
- @Override
- public WebLinkInfo getProjectWeblink(String projectName) {
- if (project != null) {
- return link(project.replace("project", encode(projectName)).toString());
- }
- return null;
- }
-
- private String encode(String val) {
- if (type.getUrlEncode()) {
- return Url.encode(type.replacePathSeparator(val));
- }
- return val;
- }
-
- private WebLinkInfo link(String rest) {
- return new WebLinkInfo(type.getLinkName(), null, url + rest, null);
- }
-
- private static ParameterizedString parse(String pattern) {
- if (!isNullOrEmpty(pattern)) {
- return new ParameterizedString(pattern);
- }
- return null;
- }
- }
-}