From 03fbaf8655fafdba6c54b8c98c0126a699458b08 Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Fri, 15 Feb 2013 17:34:31 -0800 Subject: [PATCH] Use per-project label types in Prolog submit rules Change-Id: I89fcb0b94a4f1af61d4cff7dccb18cc3dac821cd --- .../gerrit/server/project/ProjectState.java | 2 +- .../gerrit/PRED__load_commit_labels_1.java | 5 +- ...ava => PRED_get_legacy_label_types_1.java} | 29 +++--- .../src/main/prolog/gerrit_common.pl | 14 +-- .../google/gerrit/rules/GerritCommonTest.java | 95 ++++++++++++++++--- .../google/gerrit/rules/PrologTestCase.java | 4 + .../google/gerrit/rules/gerrit_common_test.pl | 10 +- 7 files changed, 118 insertions(+), 41 deletions(-) rename gerrit-server/src/main/java/gerrit/{PRED_get_legacy_approval_types_1.java => PRED_get_legacy_label_types_1.java} (71%) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java index 42c69f2e7b..5f6d4edfdb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java @@ -84,7 +84,7 @@ public class ProjectState { private final CapabilityCollection capabilities; @Inject - protected ProjectState( + public ProjectState( final ProjectCache projectCache, final AllProjectsName allProjectsName, final ProjectControl.AssistedFactory projectControlFactory, diff --git a/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java b/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java index 2fad64b260..91cb6f57cc 100644 --- a/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java +++ b/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java @@ -7,7 +7,6 @@ import com.google.gerrit.common.data.LabelTypes; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.PatchSetApproval; import com.google.gerrit.reviewdb.server.ReviewDb; -import com.google.gerrit.rules.PrologEnvironment; import com.google.gerrit.rules.StoredValues; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; @@ -42,11 +41,11 @@ class PRED__load_commit_labels_1 extends Predicate.P1 { Term listHead = Prolog.Nil; try { - PrologEnvironment env = (PrologEnvironment) engine.control; ReviewDb db = StoredValues.REVIEW_DB.get(engine); PatchSet patchSet = StoredValues.PATCH_SET.get(engine); ChangeData cd = StoredValues.CHANGE_DATA.getOrNull(engine); - LabelTypes types = env.getInjector().getInstance(LabelTypes.class); + LabelTypes types = + StoredValues.CHANGE_CONTROL.get(engine).getLabelTypes(); Iterable approvals; if (cd != null) { diff --git a/gerrit-server/src/main/java/gerrit/PRED_get_legacy_approval_types_1.java b/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java similarity index 71% rename from gerrit-server/src/main/java/gerrit/PRED_get_legacy_approval_types_1.java rename to gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java index 232caad206..89e61b9117 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_get_legacy_approval_types_1.java +++ b/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java @@ -15,8 +15,10 @@ package gerrit; import com.google.gerrit.common.data.LabelType; -import com.google.gerrit.common.data.LabelTypes; import com.google.gerrit.rules.PrologEnvironment; +import com.google.gerrit.rules.StoredValues; +import com.google.gerrit.server.project.ProjectCache; +import com.google.gerrit.server.project.ProjectState; import com.googlecode.prolog_cafe.lang.IntegerTerm; import com.googlecode.prolog_cafe.lang.ListTerm; @@ -31,19 +33,19 @@ import com.googlecode.prolog_cafe.lang.Term; import java.util.List; /** - * Obtain a list of approval types from the server configuration. + * Obtain a list of label types from the server configuration. *

- * Unifies to a Prolog list of: {@code approval_type(Label, Id, Fun, Min, Max)} + * Unifies to a Prolog list of: {@code label_type(Label, Id, Fun, Min, Max)} * where: *

*/ -class PRED_get_legacy_approval_types_1 extends Predicate.P1 { - PRED_get_legacy_approval_types_1(Term a1, Operation n) { +class PRED_get_legacy_label_types_1 extends Predicate.P1 { + PRED_get_legacy_label_types_1(Term a1, Operation n) { arg1 = a1; cont = n; } @@ -54,9 +56,12 @@ class PRED_get_legacy_approval_types_1 extends Predicate.P1 { Term a1 = arg1.dereference(); PrologEnvironment env = (PrologEnvironment) engine.control; - LabelTypes types = env.getInjector().getInstance(LabelTypes.class); - - List list = types.getLabelTypes(); + ProjectState state = env.getInjector().getInstance(ProjectCache.class) + .get(StoredValues.CHANGE.get(engine).getDest().getParentKey()); + if (state == null) { + return engine.fail(); + } + List list = state.getLabelTypes().getLabelTypes(); Term head = Prolog.Nil; for (int idx = list.size() - 1; 0 <= idx; idx--) { head = new ListTerm(export(list.get(idx)), head); @@ -68,11 +73,11 @@ class PRED_get_legacy_approval_types_1 extends Predicate.P1 { return cont; } - static final SymbolTerm symApprovalType = SymbolTerm.intern( - "approval_type", 5); + static final SymbolTerm symLabelType = SymbolTerm.intern( + "label_type", 5); static Term export(LabelType type) { - return new StructureTerm(symApprovalType, + return new StructureTerm(symLabelType, SymbolTerm.intern(type.getName()), SymbolTerm.intern(type.getId()), SymbolTerm.intern(type.getFunctionName()), diff --git a/gerrit-server/src/main/prolog/gerrit_common.pl b/gerrit-server/src/main/prolog/gerrit_common.pl index 113f9965f0..87aa1850b9 100644 --- a/gerrit-server/src/main/prolog/gerrit_common.pl +++ b/gerrit-server/src/main/prolog/gerrit_common.pl @@ -214,21 +214,21 @@ locate_submit_type(RuleName) :- :- public default_submit/1. %% default_submit(P) :- - get_legacy_approval_types(ApprovalTypes), - default_submit(ApprovalTypes, P). + get_legacy_label_types(LabelTypes), + default_submit(LabelTypes, P). % Apply the old "all approval categories must be satisfied" -% loop by scanning over all of the approval types to build -% up the submit record. +% loop by scanning over all of the label types to build up the +% submit record. % -default_submit(ApprovalTypes, P) :- - default_submit(ApprovalTypes, [], Tmp), +default_submit(LabelTypes, P) :- + default_submit(LabelTypes, [], Tmp), reverse(Tmp, Ls), P =.. [ submit | Ls]. default_submit([], Out, Out). default_submit([Type | Types], Tmp, Out) :- - approval_type(Label, Id, Fun, Min, Max) = Type, + label_type(Label, Id, Fun, Min, Max) = Type, legacy_submit_rule(Fun, Label, Id, Min, Max, Status), R = label(Label, Status), default_submit(Types, [R | Tmp], Out). diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java index 5a1926cc5f..92f6907b3c 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java @@ -17,36 +17,56 @@ package com.google.gerrit.rules; import com.google.gerrit.common.data.LabelType; import com.google.gerrit.common.data.LabelTypes; import com.google.gerrit.common.data.LabelValue; +import com.google.gerrit.reviewdb.client.Account; +import com.google.gerrit.reviewdb.client.AccountGroup; +import com.google.gerrit.reviewdb.client.Branch; +import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.git.ProjectConfig; +import com.google.gerrit.server.project.ProjectCache; +import com.google.gerrit.server.project.ProjectState; import com.google.inject.AbstractModule; import java.util.Arrays; +import java.util.Set; public class GerritCommonTest extends PrologTestCase { + private ProjectState project; + @Override public void setUp() throws Exception { super.setUp(); - final LabelTypes types = new LabelTypes(Arrays.asList( - category(0, "CRVW", "Code-Review", - value(2, "Looks good to me, approved"), - value(1, "Looks good to me, but someone else must approve"), - value(0, "No score"), - value(-1, "I would prefer that you didn't submit this"), - value(-2, "Do not submit")), - category(1, "VRIF", "Verified", - value(1, "Verified"), - value(0, "No score"), - value(-1, "Fails")) - )); + LabelTypes types = + new LabelTypes(Arrays.asList( + category(0, "CRVW", "Code-Review", + value(2, "Looks good to me, approved"), + value(1, "Looks good to me, but someone else must approve"), + value(0, "No score"), + value(-1, "I would prefer that you didn't submit this"), + value(-2, "Do not submit")), + category(1, "VRIF", "Verified", value(1, "Verified"), + value(0, "No score"), value(-1, "Fails")))); + ProjectConfig config = new ProjectConfig(new Project.NameKey("myproject")); + config.createInMemory(); + project = new ProjectState(null, null, null, null, null, + null, types, config); load("gerrit", "gerrit_common_test.pl", new AbstractModule() { @Override protected void configure() { - bind(LabelTypes.class).toInstance(types); + bind(ProjectCache.class).toInstance(new Projects(project)); } }); } + @Override + protected void setUpEnvironment(PrologEnvironment env) { + env.set(StoredValues.CHANGE, new Change( + new Change.Key("Ibeef"), new Change.Id(1), new Account.Id(2), + new Branch.NameKey(project.getProject().getNameKey(), "master"))); + } + private static LabelValue value(int value, String text) { return new LabelValue((short) value, text); } @@ -57,4 +77,53 @@ public class GerritCommonTest extends PrologTestCase { type.setPosition((short) pos); return type; } + + private static class Projects implements ProjectCache { + private final ProjectState project; + + private Projects(ProjectState project) { + this.project = project; + } + + @Override + public ProjectState getAllProjects() { + throw new UnsupportedOperationException(); + } + + @Override + public ProjectState get(Project.NameKey projectName) { + assertEquals(project.getProject().getNameKey(), projectName); + return project; + } + + @Override + public void evict(Project p) { + throw new UnsupportedOperationException(); + } + + @Override + public void remove(Project p) { + throw new UnsupportedOperationException(); + } + + @Override + public Iterable all() { + throw new UnsupportedOperationException(); + } + + @Override + public Set guessRelevantGroupUUIDs() { + throw new UnsupportedOperationException(); + } + + @Override + public Iterable byName(String prefix) { + throw new UnsupportedOperationException(); + } + + @Override + public void onCreateProject(Project.NameKey newProjectName) { + throw new UnsupportedOperationException(); + } + } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java index cc9d40f140..83809a4814 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java +++ b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java @@ -79,6 +79,9 @@ public abstract class PrologTestCase extends TestCase { machine = PrologMachineCopy.save(env); } + protected void setUpEnvironment(PrologEnvironment env) { + } + private PrologMachineCopy newMachine() { BufferingPrologControl ctl = new BufferingPrologControl(); ctl.setMaxDatabaseSize(16 * 1024); @@ -117,6 +120,7 @@ public abstract class PrologTestCase extends TestCase { for (Term test : tests) { PrologEnvironment env = envFactory.create(machine); + setUpEnvironment(env); env.setEnabled(Prolog.Feature.IO, true); System.out.format("Prolog %-60s ...", removePackage(test)); diff --git a/gerrit-server/src/test/resources/com/google/gerrit/rules/gerrit_common_test.pl b/gerrit-server/src/test/resources/com/google/gerrit/rules/gerrit_common_test.pl index db899a7a10..3b6aa77bf8 100644 --- a/gerrit-server/src/test/resources/com/google/gerrit/rules/gerrit_common_test.pl +++ b/gerrit-server/src/test/resources/com/google/gerrit/rules/gerrit_common_test.pl @@ -22,13 +22,13 @@ test(not_same_success) :- not_same(label(e, ok(a)), label(e, ok(b))). -%% get_legacy_approval_types +%% get_legacy_label_types %% -test(get_legacy_approval_types) :- - get_legacy_approval_types(T), +test(get_legacy_label_types) :- + get_legacy_label_types(T), T = [C, V], - C = approval_type('Code-Review', 'CRVW', 'MaxWithBlock', -2, 2), - V = approval_type('Verified', 'VRIF', 'MaxWithBlock', -1, 1). + C = label_type('Code-Review', 'CRVW', 'MaxWithBlock', -2, 2), + V = label_type('Verified', 'VRIF', 'MaxWithBlock', -1, 1). %% commit_label