Merge "Migrate gr-file-list"
diff --git a/Documentation/cmd-stream-events.txt b/Documentation/cmd-stream-events.txt
index f0ad460..5fd0bfc 100644
--- a/Documentation/cmd-stream-events.txt
+++ b/Documentation/cmd-stream-events.txt
@@ -324,6 +324,19 @@
comment:: Review comment cover message.
+=== Project Head Updated
+
+Sent when project's head is updated.
+
+type:: "project-head-updated"
+
+oldHead:: The old project head name
+
+newHead:: The new project head name
+
+eventCreatedOn:: Time in seconds since the UNIX epoch when this event was
+created.
+
== SEE ALSO
* link:json.html[JSON Data Formats]
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index 6fa584ac..2e203e4 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -3970,7 +3970,7 @@
|`value` ||
The effective boolean value.
|`configured_value` ||
-The configured value, can be `TRUE`, `FALSE` or `INHERITED`.
+The configured value, can be `TRUE`, `FALSE` or `INHERIT`.
|`inherited_value` |optional|
The boolean value inherited from the parent. +
Not set if there is no parent.
diff --git a/Documentation/user-search.txt b/Documentation/user-search.txt
index f716cb0..7816f5f 100644
--- a/Documentation/user-search.txt
+++ b/Documentation/user-search.txt
@@ -363,7 +363,7 @@
files, use `file:^.*\.java`.
+
The entire regular expression pattern, including the `^` character,
-should be double quoted. For example, to match all XML
+can be double quoted. For example, to match all XML
files named like 'name1.xml', 'name2.xml', and 'name3.xml' use
`file:"^name[1-3].xml"`.
+
@@ -371,8 +371,8 @@
+
*More examples:*
-* `-file:^path/.*` - changes that do not modify files from `path/`.
-* `file:{^~(path/.*)}` - changes that modify files not from `path/` (but may
+* `-path:^path/.*` - changes that do not modify files from `path/`.
+* `path:{^~(path/.*)}` - changes that modify files not from `path/` (but may
contain files from `path/`).
[[file]]
diff --git a/java/com/google/gerrit/server/events/ProjectHeadUpdatedEvent.java b/java/com/google/gerrit/server/events/ProjectHeadUpdatedEvent.java
new file mode 100644
index 0000000..90ed285
--- /dev/null
+++ b/java/com/google/gerrit/server/events/ProjectHeadUpdatedEvent.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 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.server.events;
+
+import com.google.gerrit.entities.Project;
+import com.google.gerrit.entities.Project.NameKey;
+
+public class ProjectHeadUpdatedEvent extends ProjectEvent {
+
+ static final String TYPE = "project-head-updated";
+
+ public String projectName;
+ public String oldHead;
+ public String newHead;
+
+ public ProjectHeadUpdatedEvent() {
+ super(TYPE);
+ }
+
+ @Override
+ public NameKey getProjectNameKey() {
+ return Project.nameKey(projectName);
+ }
+}
diff --git a/java/com/google/gerrit/server/events/StreamEventsApiListener.java b/java/com/google/gerrit/server/events/StreamEventsApiListener.java
index abacb85..afe2a7c 100644
--- a/java/com/google/gerrit/server/events/StreamEventsApiListener.java
+++ b/java/com/google/gerrit/server/events/StreamEventsApiListener.java
@@ -39,6 +39,7 @@
import com.google.gerrit.extensions.events.CommentAddedListener;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.events.HashtagsEditedListener;
+import com.google.gerrit.extensions.events.HeadUpdatedListener;
import com.google.gerrit.extensions.events.NewProjectCreatedListener;
import com.google.gerrit.extensions.events.PrivateStateChangedListener;
import com.google.gerrit.extensions.events.ReviewerAddedListener;
@@ -86,7 +87,8 @@
ReviewerDeletedListener,
RevisionCreatedListener,
TopicEditedListener,
- VoteDeletedListener {
+ VoteDeletedListener,
+ HeadUpdatedListener {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
public static class StreamEventsApiListenerModule extends AbstractModule {
@@ -111,6 +113,7 @@
DynamicSet.bind(binder(), VoteDeletedListener.class).to(StreamEventsApiListener.class);
DynamicSet.bind(binder(), WorkInProgressStateChangedListener.class)
.to(StreamEventsApiListener.class);
+ DynamicSet.bind(binder(), HeadUpdatedListener.class).to(StreamEventsApiListener.class);
}
}
@@ -339,6 +342,16 @@
}
@Override
+ public void onHeadUpdated(HeadUpdatedListener.Event ev) {
+ ProjectHeadUpdatedEvent event = new ProjectHeadUpdatedEvent();
+ event.projectName = ev.getProjectName();
+ event.oldHead = ev.getOldHeadName();
+ event.newHead = ev.getNewHeadName();
+
+ dispatcher.run(d -> d.postEvent(event.getProjectNameKey(), event));
+ }
+
+ @Override
public void onHashtagsEdited(HashtagsEditedListener.Event ev) {
try {
ChangeNotes notes = getNotes(ev.getChange());
diff --git a/javatests/com/google/gerrit/server/events/EventJsonTest.java b/javatests/com/google/gerrit/server/events/EventJsonTest.java
index 3c9a355..c2b67c3 100644
--- a/javatests/com/google/gerrit/server/events/EventJsonTest.java
+++ b/javatests/com/google/gerrit/server/events/EventJsonTest.java
@@ -593,6 +593,24 @@
.build());
}
+ @Test
+ public void projectHeadUpdatedEvent() {
+ ProjectHeadUpdatedEvent event = new ProjectHeadUpdatedEvent();
+ event.projectName = PROJECT;
+ event.oldHead = "refs/heads/master";
+ event.newHead = REF;
+
+ assertThatJsonMap(event)
+ .isEqualTo(
+ ImmutableMap.builder()
+ .put("projectName", PROJECT)
+ .put("oldHead", "refs/heads/master")
+ .put("newHead", REF)
+ .put("type", "project-head-updated")
+ .put("eventCreatedOn", TS1)
+ .build());
+ }
+
private Supplier<AccountAttribute> newAccount(String name) {
AccountAttribute account = new AccountAttribute();
account.name = name;
diff --git a/polygerrit-ui/app/api/rest-api.ts b/polygerrit-ui/app/api/rest-api.ts
index 72712ff..685151b 100644
--- a/polygerrit-ui/app/api/rest-api.ts
+++ b/polygerrit-ui/app/api/rest-api.ts
@@ -130,7 +130,7 @@
export enum InheritedBooleanInfoConfiguredValue {
TRUE = 'TRUE',
FALSE = 'FALSE',
- INHERITED = 'INHERITED',
+ INHERIT = 'INHERIT',
}
/**
diff --git a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts
index 9b01735..4ef307d 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts
+++ b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts
@@ -272,7 +272,7 @@
return true;
case InheritedBooleanInfoConfiguredValue.FALSE:
return false;
- case InheritedBooleanInfoConfiguredValue.INHERITED:
+ case InheritedBooleanInfoConfiguredValue.INHERIT:
return !!config.inherited_value;
default:
return false;
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
index 6ec815c..0d52e79 100644
--- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
@@ -821,30 +821,6 @@
return html`
<div>
<table>
- <tr ?hidden=${!this.showChecksSummary}>
- <td class="key">Checks</td>
- <td class="value">
- <div class="checksSummary">
- ${this.renderChecksZeroState()}${this.renderChecksChipForCategory(
- Category.ERROR
- )}${this.renderChecksChipForCategory(
- Category.WARNING
- )}${this.renderChecksChipForCategory(
- Category.INFO
- )}${this.renderChecksChipForCategory(
- Category.SUCCESS
- )}${hasNonRunningChip && hasRunningChip
- ? html`<br />`
- : ''}${this.renderChecksChipRunning()}
- <span
- class="loadingSpin"
- ?hidden=${!this.someProvidersAreLoading}
- ></span>
- ${this.renderErrorMessages()} ${this.renderChecksLogin()}
- ${this.renderSummaryMessage()} ${this.renderActions()}
- </div>
- </td>
- </tr>
<tr>
<td class="key">Comments</td>
<td class="value">
@@ -884,6 +860,30 @@
>
</td>
</tr>
+ <tr ?hidden=${!this.showChecksSummary}>
+ <td class="key">Checks</td>
+ <td class="value">
+ <div class="checksSummary">
+ ${this.renderChecksZeroState()}${this.renderChecksChipForCategory(
+ Category.ERROR
+ )}${this.renderChecksChipForCategory(
+ Category.WARNING
+ )}${this.renderChecksChipForCategory(
+ Category.INFO
+ )}${this.renderChecksChipForCategory(
+ Category.SUCCESS
+ )}${hasNonRunningChip && hasRunningChip
+ ? html`<br />`
+ : ''}${this.renderChecksChipRunning()}
+ <span
+ class="loadingSpin"
+ ?hidden=${!this.someProvidersAreLoading}
+ ></span>
+ ${this.renderErrorMessages()} ${this.renderChecksLogin()}
+ ${this.renderSummaryMessage()} ${this.renderActions()}
+ </div>
+ </td>
+ </tr>
<tr hidden>
<td class="key">Findings</td>
<td class="value"></td>
diff --git a/polygerrit-ui/app/embed/diff/gr-diff-builder/gr-diff-builder-element.ts b/polygerrit-ui/app/embed/diff/gr-diff-builder/gr-diff-builder-element.ts
index d2704ac..25d3398 100644
--- a/polygerrit-ui/app/embed/diff/gr-diff-builder/gr-diff-builder-element.ts
+++ b/polygerrit-ui/app/embed/diff/gr-diff-builder/gr-diff-builder-element.ts
@@ -208,29 +208,30 @@
const isBinary = !!(this.isImageDiff || this.diff.binary);
this.fireDiffEvent('render-start');
+ // TODO: processor.process() returns a cancelable promise already.
+ // Why wrap another one around it?
this.cancelableRenderPromise = makeCancelable(
- this.processor
- .process(this.diff.content, isBinary)
- .then(() => {
- if (this.isImageDiff) {
- (this.builder as GrDiffBuilderImage).renderDiff();
- }
- return this.untilGroupsRendered();
- })
- .then(() => {
- this.fireDiffEvent('render-content');
- })
- // Mocha testing does not like uncaught rejections, so we catch
- // the cancels which are expected and should not throw errors in
- // tests.
- .catch(e => {
- if (!e.isCanceled) return Promise.reject(e);
- return;
- })
- .finally(() => {
- this.cancelableRenderPromise = null;
- })
+ this.processor.process(this.diff.content, isBinary)
);
+ // All then/catch/finally clauses must be outside of makeCancelable().
+ this.cancelableRenderPromise
+ .then(async () => {
+ if (this.isImageDiff) {
+ (this.builder as GrDiffBuilderImage).renderDiff();
+ }
+ await this.untilGroupsRendered();
+ this.fireDiffEvent('render-content');
+ })
+ // Mocha testing does not like uncaught rejections, so we catch
+ // the cancels which are expected and should not throw errors in
+ // tests.
+ .catch(e => {
+ if (!e.isCanceled) return Promise.reject(e);
+ return;
+ })
+ .finally(() => {
+ this.cancelableRenderPromise = null;
+ });
}
// visible for testing
diff --git a/polygerrit-ui/app/embed/diff/gr-diff-processor/gr-diff-processor.ts b/polygerrit-ui/app/embed/diff/gr-diff-processor/gr-diff-processor.ts
index 616a36f..cc44f50 100644
--- a/polygerrit-ui/app/embed/diff/gr-diff-processor/gr-diff-processor.ts
+++ b/polygerrit-ui/app/embed/diff/gr-diff-processor/gr-diff-processor.ts
@@ -138,6 +138,12 @@
return Promise.resolve();
}
+ // TODO: Canceling this promise does not help much. `nextStep` will continue
+ // to be scheduled anyway. So either just remove the cancelable promise, so
+ // future programmers are not fooled about this promise can do. Or fix the
+ // scheduling of `nextStep` such that cancellation is taken into account.
+ // The easiest approach is likely to just not re-use the processor for
+ // multiple processing passes. There is no benefit from doing so.
this.processPromise = makeCancelable(
new Promise(resolve => {
const state = {
diff --git a/polygerrit-ui/app/embed/diff/gr-diff/gr-diff_html.ts b/polygerrit-ui/app/embed/diff/gr-diff/gr-diff_html.ts
index 40d4e7f..a1082f9 100644
--- a/polygerrit-ui/app/embed/diff/gr-diff/gr-diff_html.ts
+++ b/polygerrit-ui/app/embed/diff/gr-diff/gr-diff_html.ts
@@ -349,7 +349,7 @@
background-color: var(--dark-rebased-remove-highlight-color);
}
.dueToRebase .content.remove .contentText {
- background-color: var(--light-remove-add-highlight-color);
+ background-color: var(--light-rebased-remove-highlight-color);
}
/* dueToMove */
diff --git a/polygerrit-ui/app/styles/themes/app-theme.ts b/polygerrit-ui/app/styles/themes/app-theme.ts
index dc17ee6..97e0c01 100644
--- a/polygerrit-ui/app/styles/themes/app-theme.ts
+++ b/polygerrit-ui/app/styles/themes/app-theme.ts
@@ -372,9 +372,20 @@
/* diff colors */
--dark-add-highlight-color: #aaf2aa;
- --dark-rebased-add-highlight-color: #d7d7f9;
- --dark-rebased-remove-highlight-color: #f7e8b7;
+ --light-add-highlight-color: #d8fed8;
--dark-remove-highlight-color: #ffcdd2;
+ --light-remove-highlight-color: #ffebee;
+
+ --dark-rebased-add-highlight-color: #d7d7f9;
+ --light-rebased-add-highlight-color: #eef;
+ --dark-rebased-remove-highlight-color: #f7e8b7;
+ --light-rebased-remove-highlight-color: #fff8dc;
+
+ --diff-moved-in-background: var(--cyan-50);
+ --diff-moved-in-label-color: var(--cyan-900);
+ --diff-moved-out-background: var(--purple-50);
+ --diff-moved-out-label-color: var(--purple-900);
+
--diff-blank-background-color: var(--background-color-secondary);
--diff-context-control-background-color: #fff7d4;
--diff-context-control-border-color: #f6e6a5;
@@ -385,14 +396,6 @@
--diff-tab-indicator-color: var(--deemphasized-text-color);
--diff-trailing-whitespace-indicator: #ff9ad2;
--focused-line-outline-color: var(--blue-700);
- --light-add-highlight-color: #d8fed8;
- --light-rebased-add-highlight-color: #eef;
- --diff-moved-in-background: var(--cyan-50);
- --diff-moved-out-background: var(--purple-50);
- --diff-moved-in-label-color: var(--cyan-900);
- --diff-moved-out-label-color: var(--purple-900);
- --light-remove-add-highlight-color: #fff8dc;
- --light-remove-highlight-color: #ffebee;
--coverage-covered: #e0f2f1;
--coverage-not-covered: #ffd1a4;
--ranged-comment-hint-text-color: var(--orange-900);
diff --git a/polygerrit-ui/app/styles/themes/dark-theme.ts b/polygerrit-ui/app/styles/themes/dark-theme.ts
index 6f19924..17c967d 100644
--- a/polygerrit-ui/app/styles/themes/dark-theme.ts
+++ b/polygerrit-ui/app/styles/themes/dark-theme.ts
@@ -207,9 +207,20 @@
/* diff colors */
--dark-add-highlight-color: var(--green-tonal);
- --dark-rebased-add-highlight-color: rgba(11, 255, 155, 0.15);
- --dark-rebased-remove-highlight-color: rgba(255, 139, 6, 0.15);
+ --light-add-highlight-color: #182b1f;
--dark-remove-highlight-color: #62110f;
+ --light-remove-highlight-color: #320404;
+
+ --dark-rebased-add-highlight-color: rgba(11, 255, 155, 0.15);
+ --light-rebased-add-highlight-color: #487165;
+ --dark-rebased-remove-highlight-color: rgba(255, 139, 6, 0.15);
+ --light-rebased-remove-highlight-color: #2f3f2f;
+
+ --diff-moved-in-background: #1d4042;
+ --diff-moved-in-label-color: var(--cyan-50);
+ --diff-moved-out-background: #230e34;
+ --diff-moved-out-label-color: var(--purple-50);
+
--diff-blank-background-color: var(--background-color-secondary);
--diff-context-control-background-color: #333311;
--diff-context-control-border-color: var(--border-color);
@@ -220,14 +231,6 @@
--diff-tab-indicator-color: var(--deemphasized-text-color);
--diff-trailing-whitespace-indicator: #ff9ad2;
--focused-line-outline-color: var(--blue-200);
- --light-add-highlight-color: #182b1f;
- --light-rebased-add-highlight-color: #487165;
- --diff-moved-in-background: #1d4042;
- --diff-moved-out-background: #230e34;
- --diff-moved-in-label-color: var(--cyan-50);
- --diff-moved-out-label-color: var(--purple-50);
- --light-remove-add-highlight-color: #2f3f2f;
- --light-remove-highlight-color: #320404;
--coverage-covered: #112826;
--coverage-not-covered: #6b3600;
--ranged-comment-hint-text-color: var(--blue-50);