| // 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.httpd; |
| |
| import com.google.gerrit.common.data.GitWebType; |
| import com.google.gerrit.server.config.GerritServerConfig; |
| import com.google.gerrit.server.config.SitePaths; |
| import com.google.inject.Inject; |
| |
| import org.eclipse.jgit.lib.Config; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import java.io.File; |
| |
| public class GitWebConfig { |
| private static final Logger log = LoggerFactory.getLogger(GitWebConfig.class); |
| |
| private final String url; |
| private final File gitweb_cgi; |
| private final File gitweb_css; |
| private final File gitweb_js; |
| private final File git_logo_png; |
| private GitWebType type; |
| |
| @Inject |
| GitWebConfig(final SitePaths sitePaths, @GerritServerConfig final Config cfg) { |
| final String cfgUrl = cfg.getString("gitweb", null, "url"); |
| final String cfgCgi = cfg.getString("gitweb", null, "cgi"); |
| |
| type = GitWebType.fromName(cfg.getString("gitweb", null, "type")); |
| type.setBranch(cfg.getString("gitweb", null, "branch")); |
| type.setProject(cfg.getString("gitweb", null, "project")); |
| type.setRevision(cfg.getString("gitweb", null, "revision")); |
| |
| if (type.getBranch() == null) { |
| log.warn("No Pattern specified for gitweb.branch, disabling."); |
| type = null; |
| } else if (type.getProject() == null) { |
| log.warn("No Pattern specified for gitweb.project, disabling."); |
| type = null; |
| } else if (type.getRevision() == null) { |
| log.warn("No Pattern specified for gitweb.revision, disabling."); |
| type = null; |
| } |
| |
| if ((cfgUrl != null && cfgUrl.isEmpty()) |
| || (cfgCgi != null && cfgCgi.isEmpty()) || type == null) { |
| // Either setting was explicitly set to the empty string disabling |
| // gitweb for this server. Disable the configuration. |
| // |
| url = null; |
| gitweb_cgi = null; |
| gitweb_css = null; |
| gitweb_js = null; |
| git_logo_png = null; |
| return; |
| } |
| |
| if (cfgUrl != null) { |
| // Use an externally managed gitweb instance, and not an internal one. |
| // |
| url = cfgUrl; |
| gitweb_cgi = null; |
| gitweb_css = null; |
| gitweb_js = null; |
| git_logo_png = null; |
| return; |
| } |
| |
| final File pkgCgi = new File("/usr/lib/cgi-bin/gitweb.cgi"); |
| String[] resourcePaths = {"/usr/share/gitweb", "/var/www"}; |
| File cgi; |
| |
| if (cfgCgi != null) { |
| // Use the CGI script configured by the administrator, failing if it |
| // cannot be used as specified. |
| // |
| cgi = sitePaths.resolve(cfgCgi); |
| if (!cgi.isFile()) { |
| throw new IllegalStateException("Cannot find gitweb.cgi: " + cgi); |
| } |
| if (!cgi.canExecute()) { |
| throw new IllegalStateException("Cannot execute gitweb.cgi: " + cgi); |
| } |
| |
| if (!cgi.equals(pkgCgi)) { |
| // Assume the administrator pointed us to the distribution, |
| // which also has the corresponding CSS and logo file. |
| // |
| resourcePaths = new String[] {cgi.getParentFile().getAbsolutePath()}; |
| } |
| |
| } else if (pkgCgi.isFile() && pkgCgi.canExecute()) { |
| // Use the OS packaged CGI. |
| // |
| log.debug("Assuming gitweb at " + pkgCgi); |
| cgi = pkgCgi; |
| |
| } else { |
| log.warn("gitweb not installed (no " + pkgCgi + " found)"); |
| cgi = null; |
| resourcePaths = new String[] {}; |
| } |
| |
| File css = null, js = null, logo = null; |
| for (String path : resourcePaths) { |
| File dir = new File(path); |
| css = new File(dir, "gitweb.css"); |
| js = new File(dir, "gitweb.js"); |
| logo = new File(dir, "git-logo.png"); |
| if (css.isFile() && logo.isFile()) { |
| break; |
| } |
| } |
| |
| url = cgi != null ? "gitweb" : null; |
| gitweb_cgi = cgi; |
| gitweb_css = css; |
| gitweb_js = js; |
| git_logo_png = logo; |
| } |
| |
| /** @return GitWebType for gitweb viewer. */ |
| 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; |
| } |
| |
| /** @return local path to the CGI executable; null if we shouldn't execute. */ |
| public File getGitwebCGI() { |
| return gitweb_cgi; |
| } |
| |
| /** @return local path of the {@code gitweb.css} matching the CGI. */ |
| public File getGitwebCSS() { |
| return gitweb_css; |
| } |
| |
| /** @return local path of the {@code gitweb.js} for the CGI. */ |
| public File getGitwebJS() { |
| return gitweb_js; |
| } |
| |
| /** @return local path of the {@code git-logo.png} for the CGI. */ |
| public File getGitLogoPNG() { |
| return git_logo_png; |
| } |
| } |