Submit: Disable submit button when change is unmergable.

A user reported internally:
> It used to be the case that the submit button was greyed out if your
> repo required fast-forward and your CL was out of date.  Now there's
> no obvious way to tell if a submit is likely to succeed without trying
> it, which is a minor but daily annoyance.

This may have been introduced with the `submitWholeTopic` feature recently.
Looking at the code I suspect that there was a client side check for
enabling the submit button as well as there is a client side class
com.google.gerrit.client.changes.ChangeInfo.MergeableInfo.

Part of the `submitWholeTopic` feature was moving responsibility more to
the server and dumb down the client a bit. So now we also have to do this
computation at the server side.

Change-Id: I5dcd8c954446462660d45ead13eb38b6d8fa822a
Signed-off-by: Stefan Beller <sbeller@google.com>
This commit is contained in:
Stefan Beller
2015-03-16 14:44:53 -07:00
committed by David Pursehouse
parent eecb2c598d
commit ef00a864d1
2 changed files with 27 additions and 3 deletions

View File

@@ -18,10 +18,13 @@ import static com.google.common.truth.Truth.assertThat;
import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.common.ActionInfo;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test; import org.junit.Test;
import java.util.Map;
public class SubmitByFastForwardIT extends AbstractSubmit { public class SubmitByFastForwardIT extends AbstractSubmit {
@Override @Override
@@ -51,6 +54,14 @@ public class SubmitByFastForwardIT extends AbstractSubmit {
testRepo.reset(initialHead); testRepo.reset(initialHead);
PushOneCommit.Result change2 = PushOneCommit.Result change2 =
createChange("Change 2", "b.txt", "other content"); createChange("Change 2", "b.txt", "other content");
approve(change2.getChangeId());
Map<String, ActionInfo> actions = getActions(change2.getChangeId());
assertThat(actions).containsKey("submit");
ActionInfo info = actions.get("submit");
assertThat(info.enabled).isNull();
submitWithConflict(change2.getChangeId()); submitWithConflict(change2.getChangeId());
assertThat(getRemoteHead()).isEqualTo(oldHead); assertThat(getRemoteHead()).isEqualTo(oldHead);
assertSubmitter(change.getChangeId(), 1); assertSubmitter(change.getChangeId(), 1);

View File

@@ -35,6 +35,7 @@ import com.google.gerrit.extensions.api.changes.SubmitInput;
import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.extensions.webui.UiAction;
@@ -133,6 +134,7 @@ public class Submit implements RestModifyView<RevisionResource, SubmitInput>,
private final ParameterizedString submitTopicTooltip; private final ParameterizedString submitTopicTooltip;
private final boolean submitWholeTopic; private final boolean submitWholeTopic;
private final Provider<InternalChangeQuery> queryProvider; private final Provider<InternalChangeQuery> queryProvider;
private final Provider<Mergeable> mergeableProvider;
@Inject @Inject
Submit(@GerritPersonIdent PersonIdent serverIdent, Submit(@GerritPersonIdent PersonIdent serverIdent,
@@ -149,7 +151,8 @@ public class Submit implements RestModifyView<RevisionResource, SubmitInput>,
ChangeIndexer indexer, ChangeIndexer indexer,
LabelNormalizer labelNormalizer, LabelNormalizer labelNormalizer,
@GerritServerConfig Config cfg, @GerritServerConfig Config cfg,
Provider<InternalChangeQuery> queryProvider) { Provider<InternalChangeQuery> queryProvider,
Provider<Mergeable> mergeableProvider) {
this.serverIdent = serverIdent; this.serverIdent = serverIdent;
this.dbProvider = dbProvider; this.dbProvider = dbProvider;
this.repoManager = repoManager; this.repoManager = repoManager;
@@ -177,6 +180,7 @@ public class Submit implements RestModifyView<RevisionResource, SubmitInput>,
cfg.getString("change", null, "submitTopicTooltip"), cfg.getString("change", null, "submitTopicTooltip"),
DEFAULT_TOPIC_TOOLTIP)); DEFAULT_TOPIC_TOOLTIP));
this.queryProvider = queryProvider; this.queryProvider = queryProvider;
this.mergeableProvider = mergeableProvider;
} }
@Override @Override
@@ -290,6 +294,14 @@ public class Submit implements RestModifyView<RevisionResource, SubmitInput>,
.setTitle("") .setTitle("")
.setVisible(false); .setVisible(false);
} }
boolean enabled;
try {
enabled = mergeableProvider.get().apply(resource).mergeable;
} catch (RestApiException | OrmException | IOException e) {
throw new OrmRuntimeException("Could not determine mergeability", e);
}
List<ChangeData> changesByTopic = null; List<ChangeData> changesByTopic = null;
if (submitWholeTopic && !Strings.isNullOrEmpty(topic)) { if (submitWholeTopic && !Strings.isNullOrEmpty(topic)) {
changesByTopic = getChangesByTopic(topic); changesByTopic = getChangesByTopic(topic);
@@ -313,7 +325,7 @@ public class Submit implements RestModifyView<RevisionResource, SubmitInput>,
.setTitle(Strings.emptyToNull( .setTitle(Strings.emptyToNull(
submitTopicTooltip.replace(params))) submitTopicTooltip.replace(params)))
.setVisible(true) .setVisible(true)
.setEnabled(true); .setEnabled(enabled);
} }
} else { } else {
RevId revId = resource.getPatchSet().getRevision(); RevId revId = resource.getPatchSet().getRevision();
@@ -324,7 +336,8 @@ public class Submit implements RestModifyView<RevisionResource, SubmitInput>,
return new UiAction.Description() return new UiAction.Description()
.setLabel(label) .setLabel(label)
.setTitle(Strings.emptyToNull(titlePattern.replace(params))) .setTitle(Strings.emptyToNull(titlePattern.replace(params)))
.setVisible(true); .setVisible(true)
.setEnabled(enabled);
} }
} }