Merge "Fix assignee getting the owner's status on change list" into stable-2.16
diff --git a/Documentation/access-control.txt b/Documentation/access-control.txt
index d3f5d77..05c2731 100644
--- a/Documentation/access-control.txt
+++ b/Documentation/access-control.txt
@@ -1356,6 +1356,12 @@
command, but also to the web UI results pagination size.
+[[capability_readAs]]
+=== Read As
+
+Allow users to impersonate any user to see which refs they can read.
+
+
[[capability_runAs]]
=== Run As
diff --git a/WORKSPACE b/WORKSPACE
index 8ea46e3..0825969 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1091,8 +1091,8 @@
# and httpasyncclient as necessary.
maven_jar(
name = "elasticsearch-rest-client",
- artifact = "org.elasticsearch.client:elasticsearch-rest-client:6.5.0",
- sha1 = "241436d27cf65b84d17126dc7b6b947e8e2c173c",
+ artifact = "org.elasticsearch.client:elasticsearch-rest-client:6.5.1",
+ sha1 = "d87892e24ef361b9fff5435246b0f0b8f4561fe8",
)
JACKSON_VERSION = "2.9.7"
diff --git a/java/com/google/gerrit/server/change/ReviewerJson.java b/java/com/google/gerrit/server/change/ReviewerJson.java
index 6502569..ef2c926 100644
--- a/java/com/google/gerrit/server/change/ReviewerJson.java
+++ b/java/com/google/gerrit/server/change/ReviewerJson.java
@@ -23,6 +23,7 @@
import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.extensions.api.changes.ReviewerInfo;
import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.mail.Address;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
@@ -77,12 +78,15 @@
if (cd == null || !cd.getId().equals(rsrc.getChangeId())) {
cd = changeDataFactory.create(db.get(), rsrc.getChangeResource().getNotes());
}
- ReviewerInfo info =
- format(
- new ReviewerInfo(rsrc.getReviewerUser().getAccountId().get()),
- rsrc.getReviewerUser().getAccountId(),
- cd);
- loader.put(info);
+ ReviewerInfo info;
+ if (rsrc.isByEmail()) {
+ Address address = rsrc.getReviewerByEmail();
+ info = ReviewerInfo.byEmail(address.getName(), address.getEmail());
+ } else {
+ Account.Id reviewerAccountId = rsrc.getReviewerUser().getAccountId();
+ info = format(new ReviewerInfo(reviewerAccountId.get()), reviewerAccountId, cd);
+ loader.put(info);
+ }
infos.add(info);
}
loader.fill();
@@ -94,19 +98,21 @@
return format(ImmutableList.<ReviewerResource>of(rsrc));
}
- public ReviewerInfo format(ReviewerInfo out, Account.Id reviewer, ChangeData cd)
+ public ReviewerInfo format(ReviewerInfo out, Account.Id reviewerAccountId, ChangeData cd)
throws OrmException, PermissionBackendException {
PatchSet.Id psId = cd.change().currentPatchSetId();
return format(
out,
- reviewer,
+ reviewerAccountId,
cd,
- approvalsUtil.byPatchSetUser(
- db.get(), cd.notes(), psId, new Account.Id(out._accountId), null, null));
+ approvalsUtil.byPatchSetUser(db.get(), cd.notes(), psId, reviewerAccountId, null, null));
}
public ReviewerInfo format(
- ReviewerInfo out, Account.Id reviewer, ChangeData cd, Iterable<PatchSetApproval> approvals)
+ ReviewerInfo out,
+ Account.Id reviewerAccountId,
+ ChangeData cd,
+ Iterable<PatchSetApproval> approvals)
throws OrmException, PermissionBackendException {
LabelTypes labelTypes = cd.getLabelTypes();
@@ -123,7 +129,7 @@
PatchSet ps = cd.currentPatchSet();
if (ps != null) {
PermissionBackend.ForChange perm =
- permissionBackend.absentUser(reviewer).database(db).change(cd);
+ permissionBackend.absentUser(reviewerAccountId).database(db).change(cd);
for (SubmitRecord rec : submitRuleEvaluator.evaluate(cd)) {
if (rec.labels == null) {
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
index 257c88b..dc71c1f 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
@@ -22,8 +22,8 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.extensions.api.changes.AddReviewerInput;
import com.google.gerrit.extensions.api.changes.AddReviewerResult;
import com.google.gerrit.extensions.api.changes.ReviewInput;
@@ -35,11 +35,12 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.mail.Address;
import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gson.reflect.TypeToken;
+import java.lang.reflect.Type;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
-@NoHttpd
public class ChangeReviewersByEmailIT extends AbstractDaemonTest {
@Before
@@ -96,6 +97,34 @@
}
@Test
+ public void listReviewersByEmail() throws Exception {
+ assume().that(notesMigration.readChanges()).isTrue();
+ AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+ for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+ PushOneCommit.Result r = createChange();
+
+ AddReviewerInput input = new AddReviewerInput();
+ input.reviewer = toRfcAddressString(acc);
+ input.state = state;
+ gApi.changes().id(r.getChangeId()).addReviewer(input);
+
+ RestResponse restResponse =
+ adminRestSession.get("/changes/" + r.getChangeId() + "/reviewers/");
+ restResponse.assertOK();
+ Type type = new TypeToken<List<ReviewerInfo>>() {}.getType();
+ List<ReviewerInfo> reviewers = newGson().fromJson(restResponse.getReader(), type);
+ restResponse.consume();
+
+ assertThat(reviewers).hasSize(1);
+ ReviewerInfo reviewerInfo = Iterables.getOnlyElement(reviewers);
+ assertThat(reviewerInfo._accountId).isNull();
+ assertThat(reviewerInfo.name).isEqualTo(acc.name);
+ assertThat(reviewerInfo.email).isEqualTo(acc.email);
+ }
+ }
+
+ @Test
public void removeByEmail() throws Exception {
assume().that(notesMigration.readChanges()).isTrue();
AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
index c3150f1..0b5ef6e 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
@@ -53,7 +53,7 @@
case V6_4:
return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.3";
case V6_5:
- return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.0";
+ return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.1";
}
throw new IllegalStateException("No tests for version: " + version.name());
}
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.js b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.js
index 6443095..77a1e2a 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.js
+++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.js
@@ -307,9 +307,9 @@
commands.push({
title,
command: commandObj[title]
- .replace('${project}', repo)
+ .replace('${project}', encodeURI(repo))
.replace('${project-base-name}',
- repo.substring(repo.lastIndexOf('/') + 1)),
+ encodeURI(repo.substring(repo.lastIndexOf('/') + 1))),
});
}
return commands;