Provide browsing URL for GetAccess

This is so the PolyGerrit admin screen can show a link to history like
the GWT admin screen does.

Change-Id: Ida03b41469a8a785fbc0f37313565a169ce01b93
This commit is contained in:
Han-Wen Nienhuys
2018-01-30 17:21:21 +01:00
parent 06b951083b
commit 663d1890d2
4 changed files with 54 additions and 1 deletions

View File

@@ -406,6 +406,9 @@ project.
link:rest-api-groups.html#group-info[GroupInfo] objects, describing
the group UUIDs used in the `local` map. Groups that are not visible
are omitted from the `groups` map.
|`configWebLinks` ||
A list of URLs that display the history of the configuration file
governing this project's access rights.
|==================================

View File

@@ -16,6 +16,8 @@ package com.google.gerrit.extensions.api.access;
import com.google.gerrit.extensions.common.GroupInfo;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.common.WebLinkInfo;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -29,4 +31,5 @@ public class ProjectAccessInfo {
public Boolean canAdd;
public Boolean configVisible;
public Map<String, GroupInfo> groups;
public List<WebLinkInfo> configWebLinks;
}

View File

@@ -27,12 +27,14 @@ import com.google.gerrit.common.data.AccessSection;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.data.RefConfigSection;
import com.google.gerrit.common.data.WebLinkInfoCommon;
import com.google.gerrit.common.errors.NoSuchGroupException;
import com.google.gerrit.extensions.api.access.AccessSectionInfo;
import com.google.gerrit.extensions.api.access.PermissionInfo;
import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
import com.google.gerrit.extensions.common.GroupInfo;
import com.google.gerrit.extensions.common.WebLinkInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
@@ -41,6 +43,7 @@ import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.WebLinks;
import com.google.gerrit.server.account.GroupBackend;
import com.google.gerrit.server.account.GroupControl;
import com.google.gerrit.server.config.AllProjectsName;
@@ -61,6 +64,7 @@ import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -98,6 +102,7 @@ public class GetAccess implements RestReadView<ProjectResource> {
private final MetaDataUpdate.Server metaDataUpdateFactory;
private final GroupBackend groupBackend;
private final GroupJson groupJson;
private final WebLinks webLinks;
@Inject
public GetAccess(
@@ -109,7 +114,8 @@ public class GetAccess implements RestReadView<ProjectResource> {
MetaDataUpdate.Server metaDataUpdateFactory,
ProjectJson projectJson,
GroupBackend groupBackend,
GroupJson groupJson) {
GroupJson groupJson,
WebLinks webLinks) {
this.user = self;
this.permissionBackend = permissionBackend;
this.groupControlFactory = groupControlFactory;
@@ -119,6 +125,7 @@ public class GetAccess implements RestReadView<ProjectResource> {
this.metaDataUpdateFactory = metaDataUpdateFactory;
this.groupBackend = groupBackend;
this.groupJson = groupJson;
this.webLinks = webLinks;
}
public ProjectAccessInfo apply(Project.NameKey nameKey)
@@ -147,6 +154,15 @@ public class GetAccess implements RestReadView<ProjectResource> {
ProjectConfig config;
try (MetaDataUpdate md = metaDataUpdateFactory.create(projectName)) {
config = ProjectConfig.read(md);
info.configWebLinks = new ArrayList<>();
// WebLinks operates in terms of the data types used in the GWT UI. Once the GWT UI is gone,
// WebLinks should be fixed to use the extension data types.
for (WebLinkInfoCommon wl :
webLinks.getFileHistoryLinks(
projectName.get(), config.getRevision().getName(), ProjectConfig.PROJECT_CONFIG)) {
info.configWebLinks.add(new WebLinkInfo(wl.name, wl.imageUrl, wl.url, wl.target));
}
if (config.updateGroupNames(groupBackend)) {
md.setMessage("Update group names\n");

View File

@@ -33,9 +33,13 @@ import com.google.gerrit.extensions.api.projects.BranchInfo;
import com.google.gerrit.extensions.api.projects.ProjectApi;
import com.google.gerrit.extensions.client.ChangeStatus;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.WebLinkInfo;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.registration.RegistrationHandle;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.webui.FileHistoryWebLink;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.config.AllProjectsNameProvider;
@@ -43,6 +47,7 @@ import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.group.SystemGroupBackend;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Config;
@@ -63,6 +68,8 @@ public class AccessIT extends AbstractDaemonTest {
private String newProjectName;
private ProjectApi pApi;
@Inject private DynamicSet<FileHistoryWebLink> fileHistoryWebLinkDynamicSet;
@Before
public void setUp() throws Exception {
newProjectName = createProject(PROJECT_NAME).get();
@@ -75,6 +82,30 @@ public class AccessIT extends AbstractDaemonTest {
assertThat(inheritedName).isEqualTo(AllProjectsNameProvider.DEFAULT);
}
@Test
public void webLinks() throws Exception {
RegistrationHandle handle =
fileHistoryWebLinkDynamicSet.add(
new FileHistoryWebLink() {
@Override
public WebLinkInfo getFileHistoryWebLink(
String projectName, String revision, String fileName) {
WebLinkInfo info =
new WebLinkInfo(
"name", "imageURL", "http://view/" + projectName + "/" + fileName);
return info;
}
});
try {
ProjectAccessInfo info = pApi.access();
assertThat(info.configWebLinks).hasSize(1);
assertThat(info.configWebLinks.get(0).url)
.isEqualTo("http://view/" + newProjectName + "/project.config");
} finally {
handle.remove();
}
}
@Test
public void addAccessSection() throws Exception {
Project.NameKey p = new Project.NameKey(newProjectName);