summaryrefslogtreecommitdiffstats
path: root/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java')
-rw-r--r--gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java361
1 files changed, 245 insertions, 116 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
index 740e08ce97..81b4f140d5 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
@@ -17,56 +17,59 @@ package com.google.gerrit.client.changes;
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.FormatUtil;
import com.google.gerrit.client.Gerrit;
+import com.google.gerrit.client.GitwebLink;
+import com.google.gerrit.client.patches.PatchUtil;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.AccountDashboardLink;
+import com.google.gerrit.client.ui.CommentedActionDialog;
import com.google.gerrit.client.ui.ComplexDisclosurePanel;
import com.google.gerrit.client.ui.ListenableAccountDiffPreference;
+import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.ChangeDetail;
-import com.google.gerrit.common.data.GitwebLink;
import com.google.gerrit.common.data.PatchSetDetail;
-import com.google.gerrit.reviewdb.Account;
-import com.google.gerrit.reviewdb.AccountDiffPreference;
-import com.google.gerrit.reviewdb.AccountGeneralPreferences;
-import com.google.gerrit.reviewdb.ApprovalCategory;
-import com.google.gerrit.reviewdb.Change;
-import com.google.gerrit.reviewdb.ChangeMessage;
-import com.google.gerrit.reviewdb.Patch;
-import com.google.gerrit.reviewdb.PatchSet;
-import com.google.gerrit.reviewdb.PatchSetInfo;
-import com.google.gerrit.reviewdb.Project;
-import com.google.gerrit.reviewdb.UserIdentity;
-import com.google.gerrit.reviewdb.AccountGeneralPreferences.DownloadCommand;
-import com.google.gerrit.reviewdb.AccountGeneralPreferences.DownloadScheme;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountDiffPreference;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.UserIdentity;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadScheme;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Panel;
-import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwtexpui.clippy.client.CopyableLabel;
+import com.google.gwtjsonrpc.common.VoidResult;
-import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements OpenHandler<DisclosurePanel> {
+class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel
+ implements OpenHandler<DisclosurePanel> {
private static final int R_AUTHOR = 0;
private static final int R_COMMITTER = 1;
private static final int R_PARENTS = 2;
private static final int R_DOWNLOAD = 3;
private static final int R_CNT = 4;
- private final ChangeScreen changeScreen;
+ private final ChangeDetailCache detailCache;
private final ChangeDetail changeDetail;
private final PatchSet patchSet;
private final FlowPanel body;
@@ -82,42 +85,38 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
* Creates a closed complex disclosure panel for a patch set.
* The patch set details are loaded when the complex disclosure panel is opened.
*/
- PatchSetComplexDisclosurePanel(final ChangeScreen parent, final ChangeDetail detail,
- final PatchSet ps) {
- this(parent, detail, ps, false);
- addOpenHandler(this);
- }
-
- /**
- * Creates an open complex disclosure panel for a patch set.
- */
- PatchSetComplexDisclosurePanel(final ChangeScreen parent, final ChangeDetail detail,
- final PatchSetDetail psd) {
- this(parent, detail, psd.getPatchSet(), true);
- ensureLoaded(psd);
- }
-
- private PatchSetComplexDisclosurePanel(final ChangeScreen parent, final ChangeDetail detail,
- final PatchSet ps, boolean isOpen) {
+ public PatchSetComplexDisclosurePanel(final PatchSet ps, boolean isOpen) {
super(Util.M.patchSetHeader(ps.getPatchSetId()), isOpen);
- changeScreen = parent;
- changeDetail = detail;
+ detailCache = ChangeCache.get(ps.getId().getParentKey()).getChangeDetailCache();
+ changeDetail = detailCache.get();
patchSet = ps;
+
body = new FlowPanel();
setContent(body);
- final GitwebLink gw = Gerrit.getConfig().getGitwebLink();
-
+ final GitwebLink gw = Gerrit.getGitwebLink();
final InlineLabel revtxt = new InlineLabel(ps.getRevision().get() + " ");
revtxt.addStyleName(Gerrit.RESOURCES.css().patchSetRevision());
getHeader().add(revtxt);
if (gw != null) {
final Anchor revlink =
- new Anchor("(gitweb)", false, gw.toRevision(detail.getChange()
+ new Anchor(gw.getLinkName(), false, gw.toRevision(changeDetail.getChange()
.getProject(), ps));
revlink.addStyleName(Gerrit.RESOURCES.css().patchSetLink());
getHeader().add(revlink);
}
+
+ if (ps.isDraft()) {
+ final InlineLabel draftLabel = new InlineLabel(Util.C.draftPatchSetLabel());
+ draftLabel.addStyleName(Gerrit.RESOURCES.css().patchSetRevision());
+ getHeader().add(draftLabel);
+ }
+
+ if (isOpen) {
+ ensureLoaded(changeDetail.getCurrentPatchSetDetail());
+ } else {
+ addOpenHandler(this);
+ }
}
public void setDiffBaseId(PatchSet.Id diffBaseId) {
@@ -158,16 +157,26 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
if (!patchSet.getId().equals(diffBaseId)) {
patchTable = new PatchTable();
patchTable.setSavePointerId("PatchTable " + patchSet.getId());
- patchTable.setPatchSetIdToCompareWith(diffBaseId);
- patchTable.display(detail);
+ patchTable.display(diffBaseId, detail);
actionsPanel = new FlowPanel();
actionsPanel.setStyleName(Gerrit.RESOURCES.css().patchSetActions());
body.add(actionsPanel);
if (Gerrit.isSignedIn()) {
- populateReviewAction();
- if (changeDetail.isCurrentPatchSet(detail)) {
- populateActions(detail);
+ if (changeDetail.canEdit()) {
+ populateReviewAction();
+ if (changeDetail.isCurrentPatchSet(detail)) {
+ populateActions(detail);
+ }
+ }
+ if (detail.getPatchSet().isDraft()) {
+ if (changeDetail.canPublish()) {
+ populatePublishAction();
+ }
+ if (changeDetail.canDeleteDraft() &&
+ changeDetail.getPatchSets().size() > 1) {
+ populateDeleteDraftPatchSetAction();
+ }
}
}
populateDiffAllActions(detail);
@@ -202,12 +211,20 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
.anonymousDownload("Git"), r.toString()));
}
+ String hostPageUrl = GWT.getHostPageBaseURL();
+ if (!hostPageUrl.endsWith("/")) {
+ hostPageUrl += "/";
+ }
+
if (changeDetail.isAllowsAnonymous()
&& (allowedSchemes.contains(DownloadScheme.ANON_HTTP) ||
allowedSchemes.contains(DownloadScheme.DEFAULT_DOWNLOADS))) {
StringBuilder r = new StringBuilder();
- r.append(GWT.getHostPageBaseURL());
- r.append("p/");
+ if (Gerrit.getConfig().getGitHttpUrl() != null) {
+ r.append(Gerrit.getConfig().getGitHttpUrl());
+ } else {
+ r.append(hostPageUrl);
+ }
r.append(projectName);
r.append(" ");
r.append(patchSet.getRefName());
@@ -243,24 +260,28 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
&& Gerrit.getUserAccount().getUserName().length() > 0
&& (allowedSchemes.contains(DownloadScheme.HTTP) ||
allowedSchemes.contains(DownloadScheme.DEFAULT_DOWNLOADS))) {
- String base = GWT.getHostPageBaseURL();
- int p = base.indexOf("://");
- int s = base.indexOf('/', p + 3);
- if (s < 0) {
- s = base.length();
- }
- String host = base.substring(p + 3, s);
- if (host.contains("@")) {
- host = host.substring(host.indexOf('@') + 1);
- }
-
final StringBuilder r = new StringBuilder();
- r.append(base.substring(0, p + 3));
- r.append(Gerrit.getUserAccount().getUserName());
- r.append('@');
- r.append(host);
- r.append(base.substring(s));
- r.append("p/");
+ if (Gerrit.getConfig().getGitHttpUrl() != null
+ && changeDetail.isAllowsAnonymous()) {
+ r.append(Gerrit.getConfig().getGitHttpUrl());
+ } else {
+ String base = hostPageUrl;
+ int p = base.indexOf("://");
+ int s = base.indexOf('/', p + 3);
+ if (s < 0) {
+ s = base.length();
+ }
+ String host = base.substring(p + 3, s);
+ if (host.contains("@")) {
+ host = host.substring(host.indexOf('@') + 1);
+ }
+
+ r.append(base.substring(0, p + 3));
+ r.append(Gerrit.getUserAccount().getUserName());
+ r.append('@');
+ r.append(host);
+ r.append(base.substring(s));
+ }
r.append(projectName);
r.append(" ");
r.append(patchSet.getRefName());
@@ -402,15 +423,15 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
private void populateActions(final PatchSetDetail detail) {
final boolean isOpen = changeDetail.getChange().getStatus().isOpen();
- Set<ApprovalCategory.Id> allowed = changeDetail.getCurrentActions();
- if (allowed == null) {
- allowed = Collections.emptySet();
- }
- if (isOpen && allowed.contains(ApprovalCategory.SUBMIT)) {
+ if (isOpen && changeDetail.canSubmit()) {
final Button b =
new Button(Util.M
.submitPatchSet(detail.getPatchSet().getPatchSetId()));
+ if (Gerrit.getConfig().testChangeMerge()) {
+ b.setEnabled(changeDetail.getChange().isMergeable());
+ }
+
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
@@ -438,15 +459,22 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
- new CommentedChangeActionDialog(patchSet.getId(), createCommentedCallback(b),
- Util.C.revertChangeTitle(), Util.C.headingRevertMessage(),
- Util.C.buttonRevertChangeSend(), Util.C.buttonRevertChangeCancel(),
- Gerrit.RESOURCES.css().revertChangeDialog(), Gerrit.RESOURCES.css().revertMessage(),
- Util.M.revertChangeDefaultMessage(detail.getInfo().getSubject(), detail.getPatchSet().getRevision().get())) {
- public void onSend() {
- Util.MANAGE_SVC.revertChange(getPatchSetId() , getMessageText(), createCallback());
- }
- }.center();
+ new ActionDialog(b, true, Util.C.revertChangeTitle(),
+ Util.C.headingRevertMessage()) {
+ {
+ sendButton.setText(Util.C.buttonRevertChangeSend());
+ message.setText(Util.M.revertChangeDefaultMessage(
+ detail.getInfo().getSubject(),
+ detail.getPatchSet().getRevision().get())
+ );
+ }
+
+ @Override
+ public void onSend() {
+ Util.MANAGE_SVC.revertChange(patchSet.getId(), getMessageText(),
+ createCallback());
+ }
+ }.center();
}
});
actionsPanel.add(b);
@@ -458,14 +486,42 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
- new CommentedChangeActionDialog(patchSet.getId(), createCommentedCallback(b),
- Util.C.abandonChangeTitle(), Util.C.headingAbandonMessage(),
- Util.C.buttonAbandonChangeSend(), Util.C.buttonAbandonChangeCancel(),
- Gerrit.RESOURCES.css().abandonChangeDialog(), Gerrit.RESOURCES.css().abandonMessage()) {
- public void onSend() {
- Util.MANAGE_SVC.abandonChange(getPatchSetId() , getMessageText(), createCallback());
+ new ActionDialog(b, false, Util.C.abandonChangeTitle(),
+ Util.C.headingAbandonMessage()) {
+ {
+ sendButton.setText(Util.C.buttonAbandonChangeSend());
+ }
+
+ @Override
+ public void onSend() {
+ Util.MANAGE_SVC.abandonChange(patchSet.getId(), getMessageText(),
+ createCallback());
+ }
+ }.center();
+ }
+ });
+ actionsPanel.add(b);
+ }
+
+ if (changeDetail.getChange().getStatus() == Change.Status.DRAFT
+ && changeDetail.canDeleteDraft()) {
+ final Button b = new Button(Util.C.buttonDeleteDraftChange());
+ b.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ b.setEnabled(false);
+ Util.MANAGE_SVC.deleteDraftChange(patchSet.getId(),
+ new GerritCallback<VoidResult>() {
+ public void onSuccess(VoidResult result) {
+ Gerrit.display(PageLinks.MINE);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ b.setEnabled(true);
+ super.onFailure(caught);
}
- }.center();
+ });
}
});
actionsPanel.add(b);
@@ -477,14 +533,31 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
- new CommentedChangeActionDialog(patchSet.getId(), createCommentedCallback(b),
- Util.C.restoreChangeTitle(), Util.C.headingRestoreMessage(),
- Util.C.buttonRestoreChangeSend(), Util.C.buttonRestoreChangeCancel(),
- Gerrit.RESOURCES.css().abandonChangeDialog(), Gerrit.RESOURCES.css().abandonMessage()) {
- public void onSend() {
- Util.MANAGE_SVC.restoreChange(getPatchSetId(), getMessageText(), createCallback());
- }
- }.center();
+ new ActionDialog(b, false, Util.C.restoreChangeTitle(),
+ Util.C.headingRestoreMessage()) {
+ {
+ sendButton.setText(Util.C.buttonRestoreChangeSend());
+ }
+
+ @Override
+ public void onSend() {
+ Util.MANAGE_SVC.restoreChange(patchSet.getId(), getMessageText(),
+ createCallback());
+ }
+ }.center();
+ }
+ });
+ actionsPanel.add(b);
+ }
+
+ if (changeDetail.canRebase()) {
+ final Button b = new Button(Util.C.buttonRebaseChange());
+ b.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ b.setEnabled(false);
+ Util.MANAGE_SVC.rebaseChange(patchSet.getId(),
+ new ChangeDetailCache.GerritWidgetCallback(b));
}
});
actionsPanel.add(b);
@@ -494,12 +567,10 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
private void populateDiffAllActions(final PatchSetDetail detail) {
final Button diffAllSideBySide = new Button(Util.C.buttonDiffAllSideBySide());
diffAllSideBySide.addClickHandler(new ClickHandler() {
-
@Override
public void onClick(ClickEvent event) {
for (Patch p : detail.getPatches()) {
- Window.open(Window.Location.getPath() + "#"
- + Dispatcher.toPatchSideBySide(p.getKey()), "_blank", null);
+ openWindow(Dispatcher.toPatchSideBySide(diffBaseId, p.getKey()));
}
}
});
@@ -507,25 +578,77 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
final Button diffAllUnified = new Button(Util.C.buttonDiffAllUnified());
diffAllUnified.addClickHandler(new ClickHandler() {
-
@Override
public void onClick(ClickEvent event) {
for (Patch p : detail.getPatches()) {
- Window.open(Window.Location.getPath() + "#"
- + Dispatcher.toPatchUnified(p.getKey()), "_blank", null);
+ openWindow(Dispatcher.toPatchUnified(diffBaseId, p.getKey()));
}
}
});
actionsPanel.add(diffAllUnified);
}
+ private void openWindow(String token) {
+ String url = Window.Location.getPath() + "#" + token;
+ Window.open(url, "_blank", null);
+ }
+
private void populateReviewAction() {
final Button b = new Button(Util.C.buttonReview());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
- Gerrit.display("change,publish," + patchSet.getId().toString(),
- new PublishCommentScreen(patchSet.getId()));
+ Gerrit.display(Dispatcher.toPublish(patchSet.getId()));
+ }
+ });
+ actionsPanel.add(b);
+ }
+
+ private void populatePublishAction() {
+ final Button b = new Button(Util.C.buttonPublishPatchSet());
+ b.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ b.setEnabled(false);
+ Util.MANAGE_SVC.publish(patchSet.getId(),
+ new GerritCallback<ChangeDetail>() {
+ public void onSuccess(ChangeDetail result) {
+ detailCache.set(result);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ b.setEnabled(true);
+ super.onFailure(caught);
+ }
+ });
+ }
+ });
+ actionsPanel.add(b);
+ }
+
+ private void populateDeleteDraftPatchSetAction() {
+ final Button b = new Button(Util.C.buttonDeleteDraftPatchSet());
+ b.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ b.setEnabled(false);
+ PatchUtil.DETAIL_SVC.deleteDraftPatchSet(patchSet.getId(),
+ new GerritCallback<ChangeDetail>() {
+ public void onSuccess(final ChangeDetail result) {
+ if (result != null) {
+ detailCache.set(result);
+ } else {
+ Gerrit.display(PageLinks.MINE);
+ }
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ b.setEnabled(true);
+ super.onFailure(caught);
+ }
+ });
}
});
actionsPanel.add(b);
@@ -543,18 +666,15 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
new GerritCallback<PatchSetDetail>() {
@Override
public void onSuccess(PatchSetDetail result) {
-
if (patchSet.getId().equals(diffBaseId)) {
patchTable.setVisible(false);
actionsPanel.setVisible(false);
} else {
-
if (patchTable != null) {
patchTable.removeFromParent();
}
patchTable = new PatchTable();
- patchTable.setPatchSetIdToCompareWith(diffBaseId);
- patchTable.display(result);
+ patchTable.display(diffBaseId, result);
body.add(patchTable);
for (ClickHandler clickHandler : registeredClickHandler) {
@@ -610,7 +730,7 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
new SubmitFailureDialog(result, msg).center();
}
}
- changeScreen.update(result);
+ detailCache.set(result);
}
public PatchSet getPatchSet() {
@@ -636,15 +756,24 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O
}
}
- private AsyncCallback<ChangeDetail> createCommentedCallback(final Button b) {
- return new AsyncCallback<ChangeDetail>() {
- public void onSuccess(ChangeDetail result) {
- changeScreen.update(result);
- }
+ private abstract class ActionDialog extends CommentedActionDialog<ChangeDetail> {
+ public ActionDialog(final FocusWidget enableOnFailure, final boolean redirect,
+ String dialogTitle, String dialogHeading) {
+ super(dialogTitle, dialogHeading, new ChangeDetailCache.IgnoreErrorCallback() {
+ @Override
+ public void onSuccess(ChangeDetail result) {
+ if (redirect) {
+ Gerrit.display(PageLinks.toChange(result.getChange().getId()));
+ } else {
+ super.onSuccess(result);
+ }
+ }
- public void onFailure(Throwable caught) {
- b.setEnabled(true);
- }
- };
+ @Override
+ public void onFailure(Throwable caught) {
+ enableOnFailure.setEnabled(true);
+ }
+ });
+ }
}
}