Allow configuring the Report Bug URL

Let site administrators direct users to their own ticket queue,
as for many servers most of the reported bugs are small internal
problems like asking for a repository to be created or updating
group memberships.

Change-Id: If79dcf9d040867393441db89452bebb4b8eb53a8
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index cf32d88..523823d 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -1110,6 +1110,13 @@
 by the system administrator, and might not even be running on the
 same host as Gerrit.
 
+[[gerrit.reportBugUrl]]gerrit.reportBugUrl::
++
+URL to direct users to when they need to report a bug about the
+Gerrit service. By default this links to the upstream Gerrit
+Code Review's own bug tracker but could be directed to the system
+administrator's ticket queue.
+
 [[gitweb]]Section gitweb
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GerritConfig.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GerritConfig.java
index 89de3b4..8436456 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GerritConfig.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GerritConfig.java
@@ -28,6 +28,7 @@
 public class GerritConfig implements Cloneable {
   protected String registerUrl;
   protected String httpPasswordUrl;
+  protected String reportBugUrl;
   protected String openIdSsoUrl;
   protected List<OpenIdProviderPattern> allowedOpenIDs;
 
@@ -57,6 +58,14 @@
     registerUrl = u;
   }
 
+  public String getReportBugUrl() {
+    return reportBugUrl;
+  }
+
+  public void setReportBugUrl(String u) {
+    reportBugUrl = u;
+  }
+
   public String getEditFullNameUrl() {
     return editFullNameUrl;
   }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
index be74428..5fd0d39 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
@@ -58,8 +58,8 @@
 import com.google.gwt.user.client.ui.Anchor;
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
+import com.google.gwt.user.client.ui.InlineHTML;
 import com.google.gwt.user.client.ui.InlineLabel;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.RootPanel;
@@ -447,9 +447,19 @@
       vs = "dev";
     }
 
-    final HTML version = new HTML(M.poweredBy(vs));
-    version.setStyleName(RESOURCES.css().version());
-    btmmenu.add(version);
+    FlowPanel poweredBy = new FlowPanel();
+    poweredBy.setStyleName(RESOURCES.css().version());
+    poweredBy.add(new InlineHTML(M.poweredBy(vs)));
+    if (getConfig().getReportBugUrl() != null) {
+      poweredBy.add(new InlineLabel(" | "));
+      Anchor a = new Anchor(
+          C.reportBug(),
+          getConfig().getReportBugUrl());
+      a.setTarget("_blank");
+      a.setStyleName("");
+      poweredBy.add(a);
+    }
+    btmmenu.add(poweredBy);
   }
 
   private void onModuleLoad2() {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java
index c47c789..ced2202 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java
@@ -21,6 +21,7 @@
   String menuSignOut();
   String menuRegister();
   String menuSettings();
+  String reportBug();
 
   String signInDialogTitle();
   String signInDialogClose();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties
index 67ebe2a..e2d048b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties
@@ -2,6 +2,7 @@
 menuSignOut = Sign Out
 menuRegister = Register
 menuSettings = Settings
+reportBug = Report Bug
 
 signInDialogTitle = Code Review - Sign In
 signInDialogClose = Close
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.properties
index a91df3c..79772bd 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.properties
@@ -1,7 +1,6 @@
 windowTitle1 = {0} Code Review
 windowTitle2 = {0} | {1} Code Review
-poweredBy = Powered by <a href="http://code.google.com/p/gerrit/" target="_blank">Gerrit Code Review</a> ({0}) \
-| <a href="http://code.google.com/p/gerrit/issues/list" target="_blank">Report Bug</a>
+poweredBy = Powered by <a href="http://code.google.com/p/gerrit/" target="_blank">Gerrit Code Review</a> ({0})
 
 noSuchAccountMessage = {0} is not a registered user.
 
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritConfigProvider.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritConfigProvider.java
index 72bb0c2..2f09380 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritConfigProvider.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritConfigProvider.java
@@ -121,6 +121,13 @@
         "test", false));
     config.setAnonymousCowardName(anonymousCowardName);
 
+    config.setReportBugUrl(cfg.getString("gerrit", null, "reportBugUrl"));
+    if (config.getReportBugUrl() == null) {
+      config.setReportBugUrl("http://code.google.com/p/gerrit/issues/list");
+    } else if (config.getReportBugUrl().isEmpty()) {
+      config.setReportBugUrl(null);
+    }
+
     final Set<Account.FieldName> fields = new HashSet<Account.FieldName>();
     for (final Account.FieldName n : Account.FieldName.values()) {
       if (realm.allowsEdit(n)) {