Fix Guice binding
Bind correct classes to allow guice to instantiate class attributes.
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
index f48e000..a2f7d33 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
@@ -21,12 +21,17 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.io.IOException;
import java.util.List;
import java.util.Set;
public class AtomicityHelper {
+ private final static Logger log = LoggerFactory.getLogger(AtomicityHelper.class);
+
@Inject
private AccountByEmailCache byEmailCache;
@@ -39,6 +44,7 @@
@Inject
private ChangesCollection collection;
+ @Inject
AutomergeConfig config;
@Inject
@@ -59,10 +65,6 @@
@Inject
Submit submitter;
- public AtomicityHelper(final AutomergeConfig config) {
- this.config = config;
- }
-
/**
* Check if the current patchset of the specified change has dependent
* unmerged changes.
@@ -78,10 +80,9 @@
final IdentifiedUser bot = factory.create(ids.iterator().next());
final ChangeControl ctl = changeFactory.controlFor(new Change.Id(number), bot);
final ChangeData changeData = changeDataFactory.create(db.get(), new Change.Id(number));
-
final RevisionResource r = new RevisionResource(collection.parse(ctl), changeData.currentPatchSet());
final RelatedInfo related = getRelated.apply(r);
-
+ log.debug(String.format("Checking for related changes on review %d", number));
return related.changes.size() > 0;
}
@@ -93,7 +94,9 @@
* @return true or false
*/
public boolean isAtomicReview(final ChangeAttribute change) {
- return change.topic != null && change.topic.startsWith(config.getTopicPrefix());
+ final boolean atomic = change.topic != null && change.topic.startsWith(config.getTopicPrefix());
+ log.debug(String.format("Checking if change %s is an atomic change: %b", change.number, atomic));
+ return atomic;
}
/**
@@ -106,12 +109,14 @@
public boolean isSubmittable(final int change) throws OrmException {
final ChangeData changeData = changeDataFactory.create(db.get(), new Change.Id(change));
final List<SubmitRecord> cansubmit = changeData.changeControl().canSubmit(db.get(), changeData.currentPatchSet());
-
+ log.debug(String.format("Checking if change %d is submitable.", change));
for (final SubmitRecord submit : cansubmit) {
if (submit.status != SubmitRecord.Status.OK) {
+ log.debug(String.format("Change %d is not submitable", change));
return false;
}
}
+ log.debug(String.format("Change %d is submitable", change));
return true;
}
}
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
index 102b71d..73aa030 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
@@ -35,7 +35,6 @@
import com.google.gerrit.server.change.PostReview;
import com.google.gerrit.server.change.RevisionResource;
import com.google.gerrit.server.change.Submit;
-import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.data.ChangeAttribute;
import com.google.gerrit.server.events.ChangeEvent;
import com.google.gerrit.server.events.CommentAddedEvent;
@@ -50,7 +49,8 @@
import com.google.inject.Provider;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.EnumSet;
@@ -63,9 +63,13 @@
*/
public class AutomaticMerger implements ChangeListener, LifecycleListener {
+ private final static Logger log = LoggerFactory.getLogger(AutomaticMerger.class);
+
@Inject
private GerritApi api;
- private final AtomicityHelper atomicityHelper;
+
+ @Inject
+ private AtomicityHelper atomicityHelper;
@Inject
private AccountByEmailCache byEmailCache;
@@ -79,7 +83,8 @@
@Inject
private ChangesCollection collection;
- private final AutomergeConfig config;
+ @Inject
+ private AutomergeConfig config;
@Inject
Provider<ReviewDb> db;
@@ -95,24 +100,22 @@
@Inject
Provider<PostReview> reviewer;
- private final ReviewUpdater reviewUpdater;
+
+ @Inject
+ private ReviewUpdater reviewUpdater;
+
@Inject
Submit submitter;
- @Inject
- public AutomaticMerger(@GerritServerConfig final Config gerritConfig) {
- config = new AutomergeConfig(gerritConfig);
- reviewUpdater = new ReviewUpdater(config);
- atomicityHelper = new AtomicityHelper(config);
- }
-
@Override
synchronized public void onChangeEvent(final ChangeEvent event) {
+ log.info("A change has been recieved");
try {
if (event instanceof TopicChangedEvent) {
final TopicChangedEvent newComment = (TopicChangedEvent) event;
final ChangeAttribute change = newComment.change;
final int reviewNumber = Integer.parseInt(change.number);
+ log.info(String.format("Change on review %d is a topic change.", reviewNumber));
try {
api.changes().id(reviewNumber).get(EnumSet.of(ListChangesOption.CURRENT_REVISION));
} catch (final RestApiException e1) {
@@ -121,8 +124,11 @@
if (atomicityHelper.isAtomicReview(change)) {
if (atomicityHelper.hasDependentReview(reviewNumber)) {
+ log.info(String.format("Setting -2 on change %d, other atomic changes exists on the same repository.",
+ reviewNumber));
reviewUpdater.setMinusTwo(reviewNumber, AutomergeConfig.ATOMIC_REVIEWS_SAME_REPO_FILE);
} else {
+ log.info(String.format("Detected atomic review on change %d", reviewNumber));
reviewUpdater.commentOnReview(reviewNumber, AutomergeConfig.ATOMIC_REVIEW_DETECTED_FILE);
}
}
@@ -167,6 +173,7 @@
final String topic = change.topic;
try {
if (atomicityHelper.isSubmittable(Integer.parseInt(newComment.change.number))) {
+ log.info(String.format("Change %d is submittable. Will try to merge all related changes.", reviewNumber));
final List<ChangeInfo> related = Lists.newArrayList();
if (topic != null) {
related.addAll(api.changes().query("status: open AND topic: " + topic)
@@ -189,6 +196,7 @@
}
}
if (mergeable) {
+ log.debug(String.format("Change %d is mergeable", reviewNumber));
for (final ChangeInfo info : related) {
final SubmitInput input = new SubmitInput();
input.waitForMerge = true;
@@ -228,6 +236,7 @@
@Override
public void start() {
+ log.info("Starting automatic merger plugin.");
}
@Override
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeConfig.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeConfig.java
index 9b84fdc..135c8df 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeConfig.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeConfig.java
@@ -4,7 +4,6 @@
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
-import org.apache.commons.io.FileUtils;
import org.eclipse.jgit.lib.Config;
import java.io.File;
@@ -25,28 +24,31 @@
public static final String getDefaultBotEmail() {
return defaultBotEmail;
-
}
public static final String getDefaultTopicPrefix() {
return defaultTopicPrefix;
}
- private final Config config;
+ private String botEmail;
+ private final File templatesPath;
+ private String topicPrefix;
@Inject
- private SitePaths sitePaths;
+ public AutomergeConfig(@GerritServerConfig final Config config, final SitePaths paths) {
+ botEmail = config.getString(AUTOMERGE_SECTION, null, BOT_EMAIL_KEY);
+ if (botEmail == null) {
+ botEmail = defaultBotEmail;
+ }
+ topicPrefix = config.getString(AUTOMERGE_SECTION, null, TOPIC_PREFIX_KEY);
+ if (topicPrefix == null) {
+ topicPrefix = defaultTopicPrefix;
+ }
-
- public AutomergeConfig(@GerritServerConfig final Config config) {
- this.config = config;
+ templatesPath = paths.etc_dir;
}
public final String getBotEmail() {
- final String botEmail = config.getString(AUTOMERGE_SECTION, null, BOT_EMAIL_KEY);
- if (botEmail == null) {
- return defaultBotEmail;
- }
return botEmail;
}
@@ -57,21 +59,11 @@
* @return a string containing a comment.
* @throws IOException
*/
- public final String getCommentFromFile(final String filename) {
- final File commentFile = new File(sitePaths.etc_dir, filename);
- try {
- return FileUtils.readFileToString(commentFile);
- } catch (final IOException exc) {
- return String.format("Cannot find %s file in gerrit etc dir. Please check your gerrit configuration", filename);
- }
+ public final String getTemplatesPath() {
+ return templatesPath.getPath();
}
public final String getTopicPrefix() {
- final String topicPrefix = config.getString(AUTOMERGE_SECTION, null, TOPIC_PREFIX_KEY);
- if (topicPrefix == null) {
- return defaultTopicPrefix;
- }
return topicPrefix;
}
-
}
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java b/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java
index 8ae8977..32da151 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java
@@ -4,7 +4,7 @@
// 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
+// 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,
@@ -14,9 +14,13 @@
package com.criteo.gerrit.plugins.automerge;
-import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.gerrit.common.ChangeListener;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
/**
* Main automerge Guice module.
@@ -25,8 +29,22 @@
*/
public class Module extends AbstractModule {
+ protected static final Supplier<Injector> injector = Suppliers.memoize(new Supplier<Injector>() {
+ @Override
+ public Injector get() {
+ return Guice.createInjector(new Module());
+ }
+ });
+
+ public static <T> T getInstance(final Class<T> type) {
+ return injector.get().getInstance(type);
+ }
+
@Override
protected void configure() {
- DynamicSet.bind(binder(), LifecycleListener.class).to(AutomaticMerger.class);
+ DynamicSet.bind(binder(), ChangeListener.class).to(AutomaticMerger.class);
+ bind(AutomergeConfig.class).asEagerSingleton();
+ bind(AtomicityHelper.class);
+ bind(ReviewUpdater.class);
}
}
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/ReviewUpdater.java b/src/main/java/com/criteo/gerrit/plugins/automerge/ReviewUpdater.java
index 12138f1..9f40f2c 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/ReviewUpdater.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/ReviewUpdater.java
@@ -1,5 +1,7 @@
package com.criteo.gerrit.plugins.automerge;
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -19,10 +21,16 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
import java.io.IOException;
import java.util.Set;
public class ReviewUpdater {
+ private final static Logger log = LoggerFactory.getLogger(AutomaticMerger.class);
+
@Inject
private AccountByEmailCache byEmailCache;
@@ -35,7 +43,9 @@
@Inject
private ChangesCollection collection;
- final AutomergeConfig config;
+ @Inject
+ AutomergeConfig config;
+
@Inject
Provider<ReviewDb> db;
@@ -45,14 +55,10 @@
@Inject
Provider<PostReview> reviewer;
- public ReviewUpdater(final AutomergeConfig config) {
- this.config = config;
- }
-
public void commentOnReview(final int number, final String commentTemplate) throws NoSuchChangeException,
OrmException, AuthException, BadRequestException, UnprocessableEntityException, IOException {
final ReviewInput message = new ReviewInput();
- message.message = config.getCommentFromFile(commentTemplate);
+ message.message = getCommentFromFile(commentTemplate);
final Set<Account.Id> ids = byEmailCache.get(config.getBotEmail());
final IdentifiedUser bot = factory.create(ids.iterator().next());
final ChangeControl ctl = changeFactory.controlFor(new Change.Id(number), bot);
@@ -62,10 +68,22 @@
reviewer.get().apply(r, message);
}
+ private final String getCommentFromFile(final String filename) {
+ try {
+ return Files.toString(new File(config.getTemplatesPath(), filename), Charsets.UTF_8);
+
+ } catch (final IOException exc) {
+ final String errmsg =
+ String.format("Cannot find %s file in gerrit etc dir. Please check your gerrit configuration", filename);
+ log.error(errmsg);
+ return errmsg;
+ }
+ }
+
public void setMinusTwo(final int number, final String commentTemplate) throws NoSuchChangeException, OrmException,
AuthException, BadRequestException, UnprocessableEntityException, IOException {
final ReviewInput message = new ReviewInput();
- message.message = config.getCommentFromFile(commentTemplate);
+ message.message = getCommentFromFile(commentTemplate);
message.label("Code-Review", -2);
final Set<Account.Id> ids = byEmailCache.get(config.getBotEmail());
final IdentifiedUser bot = factory.create(ids.iterator().next());