Fail review command if multiple changes are selected

If a change is not uniquely identified the review
command has to fail, otherwise is not possible
to determine to which change the review has been
posted to.

Bug: Issue 320946495
Release-Notes: Fail review command if multiple changes are selected
Change-Id: Icbae6362f9915f412b1bfa7d228823fc3d32b1c7
diff --git a/java/com/google/gerrit/sshd/commands/ReviewCommand.java b/java/com/google/gerrit/sshd/commands/ReviewCommand.java
index 26dee04..21bdfbb 100644
--- a/java/com/google/gerrit/sshd/commands/ReviewCommand.java
+++ b/java/com/google/gerrit/sshd/commands/ReviewCommand.java
@@ -34,6 +34,7 @@
 import com.google.gerrit.extensions.api.changes.RestoreInput;
 import com.google.gerrit.extensions.api.changes.ReviewInput;
 import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.json.OutputFormat;
 import com.google.gerrit.server.DynamicOptions;
@@ -56,11 +57,13 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.stream.Collectors;
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.CmdLineException;
 import org.kohsuke.args4j.Option;
@@ -261,6 +264,19 @@
                         "Deprecated usage of review command: missing project for change number %d, patchset %d",
                         patchSet.id().changeId().get(), patchSet.number());
                   }
+                  int changeNumber = patchSet.id().changeId().get();
+                  String query = "change: " + changeNumber;
+                  List<ChangeInfo> changeInfos = gApi.changes().query(query).get();
+                  if (changeInfos.size() > 1) {
+                    throw die(
+                        String.format(
+                            "Multiple changes (%d) found for change number %d in projects: %s",
+                            changeInfos.size(),
+                            changeNumber,
+                            changeInfos.stream()
+                                .map(ci -> ci.project)
+                                .collect(Collectors.joining(", "))));
+                  }
                   gApi.changes()
                       .id(patchSet.id().changeId().get())
                       .revision(patchSet.number())