From 3937647979e58b03e474dda9b0137b0a95bfecd8 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 5 Jan 2009 17:33:11 -0800 Subject: [PATCH] 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 --- .../gerrit/client/data/ApprovalType.java | 8 ++++++ .../client/reviewdb/ChangeApproval.java | 8 ++++-- .../com/google/gerrit/server/ssh/Receive.java | 25 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/appjar/src/main/java/com/google/gerrit/client/data/ApprovalType.java b/appjar/src/main/java/com/google/gerrit/client/data/ApprovalType.java index 42f3f65e9a..9d7c5f90bd 100644 --- a/appjar/src/main/java/com/google/gerrit/client/data/ApprovalType.java +++ b/appjar/src/main/java/com/google/gerrit/client/data/ApprovalType.java @@ -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(); } diff --git a/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeApproval.java b/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeApproval.java index c7a0a26df9..24772a5a84 100644 --- a/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeApproval.java +++ b/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeApproval.java @@ -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; } diff --git a/appjar/src/main/java/com/google/gerrit/server/ssh/Receive.java b/appjar/src/main/java/com/google/gerrit/server/ssh/Receive.java index 0777edb98b..4c70f8b88a 100644 --- a/appjar/src/main/java/com/google/gerrit/server/ssh/Receive.java +++ b/appjar/src/main/java/com/google/gerrit/server/ssh/Receive.java @@ -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 have = new HashSet(); 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();