Merge branch 'stable-2.13'
* stable-2.13:
Fix reviewnotes export
Change-Id: I721d822ec027db64d33ba9a9839216c90680a3d8
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/.gitignore b/.gitignore
index 47617be..7b9a01e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,4 @@
/.project
/.settings/org.maven.ide.eclipse.prefs
/.settings/org.eclipse.m2e.core.prefs
-/.buckd
-/buck-cache
-/buck-out
+*.iml
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 7bae62b..ef06de9 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,16 +1,16 @@
#Thu Jul 28 11:02:36 PDT 2011
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
diff --git a/BUCK b/BUCK
deleted file mode 100644
index b766ae2..0000000
--- a/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-gerrit_plugin(
- name = 'reviewnotes',
- srcs = glob(['src/main/java/**/*.java']),
- resources = glob(['src/main/resources/**/*']),
- manifest_entries = [
- 'Gerrit-PluginName: reviewnotes',
- 'Gerrit-Module: com.googlesource.gerrit.plugins.reviewnotes.ReviewNotesModule',
- 'Gerrit-SshModule: com.googlesource.gerrit.plugins.reviewnotes.SshModule'
- ]
-)
diff --git a/BUILD b/BUILD
new file mode 100644
index 0000000..b013399
--- /dev/null
+++ b/BUILD
@@ -0,0 +1,12 @@
+load("//tools/bzl:plugin.bzl", "gerrit_plugin")
+
+gerrit_plugin(
+ name = "reviewnotes",
+ srcs = glob(["src/main/java/**/*.java"]),
+ manifest_entries = [
+ "Gerrit-PluginName: reviewnotes",
+ "Gerrit-Module: com.googlesource.gerrit.plugins.reviewnotes.ReviewNotesModule",
+ "Gerrit-SshModule: com.googlesource.gerrit.plugins.reviewnotes.SshModule",
+ ],
+ resources = glob(["src/main/resources/**/*"]),
+)
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 249700a..69e48ca 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
@@ -40,7 +40,9 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.assistedinject.Assisted;
-
+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;
@@ -58,18 +60,12 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-
class CreateReviewNotes {
- private static final Logger log =
- LoggerFactory.getLogger(CreateReviewNotes.class);
+ private static final Logger log = LoggerFactory.getLogger(CreateReviewNotes.class);
interface Factory {
- CreateReviewNotes create(ReviewDb reviewDb, Project.NameKey project,
- Repository git);
+ CreateReviewNotes create(ReviewDb reviewDb, Project.NameKey project, Repository git);
}
private static final String REFS_NOTES_REVIEW = "refs/notes/review";
@@ -94,7 +90,8 @@
private StringBuilder message;
@Inject
- CreateReviewNotes(@GerritPersonIdent PersonIdent gerritIdent,
+ CreateReviewNotes(
+ @GerritPersonIdent PersonIdent gerritIdent,
AccountCache accountCache,
@AnonymousCowardName String anonymousCowardName,
ProjectCache projectCache,
@@ -113,9 +110,11 @@
this.anonymousCowardName = anonymousCowardName;
ProjectState projectState = projectCache.get(project);
if (projectState == null) {
- log.error("Could not obtain available labels for project "
- + project.get() + ". Expect missing labels in its review notes.");
- this.labelTypes = new LabelTypes(Collections.<LabelType> emptyList());
+ log.error(
+ "Could not obtain available labels for project "
+ + project.get()
+ + ". Expect missing labels in its review notes.");
+ this.labelTypes = new LabelTypes(Collections.<LabelType>emptyList());
} else {
this.labelTypes = projectState.getLabelTypes();
}
@@ -131,8 +130,9 @@
this.git = git;
}
- void createNotes(String branch, ObjectId oldObjectId, ObjectId newObjectId,
- ProgressMonitor monitor) throws OrmException, IOException {
+ void createNotes(
+ String branch, ObjectId oldObjectId, ObjectId newObjectId, ProgressMonitor monitor)
+ throws OrmException, IOException {
if (ObjectId.zeroId().equals(newObjectId)) {
return;
}
@@ -158,8 +158,7 @@
for (RevCommit c : rw) {
PatchSet ps = loadPatchSet(c, branch);
if (ps != null) {
- ChangeNotes notes = notesFactory.create(reviewDb, project,
- ps.getId().getParentKey());
+ ChangeNotes notes = notesFactory.create(reviewDb, project, ps.getId().getParentKey());
ObjectId content = createNoteContent(notes, ps);
if (content != null) {
monitor.update(1);
@@ -167,8 +166,8 @@
getMessage().append("* ").append(c.getShortMessage()).append("\n");
}
} else {
- log.debug("no note for this commit since it is a direct push: "
- + c.getName().substring(0, 7));
+ log.debug(
+ "no note for this commit since it is a direct push: " + c.getName().substring(0, 7));
}
}
}
@@ -183,8 +182,7 @@
for (ChangeNotes cn : notes) {
monitor.update(1);
- PatchSet ps =
- reviewDb.patchSets().get(cn.getChange().currentPatchSetId());
+ PatchSet ps = reviewDb.patchSets().get(cn.getChange().currentPatchSetId());
ObjectId commitId = ObjectId.fromString(ps.getRevision().get());
RevCommit commit = rw.parseCommit(commitId);
getNotes().set(commitId, createNoteContent(cn, ps));
@@ -200,9 +198,9 @@
}
message.insert(0, "Update notes for submitted changes\n\n");
- notesBranchUtilFactory.create(project, git, inserter)
- .commitAllNotes(reviewNotes, REFS_NOTES_REVIEW, gerritServerIdent,
- message.toString());
+ notesBranchUtilFactory
+ .create(project, git, inserter)
+ .commitAllNotes(reviewNotes, REFS_NOTES_REVIEW, gerritServerIdent, message.toString());
} finally {
if (inserter != null) {
inserter.close();
@@ -210,8 +208,7 @@
}
}
- private void markUninteresting(Repository git, String branch, RevWalk rw,
- ObjectId oldObjectId) {
+ private void markUninteresting(Repository git, String branch, RevWalk rw, ObjectId oldObjectId) {
for (final Ref r : git.getAllRefs().values()) {
try {
if (r.getName().equals(branch)) {
@@ -236,13 +233,11 @@
private ObjectId createNoteContent(ChangeNotes notes, PatchSet ps)
throws OrmException, IOException {
- HeaderFormatter fmt =
- new HeaderFormatter(gerritServerIdent.getTimeZone(), anonymousCowardName);
+ HeaderFormatter fmt = new HeaderFormatter(gerritServerIdent.getTimeZone(), anonymousCowardName);
if (ps != null) {
try {
createCodeReviewNote(notes, ps, fmt);
- return getInserter().insert(Constants.OBJ_BLOB,
- fmt.toString().getBytes("UTF-8"));
+ return getInserter().insert(Constants.OBJ_BLOB, fmt.toString().getBytes("UTF-8"));
} catch (NoSuchChangeException e) {
throw new IOException(e);
}
@@ -250,11 +245,9 @@
return null;
}
- private PatchSet loadPatchSet(RevCommit c, String destBranch)
- throws OrmException {
+ private PatchSet loadPatchSet(RevCommit c, String destBranch) throws OrmException {
String hash = c.name();
- for (ChangeData cd : queryProvider.get()
- .byBranchCommit(project.get(), destBranch, hash)) {
+ for (ChangeData cd : queryProvider.get().byBranchCommit(project.get(), destBranch, hash)) {
for (PatchSet ps : cd.patchSets()) {
if (ps.getRevision().matches(hash)) {
return ps;
@@ -264,19 +257,18 @@
return null; // TODO: createNoCodeReviewNote(branch, c, fmt);
}
- private void createCodeReviewNote(ChangeNotes notes, PatchSet ps,
- HeaderFormatter fmt) throws OrmException, NoSuchChangeException {
+ private void createCodeReviewNote(ChangeNotes notes, PatchSet ps, HeaderFormatter fmt)
+ throws OrmException, NoSuchChangeException {
// This races with the label normalization/writeback done by MergeOp. It may
// repeat some work, but results should be identical except in the case of
// an additional race with a permissions change.
// 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()));
+ 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, ctl, ps.getId())) {
if (a.getValue() == 0) {
// Ignore 0 values.
} else if (a.isLegacySubmit()) {
@@ -284,8 +276,7 @@
} else {
LabelType type = labelTypes.byLabel(a.getLabelId());
if (type != null) {
- fmt.appendApproval(type, a.getValue(),
- accountCache.get(a.getAccountId()).getAccount());
+ fmt.appendApproval(type, a.getValue(), accountCache.get(a.getAccountId()).getAccount());
}
}
}
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 e62e1fc..520ae0a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
@@ -14,9 +14,9 @@
package com.googlesource.gerrit.plugins.reviewnotes;
-import com.google.common.base.Predicate;
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.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
@@ -27,7 +27,9 @@
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.Inject;
-
+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;
@@ -35,26 +37,18 @@
import org.eclipse.jgit.lib.ThreadSafeProgressMonitor;
import org.kohsuke.args4j.Option;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
/** Export review notes for all submitted changes in all projects. */
public class ExportReviewNotes extends SshCommand {
@Option(name = "--threads", usage = "Number of concurrent threads to run")
private int threads = 2;
- @Inject
- private GitRepositoryManager gitManager;
+ @Inject private GitRepositoryManager gitManager;
- @Inject
- private SchemaFactory<ReviewDb> database;
+ @Inject private SchemaFactory<ReviewDb> database;
- @Inject
- private CreateReviewNotes.Factory reviewNotesFactory;
+ @Inject private CreateReviewNotes.Factory reviewNotesFactory;
- @Inject
- private ChangeNotes.Factory notesFactory;
+ @Inject private ChangeNotes.Factory notesFactory;
private ListMultimap<Project.NameKey, ChangeNotes> changes;
private ThreadSafeProgressMonitor monitor;
@@ -79,21 +73,19 @@
private ListMultimap<Project.NameKey, ChangeNotes> mergedChanges() {
try (ReviewDb db = database.open()) {
- return MultimapBuilder.hashKeys().arrayListValues()
- .build(notesFactory.create(db, new Predicate<ChangeNotes>() {
- @Override
- public boolean apply(ChangeNotes notes) {
- return notes.getChange().getStatus() == Change.Status.MERGED;
- }
- }));
+ return MultimapBuilder.hashKeys()
+ .arrayListValues()
+ .build(
+ notesFactory.create(
+ db, notes -> notes.getChange().getStatus() == Change.Status.MERGED));
} catch (OrmException | IOException e) {
stderr.println("Cannot read changes from database " + e.getMessage());
return ImmutableListMultimap.of();
}
}
- private void export(ReviewDb db, Project.NameKey project,
- List<ChangeNotes> notes) throws IOException, OrmException {
+ 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);
@@ -111,24 +103,8 @@
return null;
}
- final Project.NameKey name = changes.keySet().iterator().next();
- final List<ChangeNotes> list = changes.removeAll(name);
- return new Map.Entry<Project.NameKey, List<ChangeNotes>>() {
- @Override
- public Project.NameKey getKey() {
- return name;
- }
-
- @Override
- public List<ChangeNotes> getValue() {
- return list;
- }
-
- @Override
- public List<ChangeNotes> setValue(List<ChangeNotes> value) {
- throw new UnsupportedOperationException();
- }
- };
+ Project.NameKey name = changes.keySet().iterator().next();
+ return Maps.immutableEntry(name, changes.removeAll(name));
}
}
@@ -136,7 +112,7 @@
@Override
public void run() {
try (ReviewDb db = database.open()) {
- for (;;) {
+ for (; ; ) {
Map.Entry<Project.NameKey, List<ChangeNotes>> next = next();
if (next != null) {
try {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/HeaderFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/HeaderFormatter.java
index d5abf41..8633d5c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/HeaderFormatter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/HeaderFormatter.java
@@ -18,7 +18,6 @@
import com.google.gerrit.common.data.LabelValue;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
-
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
@@ -28,11 +27,10 @@
/**
* Formatters for code review note headers.
- * <p>
- * This class provides a builder like interface for building the content of a
- * code review note. After instantiation, call as many as necessary
- * <code>append...(...)</code> methods and, at the end, call the
- * {@link #toString()} method to get the built note content.
+ *
+ * <p>This class provides a builder like interface for building the content of a code review note.
+ * After instantiation, call as many as necessary <code>append...(...)</code> methods and, at the
+ * end, call the {@link #toString()} method to get the built note content.
*/
class HeaderFormatter {
@@ -41,8 +39,7 @@
private final StringBuilder sb = new StringBuilder();
HeaderFormatter(TimeZone tz, String anonymousCowardName) {
- rfc2822DateFormatter =
- new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
+ rfc2822DateFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
rfc2822DateFormatter.setCalendar(Calendar.getInstance(tz, Locale.US));
this.anonymousCowardName = anonymousCowardName;
}
@@ -51,7 +48,7 @@
sb.append("Change-Id: ").append(changeKey.get()).append("\n");
}
- void appendApproval(LabelType label, short value, Account user) {
+ void appendApproval(LabelType label, short value, Account user) {
sb.append(label.getName());
sb.append(LabelValue.formatValue(value));
sb.append(": ");
@@ -63,13 +60,13 @@
boolean needSpace = false;
boolean wroteData = false;
- if (user.getFullName() != null && ! user.getFullName().isEmpty()) {
+ if (user.getFullName() != null && !user.getFullName().isEmpty()) {
sb.append(user.getFullName());
needSpace = true;
wroteData = true;
}
- if (user.getPreferredEmail() != null && ! user.getPreferredEmail().isEmpty()) {
+ if (user.getPreferredEmail() != null && !user.getPreferredEmail().isEmpty()) {
if (needSpace) {
sb.append(" ");
}
@@ -97,13 +94,11 @@
}
void appendSubmittedAt(Date date) {
- sb.append("Submitted-at: ").append(rfc2822DateFormatter.format(date))
- .append("\n");
+ sb.append("Submitted-at: ").append(rfc2822DateFormatter.format(date)).append("\n");
}
void appendReviewedOn(String canonicalWebUrl, Change.Id changeId) {
- sb.append("Reviewed-on: ").append(canonicalWebUrl).append(changeId.get())
- .append("\n");
+ sb.append("Reviewed-on: ").append(canonicalWebUrl).append(changeId.get()).append("\n");
}
@Override
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 d798648..46331ca 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
@@ -24,7 +24,8 @@
import com.google.gwtorm.server.OrmException;
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;
@@ -32,12 +33,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
-
class RefUpdateListener implements GitReferenceUpdatedListener {
- private static final Logger log = LoggerFactory
- .getLogger(RefUpdateListener.class);
+ private static final Logger log = LoggerFactory.getLogger(RefUpdateListener.class);
private final CreateReviewNotes.Factory reviewNotesFactory;
private final SchemaFactory<ReviewDb> schema;
@@ -46,9 +44,11 @@
private final boolean async;
@Inject
- RefUpdateListener(final CreateReviewNotes.Factory reviewNotesFactory,
+ RefUpdateListener(
+ final CreateReviewNotes.Factory reviewNotesFactory,
final SchemaFactory<ReviewDb> schema,
- final GitRepositoryManager repoManager, final WorkQueue workQueue,
+ final GitRepositoryManager repoManager,
+ final WorkQueue workQueue,
@GerritServerConfig final Config config) {
this.reviewNotesFactory = reviewNotesFactory;
this.schema = schema;
@@ -59,34 +59,36 @@
@Override
public void onGitReferenceUpdated(final Event e) {
- Runnable task = new ProjectRunnable() {
- @Override
- public void run() {
- createReviewNotes(e);
- }
+ Runnable task =
+ new ProjectRunnable() {
+ @Override
+ public void run() {
+ createReviewNotes(e);
+ }
- @Override
- public Project.NameKey getProjectNameKey() {
- return new Project.NameKey(e.getProjectName());
- }
+ @Override
+ public Project.NameKey getProjectNameKey() {
+ return new Project.NameKey(e.getProjectName());
+ }
- @Override
- public String getRemoteName() {
- return null;
- }
+ @Override
+ public String getRemoteName() {
+ return null;
+ }
- @Override
- public boolean hasCustomizedPrint() {
- return true;
- }
+ @Override
+ public boolean hasCustomizedPrint() {
+ return true;
+ }
- @Override
- public String toString() {
- return "create-review-notes";
- }
- };
+ @Override
+ public String toString() {
+ return "create-review-notes";
+ }
+ };
if (async) {
- workQueue.getDefaultQueue().submit(task);
+ @SuppressWarnings("unused") // No assurance this completes.
+ Future<?> possiblyIgnoredError = workQueue.getDefaultQueue().submit(task);
} else {
task.run();
}
@@ -96,10 +98,10 @@
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);
+ CreateReviewNotes crn = reviewNotesFactory.create(reviewDb, projectName, git);
if (e.getRefName().startsWith("refs/heads/")) {
- crn.createNotes(e.getRefName(),
+ crn.createNotes(
+ e.getRefName(),
ObjectId.fromString(e.getOldObjectId()),
ObjectId.fromString(e.getNewObjectId()),
null);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ReviewNotesModule.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ReviewNotesModule.java
index a2d4f79..83c50d6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ReviewNotesModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ReviewNotesModule.java
@@ -22,8 +22,7 @@
public class ReviewNotesModule extends AbstractModule {
@Override
protected void configure() {
- DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
- .to(RefUpdateListener.class);
+ DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to(RefUpdateListener.class);
install(new FactoryModuleBuilder().build(CreateReviewNotes.Factory.class));
}
}
diff --git a/src/main/resources/Documentation/cmd-export.md b/src/main/resources/Documentation/cmd-export.md
index 7f4351d..011e51a 100644
--- a/src/main/resources/Documentation/cmd-export.md
+++ b/src/main/resources/Documentation/cmd-export.md
@@ -3,7 +3,7 @@
NAME
----
-@PLUGIN@ export - Export successful reviews to [refs/notes/review](refs-notes-review.html)
+@PLUGIN@ export - Export successful reviews to [refs/notes/review](refs-notes-review.md)
SYNOPSIS
--------