diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index cf1ccc024c..d66c8843a6 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt @@ -3383,6 +3383,17 @@ removed in the next stable version. enabled = ExperimentKey ---- +[[experiments.disabled]]experiments.disabled:: ++ +List of experiments that are currently disabled. The release notes contain currently +available experiments. This list disables experiments with the given key that are +either enabled by default or explicitly in the config. + +---- +[experiments] + disabled = ExperimentKey +---- + [[ldap]] === Section ldap diff --git a/java/com/google/gerrit/httpd/raw/IndexHtmlUtil.java b/java/com/google/gerrit/httpd/raw/IndexHtmlUtil.java index d7ce88f1b6..46dde414c0 100644 --- a/java/com/google/gerrit/httpd/raw/IndexHtmlUtil.java +++ b/java/com/google/gerrit/httpd/raw/IndexHtmlUtil.java @@ -20,6 +20,7 @@ import static java.util.stream.Collectors.toSet; import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.flogger.FluentLogger; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.UsedAt; @@ -48,6 +49,10 @@ import org.eclipse.jgit.lib.Config; public class IndexHtmlUtil { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + static final ImmutableSet DEFAULT_EXPERIMENTS = + ImmutableSet.of( + "UiFeature__patchset_comments", "UiFeature__patchset_choice_for_comment_links"); + private static final Gson GSON = OutputFormat.JSON_COMPACT.newGson(); /** * Returns both static and dynamic parameters of {@code index.html}. The result is to be used when @@ -69,9 +74,13 @@ public class IndexHtmlUtil { canonicalURL, cdnPath, faviconPath, urlParameterMap, urlInScriptTagOrdainer)) .putAll(dynamicTemplateData(gerritApi, requestedURL)); - Set enabledExperiments = new HashSet<>(experimentData(urlParameterMap)); + Set enabledExperiments = new HashSet<>(); Arrays.stream(gerritServerConfig.getStringList("experiments", null, "enabled")) .forEach(enabledExperiments::add); + DEFAULT_EXPERIMENTS.forEach(enabledExperiments::add); + Arrays.stream(gerritServerConfig.getStringList("experiments", null, "disabled")) + .forEach(enabledExperiments::remove); + experimentData(urlParameterMap).forEach(enabledExperiments::add); if (!enabledExperiments.isEmpty()) { data.put("enabledExperiments", serializeObject(GSON, enabledExperiments).toString()); } diff --git a/javatests/com/google/gerrit/httpd/raw/IndexServletTest.java b/javatests/com/google/gerrit/httpd/raw/IndexServletTest.java index dc976ad909..ba9475f2e1 100644 --- a/javatests/com/google/gerrit/httpd/raw/IndexServletTest.java +++ b/javatests/com/google/gerrit/httpd/raw/IndexServletTest.java @@ -15,6 +15,7 @@ package com.google.gerrit.httpd.raw; import static com.google.common.truth.Truth.assertThat; +import static java.util.stream.Collectors.joining; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -54,8 +55,12 @@ public class IndexServletTest { String testCdnPath = "bar-cdn"; String testFaviconURL = "zaz-url"; + String disabledDefault = IndexHtmlUtil.DEFAULT_EXPERIMENTS.asList().get(0); org.eclipse.jgit.lib.Config serverConfig = new org.eclipse.jgit.lib.Config(); - serverConfig.setStringList("experiments", null, "enabled", ImmutableList.of("NewFeature")); + serverConfig.setStringList( + "experiments", null, "enabled", ImmutableList.of("NewFeature", "DisabledFeature")); + serverConfig.setStringList( + "experiments", null, "disabled", ImmutableList.of("DisabledFeature", disabledDefault)); IndexServlet servlet = new IndexServlet(testCanonicalUrl, testCdnPath, testFaviconURL, gerritApi, serverConfig); @@ -80,8 +85,14 @@ public class IndexServletTest { + "\\x22\\/config\\/server\\/info\\x22: \\x7b\\x22default_theme\\x22:" + "\\x22my-default-theme\\x22\\x7d, \\x22\\/config\\/server\\/top-menus\\x22: " + "\\x5b\\x5d\\x7d');"); + String enabledDefaults = + IndexHtmlUtil.DEFAULT_EXPERIMENTS.stream() + .filter(e -> !e.equals(disabledDefault)) + .collect(joining("\\x22,")); assertThat(output) .contains( - "window.ENABLED_EXPERIMENTS = JSON.parse('\\x5b\\x22NewFeature\\x22\\x5d');"); + "window.ENABLED_EXPERIMENTS = JSON.parse('\\x5b\\x22NewFeature\\x22,\\x22" + + enabledDefaults + + "\\x22\\x5d');"); } }