diff options
author | Mika Hamalainen <mika.hamalainen@accenture.com> | 2011-08-03 09:51:44 +0300 |
---|---|---|
committer | Mika Hamalainen <mika.hamalainen@accenture.com> | 2011-08-03 09:52:33 +0300 |
commit | 9e7eb6c453f05425562a40b7f97dc8db7f8e38d5 (patch) | |
tree | 05ac64474b0bec1bd6a4c9af79b9a8d6312dfe60 | |
parent | db6cb1467ddc6f3f1618dc8da0a568a6b6769545 (diff) |
v2.2.1 fix for topic reviews feature
Modified topic reviews to work with v2.2.1.
Changed schema version to allow schema fixes for coming
releases.
Change-Id: I22d2715ed8c72a0c961b76c2a3f01f26bcbc655d
21 files changed, 113 insertions, 357 deletions
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ApprovalDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ApprovalDetail.java index f06321bce1..15250daf9c 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ApprovalDetail.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ApprovalDetail.java @@ -20,7 +20,6 @@ import com.google.gerrit.reviewdb.SetApproval; import java.sql.Timestamp; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -68,34 +67,12 @@ public abstract class ApprovalDetail<T extends SetApproval<?>> { } } return null; + } public abstract Map<ApprovalCategory.Id, T> getApprovalMap(); public abstract void sortFirst(); - } - - public void approved(String label) { - if (approved == null) { - approved = new HashSet<String>(); - } - approved.add(label); - } - - public void rejected(String label) { - if (rejected == null) { - rejected = new HashSet<String>(); - } - rejected.add(label); - } - - public boolean isApproved(String label) { - return approved != null && approved.contains(label); - } - - public boolean isRejected(String label) { - return rejected != null && rejected.contains(label); - } public abstract void add(final T ca); } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/CommonDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/CommonDetail.java index 4f6c14f4ed..a8aea7059f 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/CommonDetail.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/CommonDetail.java @@ -31,7 +31,6 @@ public abstract class CommonDetail { protected List<ChangeInfo> neededBy; protected Set<ApprovalCategory.Id> missingApprovals; protected boolean canSubmit; - protected List<SubmitRecord> submitRecords; public AccountInfoCache getAccounts() { return accounts; @@ -112,13 +111,4 @@ public abstract class CommonDetail { public void setMissingApprovals(Set<ApprovalCategory.Id> a) { missingApprovals = a; } - - - public void setSubmitRecords(List<SubmitRecord> all) { - submitRecords = all; - } - - public List<SubmitRecord> getSubmitRecords() { - return submitRecords; - } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java index b5c2bcaa31..b3bfd8efc2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java @@ -85,13 +85,13 @@ public class Dispatcher { public static String toPatch(final String type, final Patch.Key id) { return "patch," + type + "," + id.toString(); + } + public static String toPublish(ChangeSet.Id cs) { Topic.Id c = cs.getParentKey(); return "/t/" + c + "/" + cs.get() + ",publish"; } - } - public static String toAccountGroup(final AccountGroup.Id id) { return "admin,group," + id.toString(); } @@ -131,7 +131,7 @@ public class Dispatcher { } else if (token.startsWith("change,publish,")) { publish(token); - } else if (matchPrefix("/t/", token)) { + } else if (token.startsWith("/t/")) { topic(token); } else if (MINE.equals(token) || token.startsWith("mine,")) { @@ -271,8 +271,9 @@ public class Dispatcher { return new NotFoundScreen(); } - private static void publish(String token) { - String rest = skip(token); + private static void topic(final String token) { + final String p = "/t/"; + String rest = skip(p, token); int c = rest.lastIndexOf(','); String panel = null; if (0 <= c) { @@ -316,6 +317,7 @@ public class Dispatcher { } } + private static void publish(String token) { new AsyncSplit(token) { public void onSuccess() { Gerrit.display(token, select()); @@ -326,6 +328,9 @@ public class Dispatcher { if (token.startsWith(p)) return new PublishCommentScreen(PatchSet.Id.parse(skip(p, token))); return new NotFoundScreen(); + } + }.onSuccess(); + } private static void publish(final ChangeSet.Id cs) { String token = toPublish(cs); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ApprovalTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ApprovalTable.java index a129664b65..cfc5a796dd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ApprovalTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ApprovalTable.java @@ -34,6 +34,7 @@ import com.google.gerrit.reviewdb.Account; import com.google.gerrit.reviewdb.ApprovalCategory; import com.google.gerrit.reviewdb.ApprovalCategoryValue; import com.google.gerrit.reviewdb.Change; +import com.google.gerrit.reviewdb.PatchSetApproval; import com.google.gerrit.reviewdb.SetApproval; import com.google.gerrit.reviewdb.Topic; import com.google.gwt.event.dom.client.ClickEvent; @@ -134,46 +135,33 @@ public class ApprovalTable extends Composite { return AccountDashboardLink.link(accountCache, id); } - public void display(final Change change, final Set<ApprovalCategory.Id> need, - final List<ApprovalDetail> rows) { - changeId = change.getId(); + void display(ChangeDetail detail) { + List<PatchSetApprovalDetail> rows = detail.getApprovals(); + topicId = null; + changeId = detail.getChange().getId(); + display(detail.getChange().getStatus().isOpen(), rows); + } + + void display(TopicDetail detail) { + List<ChangeSetApprovalDetail> rows = detail.getApprovals(); + topicId = detail.getTopic().getId(); + changeId = null; + display(detail.getTopic().getStatus().isOpen(), rows); + } + + private <T extends SetApproval<?>, U extends ApprovalDetail<T>> + void display(final boolean open, final List<U> rows) { + if (rows.isEmpty()) { table.setVisible(false); } else { table.resizeRows(1 + rows.size()); for (int i = 0; i < rows.size(); i++) { - displayRow(i + 1, rows.get(i), change); + displayRow(i + 1, rows.get(i)); } table.setVisible(true); } - display(detail.getTopic().getStatus().isOpen(), rows, detail.getSubmitRecords()); - } - - private <T extends SetApproval<?>, U extends ApprovalDetail<T>> void display( - final boolean status, final List<U> rows, - final List<SubmitRecord> records) { - List<String> columns = new ArrayList<String>(); - - final Element missingList = missing.getElement(); - while (DOM.getChildCount(missingList) > 0) { - DOM.removeChild(missingList, DOM.getChild(missingList, 0)); - } - - missing.setVisible(false); - if (need != null) { - for (final ApprovalType at : types) { - if (need.contains(at.getCategory().getId())) { - final Element li = DOM.createElement("li"); - li.setClassName(Gerrit.RESOURCES.css().missingApproval()); - DOM.setInnerText(li, Util.M.needApproval(at.getCategory().getName(), - at.getMax().formatValue(), at.getMax().getName())); - DOM.appendChild(missingList, li); - missing.setVisible(true); - } - } - } - addReviewer.setVisible(Gerrit.isSignedIn() && change.getStatus().isOpen()); } private void doAddReviewer() { @@ -222,7 +210,6 @@ public class ApprovalTable extends Composite { final ChangeDetail r = result.getChange(); if (r != null) { setAccountInfoCache(r.getAccounts()); - display(r.getChange(), r.getMissingApprovals(), r.getApprovals()); } } @@ -279,9 +266,10 @@ public class ApprovalTable extends Composite { } private <T extends SetApproval<?>, U extends ApprovalDetail<T>> void displayRow( - final Change change) { + final int row, final U ad) { final CellFormatter fmt = table.getCellFormatter(); - final Map<ApprovalCategory.Id, PatchSetApproval> am = ad.getApprovalMap(); + final Account.Id aId = ad.getAccount(); + final Map<ApprovalCategory.Id, T> am = ad.getApprovalMap(); final StringBuilder hint = new StringBuilder(); int col = 0; @@ -309,7 +297,7 @@ public class ApprovalTable extends Composite { for (final ApprovalType type : types) { fmt.setStyleName(row, col, Gerrit.RESOURCES.css().approvalscore()); - final PatchSetApproval ca = am.get(type.getCategory().getId()); + final T ca = am.get(type.getCategory().getId()); if (ca == null || ca.getValue() == 0) { table.clearCell(row, col); col++; @@ -359,7 +347,7 @@ public class ApprovalTable extends Composite { public void onSuccess(ReviewerResult result) { if (result.getErrors().isEmpty()) { final ChangeDetail r = result.getChange(); - display(r.getChange(), r.getMissingApprovals(), r.getApprovals()); + display(r); } else { new ErrorDialog(result.getErrors().get(0).toString()).center(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java index 202c94e175..31132e668b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java @@ -79,6 +79,8 @@ public interface ChangeConstants extends Constants { String approvalTableReviewer(); String approvalTableAddReviewer(); + String approvalTableRemoveNotPermitted(); + String approvalTableCouldNotRemove(); String changeInfoBlockOwner(); String changeInfoBlockProject(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties index a2affefb48..33b7d7c58e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties @@ -56,6 +56,8 @@ changeScreenComments = Comments approvalTableReviewer = Reviewer approvalTableAddReviewer = Add Reviewer +approvalTableRemoveNotPermitted = Not allowed to remove reviewer +approvalTableCouldNotRemove = Could not remove reviewer changeInfoBlockOwner = Owner changeInfoBlockProject = Project diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java index 86df16c142..ea7c7e458b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java @@ -309,8 +309,7 @@ public class ChangeScreen extends Screen { .getCurrentPatchSetDetail().getInfo(), detail.getAccounts()); dependsOn.display(detail.getDependsOn()); neededBy.display(detail.getNeededBy()); - approvals.display(detail.getChange(), detail.getMissingApprovals(), detail - .getApprovals()); + approvals.display(detail); for (PatchSet pId : detail.getPatchSets()) { if (patchesList != null) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/TopicLink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/TopicLink.java index 21a48f9fe2..a9cda57e6b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/TopicLink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/TopicLink.java @@ -25,7 +25,7 @@ public class TopicLink extends InlineHyperlink { private final Topic.Id topicId; public static String permalink(final Topic.Id t) { - return GWT.getHostPageBaseURL() + "/t/" + t.get() + "/"; + return GWT.getHostPageBaseURL() + "/topic," + t.get() + "/"; } public TopicLink(String topic, Topic.Id topicId) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/patch/AddReviewer.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/patch/AddReviewer.java index 8e15d78dde..b86f8e5474 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/patch/AddReviewer.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/patch/AddReviewer.java @@ -130,6 +130,4 @@ class AddReviewer extends Handler<ReviewerResult> { result.setChange(changeDetailFactory.create(changeId).call()); return result; } - - } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/ChangeSetPublishDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/ChangeSetPublishDetailFactory.java index e80cbcdb12..daa8caf205 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/ChangeSetPublishDetailFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/ChangeSetPublishDetailFactory.java @@ -18,7 +18,6 @@ import com.google.gerrit.common.data.ApprovalType; import com.google.gerrit.common.data.ApprovalTypes; import com.google.gerrit.common.data.ChangeSetPublishDetail; import com.google.gerrit.common.data.PermissionRange; -import com.google.gerrit.common.data.SubmitRecord; import com.google.gerrit.common.errors.NoSuchEntityException; import com.google.gerrit.httpd.rpc.Handler; import com.google.gerrit.reviewdb.ChangeSet; @@ -28,6 +27,7 @@ import com.google.gerrit.reviewdb.ReviewDb; import com.google.gerrit.reviewdb.Topic; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AccountInfoCacheFactory; +import com.google.gerrit.server.project.CanSubmitResult; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchTopicException; @@ -103,75 +103,23 @@ final class ChangeSetPublishDetailFactory extends Handler<ChangeSetPublishDetail if (topic.getStatus().isOpen() && changeSetId.equals(topic.currentChangeSetId())) { - Map<String, PermissionRange> rangeByName = - new HashMap<String, PermissionRange>(); - for (PermissionRange r : control.getLabelRanges()) { - if (r.isLabel()) { - rangeByName.put(r.getLabel(), r); - } - } - allowed = new ArrayList<PermissionRange>(); + allowed = new ArrayList<PermissionRange>(control.getLabelRanges()); + Collections.sort(allowed); given = db.changeSetApprovals() // .byChangeSetUser(changeSetId, user.getAccountId()) // .toList(); - - boolean couldSubmit = false; - List<SubmitRecord> submitRecords = control.canSubmit(db, changeSetId, - changeControlFactory, approvalTypes, topicFunctionState); - for (SubmitRecord rec : submitRecords) { - if (rec.status == SubmitRecord.Status.OK) { - couldSubmit = true; - } - - if (rec.labels != null) { - int ok = 0; - - for (SubmitRecord.Label lbl : rec.labels) { - boolean canMakeOk = false; - PermissionRange range = rangeByName.get(lbl.label); - if (range != null) { - if (!allowed.contains(range)) { - allowed.add(range); - } - - ApprovalType at = approvalTypes.byLabel(lbl.label); - if (at != null && at.getMax().getValue() == range.getMax()) { - canMakeOk = true; - } else if (at == null) { - canMakeOk = true; - } - } - - switch (lbl.status) { - case OK: - ok++; - break; - - case NEED: - if (canMakeOk) { - ok++; - } - break; - } - } - - if (rec.status == SubmitRecord.Status.NOT_READY - && ok == rec.labels.size()) { - couldSubmit = true; - } - } - } - - if (couldSubmit && control.getRefControl().canSubmit()) { - detail.setCanSubmit(true); - } } detail.setLabels(allowed); detail.setGiven(given); detail.setAccounts(aic.create()); + final CanSubmitResult canSubmitResult = control.canSubmit(changeSetId); + if (canSubmitResult == CanSubmitResult.OK) { + detail.setCanSubmit(true); + } + return detail; } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/RestoreTopic.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/RestoreTopic.java index f5892d5e65..521cf05431 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/RestoreTopic.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/RestoreTopic.java @@ -21,8 +21,8 @@ import com.google.gerrit.httpd.rpc.Handler; import com.google.gerrit.reviewdb.*; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.TopicUtil; +import com.google.gerrit.server.mail.AbandonedSender; import com.google.gerrit.server.mail.EmailException; -import com.google.gerrit.server.mail.RestoredSender; import com.google.gerrit.server.project.InvalidChangeOperationException; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchTopicException; @@ -41,7 +41,7 @@ class RestoreTopic extends Handler<TopicDetail> { private final TopicControl.Factory topicControlFactory; private final ReviewDb db; private final IdentifiedUser currentUser; - private final RestoredSender.Factory restoredSenderFactory; + private final AbandonedSender.Factory restoredSenderFactory; private final TopicDetailFactory.Factory topicDetailFactory; private final ChangeSet.Id changeSetId; @@ -53,7 +53,7 @@ class RestoreTopic extends Handler<TopicDetail> { @Inject RestoreTopic(final TopicControl.Factory topicControlFactory, final ReviewDb db, final IdentifiedUser currentUser, - final RestoredSender.Factory restoredSenderFactory, + final AbandonedSender.Factory restoredSenderFactory, final TopicDetailFactory.Factory topicDetailFactory, @Assisted final ChangeSet.Id changeSetId, @Assisted @Nullable final String message, final ChangeHookRunner hooks) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/SubmitAction.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/SubmitAction.java index af0c83b820..c9a9fad309 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/SubmitAction.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/SubmitAction.java @@ -15,7 +15,6 @@ package com.google.gerrit.httpd.rpc.topic; import com.google.gerrit.common.data.ApprovalTypes; -import com.google.gerrit.common.data.SubmitRecord; import com.google.gerrit.common.data.TopicDetail; import com.google.gerrit.common.errors.NoSuchEntityException; import com.google.gerrit.httpd.rpc.Handler; @@ -26,6 +25,7 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.TopicUtil; import com.google.gerrit.server.git.MergeOp; import com.google.gerrit.server.git.MergeQueue; +import com.google.gerrit.server.project.CanSubmitResult; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchTopicException; @@ -87,51 +87,13 @@ class SubmitAction extends Handler<TopicDetail> { final TopicControl topicControl = topicControlFactory.validateFor(topicId); - List<SubmitRecord> result = topicControl.canSubmit(db, changeSetId, changeControlFactory, + CanSubmitResult result = topicControl.canSubmit(db, changeSetId, changeControlFactory, approvalTypes, topicFunctionState); - if (result.isEmpty()) { - throw new IllegalStateException("Cannot submit"); - } - - switch (result.get(0).status) { - case OK: + if (result == CanSubmitResult.OK) { TopicUtil.submit(changeSetId, user, db, opFactory, merger); return topicDetailFactory.create(topicId).call(); - - case NOT_READY: { - for (SubmitRecord.Label lbl : result.get(0).labels) { - switch (lbl.status) { - case OK: - break; - - case REJECT: - throw new IllegalStateException("Blocked by " + lbl.label); - - case NEED: - throw new IllegalStateException("Needs " + lbl.label); - - case IMPOSSIBLE: - throw new IllegalStateException("Cannnot submit, check project access"); - - default: - throw new IllegalArgumentException("Unknown status " + lbl.status); - } - } - throw new IllegalStateException("Cannot submit"); - } - - case CLOSED: - throw new IllegalStateException("Topic is closed"); - - case RULE_ERROR: - if (result.get(0).errorMessage != null) { - throw new IllegalStateException(result.get(0).errorMessage); - } else { - throw new IllegalStateException("Internal rule error"); - } - - default: - throw new IllegalStateException("Uknown status " + result.get(0).status); + } else { + throw new IllegalStateException(result.getMessage()); } } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/TopicDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/TopicDetailFactory.java index 367afae190..625965396c 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/TopicDetailFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/topic/TopicDetailFactory.java @@ -18,7 +18,6 @@ import com.google.gerrit.common.data.ApprovalType; import com.google.gerrit.common.data.ApprovalTypes; import com.google.gerrit.common.data.ChangeInfo; import com.google.gerrit.common.data.ChangeSetApprovalDetail; -import com.google.gerrit.common.data.SubmitRecord; import com.google.gerrit.common.data.TopicDetail; import com.google.gerrit.common.errors.NoSuchEntityException; import com.google.gerrit.httpd.rpc.Handler; @@ -38,6 +37,7 @@ import com.google.gerrit.reviewdb.TopicMessage; import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AccountInfoCacheFactory; +import com.google.gerrit.server.project.CanSubmitResult; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchTopicException; @@ -107,6 +107,7 @@ public class TopicDetailFactory extends Handler<TopicDetail> { if (changeSet == null) { throw new NoSuchEntityException(); } + final CanSubmitResult canSubmitResult = control.canSubmit(changeSet.getId()); aic.want(topic.getOwner()); @@ -120,22 +121,7 @@ public class TopicDetailFactory extends Handler<TopicDetail> { topicId)); detail.setCanRevert(topic.getStatus() == AbstractEntity.Status.MERGED && control.canAddChangeSet()); - - if (detail.getTopic().getStatus().isOpen()) { - List<SubmitRecord> submitRecords = control.canSubmit(db, changeSet.getId(), - changeControlFactory, approvalTypes, functionState); - for (SubmitRecord rec : submitRecords) { - if (rec.labels != null) { - for (SubmitRecord.Label lbl : rec.labels) { - aic.want(lbl.appliedBy); - } - } - if (rec.status == SubmitRecord.Status.OK && control.getRefControl().canSubmit()) { - detail.setCanSubmit(true); - } - } - detail.setSubmitRecords(submitRecords); - } + detail.setCanSubmit(canSubmitResult == CanSubmitResult.OK); loadChangeSets(); loadMessages(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java index 3903d77e95..5ad8431127 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java @@ -216,7 +216,7 @@ public class ChangeUtil { public static void abandon(final PatchSet.Id patchSetId, final IdentifiedUser user, final String message, final ReviewDb db, - final AbandonedSender.Factory abandonedSenderFactory, + final AbandonedSender.Factory senderFactory, final ChangeHookRunner hooks) throws NoSuchChangeException, InvalidChangeOperationException, EmailException, OrmException { abandon(patchSetId, user, message, db, senderFactory, hooks, true); @@ -274,7 +274,7 @@ public class ChangeUtil { db.patchSetApprovals().update(approvals); // Email the reviewers - final AbandonedSender cm = abandonedSenderFactory.create(updatedChange); + final AbandonedSender cm = senderFactory.create(updatedChange); cm.setFrom(user.getAccountId()); cm.setChangeMessage(cmsg); cm.send(); @@ -412,7 +412,7 @@ public class ChangeUtil { public static void restore(final PatchSet.Id patchSetId, final IdentifiedUser user, final String message, final ReviewDb db, - final AbandonedSender.Factory abandonedSenderFactory, + final AbandonedSender.Factory senderFactory, final ChangeHookRunner hooks) throws NoSuchChangeException, InvalidChangeOperationException, EmailException, OrmException { restore(patchSetId, user, message, db, senderFactory, hooks, true); @@ -420,7 +420,7 @@ public class ChangeUtil { public static void restore(final PatchSet.Id patchSetId, final IdentifiedUser user, final String message, final ReviewDb db, - final RestoredSender.Factory senderFactory, + final AbandonedSender.Factory senderFactory, final ChangeHookRunner hooks, final boolean sendMail) throws NoSuchChangeException, InvalidChangeOperationException, EmailException, OrmException { final Change.Id changeId = patchSetId.getParentKey(); @@ -460,7 +460,6 @@ public class ChangeUtil { "Change is not abandoned or patchset is not latest"); } - final boolean sendMail, final String err) db.changeMessages().insert(Collections.singleton(cmsg)); final List<PatchSetApproval> approvals = @@ -471,12 +470,13 @@ public class ChangeUtil { db.patchSetApprovals().update(approvals); // Email the reviewers - final AbandonedSender cm = abandonedSenderFactory.create(updatedChange); + final AbandonedSender cm = senderFactory.create(updatedChange); cm.setFrom(user.getAccountId()); cm.setChangeMessage(cmsg); cm.send(); hooks.doChangeRestoreHook(updatedChange, user.getAccount(), message); + } public static Set<Account.Id> addReviewers(final Set<Account.Id> reviewerIds, final ReviewDb db, final PatchSet.Id psid, final ApprovalCategory.Id addReviewerCategoryId, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/TopicUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/TopicUtil.java index 41e6ecb6b0..fba6ce0ac4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/TopicUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/TopicUtil.java @@ -44,7 +44,6 @@ import com.google.gerrit.server.project.TopicControl; import com.google.gerrit.server.mail.AbandonedSender; import com.google.gerrit.server.mail.AddReviewerSender; import com.google.gerrit.server.mail.EmailException; -import com.google.gerrit.server.mail.RestoredSender; import com.google.gerrit.server.mail.RevertedSender; import com.google.gwtorm.client.AtomicUpdate; import com.google.gwtorm.client.OrmConcurrencyException; @@ -300,7 +299,7 @@ public class TopicUtil { public static void restore(final ChangeSet.Id changeSetId, final IdentifiedUser user, final String message, final ReviewDb db, - final RestoredSender.Factory restoredSenderFactory, + final AbandonedSender.Factory restoredSenderFactory, final ChangeHookRunner hooks) throws NoSuchChangeException, NoSuchTopicException, InvalidChangeOperationException, EmailException, OrmException { @@ -363,7 +362,7 @@ public class TopicUtil { // TODO Topic support in AbandonedSender // Meanwhile, sending mails in "behalf" of the last change of the topic if (lastChange != null) { - final RestoredSender cm = restoredSenderFactory.create(lastChange); + final AbandonedSender cm = restoredSenderFactory.create(lastChange); cm.setFrom(user.getAccountId()); cm.setTopicMessage(tmsg); cm.send(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java index 1bd02c5db4..69611baa98 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java @@ -188,7 +188,7 @@ public class ProjectConfig extends VersionedMetaData { p.setUseContributorAgreements(rc.getBoolean(RECEIVE, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, false)); p.setUseSignedOffBy(rc.getBoolean(RECEIVE, KEY_REQUIRE_SIGNED_OFF_BY, false)); p.setRequireChangeID(rc.getBoolean(RECEIVE, KEY_REQUIRE_CHANGE_ID, false)); - p.setAllowTopicReview(getBoolean(rc, RECEIVE, KEY_ALLOW_TOPIC_REVIEW, false)); + p.setAllowTopicReview(rc.getBoolean(RECEIVE, KEY_ALLOW_TOPIC_REVIEW, false)); p.setSubmitType(rc.getEnum(SUBMIT, null, KEY_ACTION, defaultSubmitAction)); p.setUseContentMerge(rc.getBoolean(SUBMIT, null, KEY_MERGE_CONTENT, false)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java index 733d69015b..dd89a5a44a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java @@ -920,7 +920,7 @@ public class ReceiveCommits implements PreReceiveHook, PostReceiveHook { return; } - requestReplace(cmd, changeEnt, newCommit); + requestReplace(cmd, changeEnt, newCommit, null, 0); } private boolean requestReplace(final ReceiveCommand cmd, final Change change, @@ -940,7 +940,7 @@ public class ReceiveCommits implements PreReceiveHook, PostReceiveHook { ChangeSet.Id csId = topic != null ? topic.currentChangeSetId() : null; final ReplaceRequest req = - new ReplaceRequest(change.getId(), newCommit, cmd); + new ReplaceRequest(change.getId(), newCommit, cmd, topicId, csId, pos); if (replaceByChange.containsKey(req.ontoChange)) { reject(cmd, "duplicate request"); @@ -1229,7 +1229,7 @@ public class ReceiveCommits implements PreReceiveHook, PostReceiveHook { // for (Change c : toReplace.keySet()) { final int position = cOrder.indexOf(toReplace.get(c)) + toUpdate.size(); - if (requestReplace(newChange, false, c, toReplace.get(c), t, position)) { + if (requestReplace(newChange, c, toReplace.get(c), t, position)) { continue; } else { if (t != null) restoreOnTopicError(t); @@ -1942,7 +1942,7 @@ public class ReceiveCommits implements PreReceiveHook, PostReceiveHook { final int position; ReplaceRequest(final Change.Id toChange, final RevCommit newCommit, - final ReceiveCommand cmd) { + final ReceiveCommand cmd, final Topic.Id topicId, final ChangeSet.Id csId, final int position) { this.ontoChange = toChange; @@ -2216,7 +2216,7 @@ public class ReceiveCommits implements PreReceiveHook, PostReceiveHook { for (final String changeId : c.getFooterLines(CHANGE_ID)) { final Change.Id onto = byKey.get(new Change.Key(changeId.trim())); if (onto != null) { - toClose.add(new ReplaceRequest(onto, c, cmd)); + toClose.add(new ReplaceRequest(onto, c, cmd, null, null, 0)); break; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java index 4165c1e6db..fcf7455ba7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java @@ -219,59 +219,12 @@ public class ChangeControl { /** @return {@link CanSubmitResult#OK}, or a result with an error message. */ public CanSubmitResult canSubmit(final PatchSet.Id patchSetId) { - return canSubmit(db, patchSetId, false); + return canSubmit(patchSetId, false); } - - public CanSubmitResult canSubmit(final PatchSet.Id patchSetId) { - if (change.getStatus().isClosed()) { - return new CanSubmitResult("Change " + change.getId() + " is closed"); - } - if (!patchSetId.equals(change.currentPatchSetId())) { - return new CanSubmitResult("Patch set " + patchSetId + " is not current"); - } - if (!getRefControl().canSubmit()) { - return new CanSubmitResult("User does not have permission to submit"); - } - if (!(getCurrentUser() instanceof IdentifiedUser)) { - return new CanSubmitResult("User is not signed-in"); - } - return CanSubmitResult.OK; - } - - /** @return {@link CanSubmitResult#OK}, or a result with an error message. */ - public CanSubmitResult canSubmit(final PatchSet.Id patchSetId, final ReviewDb db, - final ApprovalTypes approvalTypes, - FunctionState.Factory functionStateFactory) - throws OrmException { - - CanSubmitResult result = canSubmit(patchSetId); - if (result != CanSubmitResult.OK) { - return result; - } - - final List<PatchSetApproval> all = - db.patchSetApprovals().byPatchSet(patchSetId).toList(); - - final FunctionState fs = - functionStateFactory.create(change, patchSetId, all); - - for (ApprovalType c : approvalTypes.getApprovalTypes()) { - CategoryFunction.forCategory(c.getCategory()).run(c, fs); - } - for (ApprovalType type : approvalTypes.getApprovalTypes()) { - if (!fs.isValid(type)) { - return new CanSubmitResult("Requires " + type.getCategory().getName()); - } - } - - return CanSubmitResult.OK; - } -} - - - public List<SubmitRecord> canSubmit(ReviewDb db, PatchSet.Id patchSetId, - boolean fromTopic) { + public CanSubmitResult canSubmit(final PatchSet.Id patchSetId, + final boolean fromTopic) { + // FIXME Add topic handling if (change.getStatus().isClosed()) { return new CanSubmitResult("Change " + change.getId() + " is closed"); } @@ -280,9 +233,6 @@ public class ChangeControl { } if (!getRefControl().canSubmit()) { return new CanSubmitResult("User does not have permission to submit"); - rec.status = SubmitRecord.Status.NOT_READY; - - } else if ("ok".equals(submitRecord.name())) { } if (!(getCurrentUser() instanceof IdentifiedUser)) { return new CanSubmitResult("User is not signed-in"); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/TopicControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/TopicControl.java index 82b8513331..83cb4d2676 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/TopicControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/TopicControl.java @@ -17,16 +17,18 @@ package com.google.gerrit.server.project; import com.google.gerrit.common.data.ApprovalType; import com.google.gerrit.common.data.ApprovalTypes; import com.google.gerrit.common.data.PermissionRange; -import com.google.gerrit.common.data.SubmitRecord; import com.google.gerrit.reviewdb.Change; import com.google.gerrit.reviewdb.ChangeSet; import com.google.gerrit.reviewdb.ChangeSetApproval; import com.google.gerrit.reviewdb.ChangeSetElement; +import com.google.gerrit.reviewdb.PatchSetApproval; import com.google.gerrit.reviewdb.Project; import com.google.gerrit.reviewdb.ReviewDb; import com.google.gerrit.reviewdb.Topic; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.workflow.CategoryFunction; +import com.google.gerrit.server.workflow.FunctionState; import com.google.gerrit.server.workflow.TopicCategoryFunction; import com.google.gerrit.server.workflow.TopicFunctionState; import com.google.gwtorm.client.OrmException; @@ -154,7 +156,7 @@ public class TopicControl { return isOwner() // owner (aka creator) of the change can abandon || getRefControl().isOwner() // branch owner can abandon || getProjectControl().isOwner() // project owner can abandon - || getCurrentUser().getCapabilities().canAdministrateServer() // site administers are god + || getCurrentUser().isAdministrator() // site administers are god ; } @@ -209,7 +211,7 @@ public class TopicControl { // if (getRefControl().isOwner() // branch owner || getProjectControl().isOwner() // project owner - || getCurrentUser().getCapabilities().canAdministrateServer()) { + || getCurrentUser().isAdministrator()) { return true; } } @@ -217,99 +219,47 @@ public class TopicControl { return false; } - public List<SubmitRecord> canSubmit(ReviewDb db, ChangeSet.Id changeSetId, + public CanSubmitResult canSubmit(ReviewDb db, ChangeSet.Id changeSetId, final ChangeControl.Factory changeControlFactory, final ApprovalTypes approvalTypes, final TopicFunctionState.Factory functionStateFactory) throws NoSuchChangeException, OrmException { - if (topic.getStatus().isClosed()) { - SubmitRecord rec = new SubmitRecord(); - rec.status = SubmitRecord.Status.CLOSED; - return Collections.singletonList(rec); - } - - if (!changeSetId.equals(topic.currentChangeSetId())) { - SubmitRecord rec = new SubmitRecord(); - rec.status = SubmitRecord.Status.RULE_ERROR; - rec.errorMessage = "Patch set " + changeSetId + " is not current"; - return Collections.singletonList(rec); - } - - boolean doSubmit = true; - final List<ChangeSetElement> topicChangeSet = db.changeSetElements().byChangeSet(changeSetId).toList(); - List<Change> changesInTopic = new ArrayList<Change>(); - for (ChangeSetElement cse : topicChangeSet) { - changesInTopic.add(db.changes().get(cse.getChangeId())); + CanSubmitResult result = canSubmit(changeSetId); + if (result != CanSubmitResult.OK) { + return result; } - for (Change change : changesInTopic) { - ChangeControl cc = changeControlFactory.controlFor(change); - List<SubmitRecord> result = cc.canSubmit(db, change.currentPatchSetId(), true); - if (result.isEmpty()) { - throw new IllegalStateException("Cannot submit"); - } - SubmitRecord rec = new SubmitRecord(); - if (result.get(0).status.equals(SubmitRecord.Status.NOT_READY)) { - for (SubmitRecord.Label lbl : result.get(0).labels) { - switch (lbl.status) { - case OK: - case NEED: - break; - default: - rec.status = result.get(0).status; - doSubmit = false; - } - } - } else if (!result.get(0).status.equals(SubmitRecord.Status.OK)) { - rec.status = result.get(0).status; - doSubmit = false; - } - } - - // TODO This checks must be done using the new Prolog implementation - // Now we need to properly check if the topic can be submitted - // final List<ChangeSetApproval> all = db.changeSetApprovals().byChangeSet(changeSetId).toList(); final TopicFunctionState fs = - functionStateFactory.create(topic, changeSetId, all); + functionStateFactory.create(topic, changeSetId, all); + + for (ApprovalType c : approvalTypes.getApprovalTypes()) { + TopicCategoryFunction.forCategory(c.getCategory()).run(c, fs); + } - List<SubmitRecord.Label> labels = new ArrayList<SubmitRecord.Label>(); - SubmitRecord rec = new SubmitRecord(); - rec.status = SubmitRecord.Status.NOT_READY; for (ApprovalType type : approvalTypes.getApprovalTypes()) { - TopicCategoryFunction.forCategory(type.getCategory()).run(type, fs); - SubmitRecord.Label label = new SubmitRecord.Label(); - label.label = type.getCategory().getLabelName(); - label.status = SubmitRecord.Label.Status.NEED; - labels.add(label); - for (final ChangeSetApproval csa : fs.getApprovals(type)) { - if (!fs.isValid(type)) { - rec.status = SubmitRecord.Status.NOT_READY; - if (type.isMaxNegative(csa)) { - label.status = SubmitRecord.Label.Status.REJECT; - label.appliedBy = csa.getAccountId(); - } - } else { - if (type.isMaxPositive(csa)) { - label.status = SubmitRecord.Label.Status.OK; - label.appliedBy = csa.getAccountId(); - } - } + if (!fs.isValid(type)) { + return new CanSubmitResult("Requires " + type.getCategory().getName()); } } - rec.labels = labels; + return CanSubmitResult.OK; + } - if (doSubmit) { - rec.status = SubmitRecord.Status.OK; - for (SubmitRecord.Label lbl : labels) { - if (!lbl.status.equals(SubmitRecord.Label.Status.OK)) { - rec.status = SubmitRecord.Status.NOT_READY; - break; - } - } - } else rec.status = SubmitRecord.Status.NOT_READY; - return Collections.singletonList(rec); + public CanSubmitResult canSubmit(ChangeSet.Id changeSetId) { + if (topic.getStatus().isClosed()) { + return new CanSubmitResult("topic " + topic.getId() + " is closed"); + } + if (!changeSetId.equals(topic.currentChangeSetId())) { + return new CanSubmitResult("Change set " + changeSetId + " is not current"); + } + if (!getRefControl().canSubmit()) { + return new CanSubmitResult("User does not have permission to submit"); + } + if (!(getCurrentUser() instanceof IdentifiedUser)) { + return new CanSubmitResult("User is not signed-in"); + } + return CanSubmitResult.OK; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java index b8fe184cc1..1fc51b0129 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java @@ -32,7 +32,7 @@ import java.util.List; /** A version of the database schema. */ public abstract class SchemaVersion { /** The current schema version. */ - private static final Class<? extends SchemaVersion> C = Schema_98.class; + private static final Class<? extends SchemaVersion> C = Schema_8111655.class; public static class Module extends AbstractModule { @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_99.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_8111655.java index 32ad7d1720..45841200a2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_99.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_8111655.java @@ -17,9 +17,9 @@ package com.google.gerrit.server.schema; import com.google.inject.Inject; import com.google.inject.Provider; -public class Schema_99 extends SchemaVersion { +public class Schema_8111655 extends SchemaVersion { @Inject - Schema_99(Provider<Schema_58> prior) { + Schema_8111655(Provider<Schema_55> prior) { super(prior); } }
\ No newline at end of file |