Merge "Apply the match operator to filter projects" into stable-3.4
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index eee3d3e..725920e 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -3924,7 +3924,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/java/com/google/gerrit/index/query/QueryProcessor.java b/java/com/google/gerrit/index/query/QueryProcessor.java
index c05516b..1251259 100644
--- a/java/com/google/gerrit/index/query/QueryProcessor.java
+++ b/java/com/google/gerrit/index/query/QueryProcessor.java
@@ -56,6 +56,7 @@
*/
public abstract class QueryProcessor<T> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+ private static final int MAX_LIMIT_BUFFER_MULTIPLIER = 100;
protected static class Metrics {
final Timer1<String> executionTime;
@@ -356,7 +357,7 @@
private int getEffectiveLimit(Predicate<T> p) {
if (isNoLimit == true) {
- return Integer.MAX_VALUE;
+ return getIndexSize() + MAX_LIMIT_BUFFER_MULTIPLIER * getBatchSize();
}
List<Integer> possibleLimits = new ArrayList<>(4);
possibleLimits.add(getBackendSupportedLimit());
@@ -384,4 +385,8 @@
}
protected abstract String formatForLogging(T t);
+
+ protected abstract int getIndexSize();
+
+ protected abstract int getBatchSize();
}
diff --git a/java/com/google/gerrit/server/events/EventFactory.java b/java/com/google/gerrit/server/events/EventFactory.java
index b648255..addeb59 100644
--- a/java/com/google/gerrit/server/events/EventFactory.java
+++ b/java/com/google/gerrit/server/events/EventFactory.java
@@ -124,12 +124,6 @@
a.id = change.getKey().get();
a.number = change.getId().get();
a.subject = change.getSubject();
- try {
- a.commitMessage = changeDataFactory.create(change).commitMessage();
- } catch (Exception e) {
- logger.atSevere().withCause(e).log(
- "Error while getting full commit message for change %d", a.number);
- }
a.url = getChangeUrl(change);
a.owner = asAccountAttribute(change.getOwner());
a.assignee = asAccountAttribute(change.getAssignee());
@@ -147,11 +141,8 @@
/** Create a {@link ChangeAttribute} instance from the specified change. */
public ChangeAttribute asChangeAttribute(Change change, ChangeNotes notes) {
ChangeAttribute a = asChangeAttribute(change);
- Set<String> hashtags = notes.load().getHashtags();
- if (!hashtags.isEmpty()) {
- a.hashtags = new ArrayList<>(hashtags.size());
- a.hashtags.addAll(hashtags);
- }
+ addHashTags(a, notes);
+ addCommitMessage(a, notes);
return a;
}
/**
@@ -347,6 +338,15 @@
a.commitMessage = commitMessage;
}
+ private void addCommitMessage(ChangeAttribute changeAttribute, ChangeNotes notes) {
+ try {
+ addCommitMessage(changeAttribute, changeDataFactory.create(notes).commitMessage());
+ } catch (Exception e) {
+ logger.atSevere().withCause(e).log(
+ "Error while getting full commit message for change %d", changeAttribute.number);
+ }
+ }
+
public void addPatchSets(
RevWalk revWalk,
ChangeAttribute ca,
@@ -563,4 +563,12 @@
}
return null;
}
+
+ private void addHashTags(ChangeAttribute changeAttribute, ChangeNotes notes) {
+ Set<String> hashtags = notes.load().getHashtags();
+ if (!hashtags.isEmpty()) {
+ changeAttribute.hashtags = new ArrayList<>(hashtags.size());
+ changeAttribute.hashtags.addAll(hashtags);
+ }
+ }
}
diff --git a/java/com/google/gerrit/server/notedb/RepoSequence.java b/java/com/google/gerrit/server/notedb/RepoSequence.java
index 47e12ff..d743921 100644
--- a/java/com/google/gerrit/server/notedb/RepoSequence.java
+++ b/java/com/google/gerrit/server/notedb/RepoSequence.java
@@ -340,4 +340,16 @@
counterLock.unlock();
}
}
+
+ /**
+ * Retrieves the last returned sequence number.
+ *
+ * <p>Explicitly calls {@link #next()} if this instance didn't return sequence number until now.
+ */
+ public int last() {
+ if (counter == 0) {
+ next();
+ }
+ return counter - 1;
+ }
}
diff --git a/java/com/google/gerrit/server/notedb/Sequences.java b/java/com/google/gerrit/server/notedb/Sequences.java
index 7a8e28f..e44d031 100644
--- a/java/com/google/gerrit/server/notedb/Sequences.java
+++ b/java/com/google/gerrit/server/notedb/Sequences.java
@@ -55,6 +55,9 @@
private final RepoSequence changeSeq;
private final RepoSequence groupSeq;
private final Timer2<SequenceType, Boolean> nextIdLatency;
+ private final int accountBatchSize;
+ private final int changeBatchSize;
+ private final int groupBatchSize = 1;
@Inject
public Sequences(
@@ -65,7 +68,7 @@
AllUsersName allUsers,
MetricMaker metrics) {
- int accountBatchSize =
+ accountBatchSize =
cfg.getInt(
SECTION_NOTEDB,
NAME_ACCOUNTS,
@@ -80,7 +83,7 @@
() -> FIRST_ACCOUNT_ID,
accountBatchSize);
- int changeBatchSize =
+ changeBatchSize =
cfg.getInt(
SECTION_NOTEDB,
NAME_CHANGES,
@@ -95,7 +98,6 @@
() -> FIRST_CHANGE_ID,
changeBatchSize);
- int groupBatchSize = 1;
groupSeq =
new RepoSequence(
repoManager,
@@ -144,6 +146,18 @@
}
}
+ public int changeBatchSize() {
+ return changeBatchSize;
+ }
+
+ public int groupBatchSize() {
+ return groupBatchSize;
+ }
+
+ public int accountBatchSize() {
+ return accountBatchSize;
+ }
+
public int currentChangeId() {
return changeSeq.current();
}
@@ -156,6 +170,18 @@
return groupSeq.current();
}
+ public int lastChangeId() {
+ return changeSeq.last();
+ }
+
+ public int lastGroupId() {
+ return groupSeq.last();
+ }
+
+ public int lastAccountId() {
+ return accountSeq.last();
+ }
+
public void setChangeIdValue(int value) {
changeSeq.storeNew(value);
}
diff --git a/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java b/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java
index 2e29bbd..e380ef1 100644
--- a/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java
+++ b/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java
@@ -30,6 +30,7 @@
import com.google.gerrit.server.index.account.AccountIndexCollection;
import com.google.gerrit.server.index.account.AccountIndexRewriter;
import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
+import com.google.gerrit.server.notedb.Sequences;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -41,6 +42,7 @@
*/
public class AccountQueryProcessor extends QueryProcessor<AccountState> {
private final AccountControl.Factory accountControlFactory;
+ private final Sequences sequences;
static {
// It is assumed that basic rewrites do not touch visibleto predicates.
@@ -57,7 +59,8 @@
IndexConfig indexConfig,
AccountIndexCollection indexes,
AccountIndexRewriter rewriter,
- AccountControl.Factory accountControlFactory) {
+ AccountControl.Factory accountControlFactory,
+ Sequences sequences) {
super(
metricMaker,
AccountSchemaDefinitions.INSTANCE,
@@ -67,6 +70,7 @@
FIELD_LIMIT,
() -> limitsFactory.create(userProvider.get()).getQueryLimit());
this.accountControlFactory = accountControlFactory;
+ this.sequences = sequences;
}
@Override
@@ -79,4 +83,14 @@
protected String formatForLogging(AccountState accountState) {
return accountState.account().id().toString();
}
+
+ @Override
+ protected int getIndexSize() {
+ return sequences.lastAccountId();
+ }
+
+ @Override
+ protected int getBatchSize() {
+ return sequences.accountBatchSize();
+ }
}
diff --git a/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java b/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java
index ed1f2f1..7d02ecd 100644
--- a/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java
+++ b/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java
@@ -39,6 +39,7 @@
import com.google.gerrit.server.index.change.ChangeIndexRewriter;
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
import com.google.gerrit.server.index.change.IndexedChangeQuery;
+import com.google.gerrit.server.notedb.Sequences;
import com.google.inject.Inject;
import com.google.inject.Provider;
import java.util.ArrayList;
@@ -61,6 +62,7 @@
private final Map<String, DynamicBean> dynamicBeans = new HashMap<>();
private final List<Extension<ChangePluginDefinedInfoFactory>>
changePluginDefinedInfoFactoriesByPlugin = new ArrayList<>();
+ private final Sequences sequences;
static {
// It is assumed that basic rewrites do not touch visibleto predicates.
@@ -77,6 +79,7 @@
IndexConfig indexConfig,
ChangeIndexCollection indexes,
ChangeIndexRewriter rewriter,
+ Sequences sequences,
ChangeIsVisibleToPredicate.Factory changeIsVisibleToPredicateFactory,
DynamicSet<ChangePluginDefinedInfoFactory> changePluginDefinedInfoFactories) {
super(
@@ -89,6 +92,7 @@
() -> limitsFactory.create(userProvider.get()).getQueryLimit());
this.userProvider = userProvider;
this.changeIsVisibleToPredicateFactory = changeIsVisibleToPredicateFactory;
+ this.sequences = sequences;
changePluginDefinedInfoFactories
.entries()
@@ -138,4 +142,14 @@
protected String formatForLogging(ChangeData changeData) {
return changeData.getId().toString();
}
+
+ @Override
+ protected int getIndexSize() {
+ return sequences.lastChangeId();
+ }
+
+ @Override
+ protected int getBatchSize() {
+ return sequences.changeBatchSize();
+ }
}
diff --git a/java/com/google/gerrit/server/query/change/OutputStreamQuery.java b/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
index 1b6dc62..cf53a1b 100644
--- a/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
+++ b/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
@@ -18,6 +18,7 @@
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Lists;
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.LabelTypes;
@@ -28,6 +29,7 @@
import com.google.gerrit.index.query.QueryParseException;
import com.google.gerrit.index.query.QueryResult;
import com.google.gerrit.server.DynamicOptions;
+import com.google.gerrit.server.cache.PerThreadCache;
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.data.ChangeAttribute;
import com.google.gerrit.server.data.PatchSetAttribute;
@@ -205,7 +207,7 @@
return;
}
- try {
+ try (PerThreadCache ignored = PerThreadCache.create()) {
final QueryStatsAttribute stats = new QueryStatsAttribute();
stats.runTimeMilliseconds = TimeUtil.nowMs();
@@ -250,7 +252,8 @@
ChangeData d, Map<Project.NameKey, Repository> repos, Map<Project.NameKey, RevWalk> revWalks)
throws IOException {
LabelTypes labelTypes = d.getLabelTypes();
- ChangeAttribute c = eventFactory.asChangeAttribute(d.change(), d.notes());
+ ChangeAttribute c = eventFactory.asChangeAttribute(d.change());
+ c.hashtags = Lists.newArrayList(d.hashtags());
eventFactory.extend(c, d.change());
if (!trackingFooters.isEmpty()) {
diff --git a/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java b/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java
index 9e56807..e5fb036 100644
--- a/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java
+++ b/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java
@@ -30,6 +30,7 @@
import com.google.gerrit.server.index.group.GroupIndexCollection;
import com.google.gerrit.server.index.group.GroupIndexRewriter;
import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
+import com.google.gerrit.server.notedb.Sequences;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -42,6 +43,7 @@
public class GroupQueryProcessor extends QueryProcessor<InternalGroup> {
private final Provider<CurrentUser> userProvider;
private final GroupControl.GenericFactory groupControlFactory;
+ private final Sequences sequences;
static {
// It is assumed that basic rewrites do not touch visibleto predicates.
@@ -58,7 +60,8 @@
IndexConfig indexConfig,
GroupIndexCollection indexes,
GroupIndexRewriter rewriter,
- GroupControl.GenericFactory groupControlFactory) {
+ GroupControl.GenericFactory groupControlFactory,
+ Sequences sequences) {
super(
metricMaker,
GroupSchemaDefinitions.INSTANCE,
@@ -69,6 +72,7 @@
() -> limitsFactory.create(userProvider.get()).getQueryLimit());
this.userProvider = userProvider;
this.groupControlFactory = groupControlFactory;
+ this.sequences = sequences;
}
@Override
@@ -81,4 +85,14 @@
protected String formatForLogging(InternalGroup internalGroup) {
return internalGroup.getGroupUUID().get();
}
+
+ @Override
+ protected int getIndexSize() {
+ return sequences.lastGroupId();
+ }
+
+ @Override
+ protected int getBatchSize() {
+ return sequences.groupBatchSize();
+ }
}
diff --git a/java/com/google/gerrit/server/query/project/ProjectQueryProcessor.java b/java/com/google/gerrit/server/query/project/ProjectQueryProcessor.java
index 8e6d8a1..5465d6d 100644
--- a/java/com/google/gerrit/server/query/project/ProjectQueryProcessor.java
+++ b/java/com/google/gerrit/server/query/project/ProjectQueryProcessor.java
@@ -30,6 +30,7 @@
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.account.AccountLimits;
import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectCache;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -44,6 +45,7 @@
public class ProjectQueryProcessor extends QueryProcessor<ProjectData> {
private final PermissionBackend permissionBackend;
private final Provider<CurrentUser> userProvider;
+ private final ProjectCache projectCache;
static {
// It is assumed that basic rewrites do not touch visibleto predicates.
@@ -60,7 +62,8 @@
IndexConfig indexConfig,
ProjectIndexCollection indexes,
ProjectIndexRewriter rewriter,
- PermissionBackend permissionBackend) {
+ PermissionBackend permissionBackend,
+ ProjectCache projectCache) {
super(
metricMaker,
ProjectSchemaDefinitions.INSTANCE,
@@ -71,6 +74,7 @@
() -> limitsFactory.create(userProvider.get()).getQueryLimit());
this.permissionBackend = permissionBackend;
this.userProvider = userProvider;
+ this.projectCache = projectCache;
}
@Override
@@ -83,4 +87,14 @@
protected String formatForLogging(ProjectData projectData) {
return projectData.getProject().getName();
}
+
+ @Override
+ protected int getIndexSize() {
+ return projectCache.all().size();
+ }
+
+ @Override
+ protected int getBatchSize() {
+ return 1;
+ }
}
diff --git a/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java b/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java
index a768eaf..0c9f731 100644
--- a/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java
+++ b/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java
@@ -91,27 +91,37 @@
assertThat(s.acquireCount).isEqualTo(0);
assertThat(s.next()).isEqualTo(1);
+ assertThat(s.last()).isEqualTo(1);
assertThat(s.acquireCount).isEqualTo(1);
assertThat(s.next()).isEqualTo(2);
+ assertThat(s.last()).isEqualTo(2);
assertThat(s.acquireCount).isEqualTo(1);
assertThat(s.next()).isEqualTo(3);
+ assertThat(s.last()).isEqualTo(3);
assertThat(s.acquireCount).isEqualTo(1);
assertThat(s.next()).isEqualTo(4);
+ assertThat(s.last()).isEqualTo(4);
assertThat(s.acquireCount).isEqualTo(2);
assertThat(s.next()).isEqualTo(5);
+ assertThat(s.last()).isEqualTo(5);
assertThat(s.acquireCount).isEqualTo(2);
assertThat(s.next()).isEqualTo(6);
+ assertThat(s.last()).isEqualTo(6);
assertThat(s.acquireCount).isEqualTo(2);
assertThat(s.next()).isEqualTo(7);
+ assertThat(s.last()).isEqualTo(7);
assertThat(s.acquireCount).isEqualTo(3);
assertThat(s.next()).isEqualTo(8);
+ assertThat(s.last()).isEqualTo(8);
assertThat(s.acquireCount).isEqualTo(3);
assertThat(s.next()).isEqualTo(9);
+ assertThat(s.last()).isEqualTo(9);
assertThat(s.acquireCount).isEqualTo(3);
assertThat(s.next()).isEqualTo(10);
+ assertThat(s.last()).isEqualTo(10);
assertThat(s.acquireCount).isEqualTo(4);
}
@@ -127,6 +137,8 @@
assertThat(s2.next()).isEqualTo(5);
assertThat(s1.next()).isEqualTo(3);
assertThat(s2.next()).isEqualTo(6);
+ assertThat(s1.last()).isEqualTo(3);
+ assertThat(s2.last()).isEqualTo(6);
// s2 acquires 7-9; s1 acquires 10-12.
assertThat(s2.next()).isEqualTo(7);
@@ -135,6 +147,8 @@
assertThat(s1.next()).isEqualTo(11);
assertThat(s2.next()).isEqualTo(9);
assertThat(s1.next()).isEqualTo(12);
+ assertThat(s1.last()).isEqualTo(12);
+ assertThat(s2.last()).isEqualTo(9);
}
@Test
@@ -284,48 +298,61 @@
}
@Test
- public void nextWithCountOneCaller() throws Exception {
+ public void nextWithCountAndLastByOneCaller() throws Exception {
RepoSequence s = newSequence("id", 1, 3);
assertThat(s.next(2)).containsExactly(1, 2).inOrder();
assertThat(s.acquireCount).isEqualTo(1);
+ assertThat(s.last()).isEqualTo(2);
assertThat(s.next(2)).containsExactly(3, 4).inOrder();
assertThat(s.acquireCount).isEqualTo(2);
+ assertThat(s.last()).isEqualTo(4);
assertThat(s.next(2)).containsExactly(5, 6).inOrder();
assertThat(s.acquireCount).isEqualTo(2);
+ assertThat(s.last()).isEqualTo(6);
assertThat(s.next(3)).containsExactly(7, 8, 9).inOrder();
assertThat(s.acquireCount).isEqualTo(3);
+ assertThat(s.last()).isEqualTo(9);
assertThat(s.next(3)).containsExactly(10, 11, 12).inOrder();
assertThat(s.acquireCount).isEqualTo(4);
+ assertThat(s.last()).isEqualTo(12);
assertThat(s.next(3)).containsExactly(13, 14, 15).inOrder();
assertThat(s.acquireCount).isEqualTo(5);
+ assertThat(s.last()).isEqualTo(15);
assertThat(s.next(7)).containsExactly(16, 17, 18, 19, 20, 21, 22).inOrder();
assertThat(s.acquireCount).isEqualTo(6);
+ assertThat(s.last()).isEqualTo(22);
assertThat(s.next(7)).containsExactly(23, 24, 25, 26, 27, 28, 29).inOrder();
assertThat(s.acquireCount).isEqualTo(7);
+ assertThat(s.last()).isEqualTo(29);
assertThat(s.next(7)).containsExactly(30, 31, 32, 33, 34, 35, 36).inOrder();
assertThat(s.acquireCount).isEqualTo(8);
+ assertThat(s.last()).isEqualTo(36);
}
@Test
- public void nextWithCountMultipleCallers() throws Exception {
+ public void nextWithCountAndLastByMultipleCallers() throws Exception {
RepoSequence s1 = newSequence("id", 1, 3);
RepoSequence s2 = newSequence("id", 1, 4);
assertThat(s1.next(2)).containsExactly(1, 2).inOrder();
+ assertThat(s1.last()).isEqualTo(2);
assertThat(s1.acquireCount).isEqualTo(1);
// s1 hasn't exhausted its last batch.
assertThat(s2.next(2)).containsExactly(4, 5).inOrder();
+ assertThat(s2.last()).isEqualTo(5);
assertThat(s2.acquireCount).isEqualTo(1);
// s1 acquires again to cover this request, plus a whole new batch.
assertThat(s1.next(3)).containsExactly(3, 8, 9);
+ assertThat(s1.last()).isEqualTo(9);
assertThat(s1.acquireCount).isEqualTo(2);
// s2 hasn't exhausted its last batch, do so now.
assertThat(s2.next(2)).containsExactly(6, 7);
+ assertThat(s2.last()).isEqualTo(7);
assertThat(s2.acquireCount).isEqualTo(1);
}
diff --git a/polygerrit-ui/app/constants/constants.ts b/polygerrit-ui/app/constants/constants.ts
index be502f7..35a746f 100644
--- a/polygerrit-ui/app/constants/constants.ts
+++ b/polygerrit-ui/app/constants/constants.ts
@@ -211,7 +211,7 @@
export enum InheritedBooleanInfoConfiguredValue {
TRUE = 'TRUE',
FALSE = 'FALSE',
- INHERITED = 'INHERITED',
+ INHERIT = 'INHERIT',
}
export enum AccountTag {
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 f37e6a3..a47349d 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
@@ -193,7 +193,7 @@
return false;
} else if (
config &&
- config.configured_value === InheritedBooleanInfoConfiguredValue.INHERITED
+ config.configured_value === InheritedBooleanInfoConfiguredValue.INHERIT
) {
return !!(config && config.inherited_value);
} else {
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.ts b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.ts
index 6749ed1..f9f4471 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.ts
@@ -43,6 +43,7 @@
import {
ChangeStatus,
GpgKeyInfoStatus,
+ InheritedBooleanInfoConfiguredValue,
SubmitType,
} from '../../../constants/constants';
import {changeIsOpen} from '../../../utils/change-util';
@@ -53,6 +54,7 @@
BranchName,
CommitId,
CommitInfo,
+ ConfigInfo,
ElementPropertyDeepChange,
GpgKeyInfo,
Hashtag,
@@ -175,7 +177,8 @@
@property({
type: Object,
- computed: '_computePushCertificateValidation(serverConfig, change)',
+ computed:
+ '_computePushCertificateValidation(serverConfig, change, repoConfig)',
})
_pushCertificateValidation?: PushCertificateValidationInfo;
@@ -209,6 +212,9 @@
@property({type: Object})
queryTopic?: AutocompleteQuery;
+ @property({type: Object})
+ repoConfig?: ConfigInfo;
+
restApiService = appContext.restApiService;
private readonly reporting = appContext.reportingService;
@@ -407,10 +413,14 @@
*/
_computePushCertificateValidation(
serverConfig?: ServerInfo,
- change?: ParsedChangeInfo
+ change?: ParsedChangeInfo,
+ repoConfig?: ConfigInfo
): PushCertificateValidationInfo | undefined {
if (!change || !serverConfig?.receive?.enable_signed_push) return undefined;
+ if (!this.isEnabledSignedPushOnRepo(repoConfig)) {
+ return undefined;
+ }
const rev = change.revisions[change.current_revision];
if (!rev.push_certificate?.key) {
return {
@@ -454,6 +464,20 @@
}
}
+ // private but used in test
+ isEnabledSignedPushOnRepo(repoConfig?: ConfigInfo) {
+ if (!repoConfig?.enable_signed_push) return false;
+
+ const enableSignedPush = repoConfig.enable_signed_push;
+ return (
+ (enableSignedPush.configured_value ===
+ InheritedBooleanInfoConfiguredValue.INHERIT &&
+ enableSignedPush.inherited_value) ||
+ enableSignedPush.configured_value ===
+ InheritedBooleanInfoConfiguredValue.TRUE
+ );
+ }
+
_problems(msg: string, key: GpgKeyInfo) {
if (!key?.problems || key.problems.length === 0) {
return msg;
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts
index ab8e404..7d599b26 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts
@@ -36,12 +36,14 @@
createRevision,
createAccountDetailWithId,
createChangeConfig,
+ createConfig,
} from '../../../test/test-data-generators';
import {
ChangeStatus,
SubmitType,
RequirementStatus,
GpgKeyInfoStatus,
+ InheritedBooleanInfoConfiguredValue,
} from '../../../constants/constants';
import {
EmailAddress,
@@ -479,6 +481,13 @@
labels: {},
mergeable: true,
};
+ element.repoConfig = {
+ ...createConfig(),
+ enable_signed_push: {
+ configured_value: 'TRUE' as InheritedBooleanInfoConfiguredValue,
+ value: true,
+ },
+ };
});
test('Push Certificate Validation test BAD', () => {
@@ -491,7 +500,8 @@
};
const result = element._computePushCertificateValidation(
serverConfig,
- change
+ change,
+ element.repoConfig
);
assert.equal(
result?.message,
@@ -511,7 +521,8 @@
};
const result = element._computePushCertificateValidation(
serverConfig,
- change
+ change,
+ element.repoConfig
);
assert.equal(
result?.message,
@@ -525,7 +536,8 @@
change!.revisions.rev1! = createRevision(1);
const result = element._computePushCertificateValidation(
serverConfig,
- change
+ change,
+ element.repoConfig
);
assert.equal(
result?.message,
@@ -534,6 +546,41 @@
assert.equal(result?.icon, 'gr-icons:help');
assert.equal(result?.class, 'help');
});
+
+ test('_computePushCertificateValidation returns undefined', () => {
+ delete serverConfig!.receive!.enable_signed_push;
+ const result = element._computePushCertificateValidation(
+ serverConfig,
+ change,
+ element.repoConfig
+ );
+ assert.isUndefined(result);
+ });
+
+ test('isEnabledSignedPushOnRepo', () => {
+ change!.revisions.rev1!.push_certificate = {
+ certificate: 'Push certificate',
+ key: {
+ status: GpgKeyInfoStatus.TRUSTED,
+ },
+ };
+ element.change = change;
+ element.serverConfig = serverConfig;
+ element.repoConfig!.enable_signed_push!.configured_value =
+ InheritedBooleanInfoConfiguredValue.INHERIT;
+ element.repoConfig!.enable_signed_push!.inherited_value = true;
+ assert.isTrue(element.isEnabledSignedPushOnRepo(element.repoConfig));
+
+ element.repoConfig!.enable_signed_push!.inherited_value = false;
+ assert.isFalse(element.isEnabledSignedPushOnRepo(element.repoConfig));
+
+ element.repoConfig!.enable_signed_push!.configured_value =
+ InheritedBooleanInfoConfiguredValue.TRUE;
+ assert.isTrue(element.isEnabledSignedPushOnRepo(element.repoConfig));
+
+ element.repoConfig = undefined;
+ assert.isFalse(element.isEnabledSignedPushOnRepo(element.repoConfig));
+ });
});
test('_computeParents', () => {
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_html.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_html.ts
index 6d8c1ec..cb72ba7 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_html.ts
@@ -389,6 +389,7 @@
commit-info="[[_commitInfo]]"
server-config="[[_serverConfig]]"
parent-is-current="[[_parentIsCurrent]]"
+ repo-config="[[_projectConfig]]"
on-show-reply-dialog="_handleShowReplyDialog"
>
</gr-change-metadata>