Merge "Add eslint plugin for lit"
diff --git a/java/com/google/gerrit/acceptance/SshSessionMina.java b/java/com/google/gerrit/acceptance/SshSessionMina.java
index 4d8691b..3b0ba3b 100644
--- a/java/com/google/gerrit/acceptance/SshSessionMina.java
+++ b/java/com/google/gerrit/acceptance/SshSessionMina.java
@@ -107,13 +107,11 @@
@Override
public int execAndReturnStatus(String command) throws Exception {
Process process = getMinaSession().exec(command, 0);
- InputStream in = process.getInputStream();
InputStream err = process.getErrorStream();
Scanner s = new Scanner(err, UTF_8.name()).useDelimiter("\\A");
error = s.hasNext() ? s.next() : null;
- s = new Scanner(in, UTF_8.name()).useDelimiter("\\A");
try {
return process.exitValue();
} catch (IllegalThreadStateException e) {
diff --git a/java/com/google/gerrit/acceptance/testsuite/project/ProjectOperations.java b/java/com/google/gerrit/acceptance/testsuite/project/ProjectOperations.java
index 738be4d..2dd3f91 100644
--- a/java/com/google/gerrit/acceptance/testsuite/project/ProjectOperations.java
+++ b/java/com/google/gerrit/acceptance/testsuite/project/ProjectOperations.java
@@ -81,11 +81,11 @@
*
* <p>Example:
*
- * <pre>
+ * <pre>{@code
* projectOperations.forInvalidation()
* .addProjectConfigUpdater(cfg -> cfg.setString("invalidSection", null, "foo", "bar"))
* .invalidate();
- * </pre>
+ * }</pre>
*
* <p><strong>Note:</strong> The invalidation will fail with an exception if the project to
* invalidate doesn't exist.
diff --git a/java/com/google/gerrit/extensions/conditions/BooleanCondition.java b/java/com/google/gerrit/extensions/conditions/BooleanCondition.java
index 97543af..9c354fb 100644
--- a/java/com/google/gerrit/extensions/conditions/BooleanCondition.java
+++ b/java/com/google/gerrit/extensions/conditions/BooleanCondition.java
@@ -63,7 +63,9 @@
* Reduce evaluation tree by cutting off branches that evaluate trivially and replacing them with
* a leave note corresponding to the value the branch evaluated to.
*
- * <p><code>
+ * <p>
+ *
+ * <pre>{@code
* Example 1 (T=True, F=False, C=non-trivial check):
* OR
* / \ => T
@@ -76,7 +78,7 @@
* AND
* / \ => F
* T F
- * </code>
+ * }</pre>
*
* <p>There is no guarantee that the resulting tree is minimal. The only guarantee made is that
* branches that evaluate trivially will be cut off and replaced by primitive values.
diff --git a/java/com/google/gerrit/gpg/testing/TestKeys.java b/java/com/google/gerrit/gpg/testing/TestKeys.java
index de66889..0423474 100644
--- a/java/com/google/gerrit/gpg/testing/TestKeys.java
+++ b/java/com/google/gerrit/gpg/testing/TestKeys.java
@@ -436,13 +436,13 @@
/**
* A key with an additional user ID.
*
- * <pre>
+ * <pre>{@code
* pub 2048R/98C51DBF 2015-07-30
* Key fingerprint = 42B3 294D 1924 D7EB AF4A A99F 5024 BB44 98C5 1DBF
* uid foo:myId
* uid Testuser Five <test5@example.com>
* sub 2048R/C781A9E3 2015-07-30
- * </pre>
+ * }</pre>
*/
public static TestKey validKeyWithSecondUserId() {
return new TestKey(
@@ -1033,13 +1033,13 @@
/**
* Master Key without expiration with subkey with expiration.
*
- * <pre>
+ * <pre>{@code
* pub rsa1024 2018-11-17 [C]
* 5734 2C37 982A 843B 19C0 622B 6AAF 2D26 B481 02DB
* uid [ultimate] Testuser 10 <testuser10@example.com>
* sub rsa1024 2018-11-17 [S] [expires: 2065-11-05]
* 0A4A 9660 1B96 2DFC E898 E686 4305 C92E 626E B485
- * </pre>
+ * }</pre>
*/
public static TestKey validKeyWithoutExpirationWithSubkeyWithExpiration() throws Exception {
return new TestKey(
diff --git a/java/com/google/gerrit/pgm/Daemon.java b/java/com/google/gerrit/pgm/Daemon.java
index a3605f7..0a9b4d8 100644
--- a/java/com/google/gerrit/pgm/Daemon.java
+++ b/java/com/google/gerrit/pgm/Daemon.java
@@ -181,7 +181,7 @@
private String devCdn = "";
@Option(name = "--dev-cdn", usage = "Use specified cdn for serving static content.")
- private void setDevCdn(String cdn) {
+ void setDevCdn(String cdn) {
if (cdn == null) {
cdn = "";
}
diff --git a/java/com/google/gerrit/pgm/util/SiteProgram.java b/java/com/google/gerrit/pgm/util/SiteProgram.java
index 3b620d9..c1ba896 100644
--- a/java/com/google/gerrit/pgm/util/SiteProgram.java
+++ b/java/com/google/gerrit/pgm/util/SiteProgram.java
@@ -52,7 +52,7 @@
name = "--site-path",
aliases = {"-d"},
usage = "Local directory containing site data")
- private void setSitePath(String path) {
+ void setSitePath(String path) {
sitePath = Paths.get(path).normalize();
}
diff --git a/java/com/google/gerrit/server/config/ConfigUpdatedEvent.java b/java/com/google/gerrit/server/config/ConfigUpdatedEvent.java
index b37e489..4032e63 100644
--- a/java/com/google/gerrit/server/config/ConfigUpdatedEvent.java
+++ b/java/com/google/gerrit/server/config/ConfigUpdatedEvent.java
@@ -32,9 +32,9 @@
* <p>1. Help the callers figure out if any action should be taken, depending on which entries are
* updated in gerrit.config.
*
- * <p>2. Provide the callers with a mechanism to accept/reject the entries of interest: @see
- * accept(Set<ConfigKey> entries), @see accept(String section), @see reject(Set<ConfigKey> entries)
- * (+ various overloaded versions of these)
+ * <p>2. Provide the callers with a mechanism to accept/reject the entries of interest: {@link
+ * #accept(Set)}, {@link #accept(String)}, {@link #reject(Set)} (+ various overloaded versions of
+ * these)
*/
public class ConfigUpdatedEvent {
public static final ImmutableMultimap<UpdateResult, ConfigUpdateEntry> NO_UPDATES =
diff --git a/java/com/google/gerrit/server/git/MultiProgressMonitor.java b/java/com/google/gerrit/server/git/MultiProgressMonitor.java
index 786f96e..a4b1033 100644
--- a/java/com/google/gerrit/server/git/MultiProgressMonitor.java
+++ b/java/com/google/gerrit/server/git/MultiProgressMonitor.java
@@ -23,7 +23,6 @@
import com.google.common.util.concurrent.UncheckedExecutionException;
import com.google.gerrit.server.CancellationMetrics;
import com.google.gerrit.server.cancellation.RequestStateProvider;
-import com.google.gerrit.server.experiments.ExperimentFeatures;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import java.io.IOException;
@@ -168,7 +167,6 @@
}
private final CancellationMetrics cancellationMetrics;
- private final ExperimentFeatures experimentFeatures;
private final OutputStream out;
private final TaskKind taskKind;
private final String taskName;
@@ -192,11 +190,10 @@
@AssistedInject
private MultiProgressMonitor(
CancellationMetrics cancellationMetrics,
- ExperimentFeatures experimentFeatures,
@Assisted OutputStream out,
@Assisted TaskKind taskKind,
@Assisted String taskName) {
- this(cancellationMetrics, experimentFeatures, out, taskKind, taskName, 500, MILLISECONDS);
+ this(cancellationMetrics, out, taskKind, taskName, 500, MILLISECONDS);
}
/**
@@ -210,14 +207,12 @@
@AssistedInject
private MultiProgressMonitor(
CancellationMetrics cancellationMetrics,
- ExperimentFeatures experimentFeatures,
@Assisted OutputStream out,
@Assisted TaskKind taskKind,
@Assisted String taskName,
@Assisted long maxIntervalTime,
@Assisted TimeUnit maxIntervalUnit) {
this.cancellationMetrics = cancellationMetrics;
- this.experimentFeatures = experimentFeatures;
this.out = out;
this.taskKind = taskKind;
this.taskName = taskName;
diff --git a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
index ca2a5d3..c1cd30c 100644
--- a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
+++ b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
@@ -1762,6 +1762,7 @@
}
@UsedAt(UsedAt.Project.GOOGLE)
+ @SuppressWarnings("unused") // unused in upstream, but used at Google
@Option(name = "--create-cod-token", usage = "create a token for consistency-on-demand")
private boolean createCodToken;
diff --git a/java/com/google/gerrit/server/logging/CallerFinder.java b/java/com/google/gerrit/server/logging/CallerFinder.java
index bd7e608..4cb4b7f 100644
--- a/java/com/google/gerrit/server/logging/CallerFinder.java
+++ b/java/com/google/gerrit/server/logging/CallerFinder.java
@@ -41,7 +41,7 @@
*
* <p>E.g. the stacktrace could look like this:
*
- * <pre>
+ * <pre>{@code
* GroupQueryProcessor(QueryProcessor<T>).query(List<String>, List<Predicate<T>>) line: 216
* GroupQueryProcessor(QueryProcessor<T>).query(List<Predicate<T>>) line: 188
* GroupQueryProcessor(QueryProcessor<T>).query(Predicate<T>) line: 171
@@ -52,7 +52,7 @@
* GroupCacheImpl$ByNameLoader.load(Object) line: 1
* LocalCache$LoadingValueReference<K,V>.loadFuture(K, CacheLoader<? super K,V>) line: 3527
* ...
- * </pre>
+ * }</pre>
*
* <p>The first interesting caller is {@code GroupCacheImpl$ByNameLoader.load(String) line: 166}. To
* find this caller from the stacktrace we could specify {@link
diff --git a/java/com/google/gerrit/server/logging/LoggingContextAwareRunnable.java b/java/com/google/gerrit/server/logging/LoggingContextAwareRunnable.java
index 3c4c563..1bba018 100644
--- a/java/com/google/gerrit/server/logging/LoggingContextAwareRunnable.java
+++ b/java/com/google/gerrit/server/logging/LoggingContextAwareRunnable.java
@@ -28,24 +28,24 @@
*
* <p>Example:
*
- * <pre>
- * try (TraceContext traceContext = TraceContext.newTrace(true, ...)) {
- * executor
- * .submit(new LoggingContextAwareRunnable(
- * () -> {
- * // Tracing is enabled since the runnable is created within the TraceContext.
- * // Tracing is even enabled if the executor runs the runnable only after the
- * // TraceContext was closed.
+ * <pre>{@code
+ * try (TraceContext traceContext = TraceContext.newTrace(true, ...)) {
+ * executor
+ * .submit(new LoggingContextAwareRunnable(
+ * () -> {
+ * // Tracing is enabled since the runnable is created within the TraceContext.
+ * // Tracing is even enabled if the executor runs the runnable only after the
+ * // TraceContext was closed.
*
- * // The tag "foo=bar" is not set, since it was added to the logging context only
- * // after this runnable was created.
+ * // The tag "foo=bar" is not set, since it was added to the logging context only
+ * // after this runnable was created.
*
- * // do stuff
- * }))
- * .get();
- * traceContext.addTag("foo", "bar");
- * }
- * </pre>
+ * // do stuff
+ * }))
+ * .get();
+ * traceContext.addTag("foo", "bar");
+ * }
+ * }</pre>
*
* @see LoggingContextAwareCallable
*/
diff --git a/java/com/google/gerrit/server/plugincontext/PluginContext.java b/java/com/google/gerrit/server/plugincontext/PluginContext.java
index ef2e181..a5fad56 100644
--- a/java/com/google/gerrit/server/plugincontext/PluginContext.java
+++ b/java/com/google/gerrit/server/plugincontext/PluginContext.java
@@ -54,7 +54,7 @@
* <p>A plugin context can be manually opened by invoking the newTrace methods. This should only be
* needed if an extension throws multiple exceptions that need to be handled:
*
- * <pre>
+ * <pre>{@code
* public interface Foo {
* void doFoo() throws Exception1, Exception2, Exception3;
* }
@@ -66,7 +66,7 @@
* fooExtension.get().doFoo();
* }
* }
- * </pre>
+ * }</pre>
*
* <p>This class hosts static methods with generic functionality to invoke plugin extensions with a
* trace context that are commonly used by {@link PluginItemContext}, {@link PluginSetContext} and
diff --git a/java/com/google/gerrit/server/plugincontext/PluginItemContext.java b/java/com/google/gerrit/server/plugincontext/PluginItemContext.java
index 421b3ad..e88a6fe 100644
--- a/java/com/google/gerrit/server/plugincontext/PluginItemContext.java
+++ b/java/com/google/gerrit/server/plugincontext/PluginItemContext.java
@@ -40,46 +40,46 @@
*
* <p>Example if all exceptions should be caught and logged:
*
- * <pre>
+ * <pre>{@code
* fooPluginItemContext.run(foo -> foo.doFoo());
- * </pre>
+ * }</pre>
*
* <p>Example if all exceptions, but one, should be caught and logged:
*
- * <pre>
+ * <pre>{@code
* try {
* fooPluginItemContext.run(foo -> foo.doFoo(), MyException.class);
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if return values should be handled:
*
- * <pre>
+ * <pre>{@code
* Object result = fooPluginItemContext.call(foo -> foo.getFoo());
- * </pre>
+ * }</pre>
*
* <p>Example if return values and a single exception should be handled:
*
- * <pre>
+ * <pre>{@code
* Object result;
* try {
* result = fooPluginItemContext.call(foo -> foo.getFoo(), MyException.class);
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if several exceptions should be handled:
*
- * <pre>
+ * <pre>{@code
* try (TraceContext traceContext = PluginContext.newTrace(fooDynamicItem.getEntry())) {
* fooDynamicItem.get().doFoo();
* } catch (MyException1 | MyException2 | MyException3 e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*/
public class PluginItemContext<T> {
@Nullable private final DynamicItem<T> dynamicItem;
diff --git a/java/com/google/gerrit/server/plugincontext/PluginMapContext.java b/java/com/google/gerrit/server/plugincontext/PluginMapContext.java
index b02ad27..fb50cd5 100644
--- a/java/com/google/gerrit/server/plugincontext/PluginMapContext.java
+++ b/java/com/google/gerrit/server/plugincontext/PluginMapContext.java
@@ -33,15 +33,15 @@
*
* <p>Example if all exceptions should be caught and logged:
*
- * <pre>
+ * <pre>{@code
* Map<String, Object> results = new HashMap<>();
* fooPluginMapContext.runEach(
* extension -> results.put(extension.getExportName(), extension.get().getFoo());
- * </pre>
+ * }</pre>
*
* <p>Example if all exceptions, but one, should be caught and logged:
*
- * <pre>
+ * <pre>{@code
* Map<String, Object> results = new HashMap<>();
* try {
* fooPluginMapContext.runEach(
@@ -50,22 +50,22 @@
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if return values should be handled:
*
- * <pre>
+ * <pre>{@code
* Map<String, Object> results = new HashMap<>();
* for (PluginMapEntryContext<Foo> c : fooPluginMapContext) {
* if (c.call(extension -> extension.get().handles(x))) {
* c.run(extension -> results.put(extension.getExportName(), extension.get().getFoo());
* }
* }
- * </pre>
+ * }</pre>
*
* <p>Example if return values and a single exception should be handled:
*
- * <pre>
+ * <pre>{@code
* Map<String, Object> results = new HashMap<>();
* try {
* for (PluginMapEntryContext<Foo> c : fooPluginMapContext) {
@@ -77,11 +77,11 @@
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if several exceptions should be handled:
*
- * <pre>
+ * <pre>{@code
* for (Extension<Foo> fooExtension : fooDynamicMap) {
* try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) {
* fooExtension.get().doFoo();
@@ -89,7 +89,7 @@
* // handle the exception
* }
* }
- * </pre>
+ * }</pre>
*/
public class PluginMapContext<T> implements Iterable<PluginMapEntryContext<T>> {
private final DynamicMap<T> dynamicMap;
diff --git a/java/com/google/gerrit/server/plugincontext/PluginMapEntryContext.java b/java/com/google/gerrit/server/plugincontext/PluginMapEntryContext.java
index 68589cf..27181cb 100644
--- a/java/com/google/gerrit/server/plugincontext/PluginMapEntryContext.java
+++ b/java/com/google/gerrit/server/plugincontext/PluginMapEntryContext.java
@@ -35,15 +35,15 @@
*
* <p>The call* methods execute the extension and deliver a result back to the caller.
*
- * <pre>
+ * <pre>{@code
* Map<String, Object> results = new HashMap<>();
* fooPluginMapEntryContext.run(
* extension -> results.put(extension.getExportName(), extension.get().getFoo());
- * </pre>
+ * }</pre>
*
* <p>Example if all exceptions, but one, should be caught and logged:
*
- * <pre>
+ * <pre>{@code
* Map<String, Object> results = new HashMap<>();
* try {
* fooPluginMapEntryContext.run(
@@ -52,28 +52,28 @@
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if return values should be handled:
*
- * <pre>
+ * <pre>{@code
* Object result = fooPluginMapEntryContext.call(extension -> extension.get().getFoo());
- * </pre>
+ * }</pre>
*
* <p>Example if return values and a single exception should be handled:
*
- * <pre>
+ * <pre>{@code
* Object result;
* try {
* result = fooPluginMapEntryContext.call(extension -> extension.get().getFoo(), MyException.class);
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if several exceptions should be handled:
*
- * <pre>
+ * <pre>{@code
* for (Extension<Foo> fooExtension : fooDynamicMap) {
* try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) {
* fooExtension.get().doFoo();
@@ -81,7 +81,7 @@
* // handle the exception
* }
* }
- * </pre>
+ * }</pre>
*/
public class PluginMapEntryContext<T> {
private final Extension<T> extension;
diff --git a/java/com/google/gerrit/server/plugincontext/PluginSetContext.java b/java/com/google/gerrit/server/plugincontext/PluginSetContext.java
index b64cfeb..43c9552 100644
--- a/java/com/google/gerrit/server/plugincontext/PluginSetContext.java
+++ b/java/com/google/gerrit/server/plugincontext/PluginSetContext.java
@@ -34,33 +34,33 @@
*
* <p>Example if all exceptions should be caught and logged:
*
- * <pre>
+ * <pre>{@code
* fooPluginSetContext.runEach(foo -> foo.doFoo());
- * </pre>
+ * }</pre>
*
* <p>Example if all exceptions, but one, should be caught and logged:
*
- * <pre>
+ * <pre>{@code
* try {
* fooPluginSetContext.runEach(foo -> foo.doFoo(), MyException.class);
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if return values should be handled:
*
- * <pre>
+ * <pre>{@code
* for (PluginSetEntryContext<Foo> c : fooPluginSetContext) {
* if (c.call(foo -> foo.handles(x))) {
* c.run(foo -> foo.doFoo());
* }
* }
- * </pre>
+ * }</pre>
*
* <p>Example if return values and a single exception should be handled:
*
- * <pre>
+ * <pre>{@code
* try {
* for (PluginSetEntryContext<Foo> c : fooPluginSetContext) {
* if (c.call(foo -> foo.handles(x), MyException.class)) {
@@ -70,11 +70,11 @@
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if several exceptions should be handled:
*
- * <pre>
+ * <pre>{@code
* for (Extension<Foo> fooExtension : fooDynamicSet.entries()) {
* try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) {
* fooExtension.get().doFoo();
@@ -82,7 +82,7 @@
* // handle the exception
* }
* }
- * </pre>
+ * }</pre>
*/
public class PluginSetContext<T> implements Iterable<PluginSetEntryContext<T>> {
private final DynamicSet<T> dynamicSet;
diff --git a/java/com/google/gerrit/server/plugincontext/PluginSetEntryContext.java b/java/com/google/gerrit/server/plugincontext/PluginSetEntryContext.java
index 2268c07..be97b52 100644
--- a/java/com/google/gerrit/server/plugincontext/PluginSetEntryContext.java
+++ b/java/com/google/gerrit/server/plugincontext/PluginSetEntryContext.java
@@ -37,40 +37,40 @@
*
* <p>Example if all exceptions should be caught and logged:
*
- * <pre>
+ * <pre>{@code
* fooPluginSetEntryContext.run(foo -> foo.doFoo());
- * </pre>
+ * }</pre>
*
* <p>Example if all exceptions, but one, should be caught and logged:
*
- * <pre>
+ * <pre>{@code
* try {
* fooPluginSetEntryContext.run(foo -> foo.doFoo(), MyException.class);
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if return values should be handled:
*
- * <pre>
+ * <pre>{@code
* Object result = fooPluginSetEntryContext.call(foo -> foo.getFoo());
- * </pre>
+ * }</pre>
*
* <p>Example if return values and a single exception should be handled:
*
- * <pre>
+ * <pre>{@code
* Object result;
* try {
* result = fooPluginSetEntryContext.call(foo -> foo.getFoo(), MyException.class);
* } catch (MyException e) {
* // handle the exception
* }
- * </pre>
+ * }</pre>
*
* <p>Example if several exceptions should be handled:
*
- * <pre>
+ * <pre>{@code
* for (Extension<Foo> fooExtension : fooDynamicSet.entries()) {
* try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) {
* fooExtension.get().doFoo();
@@ -78,7 +78,7 @@
* // handle the exception
* }
* }
- * </pre>
+ * }</pre>
*/
public class PluginSetEntryContext<T> {
private final Extension<T> extension;
diff --git a/java/com/google/gerrit/sshd/BaseCommand.java b/java/com/google/gerrit/sshd/BaseCommand.java
index 42aabfb..f1be04e 100644
--- a/java/com/google/gerrit/sshd/BaseCommand.java
+++ b/java/com/google/gerrit/sshd/BaseCommand.java
@@ -73,6 +73,7 @@
static final int STATUS_NOT_FOUND = PRIVATE_STATUS | 2;
public static final int STATUS_NOT_ADMIN = PRIVATE_STATUS | 3;
+ @SuppressWarnings("unused") // unused here, but triggers logic in EndOfOptionsHandler
@Option(name = "--", usage = "end of options", handler = EndOfOptionsHandler.class)
private boolean endOfOptions;
diff --git a/java/com/google/gerrit/testing/GerritJUnit.java b/java/com/google/gerrit/testing/GerritJUnit.java
index 0771c39..e80afa9 100644
--- a/java/com/google/gerrit/testing/GerritJUnit.java
+++ b/java/com/google/gerrit/testing/GerritJUnit.java
@@ -26,11 +26,11 @@
* <p>This construction is recommended by the Truth team for use in conjunction with asserting
* over a {@code ThrowableSubject} on the return type:
*
- * <pre>
- * MyException e = assertThrows(MyException.class, () -> doSomething(foo));
- * assertThat(e).isInstanceOf(MySubException.class);
- * assertThat(e).hasMessageThat().contains("sub-exception occurred");
- * </pre>
+ * <pre>{@code
+ * MyException e = assertThrows(MyException.class, () -> doSomething(foo));
+ * assertThat(e).isInstanceOf(MySubException.class);
+ * assertThat(e).hasMessageThat().contains("sub-exception occurred");
+ * }</pre>
*
* @param throwableClass expected exception type.
* @param runnable runnable containing arbitrary code.
diff --git a/java/com/google/gerrit/testing/GerritServerTests.java b/java/com/google/gerrit/testing/GerritServerTests.java
index 363a07d..752c13d 100644
--- a/java/com/google/gerrit/testing/GerritServerTests.java
+++ b/java/com/google/gerrit/testing/GerritServerTests.java
@@ -26,7 +26,6 @@
@RunWith(ConfigSuite.class)
public class GerritServerTests {
@ConfigSuite.Parameter public Config config;
- @ConfigSuite.Name private String configName;
@Rule
public TestRule testRunner =
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
index ac67444..6166f36 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -4928,6 +4928,28 @@
}
@Test
+ @GerritConfig(name = "trackingid.jira-bug.footer", value = "Bug:")
+ @GerritConfig(name = "trackingid.jira-bug.match", value = "\\d+")
+ @GerritConfig(name = "trackingid.jira-bug.system", value = "JIRA")
+ public void multipleTrackingIdsInSingleFooter() throws Exception {
+ PushOneCommit push =
+ pushFactory.create(
+ admin.newIdent(),
+ testRepo,
+ PushOneCommit.SUBJECT + "\n\n" + "Bug: 123, 456",
+ PushOneCommit.FILE_NAME,
+ PushOneCommit.FILE_CONTENT);
+ PushOneCommit.Result result = push.to("refs/for/master");
+ result.assertOkStatus();
+
+ ChangeInfo change = gApi.changes().id(result.getChangeId()).get(TRACKING_IDS);
+ Collection<TrackingIdInfo> trackingIds = change.trackingIds;
+ assertThat(trackingIds).isNotNull();
+ assertThat(trackingIds).hasSize(2);
+ assertThat(trackingIds.stream().map(t -> t.id)).containsExactly("123", "456");
+ }
+
+ @Test
public void starUnstar() throws Exception {
ChangeIndexedCounter changeIndexedCounter = new ChangeIndexedCounter();
try (Registration registration =
diff --git a/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java b/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java
index dd70d4a..c42628c 100644
--- a/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java
@@ -842,7 +842,7 @@
String otherLink = "https://other.example.com";
input = new ConfigInput();
addCommentLink(input, BUGZILLA, BUGZILLA_MATCH, otherLink);
- info = setConfig(child, input);
+ setConfig(child, input);
expected = new HashMap<>();
expected.put(BUGZILLA, commentLinkInfo(BUGZILLA, BUGZILLA_MATCH, otherLink));
@@ -866,7 +866,7 @@
String otherLink = "https://other.example.com";
input = new ConfigInput();
addCommentLink(input, BUGZILLA, BUGZILLA_MATCH, otherLink);
- info = setConfig(project, input);
+ setConfig(project, input);
expected = new HashMap<>();
expected.put(BUGZILLA, commentLinkInfo(BUGZILLA, BUGZILLA_MATCH, otherLink));
@@ -888,7 +888,7 @@
input = new ConfigInput();
addCommentLink(input, BUGZILLA, null);
- info = setConfig(project, input);
+ setConfig(project, input);
expected = new HashMap<>();
expected.put(JIRA, commentLinkInfo(JIRA, JIRA_MATCH, JIRA_LINK));
diff --git a/package.json b/package.json
index 5c862cb..a47ba9f 100644
--- a/package.json
+++ b/package.json
@@ -18,6 +18,7 @@
"eslint-plugin-lit": "^1.5.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.4.0",
+ "eslint-plugin-regex": "^1.8.0",
"gts": "^3.1.0",
"prettier": "2.3.1",
"rollup": "^2.45.2",
diff --git a/plugins/delete-project b/plugins/delete-project
index 0b5bcbf..3481845 160000
--- a/plugins/delete-project
+++ b/plugins/delete-project
@@ -1 +1 @@
-Subproject commit 0b5bcbfc26d9c0559312ced40bb36a37f517b793
+Subproject commit 3481845462f86959ff4ae4efb726e2bc3e494c3d
diff --git a/plugins/replication b/plugins/replication
index c62dcce..cd17fe7 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit c62dcced96659f717db59185e98d83398df50f46
+Subproject commit cd17fe7f90e5a36ab84b9b7ce0aab22e60e48a70
diff --git a/plugins/tsconfig-plugins-base.json b/plugins/tsconfig-plugins-base.json
index 97eae67..b7e9d52 100644
--- a/plugins/tsconfig-plugins-base.json
+++ b/plugins/tsconfig-plugins-base.json
@@ -20,6 +20,7 @@
"noUnusedLocals": true, /* Report errors on unused locals. */
"noUnusedParameters": true, /* Report errors on unused parameters. */
"noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
+ "noImplicitOverride": true,
"noFallthroughCasesInSwitch": true,/* Report errors for fallthrough cases in switch statement. */
"skipLibCheck": true, /* Do not check node_modules */
diff --git a/polygerrit-ui/app/.eslintrc.js b/polygerrit-ui/app/.eslintrc.js
index 3e17d7c..14f9e8c 100644
--- a/polygerrit-ui/app/.eslintrc.js
+++ b/polygerrit-ui/app/.eslintrc.js
@@ -277,6 +277,18 @@
},
},
{
+ files: ['**/api/*.ts'],
+ rules: {
+ 'regex/invalid': [
+ 'error', [{
+ regex: 'export interface',
+ message: 'All interfaces in the api/ dir must have "declare"',
+ replacement: 'export declare interface',
+ }],
+ ],
+ },
+ },
+ {
files: ['**/*.ts'],
extends: [require.resolve('gts/.eslintrc.json')],
rules: {
@@ -425,6 +437,7 @@
'import',
'lit',
'prettier',
+ 'regex',
],
settings: {
'html/report-bad-indent': 'error',
diff --git a/polygerrit-ui/app/BUILD b/polygerrit-ui/app/BUILD
index cc62f05..00c8e65 100644
--- a/polygerrit-ui/app/BUILD
+++ b/polygerrit-ui/app/BUILD
@@ -106,7 +106,6 @@
"elements/admin/gr-repo-plugin-config/gr-repo-plugin-config_html.ts",
"elements/admin/gr-repo/gr-repo_html.ts",
"elements/admin/gr-rule-editor/gr-rule-editor_html.ts",
- "elements/change-list/gr-change-list-item/gr-change-list-item_html.ts",
"elements/change-list/gr-change-list-view/gr-change-list-view_html.ts",
"elements/change-list/gr-change-list/gr-change-list_html.ts",
"elements/change-list/gr-dashboard-view/gr-dashboard-view_html.ts",
diff --git a/polygerrit-ui/app/api/gerrit.ts b/polygerrit-ui/app/api/gerrit.ts
index 8488961..2091eea 100644
--- a/polygerrit-ui/app/api/gerrit.ts
+++ b/polygerrit-ui/app/api/gerrit.ts
@@ -25,7 +25,7 @@
}
}
-export interface Gerrit {
+export declare interface Gerrit {
install(
callback: (plugin: PluginApi) => void,
opt_version?: string,
diff --git a/polygerrit-ui/app/api/hook.ts b/polygerrit-ui/app/api/hook.ts
index f8a6cc1..8cbb9d0 100644
--- a/polygerrit-ui/app/api/hook.ts
+++ b/polygerrit-ui/app/api/hook.ts
@@ -16,7 +16,7 @@
*/
import {ChangeInfo, ConfigInfo, RevisionInfo} from './rest-api';
-export interface GerritElementExtensions {
+export declare interface GerritElementExtensions {
content?: HTMLElement & {hidden?: boolean};
change?: ChangeInfo;
revision?: RevisionInfo;
diff --git a/polygerrit-ui/app/api/rest-api.ts b/polygerrit-ui/app/api/rest-api.ts
index 4a4b79d..f86e825 100644
--- a/polygerrit-ui/app/api/rest-api.ts
+++ b/polygerrit-ui/app/api/rest-api.ts
@@ -240,7 +240,7 @@
* The AccountDetailInfo entity contains detailed information about an account.
* https://gerrit-review.googlesource.com/Documentation/rest-api-accounts.html#account-detail-info
*/
-export interface AccountDetailInfo extends AccountInfo {
+export declare interface AccountDetailInfo extends AccountInfo {
registered_on: Timestamp;
}
@@ -249,7 +249,7 @@
* from the accounts section.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#accounts-config-info
*/
-export interface AccountsConfigInfo {
+export declare interface AccountsConfigInfo {
visibility: string;
default_display_name: DefaultDisplayNameConfig;
}
@@ -320,7 +320,7 @@
* configuration of the Gerrit server.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#auth-info
*/
-export interface AuthInfo {
+export declare interface AuthInfo {
auth_type: AuthType; // docs incorrectly names it 'type'
use_contributor_agreements?: boolean;
contributor_agreements?: ContributorAgreementInfo[];
@@ -356,7 +356,7 @@
* from the change section.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#change-config-info
*/
-export interface ChangeConfigInfo {
+export declare interface ChangeConfigInfo {
allow_blame?: boolean;
large_change: number;
update_delay: number;
@@ -464,14 +464,14 @@
* The CommentLinkInfo entity describes acommentlink.
* https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#commentlink-info
*/
-export interface CommentLinkInfo {
+export declare interface CommentLinkInfo {
match: string;
link?: string;
enabled?: boolean;
html?: string;
}
-export interface CommentLinks {
+export declare interface CommentLinks {
[name: string]: CommentLinkInfo;
}
@@ -492,7 +492,8 @@
resolve_conflicts_web_links?: WebLinkInfo[];
}
-export interface ConfigArrayParameterInfo extends ConfigParameterInfoBase {
+export declare interface ConfigArrayParameterInfo
+ extends ConfigParameterInfoBase {
type: ConfigParameterInfoType.ARRAY;
values: string[];
}
@@ -502,7 +503,7 @@
* project configuration.
* https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#config-info
*/
-export interface ConfigInfo {
+export declare interface ConfigInfo {
description?: string;
use_contributor_agreements?: InheritedBooleanInfo;
use_content_merge?: InheritedBooleanInfo;
@@ -525,7 +526,8 @@
reject_empty_commit?: InheritedBooleanInfo;
}
-export interface ConfigListParameterInfo extends ConfigParameterInfoBase {
+export declare interface ConfigListParameterInfo
+ extends ConfigParameterInfoBase {
type: ConfigParameterInfoType.LIST;
permitted_values?: string[];
}
@@ -539,7 +541,7 @@
* The ConfigParameterInfo entity describes a project configurationparameter.
* https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#config-parameter-info
*/
-export interface ConfigParameterInfoBase {
+export declare interface ConfigParameterInfoBase {
display_name?: string;
description?: string;
warning?: string;
@@ -554,7 +556,7 @@
}
// https://gerrit-review.googlesource.com/Documentation/rest-api-accounts.html#contributor-agreement-info
-export interface ContributorAgreementInfo {
+export declare interface ContributorAgreementInfo {
name: string;
description: string;
url: string;
@@ -584,7 +586,7 @@
* options.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#download-info
*/
-export interface DownloadInfo {
+export declare interface DownloadInfo {
schemes: SchemesInfoMap;
archives: string[];
}
@@ -594,7 +596,7 @@
* scheme and its commands.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html
*/
-export interface DownloadSchemeInfo {
+export declare interface DownloadSchemeInfo {
url: string;
is_auth_required: boolean;
is_auth_supported: boolean;
@@ -634,7 +636,7 @@
* the gerrit section.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#gerrit-info
*/
-export interface GerritInfo {
+export declare interface GerritInfo {
all_projects: string; // Doc contains incorrect name
all_users: string; // Doc contains incorrect name
doc_search: boolean;
@@ -685,7 +687,7 @@
* Gerrit internal group, or an external group that is known to Gerrit.
* https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html#group-info
*/
-export interface GroupInfo {
+export declare interface GroupInfo {
id: GroupId;
name?: GroupName;
url?: string;
@@ -706,7 +708,7 @@
* Options of the group.
* https://gerrit-review.googlesource.com/Documentation/rest-api-groups.html
*/
-export interface GroupOptionsInfo {
+export declare interface GroupOptionsInfo {
visible_to_all: boolean;
}
@@ -718,7 +720,7 @@
* A boolean value that can also be inherited.
* https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#inherited-boolean-info
*/
-export interface InheritedBooleanInfo {
+export declare interface InheritedBooleanInfo {
value: boolean;
configured_value: InheritedBooleanInfoConfiguredValue;
inherited_value?: boolean;
@@ -750,7 +752,7 @@
* has.
* https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#label-type-info
*/
-export interface LabelTypeInfo {
+export declare interface LabelTypeInfo {
values: LabelTypeInfoValues;
default_value: number;
}
@@ -765,7 +767,7 @@
* size limit of a project.
* https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#max-object-size-limit-info
*/
-export interface MaxObjectSizeLimitInfo {
+export declare interface MaxObjectSizeLimitInfo {
value?: string;
configured_value?: string;
summary?: string;
@@ -793,7 +795,7 @@
* plugins.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#plugin-config-info
*/
-export interface PluginConfigInfo {
+export declare interface PluginConfigInfo {
has_avatars: boolean;
// Exists in Java class, but not mentioned in docs.
js_resource_paths: string[];
@@ -828,7 +830,7 @@
* The ProjectInfo entity contains information about a project
* https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#project-info
*/
-export interface ProjectInfo {
+export declare interface ProjectInfo {
id: UrlEncodedRepoName;
// name is not set if returned in a map where the project name is used as
// map key
@@ -845,7 +847,7 @@
web_links?: WebLinkInfo[];
}
-export interface ProjectInfoWithName extends ProjectInfo {
+export declare interface ProjectInfoWithName extends ProjectInfo {
name: RepoName;
}
@@ -891,7 +893,7 @@
* git-receive-pack behavior on the server.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#receive-info
*/
-export interface ReceiveInfo {
+export declare interface ReceiveInfo {
enable_signed_push?: string;
}
@@ -964,7 +966,7 @@
* Gerrit server.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#server-info
*/
-export interface ServerInfo {
+export declare interface ServerInfo {
accounts: AccountsConfigInfo;
auth: AuthInfo;
change: ChangeConfigInfo;
@@ -999,7 +1001,7 @@
* project inheritance.
* https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#submit-type-info
*/
-export interface SubmitTypeInfo {
+export declare interface SubmitTypeInfo {
value: Exclude<SubmitType, SubmitType.INHERIT>;
configured_value: SubmitType;
inherited_value: Exclude<SubmitType, SubmitType.INHERIT>;
@@ -1010,7 +1012,7 @@
* the suggest section.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#suggest-info
*/
-export interface SuggestInfo {
+export declare interface SuggestInfo {
from: number;
}
@@ -1038,7 +1040,7 @@
* from the user section.
* https://gerrit-review.googlesource.com/Documentation/rest-api-config.html#user-config-info
*/
-export interface UserConfigInfo {
+export declare interface UserConfigInfo {
anonymous_coward_name: string;
}
diff --git a/polygerrit-ui/app/api/styles.ts b/polygerrit-ui/app/api/styles.ts
index ded3beb..43149d3 100644
--- a/polygerrit-ui/app/api/styles.ts
+++ b/polygerrit-ui/app/api/styles.ts
@@ -29,11 +29,11 @@
*/
/** Lit plugins can cast Style to CSSResult. */
-export interface Style {
+export declare interface Style {
toString(): string;
}
-export interface Styles {
+export declare interface Styles {
font: Style;
form: Style;
menuPage: Style;
diff --git a/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.ts b/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.ts
index 5a48399..04d3198 100644
--- a/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.ts
+++ b/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.ts
@@ -45,7 +45,7 @@
@property({type: String})
itemTypeName?: string;
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
css`
@@ -57,7 +57,7 @@
];
}
- render() {
+ override render() {
const item = this.item ?? 'UNKNOWN ITEM';
const itemTypeName = this.itemTypeName ?? 'UNKNOWN ITEM TYPE';
return html` <gr-dialog
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.ts b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.ts
index fc7ef4b..7800653 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.ts
@@ -43,7 +43,7 @@
private readonly restApiService = appContext.restApiService;
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
tableStyles,
@@ -63,7 +63,7 @@
];
}
- render() {
+ override render() {
return html` <table
id="list"
class="genericList ${this._computeLoadingClass(this._loading)}"
@@ -114,7 +114,7 @@
</table>`;
}
- updated(changedProperties: PropertyValues) {
+ override updated(changedProperties: PropertyValues) {
if (changedProperties.has('repo')) {
this.repoChanged();
}
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
index 313b91f..6770c00 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
@@ -354,10 +354,7 @@
return this._computeAdditionalReviewers(change).length;
}
- _computeAdditionalReviewersTitle(
- change: ChangeInfo | undefined,
- config: ServerInfo
- ) {
+ _computeAdditionalReviewersTitle(change?: ChangeInfo, config?: ServerInfo) {
if (!change || !config) return '';
return this._computeAdditionalReviewers(change)
.map(user => getDisplayName(config, user, true))
@@ -393,8 +390,8 @@
}
_computeWaiting(
- account?: AccountInfo,
- change?: ChangeInfo
+ account?: AccountInfo | null,
+ change?: ChangeInfo | null
): Timestamp | undefined {
if (!account?._account_id || !change?.attention_set) return undefined;
return change?.attention_set[account._account_id]?.last_update;
@@ -417,6 +414,11 @@
);
}
+ _formatDate(date: Timestamp | undefined): string | undefined {
+ if (!date) return undefined;
+ return date.toString();
+ }
+
_handleChangeClick() {
// Don't prevent the default and neither stop bubbling. We just want to
// report the click, but then let the browser handle the click on the link.
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_html.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_html.ts
index 8ee6a3f..4557aac 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_html.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_html.ts
@@ -204,7 +204,7 @@
</template>
<template is="dom-if" if="[[_computeAdditionalReviewersCount(change)]]">
<span title="[[_computeAdditionalReviewersTitle(change, config)]]">
- +[[_computeAdditionalReviewersCount(change, config)]]
+ +[[_computeAdditionalReviewersCount(change)]]
</span>
</template>
</div>
@@ -224,14 +224,14 @@
hidden$="[[isColumnHidden('Repo', visibleChangeTableColumns)]]"
>
<a class="fullRepo" href$="[[_computeRepoUrl(change)]]">
- [[_computeRepoDisplay(change)]]
+ [[_computeRepoDisplay(change, false)]]
</a>
<a
class="truncatedRepo"
href$="[[_computeRepoUrl(change)]]"
- title$="[[_computeRepoDisplay(change)]]"
+ title$="[[_computeRepoDisplay(change, false)]]"
>
- [[_computeRepoDisplay(change, 'true')]]
+ [[_computeRepoDisplay(change, true)]]
</a>
</td>
<td
@@ -254,7 +254,7 @@
>
<gr-date-formatter
has-tooltip=""
- date-str="[[change.updated]]"
+ date-str="[[_formatDate(change.updated)]]"
></gr-date-formatter>
</td>
<td
@@ -263,7 +263,7 @@
>
<gr-date-formatter
has-tooltip=""
- date-str="[[change.submitted]]"
+ date-str="[[_formatDate(change.submitted)]]"
></gr-date-formatter>
</td>
<td
diff --git a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.ts b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.ts
index bc21dc0..e87b4f9 100644
--- a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.ts
@@ -48,7 +48,7 @@
private readonly restApiService = appContext.restApiService;
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
dashboardHeaderStyles,
@@ -63,7 +63,7 @@
];
}
- render() {
+ override render() {
return html` <gr-avatar
.account="${this._accountDetails}"
.imageSize=${100}
@@ -116,7 +116,7 @@
</div>`;
}
- updated(changedProperties: PropertyValues) {
+ override updated(changedProperties: PropertyValues) {
if (changedProperties.has('userId')) {
this._accountChanged(this.userId);
}
diff --git a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.ts b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.ts
index 1052c91..4326939 100644
--- a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.ts
+++ b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.ts
@@ -43,7 +43,7 @@
@property({type: Object})
serverConfig: ServerInfo | undefined;
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
css`
@@ -55,7 +55,7 @@
];
}
- render() {
+ override render() {
return html` <div class="container">
<a
target="_blank"
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.ts b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.ts
index c705319..3ab9c82 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.ts
+++ b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.ts
@@ -58,7 +58,7 @@
@property({type: Boolean})
_initialised = false;
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
fontStyles,
@@ -154,7 +154,7 @@
`;
}
- render() {
+ override render() {
return html` <gr-dialog
id="dialog"
confirm-label="Continue"
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.ts b/polygerrit-ui/app/elements/change/gr-message/gr-message.ts
index b4e85a9..95e4301 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.ts
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.ts
@@ -209,7 +209,7 @@
this.addEventListener('click', e => this._handleClick(e));
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
this.restApiService.getConfig().then(config => {
this.config = config;
diff --git a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.ts b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.ts
index d554ab1..c2066d7 100644
--- a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.ts
+++ b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.ts
@@ -76,7 +76,7 @@
super.disconnectedCallback();
}
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
css`
@@ -92,7 +92,7 @@
];
}
- render() {
+ override render() {
// To pass CSS mixins for @apply to Polymer components, they need to appear
// in <style> inside the template.
/* eslint-disable lit/prefer-static-styles */
diff --git a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts
index 7b12b1117..240bb22 100644
--- a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts
+++ b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts
@@ -204,7 +204,7 @@
this.query = (input: string) => this._getSearchSuggestions(input);
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
this.restApiService.getConfig().then((serverConfig?: ServerInfo) => {
const mergeability =
diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts
index 1c25755..f5072b9 100644
--- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts
+++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts
@@ -150,7 +150,7 @@
});
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
this.refitOverlay = () => {
// re-center the dialog as content changed
diff --git a/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.ts b/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.ts
index 988366c..7fee4a0 100644
--- a/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.ts
+++ b/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.ts
@@ -37,7 +37,7 @@
getPluginLoader().loadPlugins(pluginsPending);
}
- updated(changedProperties: PropertyValues<GrPluginHost>) {
+ override updated(changedProperties: PropertyValues<GrPluginHost>) {
if (changedProperties.has('config') && this.config) {
this._configChanged(this.config);
}
diff --git a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.ts b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.ts
index eca38d9..a972db3 100644
--- a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.ts
+++ b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.ts
@@ -41,7 +41,7 @@
});
}
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
css`
@@ -71,7 +71,7 @@
`;
}
- render() {
+ override render() {
return html` <div class="gr-form-styles">
<table id="agreements">
<thead>
diff --git a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.ts b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.ts
index 6354c9a..c62cff4 100644
--- a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.ts
+++ b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.ts
@@ -75,7 +75,7 @@
return Promise.all(promises);
}
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
formStyles,
@@ -113,7 +113,7 @@
];
}
- render() {
+ override render() {
return html` <div class="gr-form-styles">
<div ?hidden=${this._passwordUrl}>
<section>
diff --git a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.ts b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.ts
index 43818bb..ae3853e 100644
--- a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.ts
+++ b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.ts
@@ -30,7 +30,7 @@
@customElement('gr-alert')
export class GrAlert extends LitElement {
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
css`
@@ -93,7 +93,7 @@
>`;
}
- render() {
+ override render() {
// To pass CSS mixins for @apply to Polymer components, they need to appear
// in <style> inside the template.
/* eslint-disable lit/prefer-static-styles */
diff --git a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.ts b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.ts
index a3800a8..437e7e8 100644
--- a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.ts
+++ b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.ts
@@ -85,7 +85,7 @@
}
@property({type: String, notify: true})
- dateStr: string | null = null;
+ dateStr: string | undefined = undefined;
@property({type: Boolean})
showDateAndTime = false;
diff --git a/polygerrit-ui/app/elements/shared/gr-file-status-chip/gr-file-status-chip.ts b/polygerrit-ui/app/elements/shared/gr-file-status-chip/gr-file-status-chip.ts
index 0f94b11..3f759b5 100644
--- a/polygerrit-ui/app/elements/shared/gr-file-status-chip/gr-file-status-chip.ts
+++ b/polygerrit-ui/app/elements/shared/gr-file-status-chip/gr-file-status-chip.ts
@@ -36,7 +36,7 @@
@property({type: Object})
file?: NormalizedFileInfo;
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
css`
@@ -65,7 +65,7 @@
];
}
- render() {
+ override render() {
return html` <span
class="${this._computeStatusClass(this.file)}"
tabindex="0"
diff --git a/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account.ts b/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account.ts
index a329736..b789bee 100644
--- a/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account.ts
+++ b/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account.ts
@@ -96,7 +96,7 @@
this.reporting = appContext.reportingService;
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
this.restApiService.getConfig().then(config => {
this._config = config;
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.ts b/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.ts
index b5771fc..801b8bf 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.ts
+++ b/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.ts
@@ -50,7 +50,7 @@
@property({type: Number})
limit?: number;
- static get styles() {
+ static override get styles() {
return [
sharedStyles,
css`
@@ -84,7 +84,7 @@
];
}
- render() {
+ override render() {
// To pass CSS mixins for @apply to Polymer components, they need to appear
// in <style> inside the template.
/* eslint-disable lit/prefer-static-styles */
diff --git a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.ts b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.ts
index b2477dd..423a1a8 100644
--- a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.ts
+++ b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.ts
@@ -53,7 +53,7 @@
this.bodyScrollHandler = () => this._handleBodyScroll();
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
window.addEventListener('scroll', this.bodyScrollHandler);
}
diff --git a/polygerrit-ui/app/elements/shared/gr-vote-chip/gr-vote-chip.ts b/polygerrit-ui/app/elements/shared/gr-vote-chip/gr-vote-chip.ts
index 73ca99d..2fd3fb9 100644
--- a/polygerrit-ui/app/elements/shared/gr-vote-chip/gr-vote-chip.ts
+++ b/polygerrit-ui/app/elements/shared/gr-vote-chip/gr-vote-chip.ts
@@ -45,7 +45,7 @@
private readonly flagsService = appContext.flagsService;
- static get styles() {
+ static override get styles() {
return [
css`
.vote-chip.max {
@@ -106,7 +106,7 @@
];
}
- render() {
+ override render() {
if (!this.flagsService.isEnabled(KnownExperimentId.SUBMIT_REQUIREMENTS_UI))
return;
if (!this.vote?.value) return;
diff --git a/polygerrit-ui/app/tsconfig.json b/polygerrit-ui/app/tsconfig.json
index 9516dce..7b01226 100644
--- a/polygerrit-ui/app/tsconfig.json
+++ b/polygerrit-ui/app/tsconfig.json
@@ -25,6 +25,7 @@
"noUnusedLocals": true, /* Report errors on unused locals. */
"noUnusedParameters": true, /* Report errors on unused parameters. */
"noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
+ "noImplicitOverride": true,
"noFallthroughCasesInSwitch": true,/* Report errors for fallthrough cases in switch statement. */
"skipLibCheck": true, /* Do not check node_modules */
diff --git a/resources/com/google/gerrit/server/mail/ChangeHeader.soy b/resources/com/google/gerrit/server/mail/ChangeHeader.soy
index 5dfe671..3d0edab 100644
--- a/resources/com/google/gerrit/server/mail/ChangeHeader.soy
+++ b/resources/com/google/gerrit/server/mail/ChangeHeader.soy
@@ -20,10 +20,10 @@
{@param attentionSet: ?}
{if $attentionSet}
Attention is currently required from:{sp}
- {for $attentionSetUser in $attentionSet}
+ {for $attentionSetUser, $index in $attentionSet}
{$attentionSetUser}
// add commas or dot.
- {if isLast($attentionSetUser)}.
+ {if $index == length($attentionSet) - 1}.
{else},{sp}
{/if}
{/for}
diff --git a/resources/com/google/gerrit/server/mail/ChangeHeaderHtml.soy b/resources/com/google/gerrit/server/mail/ChangeHeaderHtml.soy
index 191737f..0d8da38 100644
--- a/resources/com/google/gerrit/server/mail/ChangeHeaderHtml.soy
+++ b/resources/com/google/gerrit/server/mail/ChangeHeaderHtml.soy
@@ -21,10 +21,10 @@
{@param attentionSet: ?}
{if $attentionSet}
<p> Attention is currently required from:{sp}
- {for $attentionSetUser in $attentionSet}
+ {for $attentionSetUser, $index in $attentionSet}
{$attentionSetUser}
//add commas or dot.
- {if isLast($attentionSetUser)}.
+ {if $index == length($attentionSet) - 1}.
{else},{sp}
{/if}
{/for} </p>
diff --git a/resources/com/google/gerrit/server/mail/Comment.soy b/resources/com/google/gerrit/server/mail/Comment.soy
index 4b923e6..4b66401 100644
--- a/resources/com/google/gerrit/server/mail/Comment.soy
+++ b/resources/com/google/gerrit/server/mail/Comment.soy
@@ -48,8 +48,8 @@
{\n}
{/if}
- {for $line in $comment.lines}
- {if isFirst($line)}
+ {for $line, $index in $comment.lines}
+ {if $index == 0}
{if $comment.startLine != 0}
{$comment.link}
{/if}
diff --git a/resources/com/google/gerrit/server/mail/DeleteReviewer.soy b/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
index a3ed3ee..ae2a9c4 100644
--- a/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
+++ b/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
@@ -26,8 +26,8 @@
{@param email: ?}
{@param fromName: ?}
{$fromName} has removed{sp}
- {for $reviewerName in $email.reviewerNames}
- {if not isFirst($reviewerName)},{sp}{/if}
+ {for $reviewerName, $index in $email.reviewerNames}
+ {if $index > 0},{sp}{/if}
{$reviewerName}
{/for}{sp}
from this change.{sp}
diff --git a/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy b/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
index 76a9199..fdcbbe7 100644
--- a/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
+++ b/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
@@ -25,9 +25,9 @@
{$fromName}{sp}
<strong>
removed{sp}
- {for $reviewerName in $email.reviewerNames}
- {if not isFirst($reviewerName)}
- {if isLast($reviewerName)}{sp}and{else},{/if}{sp}
+ {for $reviewerName, $index in $email.reviewerNames}
+ {if $index > 0}
+ {if $index == (length($email.reviewerNames) - 1)}{sp}and{else},{/if}{sp}
{/if}
{$reviewerName}
{/for}
diff --git a/resources/com/google/gerrit/server/mail/NewChange.soy b/resources/com/google/gerrit/server/mail/NewChange.soy
index aa2b946..c5f34b4 100644
--- a/resources/com/google/gerrit/server/mail/NewChange.soy
+++ b/resources/com/google/gerrit/server/mail/NewChange.soy
@@ -30,8 +30,8 @@
{if $email.reviewerNames or $email.removedReviewerNames}
{if $email.reviewerNames}
Hello{sp}
- {for $reviewerName in $email.reviewerNames}
- {if not isFirst($reviewerName)},{sp}{/if}
+ {for $reviewerName, $index in $email.reviewerNames}
+ {if $index > 0},{sp}{/if}
{$reviewerName}
{/for},
@@ -43,8 +43,8 @@
{/if}
{if $email.removedReviewerNames}
{$fromName} has removed{sp}
- {for $reviewerName in $email.removedReviewerNames}
- {if not isFirst($reviewerName)},{sp}{/if}
+ {for $reviewerName, $index in $email.removedReviewerNames}
+ {if $index > 0},{sp}{/if}
{$reviewerName}
{/for}{sp}
from this change.{sp}
diff --git a/resources/com/google/gerrit/server/mail/NewChangeHtml.soy b/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
index 272c3ef..008226f 100644
--- a/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
+++ b/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
@@ -29,9 +29,9 @@
{if $email.reviewerNames or $email.removedReviewerNames}
{if $email.reviewerNames}
{$fromName} would like{sp}
- {for $reviewerName in $email.reviewerNames}
- {if not isFirst($reviewerName)}
- {if isLast($reviewerName)}{sp}and{else},{/if}{sp}
+ {for $reviewerName, $index in $email.reviewerNames}
+ {if $index > 0}
+ {if $index == length($email.reviewerNames) - 1}{sp}and{else},{/if}{sp}
{/if}
{$reviewerName}
{/for}{sp}
@@ -44,9 +44,9 @@
{$fromName}{sp}
<strong>
removed{sp}
- {for $reviewerName in $email.removedReviewerNames}
- {if not isFirst($reviewerName)}
- {if isLast($reviewerName)}{sp}and{else},{/if}{sp}
+ {for $reviewerName, $index in $email.removedReviewerNames}
+ {if $index > 0}
+ {if $index == length($email.removedReviewerNames) - 1}{sp}and{else},{/if}{sp}
{/if}
{$reviewerName}
{/for}
diff --git a/tools/BUILD b/tools/BUILD
index 6cc108b..1bace53 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -431,7 +431,7 @@
"-Xep:TypeParameterUnusedInFormals:ERROR",
"-Xep:URLEqualsHashCode:ERROR",
# "-Xep:UndefinedEquals:WARN",
- # "-Xep:UnescapedEntity:WARN",
+ "-Xep:UnescapedEntity:ERROR",
"-Xep:UnnecessaryAssignment:ERROR",
"-Xep:UnnecessaryCheckNotNull:ERROR",
# "-Xep:UnnecessaryLambda:WARN",
@@ -446,9 +446,9 @@
"-Xep:UnusedAnonymousClass:ERROR",
"-Xep:UnusedCollectionModifiedInPlace:ERROR",
"-Xep:UnusedException:ERROR",
- # "-Xep:UnusedMethod:WARN",
+ "-Xep:UnusedMethod:ERROR",
"-Xep:UnusedNestedClass:ERROR",
- # "-Xep:UnusedVariable:WARN",
+ "-Xep:UnusedVariable:ERROR",
"-Xep:UseBinds:ERROR",
"-Xep:UseCorrectAssertInTests:ERROR",
"-Xep:VarTypeName:ERROR",
diff --git a/yarn.lock b/yarn.lock
index 764848a..17c08c3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -982,6 +982,11 @@
dependencies:
prettier-linter-helpers "^1.0.0"
+eslint-plugin-regex@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-regex/-/eslint-plugin-regex-1.8.0.tgz#4bd111cf5235fb76a4a7f77d7ffcb7b3777b8a77"
+ integrity sha512-rmzVvpoxHKgvcYDo9d1X9RMFOtyOV3A6taD3KWE6gIID2dHoc8RPd0YAjDSJ0LG35wnehQBfsNB+F7q4eYqXqw==
+
eslint-scope@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"