Expose the commit to Prolog
Expose the commit to allow for more granular control over what needs to be loaded by Gerrit, and keep the parsed commit in memory. This allows removal of the PATCH_SET_INFO and COMMIT_MESSAGE StoredValues. Change-Id: I81649c9b976ca8750f28cb39c58051594b781c9a
This commit is contained in:
@@ -214,14 +214,13 @@ public class PatchSetUtil {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the full commit message for the given project at the given patchset revision */
|
/** Returns the commit for the given project at the given patchset revision */
|
||||||
public String getFullCommitMessage(Project.NameKey project, PatchSet patchSet)
|
public RevCommit getRevCommit(Project.NameKey project, PatchSet patchSet) throws IOException {
|
||||||
throws IOException {
|
|
||||||
try (Repository repo = repoManager.openRepository(project);
|
try (Repository repo = repoManager.openRepository(project);
|
||||||
RevWalk rw = new RevWalk(repo)) {
|
RevWalk rw = new RevWalk(repo)) {
|
||||||
RevCommit src = rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get()));
|
RevCommit src = rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get()));
|
||||||
rw.parseBody(src);
|
rw.parseBody(src);
|
||||||
return src.getFullMessage();
|
return src;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,6 +18,7 @@ import com.google.common.flogger.FluentLogger;
|
|||||||
import com.google.gerrit.server.AnonymousUser;
|
import com.google.gerrit.server.AnonymousUser;
|
||||||
import com.google.gerrit.server.IdentifiedUser;
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
import com.google.gerrit.server.PatchSetUtil;
|
import com.google.gerrit.server.PatchSetUtil;
|
||||||
|
import com.google.gerrit.server.account.Emails;
|
||||||
import com.google.gerrit.server.config.GerritServerConfig;
|
import com.google.gerrit.server.config.GerritServerConfig;
|
||||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||||
import com.google.gerrit.server.patch.PatchListCache;
|
import com.google.gerrit.server.patch.PatchListCache;
|
||||||
@@ -176,6 +177,7 @@ public class PrologEnvironment extends BufferingPrologControl {
|
|||||||
private final int reductionLimit;
|
private final int reductionLimit;
|
||||||
private final int compileLimit;
|
private final int compileLimit;
|
||||||
private final PatchSetUtil patchsetUtil;
|
private final PatchSetUtil patchsetUtil;
|
||||||
|
private Emails emails;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
Args(
|
Args(
|
||||||
@@ -187,7 +189,8 @@ public class PrologEnvironment extends BufferingPrologControl {
|
|||||||
IdentifiedUser.GenericFactory userFactory,
|
IdentifiedUser.GenericFactory userFactory,
|
||||||
Provider<AnonymousUser> anonymousUser,
|
Provider<AnonymousUser> anonymousUser,
|
||||||
@GerritServerConfig Config config,
|
@GerritServerConfig Config config,
|
||||||
PatchSetUtil patchsetUtil) {
|
PatchSetUtil patchsetUtil,
|
||||||
|
Emails emails) {
|
||||||
this.projectCache = projectCache;
|
this.projectCache = projectCache;
|
||||||
this.permissionBackend = permissionBackend;
|
this.permissionBackend = permissionBackend;
|
||||||
this.repositoryManager = repositoryManager;
|
this.repositoryManager = repositoryManager;
|
||||||
@@ -196,6 +199,7 @@ public class PrologEnvironment extends BufferingPrologControl {
|
|||||||
this.userFactory = userFactory;
|
this.userFactory = userFactory;
|
||||||
this.anonymousUser = anonymousUser;
|
this.anonymousUser = anonymousUser;
|
||||||
this.patchsetUtil = patchsetUtil;
|
this.patchsetUtil = patchsetUtil;
|
||||||
|
this.emails = emails;
|
||||||
|
|
||||||
int limit = config.getInt("rules", null, "reductionLimit", 100000);
|
int limit = config.getInt("rules", null, "reductionLimit", 100000);
|
||||||
reductionLimit = limit <= 0 ? Integer.MAX_VALUE : limit;
|
reductionLimit = limit <= 0 ? Integer.MAX_VALUE : limit;
|
||||||
@@ -247,5 +251,9 @@ public class PrologEnvironment extends BufferingPrologControl {
|
|||||||
public PatchSetUtil getPatchsetUtil() {
|
public PatchSetUtil getPatchsetUtil() {
|
||||||
return patchsetUtil;
|
return patchsetUtil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Emails getEmails() {
|
||||||
|
return emails;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,6 @@ import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
|
|||||||
import com.google.gerrit.reviewdb.client.Account;
|
import com.google.gerrit.reviewdb.client.Account;
|
||||||
import com.google.gerrit.reviewdb.client.Change;
|
import com.google.gerrit.reviewdb.client.Change;
|
||||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||||
import com.google.gerrit.reviewdb.client.PatchSetInfo;
|
|
||||||
import com.google.gerrit.reviewdb.client.Project;
|
import com.google.gerrit.reviewdb.client.Project;
|
||||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||||
import com.google.gerrit.server.AnonymousUser;
|
import com.google.gerrit.server.AnonymousUser;
|
||||||
@@ -34,8 +33,6 @@ import com.google.gerrit.server.patch.PatchList;
|
|||||||
import com.google.gerrit.server.patch.PatchListCache;
|
import com.google.gerrit.server.patch.PatchListCache;
|
||||||
import com.google.gerrit.server.patch.PatchListKey;
|
import com.google.gerrit.server.patch.PatchListKey;
|
||||||
import com.google.gerrit.server.patch.PatchListNotAvailableException;
|
import com.google.gerrit.server.patch.PatchListNotAvailableException;
|
||||||
import com.google.gerrit.server.patch.PatchSetInfoFactory;
|
|
||||||
import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
|
|
||||||
import com.google.gerrit.server.permissions.PermissionBackend;
|
import com.google.gerrit.server.permissions.PermissionBackend;
|
||||||
import com.google.gerrit.server.project.ProjectState;
|
import com.google.gerrit.server.project.ProjectState;
|
||||||
import com.google.gerrit.server.query.change.ChangeData;
|
import com.google.gerrit.server.query.change.ChangeData;
|
||||||
@@ -47,6 +44,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
|
|
||||||
public final class StoredValues {
|
public final class StoredValues {
|
||||||
public static final StoredValue<Accounts> ACCOUNTS = create(Accounts.class);
|
public static final StoredValue<Accounts> ACCOUNTS = create(Accounts.class);
|
||||||
@@ -74,32 +72,16 @@ public final class StoredValues {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final StoredValue<PatchSetInfo> PATCH_SET_INFO =
|
public static final StoredValue<RevCommit> COMMIT =
|
||||||
new StoredValue<PatchSetInfo>() {
|
new StoredValue<RevCommit>() {
|
||||||
@Override
|
@Override
|
||||||
public PatchSetInfo createValue(Prolog engine) {
|
public RevCommit createValue(Prolog engine) {
|
||||||
Change change = getChange(engine);
|
|
||||||
PatchSet ps = getPatchSet(engine);
|
|
||||||
PrologEnvironment env = (PrologEnvironment) engine.control;
|
|
||||||
PatchSetInfoFactory patchInfoFactory = env.getArgs().getPatchSetInfoFactory();
|
|
||||||
try {
|
|
||||||
return patchInfoFactory.get(change.getProject(), ps);
|
|
||||||
} catch (PatchSetInfoNotAvailableException e) {
|
|
||||||
throw new SystemException(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public static final StoredValue<String> COMMIT_MESSAGE =
|
|
||||||
new StoredValue<String>() {
|
|
||||||
@Override
|
|
||||||
public String createValue(Prolog engine) {
|
|
||||||
Change change = getChange(engine);
|
Change change = getChange(engine);
|
||||||
PatchSet ps = getPatchSet(engine);
|
PatchSet ps = getPatchSet(engine);
|
||||||
PrologEnvironment env = (PrologEnvironment) engine.control;
|
PrologEnvironment env = (PrologEnvironment) engine.control;
|
||||||
PatchSetUtil patchSetUtil = env.getArgs().getPatchsetUtil();
|
PatchSetUtil patchSetUtil = env.getArgs().getPatchsetUtil();
|
||||||
try {
|
try {
|
||||||
return patchSetUtil.getFullCommitMessage(change.getProject(), ps);
|
return patchSetUtil.getRevCommit(change.getProject(), ps);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new SystemException(e.getMessage());
|
throw new SystemException(e.getMessage());
|
||||||
}
|
}
|
||||||
|
@@ -14,9 +14,13 @@
|
|||||||
|
|
||||||
package gerrit;
|
package gerrit;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.gerrit.reviewdb.client.Account;
|
import com.google.gerrit.reviewdb.client.Account;
|
||||||
import com.google.gerrit.reviewdb.client.UserIdentity;
|
import com.google.gerrit.server.account.Emails;
|
||||||
|
import com.google.gerrit.server.rules.PrologEnvironment;
|
||||||
|
import com.google.gwtorm.server.OrmException;
|
||||||
import com.googlecode.prolog_cafe.exceptions.PrologException;
|
import com.googlecode.prolog_cafe.exceptions.PrologException;
|
||||||
|
import com.googlecode.prolog_cafe.exceptions.SystemException;
|
||||||
import com.googlecode.prolog_cafe.lang.IntegerTerm;
|
import com.googlecode.prolog_cafe.lang.IntegerTerm;
|
||||||
import com.googlecode.prolog_cafe.lang.Operation;
|
import com.googlecode.prolog_cafe.lang.Operation;
|
||||||
import com.googlecode.prolog_cafe.lang.Predicate;
|
import com.googlecode.prolog_cafe.lang.Predicate;
|
||||||
@@ -24,6 +28,8 @@ import com.googlecode.prolog_cafe.lang.Prolog;
|
|||||||
import com.googlecode.prolog_cafe.lang.StructureTerm;
|
import com.googlecode.prolog_cafe.lang.StructureTerm;
|
||||||
import com.googlecode.prolog_cafe.lang.SymbolTerm;
|
import com.googlecode.prolog_cafe.lang.SymbolTerm;
|
||||||
import com.googlecode.prolog_cafe.lang.Term;
|
import com.googlecode.prolog_cafe.lang.Term;
|
||||||
|
import java.io.IOException;
|
||||||
|
import org.eclipse.jgit.lib.PersonIdent;
|
||||||
|
|
||||||
abstract class AbstractCommitUserIdentityPredicate extends Predicate.P3 {
|
abstract class AbstractCommitUserIdentityPredicate extends Predicate.P3 {
|
||||||
private static final SymbolTerm user = SymbolTerm.intern("user", 1);
|
private static final SymbolTerm user = SymbolTerm.intern("user", 1);
|
||||||
@@ -36,7 +42,7 @@ abstract class AbstractCommitUserIdentityPredicate extends Predicate.P3 {
|
|||||||
cont = n;
|
cont = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Operation exec(Prolog engine, UserIdentity userId) throws PrologException {
|
protected Operation exec(Prolog engine, PersonIdent userId) throws PrologException {
|
||||||
engine.setB0();
|
engine.setB0();
|
||||||
Term a1 = arg1.dereference();
|
Term a1 = arg1.dereference();
|
||||||
Term a2 = arg2.dereference();
|
Term a2 = arg2.dereference();
|
||||||
@@ -46,7 +52,18 @@ abstract class AbstractCommitUserIdentityPredicate extends Predicate.P3 {
|
|||||||
Term nameTerm = Prolog.Nil;
|
Term nameTerm = Prolog.Nil;
|
||||||
Term emailTerm = Prolog.Nil;
|
Term emailTerm = Prolog.Nil;
|
||||||
|
|
||||||
Account.Id id = userId.getAccount();
|
PrologEnvironment env = (PrologEnvironment) engine.control;
|
||||||
|
Emails emails = env.getArgs().getEmails();
|
||||||
|
Account.Id id = null;
|
||||||
|
try {
|
||||||
|
ImmutableSet<Account.Id> ids = emails.getAccountFor(userId.getEmailAddress());
|
||||||
|
if (ids.size() == 1) {
|
||||||
|
id = ids.iterator().next();
|
||||||
|
}
|
||||||
|
} catch (IOException | OrmException e) {
|
||||||
|
throw new SystemException(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
if (id == null) {
|
if (id == null) {
|
||||||
idTerm = anonymous;
|
idTerm = anonymous;
|
||||||
} else {
|
} else {
|
||||||
@@ -58,7 +75,7 @@ abstract class AbstractCommitUserIdentityPredicate extends Predicate.P3 {
|
|||||||
nameTerm = SymbolTerm.create(name);
|
nameTerm = SymbolTerm.create(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
String email = userId.getEmail();
|
String email = userId.getEmailAddress();
|
||||||
if (email != null && !email.equals("")) {
|
if (email != null && !email.equals("")) {
|
||||||
emailTerm = SymbolTerm.create(email);
|
emailTerm = SymbolTerm.create(email);
|
||||||
}
|
}
|
||||||
|
@@ -11,5 +11,6 @@ java_library(
|
|||||||
"//lib/flogger:api",
|
"//lib/flogger:api",
|
||||||
"//lib/jgit/org.eclipse.jgit:jgit",
|
"//lib/jgit/org.eclipse.jgit:jgit",
|
||||||
"//lib/prolog:runtime",
|
"//lib/prolog:runtime",
|
||||||
|
"@guava//jar",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@@ -14,13 +14,12 @@
|
|||||||
|
|
||||||
package gerrit;
|
package gerrit;
|
||||||
|
|
||||||
import com.google.gerrit.reviewdb.client.PatchSetInfo;
|
|
||||||
import com.google.gerrit.reviewdb.client.UserIdentity;
|
|
||||||
import com.google.gerrit.server.rules.StoredValues;
|
import com.google.gerrit.server.rules.StoredValues;
|
||||||
import com.googlecode.prolog_cafe.exceptions.PrologException;
|
import com.googlecode.prolog_cafe.exceptions.PrologException;
|
||||||
import com.googlecode.prolog_cafe.lang.Operation;
|
import com.googlecode.prolog_cafe.lang.Operation;
|
||||||
import com.googlecode.prolog_cafe.lang.Prolog;
|
import com.googlecode.prolog_cafe.lang.Prolog;
|
||||||
import com.googlecode.prolog_cafe.lang.Term;
|
import com.googlecode.prolog_cafe.lang.Term;
|
||||||
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
|
|
||||||
public class PRED_commit_author_3 extends AbstractCommitUserIdentityPredicate {
|
public class PRED_commit_author_3 extends AbstractCommitUserIdentityPredicate {
|
||||||
public PRED_commit_author_3(Term a1, Term a2, Term a3, Operation n) {
|
public PRED_commit_author_3(Term a1, Term a2, Term a3, Operation n) {
|
||||||
@@ -29,8 +28,7 @@ public class PRED_commit_author_3 extends AbstractCommitUserIdentityPredicate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Operation exec(Prolog engine) throws PrologException {
|
public Operation exec(Prolog engine) throws PrologException {
|
||||||
PatchSetInfo psInfo = StoredValues.PATCH_SET_INFO.get(engine);
|
RevCommit revCommit = StoredValues.COMMIT.get(engine);
|
||||||
UserIdentity author = psInfo.getAuthor();
|
return exec(engine, revCommit.getAuthorIdent());
|
||||||
return exec(engine, author);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,13 +14,12 @@
|
|||||||
|
|
||||||
package gerrit;
|
package gerrit;
|
||||||
|
|
||||||
import com.google.gerrit.reviewdb.client.PatchSetInfo;
|
|
||||||
import com.google.gerrit.reviewdb.client.UserIdentity;
|
|
||||||
import com.google.gerrit.server.rules.StoredValues;
|
import com.google.gerrit.server.rules.StoredValues;
|
||||||
import com.googlecode.prolog_cafe.exceptions.PrologException;
|
import com.googlecode.prolog_cafe.exceptions.PrologException;
|
||||||
import com.googlecode.prolog_cafe.lang.Operation;
|
import com.googlecode.prolog_cafe.lang.Operation;
|
||||||
import com.googlecode.prolog_cafe.lang.Prolog;
|
import com.googlecode.prolog_cafe.lang.Prolog;
|
||||||
import com.googlecode.prolog_cafe.lang.Term;
|
import com.googlecode.prolog_cafe.lang.Term;
|
||||||
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
|
|
||||||
public class PRED_commit_committer_3 extends AbstractCommitUserIdentityPredicate {
|
public class PRED_commit_committer_3 extends AbstractCommitUserIdentityPredicate {
|
||||||
public PRED_commit_committer_3(Term a1, Term a2, Term a3, Operation n) {
|
public PRED_commit_committer_3(Term a1, Term a2, Term a3, Operation n) {
|
||||||
@@ -29,8 +28,7 @@ public class PRED_commit_committer_3 extends AbstractCommitUserIdentityPredicate
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Operation exec(Prolog engine) throws PrologException {
|
public Operation exec(Prolog engine) throws PrologException {
|
||||||
PatchSetInfo psInfo = StoredValues.PATCH_SET_INFO.get(engine);
|
RevCommit revCommit = StoredValues.COMMIT.get(engine);
|
||||||
UserIdentity committer = psInfo.getCommitter();
|
return exec(engine, revCommit.getCommitterIdent());
|
||||||
return exec(engine, committer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,7 @@ import com.googlecode.prolog_cafe.lang.Predicate;
|
|||||||
import com.googlecode.prolog_cafe.lang.Prolog;
|
import com.googlecode.prolog_cafe.lang.Prolog;
|
||||||
import com.googlecode.prolog_cafe.lang.SymbolTerm;
|
import com.googlecode.prolog_cafe.lang.SymbolTerm;
|
||||||
import com.googlecode.prolog_cafe.lang.Term;
|
import com.googlecode.prolog_cafe.lang.Term;
|
||||||
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the commit message as a symbol
|
* Returns the commit message as a symbol
|
||||||
@@ -40,7 +41,8 @@ public class PRED_commit_message_1 extends Predicate.P1 {
|
|||||||
engine.setB0();
|
engine.setB0();
|
||||||
Term a1 = arg1.dereference();
|
Term a1 = arg1.dereference();
|
||||||
|
|
||||||
String commitMessage = StoredValues.COMMIT_MESSAGE.get(engine);
|
RevCommit revCommit = StoredValues.COMMIT.get(engine);
|
||||||
|
String commitMessage = revCommit.getFullMessage();
|
||||||
|
|
||||||
SymbolTerm msg = SymbolTerm.create(commitMessage);
|
SymbolTerm msg = SymbolTerm.create(commitMessage);
|
||||||
if (!a1.unify(msg, engine.trail)) {
|
if (!a1.unify(msg, engine.trail)) {
|
||||||
|
@@ -49,7 +49,7 @@ public class GerritCommonTest extends PrologTestCase {
|
|||||||
bind(PrologEnvironment.Args.class)
|
bind(PrologEnvironment.Args.class)
|
||||||
.toInstance(
|
.toInstance(
|
||||||
new PrologEnvironment.Args(
|
new PrologEnvironment.Args(
|
||||||
null, null, null, null, null, null, null, cfg, null));
|
null, null, null, null, null, null, null, cfg, null, null));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user