Merge "Remove ProjectCache#checkedGet and move callers to #get"
* submodules: * Update plugins/gitiles from branch 'master' to 7793e45da5259cc4aad1add2e4aa20673a95057d - Adapt to ProjectCache interface change Change-Id: I667b6e203e6ca22326c1be232d72ecd7b91823d2 * Update plugins/replication from branch 'master' to f475ca45428ce3a1432bf09a24c84c52c9f5bc91 - Adapt to ProjectCache interface change Change-Id: I8ae19e4d2914230536ba932fba18b9c923859f77
This commit is contained in:
commit
0d78fbdf95
@ -23,6 +23,7 @@ import static com.google.common.truth.TruthJUnit.assume;
|
||||
import static com.google.gerrit.entities.Patch.COMMIT_MSG;
|
||||
import static com.google.gerrit.entities.Patch.MERGE_LIST;
|
||||
import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static com.google.gerrit.server.project.testing.TestLabels.label;
|
||||
import static com.google.gerrit.server.project.testing.TestLabels.value;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
@ -1185,9 +1186,8 @@ public abstract class AbstractDaemonTest {
|
||||
GroupReference groupReference,
|
||||
String ref,
|
||||
boolean exclusive,
|
||||
String... permissionNames)
|
||||
throws IOException {
|
||||
ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
|
||||
String... permissionNames) {
|
||||
ProjectConfig cfg = projectCache.get(project).orElseThrow(illegalState(project)).getConfig();
|
||||
AccessSection accessSection = cfg.getAccessSection(ref);
|
||||
assertThat(accessSection).isNotNull();
|
||||
for (String permissionName : permissionNames) {
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.acceptance;
|
||||
|
||||
import static com.google.gerrit.server.git.receive.LazyPostReceiveHookChain.affectsSize;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static com.google.gerrit.server.quota.QuotaGroupDefinitions.REPOSITORY_SIZE_GROUP;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
@ -241,15 +242,8 @@ class InProcessProtocol extends TestProtocol<Context> {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
ProjectState projectState;
|
||||
try {
|
||||
projectState = projectCache.checkedGet(req.project);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
if (projectState == null) {
|
||||
throw new RuntimeException("can't load project state for " + req.project.get());
|
||||
}
|
||||
ProjectState projectState =
|
||||
projectCache.get(req.project).orElseThrow(illegalState(req.project));
|
||||
Repository permissionAwareRepository = PermissionAwareRepositoryManager.wrap(repo, perm);
|
||||
UploadPack up = new UploadPack(permissionAwareRepository);
|
||||
up.setPackConfig(transferConfig.getPackConfig());
|
||||
@ -320,10 +314,11 @@ class InProcessProtocol extends TestProtocol<Context> {
|
||||
}
|
||||
try {
|
||||
IdentifiedUser identifiedUser = userProvider.get().asIdentifiedUser();
|
||||
ProjectState projectState = projectCache.checkedGet(req.project);
|
||||
if (projectState == null) {
|
||||
throw new RuntimeException(String.format("project %s not found", req.project));
|
||||
}
|
||||
ProjectState projectState =
|
||||
projectCache
|
||||
.get(req.project)
|
||||
.orElseThrow(
|
||||
() -> new RuntimeException(String.format("project %s not found", req.project)));
|
||||
|
||||
AsyncReceiveCommits arc = factory.create(projectState, identifiedUser, db, null);
|
||||
if (arc.canUpload() != Capable.OK) {
|
||||
|
@ -285,8 +285,11 @@ public class GitOverHttpServlet extends GitServlet {
|
||||
|
||||
try {
|
||||
Project.NameKey nameKey = Project.nameKey(projectName);
|
||||
ProjectState state = projectCache.checkedGet(nameKey);
|
||||
if (state == null || !state.statePermitsRead()) {
|
||||
ProjectState state =
|
||||
projectCache
|
||||
.get(nameKey)
|
||||
.orElseThrow(() -> new RepositoryNotFoundException(nameKey.get()));
|
||||
if (!state.statePermitsRead()) {
|
||||
throw new RepositoryNotFoundException(nameKey.get());
|
||||
}
|
||||
req.setAttribute(ATT_STATE, state);
|
||||
|
@ -413,15 +413,15 @@ class GitwebServlet extends HttpServlet {
|
||||
}
|
||||
|
||||
Project.NameKey nameKey = Project.nameKey(name);
|
||||
ProjectState projectState;
|
||||
Optional<ProjectState> projectState;
|
||||
try {
|
||||
projectState = projectCache.checkedGet(nameKey);
|
||||
if (projectState == null) {
|
||||
projectState = projectCache.get(nameKey);
|
||||
if (!projectState.isPresent()) {
|
||||
sendErrorOrRedirect(req, rsp, HttpServletResponse.SC_NOT_FOUND);
|
||||
return;
|
||||
}
|
||||
|
||||
projectState.checkStatePermitsRead();
|
||||
projectState.get().checkStatePermitsRead();
|
||||
permissionBackend.user(userProvider.get()).project(nameKey).check(ProjectPermission.READ);
|
||||
} catch (AuthException e) {
|
||||
sendErrorOrRedirect(req, rsp, HttpServletResponse.SC_NOT_FOUND);
|
||||
@ -437,7 +437,7 @@ class GitwebServlet extends HttpServlet {
|
||||
|
||||
try (Repository repo = repoManager.openRepository(nameKey)) {
|
||||
CacheHeaders.setNotCacheable(rsp);
|
||||
exec(req, rsp, projectState);
|
||||
exec(req, rsp, projectState.get());
|
||||
} catch (RepositoryNotFoundException e) {
|
||||
getServletContext().log("Cannot open repository", e);
|
||||
rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.httpd.raw;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.gerrit.entities.Change;
|
||||
import com.google.gerrit.entities.Patch;
|
||||
import com.google.gerrit.entities.PatchSet;
|
||||
@ -123,7 +125,10 @@ public class CatServlet extends HttpServlet {
|
||||
try {
|
||||
ChangeNotes notes = changeNotesFactory.createChecked(changeId);
|
||||
permissionBackend.currentUser().change(notes).check(ChangePermission.READ);
|
||||
projectCache.checkedGet(notes.getProjectName()).checkStatePermitsRead();
|
||||
projectCache
|
||||
.get(notes.getProjectName())
|
||||
.orElseThrow(illegalState(notes.getProjectName()))
|
||||
.checkStatePermitsRead();
|
||||
if (patchKey.patchSetId().get() == 0) {
|
||||
// change edit
|
||||
Optional<ChangeEdit> edit = changeEditUtil.byChange(notes);
|
||||
|
@ -16,6 +16,7 @@ package com.google.gerrit.server;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.collect.HashBasedTable;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
@ -83,7 +84,10 @@ public class ApprovalInference {
|
||||
.changeId(notes.load().getChangeId().get())
|
||||
.patchSetId(psId.get())
|
||||
.build())) {
|
||||
project = projectCache.checkedGet(notes.getProjectName());
|
||||
project =
|
||||
projectCache
|
||||
.get(notes.getProjectName())
|
||||
.orElseThrow(illegalState(notes.getProjectName()));
|
||||
Collection<PatchSetApproval> approvals =
|
||||
getForPatchSetWithoutNormalization(notes, project, psId, rw, repoConfig);
|
||||
return labelNormalizer.normalize(notes, approvals).getNormalized();
|
||||
|
@ -17,6 +17,7 @@ package com.google.gerrit.server;
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
|
||||
import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
@ -49,7 +50,6 @@ import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.util.LabelVote;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
@ -220,14 +220,17 @@ public class ApprovalsUtil {
|
||||
|
||||
private boolean canSee(ChangeNotes notes, Account.Id accountId) {
|
||||
try {
|
||||
if (!projectCache.checkedGet(notes.getProjectName()).statePermitsRead()) {
|
||||
if (!projectCache
|
||||
.get(notes.getProjectName())
|
||||
.orElseThrow(illegalState(notes.getProjectName()))
|
||||
.statePermitsRead()) {
|
||||
return false;
|
||||
}
|
||||
permissionBackend.absentUser(accountId).change(notes).check(ChangePermission.READ);
|
||||
return true;
|
||||
} catch (AuthException e) {
|
||||
return false;
|
||||
} catch (IOException | PermissionBackendException e) {
|
||||
} catch (PermissionBackendException e) {
|
||||
logger.atWarning().withCause(e).log(
|
||||
"Failed to check if account %d can see change %d",
|
||||
accountId.get(), notes.getChangeId().get());
|
||||
|
@ -14,7 +14,6 @@
|
||||
|
||||
package com.google.gerrit.server;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
@ -79,12 +78,8 @@ public class CreateGroupPermissionSyncer implements ChangeMergedListener {
|
||||
* refs/groups/*}.
|
||||
*/
|
||||
public void syncIfNeeded() throws IOException, ConfigInvalidException {
|
||||
ProjectState allProjectsState = projectCache.checkedGet(allProjects);
|
||||
requireNonNull(
|
||||
allProjectsState, () -> String.format("Can't obtain project state for %s", allProjects));
|
||||
ProjectState allUsersState = projectCache.checkedGet(allUsers);
|
||||
requireNonNull(
|
||||
allUsersState, () -> String.format("Can't obtain project state for %s", allUsers));
|
||||
ProjectState allProjectsState = projectCache.getAllProjects();
|
||||
ProjectState allUsersState = projectCache.getAllUsers();
|
||||
|
||||
Set<PermissionRule> createGroupsGlobal =
|
||||
new HashSet<>(allProjectsState.getCapabilityCollection().createGroup);
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
import com.google.common.collect.ImmutableCollection;
|
||||
@ -145,9 +146,8 @@ public class PatchSetUtil {
|
||||
return false;
|
||||
}
|
||||
|
||||
ProjectState projectState = projectCache.checkedGet(notes.getProjectName());
|
||||
requireNonNull(
|
||||
projectState, () -> String.format("Failed to load project %s", notes.getProjectName()));
|
||||
ProjectState projectState =
|
||||
projectCache.get(notes.getProjectName()).orElseThrow(illegalState(notes.getProjectName()));
|
||||
|
||||
ApprovalsUtil approvalsUtil = approvalsUtilProvider.get();
|
||||
for (PatchSetApproval ap :
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.account;
|
||||
|
||||
import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
||||
import static com.google.gerrit.server.project.ProjectCache.noSuchProject;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.collect.Streams;
|
||||
@ -106,11 +107,7 @@ public class GroupMembers {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
ProjectState projectState = projectCache.checkedGet(project);
|
||||
if (projectState == null) {
|
||||
throw new NoSuchProjectException(project);
|
||||
}
|
||||
|
||||
ProjectState projectState = projectCache.get(project).orElseThrow(noSuchProject(project));
|
||||
final HashSet<Account> projectOwners = new HashSet<>();
|
||||
for (AccountGroup.UUID ownerGroup : projectState.getAllOwners()) {
|
||||
if (!seen.contains(ownerGroup)) {
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.api.projects;
|
||||
|
||||
import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.gerrit.common.Nullable;
|
||||
import com.google.gerrit.extensions.api.projects.LabelApi;
|
||||
@ -78,7 +79,11 @@ public class LabelApiImpl implements LabelApi {
|
||||
// recreate project resource because project state was updated by creating the new label and
|
||||
// needs to be reloaded
|
||||
project =
|
||||
new ProjectResource(projectCache.checkedGet(project.getNameKey()), project.getUser());
|
||||
new ProjectResource(
|
||||
projectCache
|
||||
.get(project.getNameKey())
|
||||
.orElseThrow(illegalState(project.getNameKey())),
|
||||
project.getUser());
|
||||
return this;
|
||||
} catch (Exception e) {
|
||||
throw asRestApiException("Cannot create branch", e);
|
||||
|
@ -28,7 +28,7 @@ import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.assistedinject.Assisted;
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
import org.kohsuke.args4j.CmdLineException;
|
||||
import org.kohsuke.args4j.CmdLineParser;
|
||||
import org.kohsuke.args4j.OptionDef;
|
||||
@ -74,10 +74,10 @@ public class ProjectHandler extends OptionHandler<ProjectState> {
|
||||
String nameWithoutSuffix = ProjectUtil.stripGitSuffix(projectName);
|
||||
Project.NameKey nameKey = Project.nameKey(nameWithoutSuffix);
|
||||
|
||||
ProjectState state;
|
||||
Optional<ProjectState> state;
|
||||
try {
|
||||
state = projectCache.checkedGet(nameKey);
|
||||
if (state == null) {
|
||||
state = projectCache.get(nameKey);
|
||||
if (!state.isPresent()) {
|
||||
throw new CmdLineException(owner, localizable("project %s not found"), nameWithoutSuffix);
|
||||
}
|
||||
// Hidden projects(permitsRead = false) should only be accessible by the project owners.
|
||||
@ -85,18 +85,18 @@ public class ProjectHandler extends OptionHandler<ProjectState> {
|
||||
// be allowed for other users). Allowing project owners to access here will help them to view
|
||||
// and update the config of hidden projects easily.
|
||||
ProjectPermission permissionToCheck =
|
||||
state.statePermitsRead() ? ProjectPermission.ACCESS : ProjectPermission.READ_CONFIG;
|
||||
state.get().statePermitsRead() ? ProjectPermission.ACCESS : ProjectPermission.READ_CONFIG;
|
||||
permissionBackend.currentUser().project(nameKey).check(permissionToCheck);
|
||||
} catch (AuthException e) {
|
||||
throw new CmdLineException(
|
||||
owner, localizable(new NoSuchProjectException(nameKey, e).getMessage()));
|
||||
} catch (PermissionBackendException | IOException e) {
|
||||
} catch (PermissionBackendException e) {
|
||||
logger.atWarning().withCause(e).log("Cannot load project %s", nameWithoutSuffix);
|
||||
throw new CmdLineException(
|
||||
owner, localizable(new NoSuchProjectException(nameKey).getMessage()));
|
||||
}
|
||||
|
||||
setter.addValue(state);
|
||||
setter.addValue(state.get());
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkState;
|
||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
import static com.google.gerrit.extensions.client.ReviewerState.CC;
|
||||
import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
@ -175,7 +176,10 @@ public class AddReviewersOp implements BatchUpdateOp {
|
||||
approvalsUtil.addReviewers(
|
||||
ctx.getNotes(),
|
||||
ctx.getUpdate(change.currentPatchSetId()),
|
||||
projectCache.checkedGet(change.getProject()).getLabelTypes(change.getDest()),
|
||||
projectCache
|
||||
.get(change.getProject())
|
||||
.orElseThrow(illegalState(change.getProject()))
|
||||
.getLabelTypes(change.getDest()),
|
||||
change,
|
||||
accountIds);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
||||
import static com.google.gerrit.entities.Change.INITIAL_PATCH_SET_ID;
|
||||
import static com.google.gerrit.server.change.ReviewerAdder.newAddReviewerInputFromCommitIdentity;
|
||||
import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
import com.google.common.base.MoreObjects;
|
||||
@ -359,7 +360,7 @@ public class ChangeInserter implements InsertChangeOp {
|
||||
@Override
|
||||
public void updateRepo(RepoContext ctx) throws ResourceConflictException, IOException {
|
||||
cmd = new ReceiveCommand(ObjectId.zeroId(), commitId, psId.toRefName());
|
||||
projectState = projectCache.checkedGet(ctx.getProject());
|
||||
projectState = projectCache.get(ctx.getProject()).orElseThrow(illegalState(ctx.getProject()));
|
||||
validate(ctx);
|
||||
if (!updateRef) {
|
||||
return;
|
||||
|
@ -14,10 +14,10 @@
|
||||
|
||||
package com.google.gerrit.server.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
import com.google.common.base.MoreObjects;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
import com.google.common.hash.Hasher;
|
||||
import com.google.common.hash.Hashing;
|
||||
@ -47,7 +47,6 @@ import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.google.inject.assistedinject.Assisted;
|
||||
import java.io.IOException;
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
@ -189,14 +188,8 @@ public class ChangeResource implements RestResource, HasETag {
|
||||
// TODO(dborowitz): Include more NoteDb and other related refs, e.g. drafts
|
||||
// and edits.
|
||||
|
||||
Iterable<ProjectState> projectStateTree;
|
||||
try {
|
||||
projectStateTree = projectCache.checkedGet(getProject()).tree();
|
||||
} catch (IOException e) {
|
||||
logger.atSevere().log("could not load project %s while computing etag", getProject());
|
||||
projectStateTree = ImmutableList.of();
|
||||
}
|
||||
|
||||
Iterable<ProjectState> projectStateTree =
|
||||
projectCache.get(getProject()).orElseThrow(illegalState(getProject())).tree();
|
||||
for (ProjectState p : projectStateTree) {
|
||||
hashObjectId(h, p.getConfig().getRevision(), buf);
|
||||
}
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
import com.google.gerrit.common.data.LabelType;
|
||||
@ -118,7 +120,11 @@ public class DeleteReviewerOp implements BatchUpdateOp {
|
||||
currChange = ctx.getChange();
|
||||
currPs = psUtil.current(ctx.getNotes());
|
||||
|
||||
LabelTypes labelTypes = projectCache.checkedGet(ctx.getProject()).getLabelTypes(ctx.getNotes());
|
||||
LabelTypes labelTypes =
|
||||
projectCache
|
||||
.get(ctx.getProject())
|
||||
.orElseThrow(illegalState(ctx.getProject()))
|
||||
.getLabelTypes(ctx.getNotes());
|
||||
// removing a reviewer will remove all her votes
|
||||
for (LabelType lt : labelTypes.getLabelTypes()) {
|
||||
newApprovals.put(lt.getName(), (short) 0);
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.change;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
@ -86,7 +87,11 @@ public class LabelNormalizer {
|
||||
List<PatchSetApproval> unchanged = Lists.newArrayListWithCapacity(approvals.size());
|
||||
List<PatchSetApproval> updated = Lists.newArrayListWithCapacity(approvals.size());
|
||||
List<PatchSetApproval> deleted = Lists.newArrayListWithCapacity(approvals.size());
|
||||
LabelTypes labelTypes = projectCache.checkedGet(notes.getProjectName()).getLabelTypes(notes);
|
||||
LabelTypes labelTypes =
|
||||
projectCache
|
||||
.get(notes.getProjectName())
|
||||
.orElseThrow(illegalState(notes.getProjectName()))
|
||||
.getLabelTypes(notes);
|
||||
for (PatchSetApproval psa : approvals) {
|
||||
Change.Id changeId = psa.key().patchSetId().changeId();
|
||||
checkArgument(
|
||||
|
@ -17,6 +17,7 @@ package com.google.gerrit.server.change;
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
|
||||
import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
@ -297,7 +298,10 @@ public class PatchSetInserter implements BatchUpdateOp {
|
||||
if (checkAddPatchSetPermission) {
|
||||
permissionBackend.user(ctx.getUser()).change(origNotes).check(ChangePermission.ADD_PATCH_SET);
|
||||
}
|
||||
projectCache.checkedGet(ctx.getProject()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(ctx.getProject())
|
||||
.orElseThrow(illegalState(ctx.getProject()))
|
||||
.checkStatePermitsWrite();
|
||||
if (!validate) {
|
||||
return;
|
||||
}
|
||||
@ -309,7 +313,10 @@ public class PatchSetInserter implements BatchUpdateOp {
|
||||
ObjectId.zeroId(),
|
||||
commitId,
|
||||
refName.substring(0, refName.lastIndexOf('/') + 1) + "new"),
|
||||
projectCache.checkedGet(origNotes.getProjectName()).getProject(),
|
||||
projectCache
|
||||
.get(origNotes.getProjectName())
|
||||
.orElseThrow(illegalState(origNotes.getProjectName()))
|
||||
.getProject(),
|
||||
origNotes.getChange().getDest().branch(),
|
||||
ctx.getRevWalk().getObjectReader(),
|
||||
commitId,
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.change;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.gerrit.entities.PatchSet;
|
||||
import com.google.gerrit.extensions.restapi.MergeConflictException;
|
||||
@ -233,8 +234,9 @@ public class RebaseChangeOp implements BatchUpdateOp {
|
||||
return rebasedPatchSet;
|
||||
}
|
||||
|
||||
private MergeUtil newMergeUtil() throws IOException {
|
||||
ProjectState project = projectCache.checkedGet(notes.getProjectName());
|
||||
private MergeUtil newMergeUtil() {
|
||||
ProjectState project =
|
||||
projectCache.get(notes.getProjectName()).orElseThrow(illegalState(notes.getProjectName()));
|
||||
return forceContentMerge
|
||||
? mergeUtilFactory.create(project, true)
|
||||
: mergeUtilFactory.create(project);
|
||||
|
@ -20,6 +20,7 @@ import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
||||
import static com.google.gerrit.extensions.client.ReviewerState.CC;
|
||||
import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.Comparator.comparing;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
@ -203,7 +204,8 @@ public class ReviewerAdder {
|
||||
boolean confirmed = input.confirmed();
|
||||
boolean allowByEmail =
|
||||
projectCache
|
||||
.checkedGet(notes.getProjectName())
|
||||
.get(notes.getProjectName())
|
||||
.orElseThrow(illegalState(notes.getProjectName()))
|
||||
.is(BooleanProjectConfig.ENABLE_REVIEWER_BY_EMAIL);
|
||||
|
||||
ReviewerAddition byAccountId = addByAccountId(input, notes, user);
|
||||
|
@ -365,11 +365,8 @@ public class RevisionJson {
|
||||
} catch (AuthException ae) {
|
||||
return false;
|
||||
}
|
||||
ProjectState projectState = projectCache.checkedGet(cd.project());
|
||||
if (projectState == null) {
|
||||
logger.atSevere().log("project state for project %s is null", cd.project());
|
||||
return false;
|
||||
}
|
||||
ProjectState projectState =
|
||||
projectCache.get(cd.project()).orElseThrow(illegalState(cd.project()));
|
||||
return projectState.statePermitsRead();
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.edit;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.gerrit.entities.Change;
|
||||
import com.google.gerrit.entities.PatchSet;
|
||||
@ -426,7 +428,10 @@ public class ChangeEditModifier {
|
||||
patchSetUtil.checkPatchSetNotLocked(notes);
|
||||
try {
|
||||
permissionBackend.currentUser().change(notes).check(ChangePermission.ADD_PATCH_SET);
|
||||
projectCache.checkedGet(notes.getProjectName()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(notes.getProjectName())
|
||||
.orElseThrow(illegalState(notes.getProjectName()))
|
||||
.checkStatePermitsWrite();
|
||||
} catch (AuthException denied) {
|
||||
throw new AuthException("edit not permitted", denied);
|
||||
}
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.git;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.cache.CacheLoader;
|
||||
@ -178,7 +180,7 @@ public class PureRevertCache {
|
||||
// Rebase claimed revert onto claimed original
|
||||
ThreeWayMerger merger =
|
||||
mergeUtilFactory
|
||||
.create(projectCache.checkedGet(project))
|
||||
.create(projectCache.get(project).orElseThrow(illegalState(project)))
|
||||
.newThreeWayMerger(oi, repo.getConfig());
|
||||
merger.setBase(claimedRevertCommit.getParent(0));
|
||||
boolean success = merger.merge(claimedRevertCommit, claimedOriginalCommit);
|
||||
|
@ -21,6 +21,7 @@ import static com.google.gerrit.server.change.ReviewerAdder.newAddReviewerInputF
|
||||
import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromFooters;
|
||||
import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromReviewers;
|
||||
import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static org.eclipse.jgit.lib.Constants.R_HEADS;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
@ -549,7 +550,11 @@ public class ReplaceOp implements BatchUpdateOp {
|
||||
* show a transition from an oldValue of 0 to the new value.
|
||||
*/
|
||||
List<LabelType> labels =
|
||||
projectCache.checkedGet(ctx.getProject()).getLabelTypes(notes).getLabelTypes();
|
||||
projectCache
|
||||
.get(ctx.getProject())
|
||||
.orElseThrow(illegalState(ctx.getProject()))
|
||||
.getLabelTypes(notes)
|
||||
.getLabelTypes();
|
||||
Map<String, Short> allApprovals = new HashMap<>();
|
||||
Map<String, Short> oldApprovals = new HashMap<>();
|
||||
for (LabelType lt : labels) {
|
||||
|
@ -18,6 +18,7 @@ import static com.google.common.base.Preconditions.checkState;
|
||||
import static com.google.gerrit.entities.Change.CHANGE_ID_PATTERN;
|
||||
import static com.google.gerrit.entities.RefNames.REFS_CHANGES;
|
||||
import static com.google.gerrit.entities.RefNames.REFS_CONFIG;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
@ -144,7 +145,8 @@ public class CommitValidators {
|
||||
boolean skipValidation)
|
||||
throws IOException {
|
||||
PermissionBackend.ForRef perm = forProject.ref(branch.branch());
|
||||
ProjectState projectState = projectCache.checkedGet(branch.project());
|
||||
ProjectState projectState =
|
||||
projectCache.get(branch.project()).orElseThrow(illegalState(branch.project()));
|
||||
return new CommitValidators(
|
||||
ImmutableList.of(
|
||||
new UploadMergesPermissionValidator(perm),
|
||||
@ -173,7 +175,8 @@ public class CommitValidators {
|
||||
@Nullable Change change)
|
||||
throws IOException {
|
||||
PermissionBackend.ForRef perm = forProject.ref(branch.branch());
|
||||
ProjectState projectState = projectCache.checkedGet(branch.project());
|
||||
ProjectState projectState =
|
||||
projectCache.get(branch.project()).orElseThrow(illegalState(branch.project()));
|
||||
return new CommitValidators(
|
||||
ImmutableList.of(
|
||||
new UploadMergesPermissionValidator(perm),
|
||||
@ -181,7 +184,7 @@ public class CommitValidators {
|
||||
new AmendedGerritMergeCommitValidationListener(perm, gerritIdent),
|
||||
new AuthorUploaderValidator(user, perm, urlFormatter.get()),
|
||||
new FileCountValidator(patchListCache, config),
|
||||
new SignedOffByValidator(user, perm, projectCache.checkedGet(branch.project())),
|
||||
new SignedOffByValidator(user, perm, projectState),
|
||||
new ChangeIdValidator(
|
||||
projectState, user, urlFormatter.get(), config, sshInfo, change),
|
||||
new ConfigValidator(projectConfigFactory, branch, user, rw, allUsers, allProjects),
|
||||
@ -208,10 +211,12 @@ public class CommitValidators {
|
||||
// - Plugin validators may do things like require certain commit message
|
||||
// formats, so we play it safe and exclude them.
|
||||
PermissionBackend.ForRef perm = forProject.ref(branch.branch());
|
||||
ProjectState projectState =
|
||||
projectCache.get(branch.project()).orElseThrow(illegalState(branch.project()));
|
||||
return new CommitValidators(
|
||||
ImmutableList.of(
|
||||
new UploadMergesPermissionValidator(perm),
|
||||
new ProjectStateValidationListener(projectCache.checkedGet(branch.project())),
|
||||
new ProjectStateValidationListener(projectState),
|
||||
new AuthorUploaderValidator(user, perm, urlFormatter.get()),
|
||||
new CommitterUploaderValidator(user, perm, urlFormatter.get())));
|
||||
}
|
||||
|
@ -47,6 +47,7 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
|
||||
import com.google.gerrit.server.project.InvalidChangeOperationException;
|
||||
import com.google.gerrit.server.project.NoSuchChangeException;
|
||||
import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.inject.Provider;
|
||||
import com.google.inject.assistedinject.Assisted;
|
||||
import com.google.inject.assistedinject.AssistedInject;
|
||||
@ -196,7 +197,10 @@ public class PatchScriptFactory implements Callable<PatchScript> {
|
||||
throw new NoSuchChangeException(changeId, e);
|
||||
}
|
||||
|
||||
if (!projectCache.checkedGet(notes.getProjectName()).statePermitsRead()) {
|
||||
if (!projectCache
|
||||
.get(notes.getProjectName())
|
||||
.map(ProjectState::statePermitsRead)
|
||||
.orElse(false)) {
|
||||
throw new NoSuchChangeException(changeId);
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,7 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
|
||||
import com.google.gerrit.server.project.InvalidChangeOperationException;
|
||||
import com.google.gerrit.server.project.NoSuchChangeException;
|
||||
import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.inject.Provider;
|
||||
import com.google.inject.assistedinject.Assisted;
|
||||
import com.google.inject.assistedinject.AssistedInject;
|
||||
@ -102,7 +103,10 @@ public class PatchScriptFactoryForAutoFix implements Callable<PatchScript> {
|
||||
throw new NoSuchChangeException(changeId, e);
|
||||
}
|
||||
|
||||
if (!projectCache.checkedGet(notes.getProjectName()).statePermitsRead()) {
|
||||
if (!projectCache
|
||||
.get(notes.getProjectName())
|
||||
.map(ProjectState::statePermitsRead)
|
||||
.orElse(false)) {
|
||||
throw new NoSuchChangeException(changeId);
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.permissions;
|
||||
|
||||
import static com.google.gerrit.server.permissions.DefaultPermissionMappings.globalPermissionName;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static java.util.stream.Collectors.toSet;
|
||||
|
||||
@ -103,7 +104,7 @@ public class DefaultPermissionBackend extends PermissionBackend {
|
||||
@Override
|
||||
public ForProject project(Project.NameKey project) {
|
||||
try {
|
||||
ProjectState state = projectCache.checkedGet(project);
|
||||
ProjectState state = projectCache.get(project).orElseThrow(illegalState(project));
|
||||
ProjectControl control =
|
||||
PerThreadCache.getOrCompute(
|
||||
PerThreadCache.Key.create(ProjectControl.class, project, user.getCacheKey()),
|
||||
|
@ -78,11 +78,8 @@ public class ContributorAgreementsChecker {
|
||||
public void check(Project.NameKey project, CurrentUser user) throws IOException, AuthException {
|
||||
metrics.claCheckCount.increment();
|
||||
|
||||
ProjectState projectState = projectCache.checkedGet(project);
|
||||
if (projectState == null) {
|
||||
throw new IOException("Can't load All-Projects");
|
||||
}
|
||||
|
||||
ProjectState projectState =
|
||||
projectCache.get(project).orElseThrow(() -> new IOException("Can't load " + project));
|
||||
if (!projectState.is(BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS)) {
|
||||
return;
|
||||
}
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.project;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.noSuchProject;
|
||||
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
import com.google.gerrit.entities.BranchNameKey;
|
||||
import com.google.gerrit.entities.Project;
|
||||
@ -67,10 +69,8 @@ public class CreateRefControl {
|
||||
Provider<? extends CurrentUser> user, Repository repo, BranchNameKey branch, RevObject object)
|
||||
throws AuthException, PermissionBackendException, NoSuchProjectException, IOException,
|
||||
ResourceConflictException {
|
||||
ProjectState ps = projectCache.checkedGet(branch.project());
|
||||
if (ps == null) {
|
||||
throw new NoSuchProjectException(branch.project());
|
||||
}
|
||||
ProjectState ps =
|
||||
projectCache.get(branch.project()).orElseThrow(noSuchProject(branch.project()));
|
||||
ps.checkStatePermitsWrite();
|
||||
|
||||
PermissionBackend.ForRef perm = permissionBackend.user(user.get()).ref(branch);
|
||||
|
@ -55,21 +55,9 @@ public interface ProjectCache {
|
||||
* @return an {@link Optional} wrapping the the cached data; {@code absent} if no such project
|
||||
* exists or the projectName is null
|
||||
* @throws StorageException when there was an error.
|
||||
* @see #checkedGet(com.google.gerrit.entities.Project.NameKey)
|
||||
*/
|
||||
Optional<ProjectState> get(@Nullable Project.NameKey projectName) throws StorageException;
|
||||
|
||||
/**
|
||||
* Get the cached data for a project by its unique name.
|
||||
*
|
||||
* @param projectName name of the project.
|
||||
* @throws IOException when there was an error.
|
||||
* @return the cached data; null if no such project exists or projectName is null.
|
||||
* @deprecated use {@link #get(Project.NameKey)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
ProjectState checkedGet(@Nullable Project.NameKey projectName) throws IOException;
|
||||
|
||||
/**
|
||||
* Invalidate the cached information about the given project, and triggers reindexing for it
|
||||
*
|
||||
|
@ -18,13 +18,13 @@ import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.stream.Collectors.toSet;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.cache.CacheLoader;
|
||||
import com.google.common.cache.LoadingCache;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.ImmutableSortedSet;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
import com.google.gerrit.common.Nullable;
|
||||
import com.google.gerrit.entities.AccountGroup;
|
||||
import com.google.gerrit.entities.Project;
|
||||
import com.google.gerrit.exceptions.StorageException;
|
||||
@ -136,43 +136,27 @@ public class ProjectCacheImpl implements ProjectCache {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<ProjectState> get(Project.NameKey projectName) {
|
||||
public Optional<ProjectState> get(@Nullable Project.NameKey projectName) {
|
||||
if (projectName == null) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
try {
|
||||
return Optional.ofNullable(checkedGet(projectName));
|
||||
} catch (IOException e) {
|
||||
ProjectState state = byName.get(projectName.get());
|
||||
if (state != null && state.needsRefresh(clock.read())) {
|
||||
byName.invalidate(projectName.get());
|
||||
state = byName.get(projectName.get());
|
||||
}
|
||||
return Optional.of(state);
|
||||
} catch (Exception e) {
|
||||
if ((e.getCause() instanceof RepositoryNotFoundException)) {
|
||||
logger.atFine().log("Cannot find project %s", projectName.get());
|
||||
return Optional.empty();
|
||||
}
|
||||
throw new StorageException("project state not available", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProjectState checkedGet(Project.NameKey projectName) throws IOException {
|
||||
if (projectName == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return strictCheckedGet(projectName);
|
||||
} catch (Exception e) {
|
||||
if (!(e.getCause() instanceof RepositoryNotFoundException)) {
|
||||
logger.atWarning().withCause(e).log("Cannot read project %s", projectName.get());
|
||||
if (e.getCause() != null) {
|
||||
Throwables.throwIfInstanceOf(e.getCause(), IOException.class);
|
||||
}
|
||||
throw new IOException(e);
|
||||
}
|
||||
logger.atFine().log("Cannot find project %s", projectName.get());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private ProjectState strictCheckedGet(Project.NameKey projectName) throws Exception {
|
||||
ProjectState state = byName.get(projectName.get());
|
||||
if (state != null && state.needsRefresh(clock.read())) {
|
||||
byName.invalidate(projectName.get());
|
||||
state = byName.get(projectName.get());
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void evict(Project p) throws IOException {
|
||||
evict(p.getNameKey());
|
||||
|
@ -473,12 +473,7 @@ public class ChangeData {
|
||||
|
||||
public LabelTypes getLabelTypes() {
|
||||
if (labelTypes == null) {
|
||||
ProjectState state;
|
||||
try {
|
||||
state = projectCache.checkedGet(project());
|
||||
} catch (IOException e) {
|
||||
throw new StorageException("project state not available", e);
|
||||
}
|
||||
ProjectState state = projectCache.get(project()).orElseThrow(illegalState(project()));
|
||||
labelTypes = state.getLabelTypes(change().getDest());
|
||||
}
|
||||
return labelTypes;
|
||||
|
@ -30,7 +30,7 @@ import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
import org.eclipse.jgit.errors.RepositoryNotFoundException;
|
||||
|
||||
public class ChangeIsVisibleToPredicate extends IsVisibleToPredicate<ChangeData> {
|
||||
@ -68,19 +68,14 @@ public class ChangeIsVisibleToPredicate extends IsVisibleToPredicate<ChangeData>
|
||||
}
|
||||
|
||||
ChangeNotes notes = notesFactory.createFromIndexedChange(change);
|
||||
|
||||
try {
|
||||
ProjectState projectState = projectCache.checkedGet(cd.project());
|
||||
if (projectState == null) {
|
||||
logger.atFine().log("Filter out change %s of non-existing project %s", cd, cd.project());
|
||||
return false;
|
||||
}
|
||||
if (!projectState.statePermitsRead()) {
|
||||
logger.atFine().log("Filter out change %s of non-reabable project %s", cd, cd.project());
|
||||
return false;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new StorageException("unable to read project state", e);
|
||||
Optional<ProjectState> projectState = projectCache.get(cd.project());
|
||||
if (!projectState.isPresent()) {
|
||||
logger.atFine().log("Filter out change %s of non-existing project %s", cd, cd.project());
|
||||
return false;
|
||||
}
|
||||
if (!projectState.get().statePermitsRead()) {
|
||||
logger.atFine().log("Filter out change %s of non-reabable project %s", cd, cd.project());
|
||||
return false;
|
||||
}
|
||||
|
||||
PermissionBackend.WithUser withUser =
|
||||
|
@ -28,7 +28,6 @@ import com.google.gerrit.server.permissions.PermissionBackend;
|
||||
import com.google.gerrit.server.permissions.PermissionBackendException;
|
||||
import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
|
||||
public class EqualsLabelPredicate extends ChangeIndexPredicate {
|
||||
@ -120,14 +119,13 @@ public class EqualsLabelPredicate extends ChangeIndexPredicate {
|
||||
// Check the user has 'READ' permission.
|
||||
try {
|
||||
PermissionBackend.ForChange perm = permissionBackend.absentUser(approver).change(cd);
|
||||
ProjectState projectState = projectCache.checkedGet(cd.project());
|
||||
if (projectState == null || !projectState.statePermitsRead()) {
|
||||
if (!projectCache.get(cd.project()).map(ProjectState::statePermitsRead).orElse(false)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
perm.check(ChangePermission.READ);
|
||||
return true;
|
||||
} catch (PermissionBackendException | IOException | AuthException e) {
|
||||
} catch (PermissionBackendException | AuthException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.gerrit.entities.PatchSet;
|
||||
import com.google.gerrit.entities.Project;
|
||||
import com.google.gerrit.extensions.common.EditInfo;
|
||||
@ -70,7 +72,7 @@ public class ApplyFix implements RestModifyView<FixResource, Void> {
|
||||
ResourceNotFoundException, PermissionBackendException {
|
||||
RevisionResource revisionResource = fixResource.getRevisionResource();
|
||||
Project.NameKey project = revisionResource.getProject();
|
||||
ProjectState projectState = projectCache.checkedGet(project);
|
||||
ProjectState projectState = projectCache.get(project).orElseThrow(illegalState(project));
|
||||
PatchSet patchSet = revisionResource.getPatchSet();
|
||||
|
||||
try (Repository repository = gitRepositoryManager.openRepository(project)) {
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.gerrit.entities.Change;
|
||||
@ -365,9 +367,10 @@ public class ChangeEdits implements ChildCollection<ChangeResource, ChangeEditRe
|
||||
public Response<BinaryResult> apply(ChangeEditResource rsrc) throws IOException {
|
||||
try {
|
||||
ChangeEdit edit = rsrc.getChangeEdit();
|
||||
Project.NameKey project = rsrc.getChangeResource().getProject();
|
||||
return Response.ok(
|
||||
fileContentUtil.getContent(
|
||||
projectCache.checkedGet(rsrc.getChangeResource().getProject()),
|
||||
projectCache.get(project).orElseThrow(illegalState(project)),
|
||||
base ? edit.getBasePatchSet().commitId() : edit.getEditCommit(),
|
||||
rsrc.getPath(),
|
||||
null));
|
||||
|
@ -39,6 +39,7 @@ import com.google.inject.Provider;
|
||||
import com.google.inject.Singleton;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Singleton
|
||||
public class ChangesCollection implements RestCollection<TopLevelResource, ChangeResource> {
|
||||
@ -128,19 +129,18 @@ public class ChangesCollection implements RestCollection<TopLevelResource, Chang
|
||||
} catch (AuthException e) {
|
||||
return false;
|
||||
}
|
||||
ProjectState projectState = projectCache.checkedGet(notes.getProjectName());
|
||||
if (projectState == null) {
|
||||
Optional<ProjectState> projectState = projectCache.get(notes.getProjectName());
|
||||
if (!projectState.isPresent()) {
|
||||
return false;
|
||||
}
|
||||
return projectState.statePermitsRead();
|
||||
return projectState.get().statePermitsRead();
|
||||
}
|
||||
|
||||
private void checkProjectStatePermitsRead(Project.NameKey project)
|
||||
throws IOException, ResourceNotFoundException, ResourceConflictException {
|
||||
ProjectState projectState = projectCache.checkedGet(project);
|
||||
if (projectState == null) {
|
||||
throw new ResourceNotFoundException("project not found: " + project.get());
|
||||
}
|
||||
projectState.checkStatePermitsRead();
|
||||
throws ResourceNotFoundException, ResourceConflictException {
|
||||
projectCache
|
||||
.get(project)
|
||||
.orElseThrow(() -> new ResourceNotFoundException("project not found: " + project.get()))
|
||||
.checkStatePermitsRead();
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
import com.google.gerrit.entities.BranchNameKey;
|
||||
@ -38,6 +39,7 @@ import com.google.gerrit.server.project.InvalidChangeOperationException;
|
||||
import com.google.gerrit.server.project.NoSuchChangeException;
|
||||
import com.google.gerrit.server.project.NoSuchProjectException;
|
||||
import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.gerrit.server.update.UpdateException;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
@ -86,7 +88,10 @@ public class CherryPick
|
||||
.project(rsrc.getChange().getProject())
|
||||
.ref(refName)
|
||||
.check(RefPermission.CREATE_CHANGE);
|
||||
projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(rsrc.getProject())
|
||||
.orElseThrow(illegalState(rsrc.getProject()))
|
||||
.checkStatePermitsWrite();
|
||||
|
||||
try {
|
||||
CherryPickChange.Result cherryPickResult =
|
||||
@ -109,13 +114,8 @@ public class CherryPick
|
||||
|
||||
@Override
|
||||
public UiAction.Description getDescription(RevisionResource rsrc) {
|
||||
boolean projectStatePermitsWrite = false;
|
||||
try {
|
||||
projectStatePermitsWrite = projectCache.checkedGet(rsrc.getProject()).statePermitsWrite();
|
||||
} catch (IOException e) {
|
||||
logger.atSevere().withCause(e).log(
|
||||
"Failed to check if project state permits write: %s", rsrc.getProject());
|
||||
}
|
||||
boolean projectStatePermitsWrite =
|
||||
projectCache.get(rsrc.getProject()).map(ProjectState::statePermitsWrite).orElse(false);
|
||||
return new UiAction.Description()
|
||||
.setLabel("Cherry Pick")
|
||||
.setTitle("Cherry pick change to a different branch")
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.common.base.MoreObjects.firstNonNull;
|
||||
import static com.google.gerrit.server.project.ProjectCache.noSuchProject;
|
||||
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.google.common.base.Strings;
|
||||
@ -308,10 +309,8 @@ public class CherryPickChange {
|
||||
String commitMessage = ChangeIdUtil.insertId(message, generatedChangeId).trim() + '\n';
|
||||
|
||||
CodeReviewCommit cherryPickCommit;
|
||||
ProjectState projectState = projectCache.checkedGet(dest.project());
|
||||
if (projectState == null) {
|
||||
throw new NoSuchProjectException(dest.project());
|
||||
}
|
||||
ProjectState projectState =
|
||||
projectCache.get(dest.project()).orElseThrow(noSuchProject(dest.project()));
|
||||
try {
|
||||
MergeUtil mergeUtil;
|
||||
if (input.allowConflicts) {
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.base.MoreObjects;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.Iterables;
|
||||
@ -127,7 +129,8 @@ public class CreateMergePatchSet implements RestModifyView<ChangeResource, Merge
|
||||
|
||||
rsrc.permissions().check(ChangePermission.ADD_PATCH_SET);
|
||||
|
||||
ProjectState projectState = projectCache.checkedGet(rsrc.getProject());
|
||||
ProjectState projectState =
|
||||
projectCache.get(rsrc.getProject()).orElseThrow(illegalState(rsrc.getProject()));
|
||||
projectState.checkStatePermitsWrite();
|
||||
|
||||
MergeInput merge = in.merge;
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.common.base.MoreObjects.firstNonNull;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
@ -129,7 +130,9 @@ public class DeleteVote implements RestModifyView<VoteResource, DeleteVoteInput>
|
||||
bu.addOp(
|
||||
change.getId(),
|
||||
new Op(
|
||||
projectCache.checkedGet(r.getChange().getProject()),
|
||||
projectCache
|
||||
.get(r.getChange().getProject())
|
||||
.orElseThrow(illegalState(r.getChange().getProject())),
|
||||
r.getReviewerUser().state(),
|
||||
rsrc.getLabel(),
|
||||
input));
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.gerrit.extensions.restapi.BinaryResult;
|
||||
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
|
||||
import com.google.gerrit.extensions.restapi.Response;
|
||||
@ -47,6 +49,9 @@ public class DownloadContent implements RestReadView<FileResource> {
|
||||
RevisionResource rev = rsrc.getRevision();
|
||||
return Response.ok(
|
||||
fileContentUtil.downloadContent(
|
||||
projectCache.checkedGet(rev.getProject()), rev.getPatchSet().commitId(), path, parent));
|
||||
projectCache.get(rev.getProject()).orElseThrow(illegalState(rev.getProject())),
|
||||
rev.getPatchSet().commitId(),
|
||||
path,
|
||||
parent));
|
||||
}
|
||||
}
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.gerrit.entities.Change;
|
||||
import com.google.gerrit.entities.Patch;
|
||||
import com.google.gerrit.entities.PatchSet;
|
||||
@ -79,7 +81,9 @@ public class GetContent implements RestReadView<FileResource> {
|
||||
}
|
||||
return Response.ok(
|
||||
fileContentUtil.getContent(
|
||||
projectCache.checkedGet(rsrc.getRevision().getProject()),
|
||||
projectCache
|
||||
.get(rsrc.getRevision().getProject())
|
||||
.orElseThrow(illegalState(rsrc.getRevision().getProject())),
|
||||
rsrc.getRevision().getPatchSet().commitId(),
|
||||
path,
|
||||
parent));
|
||||
|
@ -17,6 +17,7 @@ package com.google.gerrit.server.restapi.change;
|
||||
import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
|
||||
import static com.google.gerrit.server.permissions.ChangePermission.ABANDON;
|
||||
import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static com.google.gerrit.server.query.change.ChangeData.asChanges;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
@ -149,7 +150,7 @@ public class Move implements RestModifyView<ChangeResource, MoveInput>, UiAction
|
||||
} catch (AuthException denied) {
|
||||
throw new AuthException("move not permitted", denied);
|
||||
}
|
||||
projectCache.checkedGet(project).checkStatePermitsWrite();
|
||||
projectCache.get(project).orElseThrow(illegalState(project)).checkStatePermitsWrite();
|
||||
|
||||
Op op = new Op(input);
|
||||
try (BatchUpdate u = updateFactory.create(project, caller, TimeUtil.nowTs())) {
|
||||
@ -259,7 +260,7 @@ public class Move implements RestModifyView<ChangeResource, MoveInput>, UiAction
|
||||
for (PatchSetApproval psa :
|
||||
approvalsUtil.byPatchSet(
|
||||
ctx.getNotes(), psId, ctx.getRevWalk(), ctx.getRepoView().getConfig())) {
|
||||
ProjectState projectState = projectCache.checkedGet(project);
|
||||
ProjectState projectState = projectCache.get(project).orElseThrow(illegalState(project));
|
||||
LabelType type = projectState.getLabelTypes(ctx.getNotes()).byLabel(psa.labelId());
|
||||
// Only keep veto votes, defined as votes where:
|
||||
// 1- the label function allows minimum values to block submission.
|
||||
@ -294,10 +295,13 @@ public class Move implements RestModifyView<ChangeResource, MoveInput>, UiAction
|
||||
}
|
||||
|
||||
try {
|
||||
if (!projectCache.checkedGet(rsrc.getProject()).statePermitsWrite()) {
|
||||
if (!projectCache
|
||||
.get(rsrc.getProject())
|
||||
.orElseThrow(illegalState(rsrc.getProject()))
|
||||
.statePermitsWrite()) {
|
||||
return description;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
} catch (StorageException e) {
|
||||
logger.atSevere().withCause(e).log(
|
||||
"Failed to check if project state permits write: %s", rsrc.getProject());
|
||||
return description;
|
||||
|
@ -20,6 +20,7 @@ import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
import static com.google.gerrit.server.CommentsUtil.setCommentCommitId;
|
||||
import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
|
||||
import static com.google.gerrit.server.permissions.LabelPermission.ForUser.ON_BEHALF_OF;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static java.util.stream.Collectors.groupingBy;
|
||||
@ -235,7 +236,8 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
|
||||
if (revision.getEdit().isPresent()) {
|
||||
throw new ResourceConflictException("cannot post review on edit");
|
||||
}
|
||||
ProjectState projectState = projectCache.checkedGet(revision.getProject());
|
||||
ProjectState projectState =
|
||||
projectCache.get(revision.getProject()).orElseThrow(illegalState(revision.getProject()));
|
||||
LabelTypes labelTypes = projectState.getLabelTypes(revision.getNotes());
|
||||
|
||||
logger.atFine().log("strict label checking is %s", (strictLabels ? "enabled" : "disabled"));
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.gerrit.common.FooterConstants;
|
||||
import com.google.gerrit.entities.BooleanProjectConfig;
|
||||
import com.google.gerrit.entities.PatchSet;
|
||||
@ -112,7 +114,8 @@ public class PutMessage implements RestModifyView<ChangeResource, CommitMessageI
|
||||
sanitizedCommitMessage =
|
||||
ensureChangeIdIsCorrect(
|
||||
projectCache
|
||||
.checkedGet(resource.getProject())
|
||||
.get(resource.getProject())
|
||||
.orElseThrow(illegalState(resource.getProject()))
|
||||
.is(BooleanProjectConfig.REQUIRE_CHANGE_ID),
|
||||
resource.getChange().getKey().get(),
|
||||
sanitizedCommitMessage);
|
||||
@ -188,7 +191,10 @@ public class PutMessage implements RestModifyView<ChangeResource, CommitMessageI
|
||||
.user(userProvider.get())
|
||||
.change(changeNotes)
|
||||
.check(ChangePermission.ADD_PATCH_SET);
|
||||
projectCache.checkedGet(changeNotes.getProjectName()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(changeNotes.getProjectName())
|
||||
.orElseThrow(illegalState(changeNotes.getProjectName()))
|
||||
.checkStatePermitsWrite();
|
||||
} catch (AuthException denied) {
|
||||
throw new AuthException("modifying commit message not permitted", denied);
|
||||
}
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
@ -104,7 +106,10 @@ public class Rebase
|
||||
patchSetUtil.checkPatchSetNotLocked(rsrc.getNotes());
|
||||
|
||||
rsrc.permissions().check(ChangePermission.REBASE);
|
||||
projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(rsrc.getProject())
|
||||
.orElseThrow(illegalState(rsrc.getProject()))
|
||||
.checkStatePermitsWrite();
|
||||
|
||||
Change change = rsrc.getChange();
|
||||
try (Repository repo = repoManager.openRepository(change.getProject());
|
||||
@ -217,10 +222,13 @@ public class Rebase
|
||||
}
|
||||
|
||||
try {
|
||||
if (!projectCache.checkedGet(rsrc.getProject()).statePermitsWrite()) {
|
||||
if (!projectCache
|
||||
.get(rsrc.getProject())
|
||||
.orElseThrow(illegalState(rsrc.getProject()))
|
||||
.statePermitsWrite()) {
|
||||
return description;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
} catch (StorageException e) {
|
||||
logger.atSevere().withCause(e).log(
|
||||
"Failed to check if project state permits write: %s", rsrc.getProject());
|
||||
return description;
|
||||
|
@ -235,15 +235,14 @@ class RelatedChangesSorter {
|
||||
return result;
|
||||
}
|
||||
|
||||
private boolean isVisible(PatchSetData psd) throws PermissionBackendException, IOException {
|
||||
private boolean isVisible(PatchSetData psd) throws PermissionBackendException {
|
||||
PermissionBackend.WithUser perm = permissionBackend.currentUser();
|
||||
try {
|
||||
perm.change(psd.data()).check(ChangePermission.READ);
|
||||
} catch (AuthException e) {
|
||||
return false;
|
||||
}
|
||||
ProjectState state = projectCache.checkedGet(psd.data().project());
|
||||
return state != null && state.statePermitsRead();
|
||||
return projectCache.get(psd.data().project()).map(ProjectState::statePermitsRead).orElse(false);
|
||||
}
|
||||
|
||||
@AutoValue
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
import com.google.gerrit.entities.Change;
|
||||
@ -40,6 +42,7 @@ import com.google.gerrit.server.notedb.ChangeUpdate;
|
||||
import com.google.gerrit.server.permissions.ChangePermission;
|
||||
import com.google.gerrit.server.permissions.PermissionBackendException;
|
||||
import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.gerrit.server.update.BatchUpdate;
|
||||
import com.google.gerrit.server.update.BatchUpdateOp;
|
||||
import com.google.gerrit.server.update.ChangeContext;
|
||||
@ -88,7 +91,10 @@ public class Restore
|
||||
psUtil.checkPatchSetNotLocked(rsrc.getNotes());
|
||||
|
||||
rsrc.permissions().check(ChangePermission.RESTORE);
|
||||
projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(rsrc.getProject())
|
||||
.orElseThrow(illegalState(rsrc.getProject()))
|
||||
.checkStatePermitsWrite();
|
||||
|
||||
Op op = new Op(input);
|
||||
try (BatchUpdate u =
|
||||
@ -166,10 +172,10 @@ public class Restore
|
||||
}
|
||||
|
||||
try {
|
||||
if (!projectCache.checkedGet(rsrc.getProject()).statePermitsWrite()) {
|
||||
if (!projectCache.get(rsrc.getProject()).map(ProjectState::statePermitsRead).orElse(false)) {
|
||||
return description;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
} catch (StorageException e) {
|
||||
logger.atSevere().withCause(e).log(
|
||||
"Failed to check if project state permits write: %s", rsrc.getProject());
|
||||
return description;
|
||||
|
@ -16,10 +16,12 @@ package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
|
||||
import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
import com.google.gerrit.entities.Change;
|
||||
import com.google.gerrit.entities.PatchSet;
|
||||
import com.google.gerrit.exceptions.StorageException;
|
||||
import com.google.gerrit.extensions.api.changes.RevertInput;
|
||||
import com.google.gerrit.extensions.common.ChangeInfo;
|
||||
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
||||
@ -40,6 +42,7 @@ import com.google.gerrit.server.project.ContributorAgreementsChecker;
|
||||
import com.google.gerrit.server.project.NoSuchChangeException;
|
||||
import com.google.gerrit.server.project.NoSuchProjectException;
|
||||
import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.gerrit.server.update.UpdateException;
|
||||
import com.google.gerrit.server.util.time.TimeUtil;
|
||||
import com.google.inject.Inject;
|
||||
@ -87,7 +90,10 @@ public class Revert
|
||||
|
||||
contributorAgreements.check(rsrc.getProject(), rsrc.getUser());
|
||||
permissionBackend.user(rsrc.getUser()).ref(change.getDest()).check(CREATE_CHANGE);
|
||||
projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(rsrc.getProject())
|
||||
.orElseThrow(illegalState(rsrc.getProject()))
|
||||
.checkStatePermitsWrite();
|
||||
ChangeNotes notes = rsrc.getNotes();
|
||||
Change.Id changeIdToRevert = notes.getChangeId();
|
||||
PatchSet.Id patchSetId = notes.getChange().currentPatchSetId();
|
||||
@ -108,8 +114,9 @@ public class Revert
|
||||
Change change = rsrc.getChange();
|
||||
boolean projectStatePermitsWrite = false;
|
||||
try {
|
||||
projectStatePermitsWrite = projectCache.checkedGet(rsrc.getProject()).statePermitsWrite();
|
||||
} catch (IOException e) {
|
||||
projectStatePermitsWrite =
|
||||
projectCache.get(rsrc.getProject()).map(ProjectState::statePermitsWrite).orElse(false);
|
||||
} catch (StorageException e) {
|
||||
logger.atSevere().withCause(e).log(
|
||||
"Failed to check if project state permits write: %s", rsrc.getProject());
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ package com.google.gerrit.server.restapi.change;
|
||||
import static com.google.common.base.MoreObjects.firstNonNull;
|
||||
import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
|
||||
import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
@ -62,6 +63,7 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
|
||||
import com.google.gerrit.server.project.ContributorAgreementsChecker;
|
||||
import com.google.gerrit.server.project.NoSuchProjectException;
|
||||
import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.gerrit.server.query.change.ChangeData;
|
||||
import com.google.gerrit.server.query.change.InternalChangeQuery;
|
||||
import com.google.gerrit.server.restapi.change.CherryPickChange.Result;
|
||||
@ -213,7 +215,10 @@ public class RevertSubmission
|
||||
contributorAgreements.check(change.getProject(), changeResource.getUser());
|
||||
permissionBackend.currentUser().ref(change.getDest()).check(CREATE_CHANGE);
|
||||
permissionBackend.currentUser().change(changeData).check(ChangePermission.READ);
|
||||
projectCache.checkedGet(change.getProject()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(change.getProject())
|
||||
.orElseThrow(illegalState(change.getProject()))
|
||||
.checkStatePermitsWrite();
|
||||
|
||||
requireNonNull(
|
||||
psUtil.get(changeData.notes(), change.currentPatchSetId()),
|
||||
@ -533,8 +538,9 @@ public class RevertSubmission
|
||||
Change change = rsrc.getChange();
|
||||
boolean projectStatePermitsWrite = false;
|
||||
try {
|
||||
projectStatePermitsWrite = projectCache.checkedGet(rsrc.getProject()).statePermitsWrite();
|
||||
} catch (IOException e) {
|
||||
projectStatePermitsWrite =
|
||||
projectCache.get(rsrc.getProject()).map(ProjectState::statePermitsWrite).orElse(false);
|
||||
} catch (StorageException e) {
|
||||
logger.atSevere().withCause(e).log(
|
||||
"Failed to check if project state permits write: %s", rsrc.getProject());
|
||||
}
|
||||
|
@ -34,6 +34,7 @@ import com.google.gerrit.server.permissions.ChangePermission;
|
||||
import com.google.gerrit.server.permissions.PermissionBackend;
|
||||
import com.google.gerrit.server.permissions.PermissionBackendException;
|
||||
import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
import java.io.IOException;
|
||||
@ -111,7 +112,10 @@ public class Revisions implements ChildCollection<ChangeResource, RevisionResour
|
||||
.user(change.getUser())
|
||||
.change(change.getNotes())
|
||||
.check(ChangePermission.READ);
|
||||
return projectCache.checkedGet(change.getProject()).statePermitsRead();
|
||||
return projectCache
|
||||
.get(change.getProject())
|
||||
.map(ProjectState::statePermitsRead)
|
||||
.orElse(false);
|
||||
} catch (AuthException e) {
|
||||
return false;
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.git.ObjectIds.abbreviateName;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.stream.Collectors.joining;
|
||||
|
||||
import com.google.common.base.MoreObjects;
|
||||
@ -54,6 +55,7 @@ import com.google.gerrit.server.permissions.ChangePermission;
|
||||
import com.google.gerrit.server.permissions.PermissionBackend;
|
||||
import com.google.gerrit.server.permissions.PermissionBackendException;
|
||||
import com.google.gerrit.server.project.ProjectCache;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
import com.google.gerrit.server.query.change.ChangeData;
|
||||
import com.google.gerrit.server.query.change.InternalChangeQuery;
|
||||
import com.google.gerrit.server.submit.ChangeSet;
|
||||
@ -181,7 +183,10 @@ public class Submit
|
||||
rsrc.permissions().check(ChangePermission.SUBMIT);
|
||||
submitter = rsrc.getUser().asIdentifiedUser();
|
||||
}
|
||||
projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(rsrc.getProject())
|
||||
.orElseThrow(illegalState(rsrc.getProject()))
|
||||
.checkStatePermitsWrite();
|
||||
|
||||
return mergeChange(rsrc, submitter, input);
|
||||
}
|
||||
@ -291,10 +296,13 @@ public class Submit
|
||||
}
|
||||
|
||||
try {
|
||||
if (!projectCache.checkedGet(resource.getProject()).statePermitsWrite()) {
|
||||
if (!projectCache
|
||||
.get(resource.getProject())
|
||||
.map(ProjectState::statePermitsWrite)
|
||||
.orElse(false)) {
|
||||
return null; // submit not visible
|
||||
}
|
||||
} catch (IOException e) {
|
||||
} catch (StorageException e) {
|
||||
logger.atSevere().withCause(e).log("Error checking if change is submittable");
|
||||
throw new StorageException("Could not determine problems for the change", e);
|
||||
}
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.change;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.gerrit.extensions.client.ReviewerState;
|
||||
import com.google.gerrit.extensions.common.AccountVisibility;
|
||||
import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
|
||||
@ -96,7 +98,7 @@ public class SuggestChangeReviewers extends SuggestReviewers
|
||||
reviewerState,
|
||||
rsrc.getNotes(),
|
||||
this,
|
||||
projectCache.checkedGet(rsrc.getProject()),
|
||||
projectCache.get(rsrc.getProject()).orElseThrow(illegalState(rsrc.getProject())),
|
||||
getVisibility(rsrc),
|
||||
excludeGroups));
|
||||
}
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
package com.google.gerrit.server.restapi.project;
|
||||
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.gerrit.common.data.AccessSection;
|
||||
import com.google.gerrit.entities.Change;
|
||||
@ -105,7 +107,10 @@ public class CreateAccessChange implements RestModifyView<ProjectResource, Proje
|
||||
throw new AuthException("cannot create change for " + RefNames.REFS_CONFIG, denied);
|
||||
}
|
||||
}
|
||||
projectCache.checkedGet(rsrc.getNameKey()).checkStatePermitsWrite();
|
||||
projectCache
|
||||
.get(rsrc.getNameKey())
|
||||
.orElseThrow(illegalState(rsrc.getNameKey()))
|
||||
.checkStatePermitsWrite();
|
||||
|
||||
MetaDataUpdate.User metaDataUpdateUser = metaDataUpdateFactory.get();
|
||||
List<AccessSection> removals = setAccess.getAccessSections(input.remove);
|
||||
|
@ -20,6 +20,7 @@ import static com.google.gerrit.server.permissions.ProjectPermission.CREATE_TAG_
|
||||
import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
|
||||
import static com.google.gerrit.server.permissions.RefPermission.READ;
|
||||
import static com.google.gerrit.server.permissions.RefPermission.WRITE_CONFIG;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static java.util.stream.Collectors.toMap;
|
||||
|
||||
import com.google.common.collect.ImmutableBiMap;
|
||||
@ -118,10 +119,8 @@ public class GetAccess implements RestReadView<ProjectResource> {
|
||||
}
|
||||
|
||||
public ProjectAccessInfo apply(Project.NameKey nameKey) throws Exception {
|
||||
ProjectState state = projectCache.checkedGet(nameKey);
|
||||
if (state == null) {
|
||||
throw new ResourceNotFoundException(nameKey.get());
|
||||
}
|
||||
ProjectState state =
|
||||
projectCache.get(nameKey).orElseThrow(() -> new ResourceNotFoundException(nameKey.get()));
|
||||
return apply(new ProjectResource(state, user.get())).value();
|
||||
}
|
||||
|
||||
@ -135,7 +134,8 @@ public class GetAccess implements RestReadView<ProjectResource> {
|
||||
|
||||
Project.NameKey projectName = rsrc.getNameKey();
|
||||
ProjectAccessInfo info = new ProjectAccessInfo();
|
||||
ProjectState projectState = projectCache.checkedGet(projectName);
|
||||
ProjectState projectState =
|
||||
projectCache.get(projectName).orElseThrow(illegalState(projectName));
|
||||
PermissionBackend.ForProject perm = permissionBackend.currentUser().project(projectName);
|
||||
|
||||
ProjectConfig config;
|
||||
@ -154,12 +154,12 @@ public class GetAccess implements RestReadView<ProjectResource> {
|
||||
md.setMessage("Update group names\n");
|
||||
config.commit(md);
|
||||
projectCache.evict(config.getProject());
|
||||
projectState = projectCache.checkedGet(projectName);
|
||||
projectState = projectCache.get(projectName).orElseThrow(illegalState(projectName));
|
||||
perm = permissionBackend.currentUser().project(projectName);
|
||||
} else if (config.getRevision() != null
|
||||
&& !config.getRevision().equals(projectState.getConfig().getRevision())) {
|
||||
projectCache.evict(config.getProject());
|
||||
projectState = projectCache.checkedGet(projectName);
|
||||
projectState = projectCache.get(projectName).orElseThrow(illegalState(projectName));
|
||||
perm = permissionBackend.currentUser().project(projectName);
|
||||
}
|
||||
} catch (ConfigInvalidException e) {
|
||||
|
@ -43,6 +43,7 @@ import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
import com.google.inject.Singleton;
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
|
||||
@Singleton
|
||||
public class ProjectsCollection
|
||||
@ -139,19 +140,19 @@ public class ProjectsCollection
|
||||
id = ProjectUtil.sanitizeProjectName(id);
|
||||
|
||||
Project.NameKey nameKey = Project.nameKey(id);
|
||||
ProjectState state = projectCache.checkedGet(nameKey);
|
||||
if (state == null) {
|
||||
Optional<ProjectState> state = projectCache.get(nameKey);
|
||||
if (!state.isPresent()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
logger.atFine().log("Project %s has state %s", nameKey, state.getProject().getState());
|
||||
logger.atFine().log("Project %s has state %s", nameKey, state.get().getProject().getState());
|
||||
|
||||
if (checkAccess) {
|
||||
// Hidden projects(permitsRead = false) should only be accessible by the project owners.
|
||||
// WRITE_CONFIG is checked here because it's only allowed to project owners (ACCESS may also
|
||||
// be allowed for other users). Allowing project owners to access here will help them to view
|
||||
// and update the config of hidden projects easily.
|
||||
if (state.statePermitsRead()) {
|
||||
if (state.get().statePermitsRead()) {
|
||||
try {
|
||||
permissionBackend.currentUser().project(nameKey).check(ProjectPermission.ACCESS);
|
||||
} catch (AuthException e) {
|
||||
@ -161,11 +162,11 @@ public class ProjectsCollection
|
||||
try {
|
||||
permissionBackend.currentUser().project(nameKey).check(ProjectPermission.WRITE_CONFIG);
|
||||
} catch (AuthException e) {
|
||||
state.checkStatePermitsRead();
|
||||
state.get().checkStatePermitsRead();
|
||||
}
|
||||
}
|
||||
}
|
||||
return new ProjectResource(state, user.get());
|
||||
return new ProjectResource(state.get(), user.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -179,12 +179,10 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation {
|
||||
}
|
||||
|
||||
private boolean isVisible(ChangeSet changeSet, ChangeData cd, CurrentUser user)
|
||||
throws PermissionBackendException, IOException {
|
||||
ProjectState projectState = projectCache.checkedGet(cd.project());
|
||||
boolean visible =
|
||||
changeSet.ids().contains(cd.getId())
|
||||
&& (projectState != null)
|
||||
&& projectState.statePermitsRead();
|
||||
throws PermissionBackendException {
|
||||
boolean statePermitsRead =
|
||||
projectCache.get(cd.project()).map(ProjectState::statePermitsRead).orElse(false);
|
||||
boolean visible = statePermitsRead && changeSet.ids().contains(cd.getId());
|
||||
if (!visible) {
|
||||
return false;
|
||||
}
|
||||
|
@ -110,9 +110,7 @@ public class MergeSuperSet {
|
||||
ChangeData cd = changeDataFactory.create(change.getProject(), change.getId());
|
||||
boolean visible = false;
|
||||
if (cd != null) {
|
||||
ProjectState projectState = projectCache.checkedGet(cd.project());
|
||||
|
||||
if (projectState.statePermitsRead()) {
|
||||
if (projectCache.get(cd.project()).map(ProjectState::statePermitsRead).orElse(false)) {
|
||||
try {
|
||||
permissionBackend.user(user).change(cd).check(ChangePermission.READ);
|
||||
visible = true;
|
||||
@ -210,10 +208,8 @@ public class MergeSuperSet {
|
||||
return queryProvider.get().byTopicOpen(topic);
|
||||
}
|
||||
|
||||
private boolean canRead(CurrentUser user, ChangeData cd)
|
||||
throws PermissionBackendException, IOException {
|
||||
ProjectState projectState = projectCache.checkedGet(cd.project());
|
||||
if (projectState == null || !projectState.statePermitsRead()) {
|
||||
private boolean canRead(CurrentUser user, ChangeData cd) throws PermissionBackendException {
|
||||
if (!projectCache.get(cd.project()).map(ProjectState::statePermitsRead).orElse(false)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -325,8 +325,8 @@ public class ReviewCommand extends SshCommand {
|
||||
|
||||
ProjectState allProjectsState;
|
||||
try {
|
||||
allProjectsState = projectCache.checkedGet(allProjects);
|
||||
} catch (IOException e) {
|
||||
allProjectsState = projectCache.getAllProjects();
|
||||
} catch (Exception e) {
|
||||
throw die("missing " + allProjects.get(), e);
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,7 @@ import static com.google.gerrit.server.StarredChangesUtil.IGNORE_LABEL;
|
||||
import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
|
||||
import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
|
||||
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static com.google.gerrit.testing.GerritJUnit.assertThrows;
|
||||
import static com.google.gerrit.truth.ConfigSubject.assertThat;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
@ -260,7 +261,7 @@ public class AccountIT extends AbstractDaemonTest {
|
||||
int min,
|
||||
int max)
|
||||
throws IOException {
|
||||
ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
|
||||
ProjectConfig cfg = projectCache.get(project).orElseThrow(illegalState(project)).getConfig();
|
||||
AccessSection accessSection = cfg.getAccessSection(ref);
|
||||
assertThat(accessSection).isNotNull();
|
||||
|
||||
|
@ -397,7 +397,10 @@ public class RevertIT extends AbstractDaemonTest {
|
||||
.revision(result.getCommit().name())
|
||||
.review(ReviewInput.approve());
|
||||
gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()).submit();
|
||||
projectCache.checkedGet(project).getProject().setState(ProjectState.READ_ONLY);
|
||||
try (ProjectConfigUpdate u = updateProject(project)) {
|
||||
u.getConfig().getProject().setState(ProjectState.READ_ONLY);
|
||||
u.save();
|
||||
}
|
||||
|
||||
String expected = "project state " + ProjectState.READ_ONLY + " does not permit write";
|
||||
ResourceConflictException thrown =
|
||||
@ -461,7 +464,10 @@ public class RevertIT extends AbstractDaemonTest {
|
||||
gApi.changes().id(change1).current().submit();
|
||||
|
||||
// revoke write permissions for the first repository.
|
||||
projectCache.checkedGet(project).getProject().setState(ProjectState.READ_ONLY);
|
||||
try (ProjectConfigUpdate u = updateProject(project)) {
|
||||
u.getConfig().getProject().setState(ProjectState.READ_ONLY);
|
||||
u.save();
|
||||
}
|
||||
|
||||
String expected = "project state " + ProjectState.READ_ONLY + " does not permit write";
|
||||
|
||||
|
@ -27,6 +27,7 @@ import static com.google.gerrit.extensions.client.ListChangesOption.LABELS;
|
||||
import static com.google.gerrit.extensions.client.ListChangesOption.SUBMITTABLE;
|
||||
import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
|
||||
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static com.google.gerrit.server.project.testing.TestLabels.label;
|
||||
import static com.google.gerrit.server.project.testing.TestLabels.value;
|
||||
import static com.google.gerrit.testing.GerritJUnit.assertThrows;
|
||||
@ -332,7 +333,7 @@ public class CustomLabelIT extends AbstractDaemonTest {
|
||||
public void customLabel_withBranch() throws Exception {
|
||||
label.setRefPatterns(Arrays.asList("master"));
|
||||
saveLabelConfig();
|
||||
ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
|
||||
ProjectConfig cfg = projectCache.get(project).orElseThrow(illegalState(project)).getConfig();
|
||||
assertThat(cfg.getLabelSections().get(label.getName()).getRefPatterns()).contains("master");
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@ import static com.google.gerrit.common.data.GlobalCapability.QUERY_LIMIT;
|
||||
import static com.google.gerrit.entities.RefNames.REFS_CONFIG;
|
||||
import static com.google.gerrit.server.group.SystemGroupBackend.PROJECT_OWNERS;
|
||||
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
|
||||
import static com.google.gerrit.server.project.ProjectCache.illegalState;
|
||||
import static com.google.gerrit.testing.GerritJUnit.assertThrows;
|
||||
import static com.google.gerrit.truth.ConfigSubject.assertThat;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
@ -100,14 +101,15 @@ public class ProjectOperationsImplTest extends AbstractDaemonTest {
|
||||
public void mutatingResultOfGetProjectConfigDoesNotMutateGlobalCachedValue() throws Exception {
|
||||
Project.NameKey key = projectOperations.newProject().create();
|
||||
ProjectConfig projectConfig = projectOperations.project(key).getProjectConfig();
|
||||
ProjectState cachedProjectState1 = projectCache.checkedGet(key);
|
||||
ProjectState cachedProjectState1 = projectCache.get(key).orElseThrow(illegalState(project));
|
||||
ProjectConfig cachedProjectConfig1 = cachedProjectState1.getConfig();
|
||||
assertThat(cachedProjectConfig1).isNotSameInstanceAs(projectConfig);
|
||||
assertThat(cachedProjectConfig1.getProject().getDescription()).isEmpty();
|
||||
assertThat(projectConfig.getProject().getDescription()).isEmpty();
|
||||
projectConfig.getProject().setDescription("my fancy project");
|
||||
|
||||
ProjectConfig cachedProjectConfig2 = projectCache.checkedGet(key).getConfig();
|
||||
ProjectConfig cachedProjectConfig2 =
|
||||
projectCache.get(key).orElseThrow(illegalState(project)).getConfig();
|
||||
assertThat(cachedProjectConfig2).isNotSameInstanceAs(projectConfig);
|
||||
assertThat(cachedProjectConfig2.getProject().getDescription()).isEmpty();
|
||||
}
|
||||
|
@ -215,7 +215,7 @@ public class CommitsCollectionTest {
|
||||
// Anonymous user group has ALLOW READ permission in refs/*.
|
||||
// This method is idempotent, so is safe to call on every test setup.
|
||||
TestProjectUpdate.Builder u = projectOperations.allProjectsForUpdate();
|
||||
projectCache.checkedGet(allProjects).getConfig().getAccessSectionNames().stream()
|
||||
projectCache.getAllProjects().getConfig().getAccessSectionNames().stream()
|
||||
.filter(sec -> sec.startsWith(R_REFS))
|
||||
.forEach(sec -> u.remove(permissionKey(Permission.READ).ref(sec)));
|
||||
getAdmins().forEach(admin -> u.add(allow(Permission.READ).ref("refs/*").group(admin)));
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit e8a249ae1b68f43d5941f0c1a64ccdbd0a395d4a
|
||||
Subproject commit 4126b5223546999133836d588e1775fd672c72e5
|
@ -1 +1 @@
|
||||
Subproject commit 22a607bdec5588d50633fcdcf549ac89e7080c37
|
||||
Subproject commit 7793e45da5259cc4aad1add2e4aa20673a95057d
|
@ -1 +1 @@
|
||||
Subproject commit 718d6210721cbfc38bbac6a3d976636fe17e4b72
|
||||
Subproject commit f475ca45428ce3a1432bf09a24c84c52c9f5bc91
|
Loading…
x
Reference in New Issue
Block a user