Add init step for enabling experimental features
This is intended for features that are experimental enough that we want to hide them behind some warning text, but not so experimental that we want them to be enabled only with obscure or undocumented commands. The two current features, to nobody's surprise, are NoteDb and PolyGerrit. Enabling NoteDb sets all NotesMigration options to enabled, in particular disabling ReviewDb for changes, although the tables are still created since they're still in the schema. For PolyGerrit, the main question is what the default UI is, as PG has been part of the WAR for a while now. It is also possible to disable the GWT UI, although this is not the suggested default option since there are still some missing features that make switching back worthwhile. Change-Id: I419d73eb5944b7c4c8651b86c6efd25a969e60b5
This commit is contained in:
@@ -129,6 +129,7 @@ public class BaseInit extends SiteProgram {
|
||||
init.flags.dev = isDev() && init.site.isNew;
|
||||
init.flags.skipPlugins = skipPlugins();
|
||||
init.flags.deleteCaches = getDeleteCaches();
|
||||
init.flags.isNew = init.site.isNew;
|
||||
|
||||
final SiteRun run;
|
||||
try {
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
// Copyright (C) 2017 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.pgm.init;
|
||||
|
||||
import static com.google.gerrit.server.notedb.ConfigNotesMigration.SECTION_NOTE_DB;
|
||||
import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
|
||||
|
||||
import com.google.gerrit.extensions.client.UiType;
|
||||
import com.google.gerrit.pgm.init.api.ConsoleUI;
|
||||
import com.google.gerrit.pgm.init.api.InitFlags;
|
||||
import com.google.gerrit.pgm.init.api.InitStep;
|
||||
import com.google.gerrit.pgm.init.api.Section;
|
||||
import com.google.gerrit.server.notedb.ConfigNotesMigration;
|
||||
import com.google.inject.Inject;
|
||||
import java.util.Locale;
|
||||
import javax.inject.Singleton;
|
||||
import org.eclipse.jgit.lib.Config;
|
||||
|
||||
@Singleton
|
||||
class InitExperimental implements InitStep {
|
||||
private final ConsoleUI ui;
|
||||
private final InitFlags flags;
|
||||
private final Section noteDbChanges;
|
||||
private final Section gerrit;
|
||||
|
||||
@Inject
|
||||
InitExperimental(ConsoleUI ui, InitFlags flags, Section.Factory sections) {
|
||||
this.ui = ui;
|
||||
this.flags = flags; // Don't grab any flags yet; they aren't initialized until BaseInit#run.
|
||||
this.noteDbChanges = sections.get(SECTION_NOTE_DB, CHANGES.key());
|
||||
this.gerrit = sections.get("gerrit", null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
ui.header("Experimental features");
|
||||
if (!ui.yesno(false, "Enable any experimental features")) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (flags.isNew) {
|
||||
initNoteDb();
|
||||
}
|
||||
initUis();
|
||||
}
|
||||
|
||||
private void initNoteDb() {
|
||||
ui.message(
|
||||
"Use experimental NoteDb for change metadata?\n"
|
||||
+ " NoteDb is not recommended for production servers."
|
||||
+ " Please familiarize yourself with the documentation:\n"
|
||||
+ " https://gerrit-review.googlesource.com/Documentation/dev-note-db.html\n");
|
||||
if (!ui.yesno(false, "Enable")) {
|
||||
return;
|
||||
}
|
||||
|
||||
Config defaultConfig = ConfigNotesMigration.allEnabledConfig();
|
||||
for (String name : defaultConfig.getNames(SECTION_NOTE_DB, CHANGES.key())) {
|
||||
noteDbChanges.set(name, defaultConfig.getString(SECTION_NOTE_DB, CHANGES.key(), name));
|
||||
}
|
||||
}
|
||||
|
||||
private void initUis() {
|
||||
boolean pg = ui.yesno(true, "Default to PolyGerrit UI");
|
||||
UiType uiType = pg ? UiType.POLYGERRIT : UiType.GWT;
|
||||
gerrit.set("ui", uiType.name().toLowerCase(Locale.US));
|
||||
if (pg) {
|
||||
gerrit.set("enableGwtUi", Boolean.toString(ui.yesno(true, "Enable GWT UI")));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,6 @@
|
||||
package com.google.gerrit.pgm.init;
|
||||
|
||||
import com.google.gerrit.extensions.config.FactoryModule;
|
||||
import com.google.gerrit.pgm.init.api.InitFlags;
|
||||
import com.google.gerrit.pgm.init.api.InitStep;
|
||||
import com.google.gerrit.pgm.init.api.Section;
|
||||
import com.google.gerrit.server.config.SitePaths;
|
||||
@@ -37,7 +36,6 @@ public class InitModule extends FactoryModule {
|
||||
@Override
|
||||
protected void configure() {
|
||||
bind(SitePaths.class);
|
||||
bind(InitFlags.class);
|
||||
bind(Libraries.class);
|
||||
bind(LibraryDownloader.class);
|
||||
factory(Section.Factory.class);
|
||||
@@ -64,6 +62,7 @@ public class InitModule extends FactoryModule {
|
||||
step().to(InitCache.class);
|
||||
step().to(InitPlugins.class);
|
||||
step().to(InitDev.class);
|
||||
step().to(InitExperimental.class);
|
||||
}
|
||||
|
||||
protected LinkedBindingBuilder<InitStep> step() {
|
||||
|
||||
@@ -31,6 +31,9 @@ public class InitFlags {
|
||||
/** Recursively delete the site path if initialization fails. */
|
||||
public boolean deleteOnFailure;
|
||||
|
||||
/** Site is being newly created */
|
||||
public boolean isNew;
|
||||
|
||||
/** Run the daemon (and open the web UI in a browser) after initialization. */
|
||||
public boolean autoStart;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user