Merge "Track latency of loading a single account config"
diff --git a/java/com/google/gerrit/server/git/MergeUtil.java b/java/com/google/gerrit/server/git/MergeUtil.java
index 801300e..18394b5 100644
--- a/java/com/google/gerrit/server/git/MergeUtil.java
+++ b/java/com/google/gerrit/server/git/MergeUtil.java
@@ -462,7 +462,7 @@
}
public static String createConflictMessage(List<String> conflicts) {
- StringBuilder sb = new StringBuilder("merge conflict(s)");
+ StringBuilder sb = new StringBuilder("merge conflict(s):");
for (String c : conflicts) {
sb.append('\n').append(c);
}
diff --git a/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java b/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java
index 06478ac..cfb4c77 100644
--- a/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java
+++ b/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java
@@ -21,6 +21,7 @@
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.entities.Project;
+import com.google.gerrit.exceptions.InvalidMergeStrategyException;
import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.MergeInput;
@@ -192,6 +193,8 @@
ChangeJson json = jsonFactory.create(ListChangesOption.CURRENT_REVISION);
return Response.ok(json.format(psInserter.getChange()));
+ } catch (InvalidMergeStrategyException e) {
+ throw new BadRequestException(e.getMessage());
}
}
diff --git a/java/com/google/gerrit/server/schema/NoteDbSchemaVersions.java b/java/com/google/gerrit/server/schema/NoteDbSchemaVersions.java
index 02250f2..b450a4b 100644
--- a/java/com/google/gerrit/server/schema/NoteDbSchemaVersions.java
+++ b/java/com/google/gerrit/server/schema/NoteDbSchemaVersions.java
@@ -28,7 +28,7 @@
public class NoteDbSchemaVersions {
static final ImmutableSortedMap<Integer, Class<? extends NoteDbSchemaVersion>> ALL =
// List all supported NoteDb schema versions here.
- Stream.of(Schema_180.class, Schema_181.class)
+ Stream.of(Schema_180.class, Schema_181.class, Schema_182.class)
.collect(toImmutableSortedMap(naturalOrder(), v -> guessVersion(v).get(), v -> v));
public static final int FIRST = ALL.firstKey();
diff --git a/java/com/google/gerrit/server/schema/Schema_182.java b/java/com/google/gerrit/server/schema/Schema_182.java
new file mode 100644
index 0000000..3928b2b
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_182.java
@@ -0,0 +1,34 @@
+// Copyright (C) 2020 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.schema;
+
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.DeleteZombieCommentsRefs;
+
+/**
+ * Schema 182 for Gerrit metadata.
+ *
+ * <p>Upgrading to this schema version cleans the zombie draft comment refs in NoteDb
+ */
+public class Schema_182 implements NoteDbSchemaVersion {
+ @Override
+ public void upgrade(Arguments args, UpdateUI ui) throws Exception {
+ AllUsersName allUsers = args.allUsers;
+ GitRepositoryManager gitRepoManager = args.repoManager;
+ DeleteZombieCommentsRefs cleanup = new DeleteZombieCommentsRefs(allUsers, gitRepoManager, 100);
+ cleanup.execute();
+ }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
index d5686d1..c889984 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -3184,20 +3184,19 @@
@Test
public void createMergePatchSet() throws Exception {
- PushOneCommit.Result start = pushTo("refs/heads/master");
- start.assertOkStatus();
- // create a change for master
- PushOneCommit.Result r = createChange();
- r.assertOkStatus();
- String changeId = r.getChangeId();
+ RevCommit initialHead = projectOperations.project(project).getHead("master");
+ createBranch("dev");
- testRepo.reset(start.getCommit());
+ // create a change for master
+ String changeId = createChange().getChangeId();
+
+ testRepo.reset(initialHead);
PushOneCommit.Result currentMaster = pushTo("refs/heads/master");
currentMaster.assertOkStatus();
String parent = currentMaster.getCommit().getName();
// push a commit into dev branch
- createBranch("dev");
+ testRepo.reset(initialHead);
PushOneCommit.Result changeA =
pushFactory
.create(user.newIdent(), testRepo, "change A", "A.txt", "A content")
@@ -3218,22 +3217,57 @@
}
@Test
+ public void createMergePatchSet_Conflict() throws Exception {
+ RevCommit initialHead = projectOperations.project(project).getHead("master");
+ createBranch("dev");
+
+ // create a change for master
+ String changeId = createChange().getChangeId();
+
+ String fileName = "shared.txt";
+ testRepo.reset(initialHead);
+ PushOneCommit.Result currentMaster =
+ pushFactory
+ .create(admin.newIdent(), testRepo, "change 1", fileName, "content 1")
+ .to("refs/heads/master");
+ currentMaster.assertOkStatus();
+
+ // push a commit into dev branch
+ testRepo.reset(initialHead);
+ PushOneCommit.Result changeA =
+ pushFactory
+ .create(user.newIdent(), testRepo, "change 2", fileName, "content 2")
+ .to("refs/heads/dev");
+ changeA.assertOkStatus();
+ MergeInput mergeInput = new MergeInput();
+ mergeInput.source = "dev";
+ MergePatchSetInput in = new MergePatchSetInput();
+ in.merge = mergeInput;
+ in.subject = "update change by merge ps2";
+ ResourceConflictException thrown =
+ assertThrows(
+ ResourceConflictException.class,
+ () -> gApi.changes().id(changeId).createMergePatchSet(in));
+ assertThat(thrown).hasMessageThat().isEqualTo("merge conflict(s):\n" + fileName);
+ }
+
+ @Test
public void createMergePatchSetInheritParent() throws Exception {
- PushOneCommit.Result start = pushTo("refs/heads/master");
- start.assertOkStatus();
+ RevCommit initialHead = projectOperations.project(project).getHead("master");
+ createBranch("dev");
+
// create a change for master
PushOneCommit.Result r = createChange();
- r.assertOkStatus();
String changeId = r.getChangeId();
String parent = r.getCommit().getParent(0).getName();
// advance master branch
- testRepo.reset(start.getCommit());
+ testRepo.reset(initialHead);
PushOneCommit.Result currentMaster = pushTo("refs/heads/master");
currentMaster.assertOkStatus();
// push a commit into dev branch
- createBranch("dev");
+ testRepo.reset(initialHead);
PushOneCommit.Result changeA =
pushFactory
.create(user.newIdent(), testRepo, "change A", "A.txt", "A content")
@@ -3315,6 +3349,46 @@
.isEqualTo(expectedParent);
}
+ @Test
+ public void createMergePatchSetWithUnupportedMergeStrategy() throws Exception {
+ RevCommit initialHead = projectOperations.project(project).getHead("master");
+ createBranch("dev");
+
+ // create a change for master
+ String changeId = createChange().getChangeId();
+
+ String fileName = "shared.txt";
+ String sourceSubject = "source change";
+ String sourceContent = "source content";
+ String targetSubject = "target change";
+ String targetContent = "target content";
+ testRepo.reset(initialHead);
+ PushOneCommit.Result currentMaster =
+ pushFactory
+ .create(admin.newIdent(), testRepo, targetSubject, fileName, targetContent)
+ .to("refs/heads/master");
+ currentMaster.assertOkStatus();
+
+ // push a commit into dev branch
+ testRepo.reset(initialHead);
+ PushOneCommit.Result changeA =
+ pushFactory
+ .create(user.newIdent(), testRepo, sourceSubject, fileName, sourceContent)
+ .to("refs/heads/dev");
+ changeA.assertOkStatus();
+ MergeInput mergeInput = new MergeInput();
+ mergeInput.source = "dev";
+ mergeInput.strategy = "unsupported-strategy";
+ MergePatchSetInput in = new MergePatchSetInput();
+ in.merge = mergeInput;
+ in.subject = "update change by merge ps2";
+
+ BadRequestException ex =
+ assertThrows(
+ BadRequestException.class, () -> gApi.changes().id(changeId).createMergePatchSet(in));
+ assertThat(ex).hasMessageThat().isEqualTo("invalid merge strategy: " + mergeInput.strategy);
+ }
+
private MergePatchSetInput createMergePatchSetInput(String baseChange) {
MergeInput mergeInput = new MergeInput();
mergeInput.source = "foo";
diff --git a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html
index d9786c1..52c0c89 100644
--- a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html
+++ b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html
@@ -54,9 +54,9 @@
@media screen and (max-width: 50em) {
.container {
flex-direction: column;
- margin: 0 0 var(--spacing-m) var(--spacing-m);
}
.lineNum {
+ margin-right: 0;
min-width: initial;
text-align: left;
}
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.html b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
index 5dbc1b8..e77bf57 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.html
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
@@ -110,20 +110,24 @@
}
.expanded .author {
cursor: pointer;
- margin-bottom: var(--spacing-s);
+ margin-bottom: var(--spacing-m);
}
.expanded .content {
padding-left: 40px;
}
.dateContainer {
position: absolute;
+ /* right and top values should match .contentContainer padding */
right: var(--spacing-l);
- top: 10px;
+ top: var(--spacing-m);
}
.dateContainer .patchset {
margin-right: var(--spacing-m);
color: var(--deemphasized-text-color);
}
+ .dateContainer .patchset:before {
+ content: 'Patchset ';
+ }
span.date {
color: var(--deemphasized-text-color);
}
@@ -169,6 +173,19 @@
font-weight: var(--font-weight-bold);
};
}
+ @media screen and (max-width: 50em) {
+ .expanded .content {
+ padding-left: 0;
+ }
+ .score,
+ .commentsSummary,
+ .authorLabel {
+ min-width: 0px;
+ }
+ .dateContainer .patchset:before {
+ content: 'PS ';
+ }
+ }
</style>
<div class$="[[_computeClass(_expanded)]]">
<div class="contentContainer">
@@ -227,7 +244,7 @@
</template>
<span class="dateContainer">
<template is="dom-if" if="[[message._revision_number]]">
- <span class="patchset">Patchset [[message._revision_number]]</span>
+ <span class="patchset">[[message._revision_number]]</span>
</template>
<template is="dom-if" if="[[!message.id]]">
<span class="date">
@@ -249,7 +266,7 @@
id="expandToggle"
on-click="_toggleExpanded"
title="Toggle expanded state"
- icon="[[_computeExpandToggleIcon(_expanded)]]">
+ icon="[[_computeExpandToggleIcon(_expanded)]]"></iron-icon>
</span>
</div>
</div>
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js
index 2c47dc1..cd759d3 100644
--- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js
+++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js
@@ -359,6 +359,16 @@
_processedMessagesChanged(messages) {
if (messages) {
this._visibleMessages = messages.slice(-MAX_INITIAL_SHOWN_MESSAGES);
+
+ if (messages.length === 0) return;
+ const tags = messages.map(message => message.tag || message.type ||
+ (message.comments ? 'comments' : 'none'));
+ const tagsCounted = tags.reduce((acc, val) => {
+ acc[val] = (acc[val] || 0) + 1;
+ return acc;
+ }, {all: messages.length});
+ this.$.reporting.reportInteraction('messages-count',
+ JSON.stringify(tagsCounted));
}
}