diff options
Diffstat (limited to 'gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java')
-rw-r--r-- | gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java | 133 |
1 files changed, 33 insertions, 100 deletions
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java index ef632c44bd..d782da41a1 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java @@ -14,52 +14,39 @@ package com.google.gerrit.httpd.rpc.project; -import com.google.gerrit.common.data.ApprovalType; -import com.google.gerrit.common.data.ApprovalTypes; -import com.google.gerrit.common.data.InheritedRefRight; import com.google.gerrit.common.data.ProjectDetail; import com.google.gerrit.httpd.rpc.Handler; -import com.google.gerrit.reviewdb.AccountGroup; -import com.google.gerrit.reviewdb.Project; -import com.google.gerrit.reviewdb.RefRight; -import com.google.gerrit.server.account.GroupCache; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.project.ProjectState; -import com.google.gerrit.server.project.RefControl; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; + +import java.io.IOException; class ProjectDetailFactory extends Handler<ProjectDetail> { interface Factory { ProjectDetailFactory create(@Assisted Project.NameKey name); } - private final ApprovalTypes approvalTypes; - private final GroupCache groupCache; private final ProjectControl.Factory projectControlFactory; + private final GitRepositoryManager gitRepositoryManager; private final Project.NameKey projectName; - private Map<AccountGroup.Id, AccountGroup> groups; @Inject - ProjectDetailFactory(final ApprovalTypes approvalTypes, - final GroupCache groupCache, - final ProjectControl.Factory projectControlFactory, - + ProjectDetailFactory(final ProjectControl.Factory projectControlFactory, + final GitRepositoryManager gitRepositoryManager, @Assisted final Project.NameKey name) { - this.approvalTypes = approvalTypes; - this.groupCache = groupCache; this.projectControlFactory = projectControlFactory; - + this.gitRepositoryManager = gitRepositoryManager; this.projectName = name; } @@ -72,88 +59,34 @@ class ProjectDetailFactory extends Handler<ProjectDetail> { final ProjectDetail detail = new ProjectDetail(); detail.setProject(projectState.getProject()); - groups = new HashMap<AccountGroup.Id, AccountGroup>(); - final List<InheritedRefRight> refRights = new ArrayList<InheritedRefRight>(); - - for (final RefRight r : projectState.getInheritedRights()) { - RefControl rc = pc.controlForRef(r.getRefPattern()); - boolean isOwner = rc.isOwner(); - - if (!isOwner && !rc.isVisible()) { - continue; - } - - InheritedRefRight refRight = new InheritedRefRight(r, true, isOwner); - if (!refRights.contains(refRight)) { - refRights.add(refRight); - wantGroup(r.getAccountGroupId()); - } - } - - for (final RefRight r : projectState.getLocalRights()) { - RefControl rc = pc.controlForRef(r.getRefPattern()); - boolean isOwner = rc.isOwner(); - - if (!isOwner && !rc.isVisible()) { - continue; - } - - refRights.add(new InheritedRefRight(r, false, isOwner)); - wantGroup(r.getAccountGroupId()); - } - - loadGroups(); - - Collections.sort(refRights, new Comparator<InheritedRefRight>() { - @Override - public int compare(final InheritedRefRight a, final InheritedRefRight b) { - final RefRight right1 = a.getRight(); - final RefRight right2 = b.getRight(); - int rc = categoryOf(right1).compareTo(categoryOf(right2)); - if (rc == 0) { - rc = right1.getRefPattern().compareTo(right2.getRefPattern()); - } - if (rc == 0) { - rc = groupOf(right1).compareTo(groupOf(right2)); - } - return rc; - } - - private String categoryOf(final RefRight r) { - final ApprovalType type = - approvalTypes.getApprovalType(r.getApprovalCategoryId()); - if (type == null) { - return r.getApprovalCategoryId().get(); - } - return type.getCategory().getName(); - } - - private String groupOf(final RefRight r) { - return groups.get(r.getAccountGroupId()).getName(); - } - }); - final boolean userIsOwner = pc.isOwner(); final boolean userIsOwnerAnyRef = pc.isOwnerAnyRef(); - detail.setRights(refRights); - detail.setGroups(groups); detail.setCanModifyAccess(userIsOwnerAnyRef); detail.setCanModifyAgreements(userIsOwner); detail.setCanModifyDescription(userIsOwner); detail.setCanModifyMergeType(userIsOwner); - return detail; - } - - private void wantGroup(final AccountGroup.Id id) { - groups.put(id, null); - } - - private void loadGroups() { - final Set<AccountGroup.Id> toGet = groups.keySet(); - groups = new HashMap<AccountGroup.Id, AccountGroup>(); - for (AccountGroup.Id groupId : toGet) { - groups.put(groupId, groupCache.get(groupId)); + detail.setCanModifyState(userIsOwner); + + final Project.NameKey projectName = projectState.getProject().getNameKey(); + Repository git; + try { + git = gitRepositoryManager.openRepository(projectName); + } catch (RepositoryNotFoundException err) { + throw new NoSuchProjectException(projectName); } + try { + Ref head = git.getRef(Constants.HEAD); + if (head != null && head.isSymbolic() + && GitRepositoryManager.REF_CONFIG.equals(head.getLeaf().getName())) { + detail.setPermissionOnly(true); + } + } catch (IOException err) { + throw new NoSuchProjectException(projectName); + } finally { + git.close(); + } + + return detail; } } |