Merge branch stable-2.14
* stable-2.14:
Adapt to the JGit v4.5.x
Change-Id: I7d88bebded4f0155262f268f918ce49639ee306f
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
index 504bfba..300baa4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
@@ -28,9 +28,9 @@
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.config.AnonymousCowardName;
import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.git.LockFailureException;
import com.google.gerrit.server.git.NotesBranchUtil;
import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectState;
@@ -43,7 +43,6 @@
import java.io.IOException;
import java.util.Collections;
import java.util.List;
-import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.Constants;
@@ -75,7 +74,6 @@
private final String anonymousCowardName;
private final LabelTypes labelTypes;
private final ApprovalsUtil approvalsUtil;
- private final ChangeControl.GenericFactory changeControlFactory;
private final ChangeNotes.Factory notesFactory;
private final IdentifiedUser.GenericFactory userFactory;
private final NotesBranchUtil.Factory notesBranchUtilFactory;
@@ -96,7 +94,6 @@
@AnonymousCowardName String anonymousCowardName,
ProjectCache projectCache,
ApprovalsUtil approvalsUtil,
- ChangeControl.GenericFactory changeControlFactory,
ChangeNotes.Factory notesFactory,
IdentifiedUser.GenericFactory userFactory,
NotesBranchUtil.Factory notesBranchUtilFactory,
@@ -119,7 +116,6 @@
this.labelTypes = projectState.getLabelTypes();
}
this.approvalsUtil = approvalsUtil;
- this.changeControlFactory = changeControlFactory;
this.notesFactory = notesFactory;
this.userFactory = userFactory;
this.notesBranchUtilFactory = notesBranchUtilFactory;
@@ -194,7 +190,7 @@
}
}
- void commitNotes() throws IOException, ConcurrentRefUpdateException {
+ void commitNotes() throws LockFailureException, IOException {
try {
if (reviewNotes == null) {
return;
@@ -212,7 +208,7 @@
}
private void markUninteresting(Repository git, String branch, RevWalk rw, ObjectId oldObjectId) {
- for (final Ref r : git.getAllRefs().values()) {
+ for (Ref r : git.getAllRefs().values()) {
try {
if (r.getName().equals(branch)) {
if (!ObjectId.zeroId().equals(oldObjectId)) {
@@ -268,10 +264,10 @@
// TODO(dborowitz): These will eventually be stamped in the ChangeNotes at
// commit time so we will be able to skip this normalization step.
Change change = notes.getChange();
- ChangeControl ctl =
- changeControlFactory.controlFor(notes, userFactory.create(change.getOwner()));
PatchSetApproval submit = null;
- for (PatchSetApproval a : approvalsUtil.byPatchSet(reviewDb, ctl, ps.getId())) {
+ for (PatchSetApproval a :
+ approvalsUtil.byPatchSet(
+ reviewDb, notes, userFactory.create(change.getOwner()), ps.getId(), null, null)) {
if (a.getValue() == 0) {
// Ignore 0 values.
} else if (a.isLegacySubmit()) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
index 520ae0a..4144381 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
@@ -14,15 +14,20 @@
package com.googlesource.gerrit.plugins.reviewnotes;
+import com.github.rholder.retry.Attempt;
+import com.github.rholder.retry.RetryListener;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.UpdateException;
import com.google.gerrit.sshd.SshCommand;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.SchemaFactory;
@@ -30,7 +35,6 @@
import java.io.IOException;
import java.util.List;
import java.util.Map;
-import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.TextProgressMonitor;
@@ -50,6 +54,8 @@
@Inject private ChangeNotes.Factory notesFactory;
+ @Inject private RetryHelper retryHelper;
+
private ListMultimap<Project.NameKey, ChangeNotes> changes;
private ThreadSafeProgressMonitor monitor;
@@ -85,16 +91,27 @@
}
private void export(ReviewDb db, Project.NameKey project, List<ChangeNotes> notes)
- throws IOException, OrmException {
- try (Repository git = gitManager.openRepository(project)) {
- CreateReviewNotes crn = reviewNotesFactory.create(db, project, git);
- crn.createNotes(notes, monitor);
- crn.commitNotes();
- } catch (RepositoryNotFoundException e) {
- stderr.println("Unable to open project: " + project.get());
- } catch (ConcurrentRefUpdateException e) {
- stderr.println(e.getMessage());
- }
+ throws RestApiException, UpdateException {
+ retryHelper.execute(
+ updateFactory -> {
+ try (Repository git = gitManager.openRepository(project)) {
+ CreateReviewNotes crn = reviewNotesFactory.create(db, project, git);
+ crn.createNotes(notes, monitor);
+ crn.commitNotes();
+ } catch (RepositoryNotFoundException e) {
+ stderr.println("Unable to open project: " + project.get());
+ }
+ return null;
+ },
+ RetryHelper.options()
+ .listener(
+ new RetryListener() {
+ @Override
+ public <V> void onRetry(Attempt<V> attempt) {
+ monitor.update(-notes.size());
+ }
+ })
+ .build());
}
private Map.Entry<Project.NameKey, List<ChangeNotes>> next() {
@@ -117,7 +134,7 @@
if (next != null) {
try {
export(db, next.getKey(), next.getValue());
- } catch (OrmException | IOException e) {
+ } catch (RestApiException | UpdateException e) {
stderr.println(e.getMessage());
}
} else {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
index 46331ca..17b7f81 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
@@ -15,18 +15,19 @@
package com.googlesource.gerrit.plugins.reviewnotes;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.ProjectRunnable;
import com.google.gerrit.server.git.WorkQueue;
-import com.google.gwtorm.server.OrmException;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.UpdateException;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.Inject;
-import java.io.IOException;
import java.util.concurrent.Future;
-import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
@@ -41,24 +42,27 @@
private final SchemaFactory<ReviewDb> schema;
private final GitRepositoryManager repoManager;
private final WorkQueue workQueue;
+ private final RetryHelper retryHelper;
private final boolean async;
@Inject
RefUpdateListener(
- final CreateReviewNotes.Factory reviewNotesFactory,
- final SchemaFactory<ReviewDb> schema,
- final GitRepositoryManager repoManager,
- final WorkQueue workQueue,
- @GerritServerConfig final Config config) {
+ CreateReviewNotes.Factory reviewNotesFactory,
+ SchemaFactory<ReviewDb> schema,
+ GitRepositoryManager repoManager,
+ WorkQueue workQueue,
+ RetryHelper retryHelper,
+ @GerritServerConfig Config config) {
this.reviewNotesFactory = reviewNotesFactory;
this.schema = schema;
this.repoManager = repoManager;
this.workQueue = workQueue;
+ this.retryHelper = retryHelper;
this.async = config.getBoolean("reviewnotes", null, "async", false);
}
@Override
- public void onGitReferenceUpdated(final Event e) {
+ public void onGitReferenceUpdated(Event e) {
Runnable task =
new ProjectRunnable() {
@Override
@@ -95,19 +99,26 @@
}
private void createReviewNotes(Event e) {
- Project.NameKey projectName = new Project.NameKey(e.getProjectName());
- try (Repository git = repoManager.openRepository(projectName);
- ReviewDb reviewDb = schema.open()) {
- CreateReviewNotes crn = reviewNotesFactory.create(reviewDb, projectName, git);
- if (e.getRefName().startsWith("refs/heads/")) {
- crn.createNotes(
- e.getRefName(),
- ObjectId.fromString(e.getOldObjectId()),
- ObjectId.fromString(e.getNewObjectId()),
- null);
- crn.commitNotes();
- }
- } catch (OrmException | IOException | ConcurrentRefUpdateException x) {
+ if (!e.getRefName().startsWith(RefNames.REFS_HEADS)) {
+ return;
+ }
+ try {
+ retryHelper.execute(
+ updateFactory -> {
+ Project.NameKey projectName = new Project.NameKey(e.getProjectName());
+ try (Repository git = repoManager.openRepository(projectName);
+ ReviewDb reviewDb = schema.open()) {
+ CreateReviewNotes crn = reviewNotesFactory.create(reviewDb, projectName, git);
+ crn.createNotes(
+ e.getRefName(),
+ ObjectId.fromString(e.getOldObjectId()),
+ ObjectId.fromString(e.getNewObjectId()),
+ null);
+ crn.commitNotes();
+ }
+ return null;
+ });
+ } catch (RestApiException | UpdateException x) {
log.error(x.getMessage(), x);
}
}