Automatically set each approval category for the current user
During receive we assume the submitter wants to approve this change, so we automatically insert the ChangeApproval records for all known workflow stops at their max value. The user might not have access to these, but that will be fixed later at display time in case the ProjectRights are updated post-upload. Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
@@ -66,6 +66,14 @@ public class ApprovalType {
|
||||
return values;
|
||||
}
|
||||
|
||||
public ApprovalCategoryValue getMax() {
|
||||
if (values.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
final ApprovalCategoryValue v = values.get(values.size() - 1);
|
||||
return v.getValue() > 0 ? v : null;
|
||||
}
|
||||
|
||||
public boolean isMaxNegative(final ChangeApproval ca) {
|
||||
return maxNegative == ca.getValue();
|
||||
}
|
||||
|
||||
@@ -81,9 +81,9 @@ public final class ChangeApproval {
|
||||
protected ChangeApproval() {
|
||||
}
|
||||
|
||||
public ChangeApproval(final ChangeApproval.Key k) {
|
||||
public ChangeApproval(final ChangeApproval.Key k, final short v) {
|
||||
key = k;
|
||||
setValue((short) 0);
|
||||
setValue(v);
|
||||
}
|
||||
|
||||
public Change.Id getChangeId() {
|
||||
@@ -107,6 +107,10 @@ public final class ChangeApproval {
|
||||
granted = new Timestamp(System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
value = 0;
|
||||
}
|
||||
|
||||
public Timestamp getGranted() {
|
||||
return granted;
|
||||
}
|
||||
|
||||
@@ -15,9 +15,12 @@
|
||||
package com.google.gerrit.server.ssh;
|
||||
|
||||
import com.google.gerrit.client.Link;
|
||||
import com.google.gerrit.client.data.ApprovalType;
|
||||
import com.google.gerrit.client.reviewdb.Account;
|
||||
import com.google.gerrit.client.reviewdb.AccountAgreement;
|
||||
import com.google.gerrit.client.reviewdb.AccountExternalId;
|
||||
import com.google.gerrit.client.reviewdb.ApprovalCategory;
|
||||
import com.google.gerrit.client.reviewdb.ApprovalCategoryValue;
|
||||
import com.google.gerrit.client.reviewdb.Branch;
|
||||
import com.google.gerrit.client.reviewdb.Change;
|
||||
import com.google.gerrit.client.reviewdb.ChangeApproval;
|
||||
@@ -462,6 +465,16 @@ class Receive extends AbstractGitCommand {
|
||||
imp.run();
|
||||
change.setCurrentPatchSet(imp.getPatchSetInfo());
|
||||
db.changes().insert(Collections.singleton(change));
|
||||
|
||||
for (final ApprovalType t : server.getGerritConfig().getApprovalTypes()) {
|
||||
final ApprovalCategoryValue v = t.getMax();
|
||||
if (v != null) {
|
||||
db.changeApprovals().insert(
|
||||
Collections.singleton(new ChangeApproval(new ChangeApproval.Key(
|
||||
change.getId(), userAccount.getId(), v.getCategoryId()), v
|
||||
.getValue())));
|
||||
}
|
||||
}
|
||||
txn.commit();
|
||||
|
||||
final RefUpdate ru = repo.updateRef(ps.getRefName());
|
||||
@@ -503,15 +516,27 @@ class Receive extends AbstractGitCommand {
|
||||
imp.setTransaction(txn);
|
||||
imp.run();
|
||||
|
||||
final Set<ApprovalCategory.Id> have = new HashSet<ApprovalCategory.Id>();
|
||||
for (final ChangeApproval a : db.changeApprovals().byChange(change.getId())) {
|
||||
if (userAccount.getId().equals(a.getAccountId())) {
|
||||
// Leave my own approvals alone.
|
||||
//
|
||||
have.add(a.getCategoryId());
|
||||
|
||||
} else if (a.getValue() > 0) {
|
||||
a.clear();
|
||||
db.changeApprovals().update(Collections.singleton(a));
|
||||
}
|
||||
}
|
||||
for (final ApprovalType t : server.getGerritConfig().getApprovalTypes()) {
|
||||
final ApprovalCategoryValue v = t.getMax();
|
||||
if (!have.contains(t.getCategory().getId()) && v != null) {
|
||||
db.changeApprovals().insert(
|
||||
Collections.singleton(new ChangeApproval(new ChangeApproval.Key(
|
||||
change.getId(), userAccount.getId(), v.getCategoryId()), v
|
||||
.getValue())));
|
||||
}
|
||||
}
|
||||
|
||||
change.setCurrentPatchSet(imp.getPatchSetInfo());
|
||||
change.updated();
|
||||
|
||||
Reference in New Issue
Block a user