Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Folk2014-12-26 21:20:50 +0000
committerSam Davis2015-01-21 18:42:33 +0000
commit715e2076cdf282244f1363d51476ff95be9e4909 (patch)
treed5ccee8a45291d382f4c9b8668b24de4b9869583 /org.eclipse.mylyn.gerrit.ui
parentc20f5bf37ed0831a032929b065e3b8129793d93b (diff)
downloadorg.eclipse.mylyn.reviews-715e2076cdf282244f1363d51476ff95be9e4909.tar.gz
org.eclipse.mylyn.reviews-715e2076cdf282244f1363d51476ff95be9e4909.tar.xz
org.eclipse.mylyn.reviews-715e2076cdf282244f1363d51476ff95be9e4909.zip
443869: user can cherry pick to a remote branch
Change-Id: Ic4cc59bd9d4030d8badf53d91946083d5f618f68 Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=443869 Signed-off-by: Nicholas Folk <Nicholas.folk@tasktop.com>
Diffstat (limited to 'org.eclipse.mylyn.gerrit.ui')
-rw-r--r--org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/CherryPickUiFactory.java39
-rw-r--r--org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/Messages.java6
-rw-r--r--org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/PatchSetUiFactoryProvider.java1
-rw-r--r--org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/messages.properties1
-rw-r--r--org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/CherryPickDialog.java158
-rw-r--r--org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/Messages.java12
-rw-r--r--org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/messages.properties4
7 files changed, 221 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/CherryPickUiFactory.java b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/CherryPickUiFactory.java
new file mode 100644
index 000000000..ff6694fba
--- /dev/null
+++ b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/CherryPickUiFactory.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Tasktop Technologies and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.gerrit.ui.factories;
+
+import org.eclipse.mylyn.internal.gerrit.core.client.GerritChange;
+import org.eclipse.mylyn.internal.gerrit.ui.operations.CherryPickDialog;
+import org.eclipse.mylyn.reviews.core.model.IReviewItemSet;
+import org.eclipse.mylyn.reviews.ui.spi.factories.IUiContext;
+
+public class CherryPickUiFactory extends AbstractPatchSetUiFactory {
+
+ public CherryPickUiFactory(IUiContext context, IReviewItemSet set) {
+ super(Messages.CherryPickUiFactory_Cherry_Pick, context, set);
+ }
+
+ @Override
+ public boolean isExecutable() {
+ if (isAnonymous()) {
+ return false;
+ }
+ GerritChange change = getChange();
+ return change != null && change.getChangeDetail() != null && change.getChangeDetail().canCherryPick();
+ }
+
+ @Override
+ public void execute() {
+ new CherryPickDialog(getShell(), getTask(), getPatchSetDetail().getPatchSet(), getChange()).open(getEditor());
+ }
+
+}
diff --git a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/Messages.java b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/Messages.java
index e8c383a2d..f64159274 100644
--- a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/Messages.java
+++ b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/Messages.java
@@ -19,6 +19,7 @@ public class Messages extends NLS {
public static String AbandonUiFactory_Abandon;
public static String AbstractPatchSetUiFactory_Clone_Git_Repository;
+
public static String AbstractPatchSetUiFactory_Gerrit_Fetch_Change_Error;
public static String AbstractPatchSetUiFactory_Git_repository_not_found_in_workspace;
@@ -28,6 +29,9 @@ public class Messages extends NLS {
public static String AbstractPatchSetUiFactory_No_remote_config_found_with_fetch_URL;
public static String AddReviewersUiFactory_Add_Reviewers;
+
+ public static String CherryPickUiFactory_Cherry_Pick;
+
public static String CompareWithUiFactory_Base;
public static String CompareWithUiFactory_Compare_Patch_Set_X_with_Y;
@@ -43,9 +47,11 @@ public class Messages extends NLS {
public static String OpenCommitUiFactory_Open_Commit;
public static String OpenCommitUiFactory_Opening_Commit_Viewer;
+
public static String OpenFileUiFactory_File_not_available;
public static String OpenFileUiFactory_Open_File;
+
public static String PublishUiFactory_Clearing_status_failed;
public static String PublishUiFactory_Error_while_clearing_status;
diff --git a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/PatchSetUiFactoryProvider.java b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/PatchSetUiFactoryProvider.java
index 6b01f2ec1..94ca7597b 100644
--- a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/PatchSetUiFactoryProvider.java
+++ b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/PatchSetUiFactoryProvider.java
@@ -32,6 +32,7 @@ public class PatchSetUiFactoryProvider extends AbstractReviewItemSetUiFactoryPro
factories.add(new FetchUiFactory(context, set));
factories.add(new CompareWithUiFactory(context, set));
factories.add(new RebaseUiFactory(context, set));
+ factories.add(new CherryPickUiFactory(context, set));
factories.add(new SubmitUiFactory(context, set));
factories.add(new AbandonUiFactory(context, set));
factories.add(new RestoreUiFactory(context, set));
diff --git a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/messages.properties b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/messages.properties
index 0aa9f01e8..5d44bbfd1 100644
--- a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/messages.properties
+++ b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/factories/messages.properties
@@ -15,6 +15,7 @@ AbstractPatchSetUiFactory_Git_repository_not_found_in_workspace=The referenced G
AbstractPatchSetUiFactory_No_Git_repository_found_for_fetching=No Git repository found for fetching Gerrit change {0}
AbstractPatchSetUiFactory_No_remote_config_found_with_fetch_URL=No remote config found that has fetch URL with host ''{0}'' and path matching ''{1}''
AddReviewersUiFactory_Add_Reviewers=Add Reviewers...
+CherryPickUiFactory_Cherry_Pick=Cherry Pick To
CompareWithUiFactory_Base=Base
CompareWithUiFactory_Compare_Patch_Set_X_with_Y=Compare Patch Set {0} with {1}
CompareWithUiFactory_Compare_With=Compare With...
diff --git a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/CherryPickDialog.java b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/CherryPickDialog.java
new file mode 100644
index 000000000..fa2e114e1
--- /dev/null
+++ b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/CherryPickDialog.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Tasktop Technologies and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.gerrit.ui.operations;
+
+import java.util.List;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.mylyn.internal.gerrit.core.client.GerritChange;
+import org.eclipse.mylyn.internal.gerrit.core.operations.CherryPickRequest;
+import org.eclipse.mylyn.internal.gerrit.core.operations.GerritOperation;
+import org.eclipse.mylyn.internal.gerrit.ui.GerritUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextEditor;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.data.ChangeDetail;
+import com.google.gerrit.common.data.PatchSetDetail;
+import com.google.gerrit.reviewdb.PatchSet;
+
+public class CherryPickDialog extends GerritOperationDialog {
+
+ private PatchSet patchSet;
+
+ private GerritChange change;
+
+ private RichTextEditor commitMessage;
+
+ private Text destination;
+
+ public CherryPickDialog(Shell parentShell, ITask task) {
+ super(parentShell, task);
+ }
+
+ public CherryPickDialog(Shell shell, ITask task, PatchSet patchSet, GerritChange gerritChange) {
+ super(shell, task);
+ this.patchSet = patchSet;
+ this.change = gerritChange;
+ }
+
+ @Override
+ public GerritOperation<?> createOperation() {
+ int patchSetId = patchSet.getId().get();
+ CherryPickRequest request = new CherryPickRequest(task.getTaskId(), patchSetId, getDestination());
+ request.setMessage(commitMessage.getText());
+ return GerritUiPlugin.getDefault().getOperationFactory().createOperation(task, request);
+ }
+
+ private String getDestination() {
+ return destination.getText();
+ }
+
+ @Override
+ protected Control createPageControls(final Composite parent) {
+ setTitle(Messages.CherryPickDialog_Cherry_Pick);
+ setMessage(NLS.bind(Messages.CherryPickDialog_Change_X_Set_Y, task.getTaskId(), patchSet.getPatchSetId()));
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayoutFactory.swtDefaults().applyTo(composite);
+
+ Label branchlabel = new Label(composite, SWT.NONE);
+ branchlabel.setText(NLS.bind(Messages.CherryPickDialog_Cherry_Pick_to_Branch, patchSet.getRefName()));
+
+ destination = new Text(composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
+ GridDataFactory.swtDefaults().align(SWT.FILL, SWT.FILL).applyTo(destination);
+
+ Label commitLabel = new Label(composite, SWT.NONE);
+ commitLabel.setText(NLS.bind(Messages.CherryPickDialog_Cherry_Pick_Commit_Message, patchSet.getRefName()));
+
+ commitMessage = createRichTextEditor(composite, ""); //$NON-NLS-1$
+ GridDataFactory.fillDefaults().grab(true, true).hint(400, 100).applyTo(commitMessage.getControl());
+ commitMessage.setText(getCommitMessage());
+
+ destination.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ updateButtons();
+ }
+ });
+ commitMessage.getViewer().addTextListener(new ITextListener() {
+ @Override
+ public void textChanged(TextEvent event) {
+ updateButtons();
+ }
+ });
+
+ destination.setFocus();
+ return composite;
+ }
+
+ private String getCommitMessage() {
+ List<PatchSetDetail> details = change.getPatchSetDetails();
+ // If patchSet doesn't exist in details, return commit message of most recent patch set
+ PatchSetDetail patchSetDetail = details.get(details.size() - 1);
+ for (PatchSetDetail detail : details) {
+ if (detail.getPatchSet() == patchSet) {
+ patchSetDetail = detail;
+ }
+ }
+ return patchSetDetail.getInfo().getMessage();
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Control control = super.createContents(parent);
+ setOKButtonEnabled(false);
+ return control;
+ };
+
+ @Override
+ protected boolean processOperationResult(GerritOperation<?> operation) {
+ if (operation != null) {
+ ChangeDetail changeDetail = (ChangeDetail) operation.getOperationResult();
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ if (changeDetail != null && changeDetail.getChange() != null) {
+ // changeId is deprecated, yet gerrit still uses it as an identifier, as does mylyn reviews
+ TasksUiUtil.openTask(repository, changeDetail.getChange().getChangeId() + ""); //$NON-NLS-1$
+ }
+ }
+ return super.processOperationResult(operation);
+ }
+
+ private void updateButtons() {
+ boolean isSubmittable = !Strings.isNullOrEmpty(destination.getText())
+ && !Strings.isNullOrEmpty(commitMessage.getText());
+ setOKButtonEnabled(isSubmittable);
+ }
+
+ private void setOKButtonEnabled(boolean enable) {
+ getButton(IDialogConstants.OK_ID).setEnabled(enable);
+ }
+
+}
diff --git a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/Messages.java b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/Messages.java
index f43a23486..e73e448c4 100644
--- a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/Messages.java
+++ b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/Messages.java
@@ -32,9 +32,20 @@ public class Messages extends NLS {
public static String PublishDialog_Publishes_X_drafts;
+ public static String CherryPickDialog_Cherry_Pick;
+
+ public static String CherryPickDialog_Change_X_Set_Y;
+
+ public static String CherryPickDialog_Cherry_Pick_to_Branch;
+
+ public static String CherryPickDialog_Cherry_Pick_Commit_Message;
+
+ public static String CherryPickDialog_Cherry_Pick_Commit_Message_Template;
+
public static String RebaseDialog_Rebase_Patch_Set;
public static String RebaseDialog_Rebase_patch_set_X;
+
public static String RestoreDialog_Enter_message;
public static String RestoreDialog_Restore_Change;
@@ -42,6 +53,7 @@ public class Messages extends NLS {
public static String SubmitDialog_Submit_Change;
public static String SubmitDialog_Submit_change_confirmation;
+
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/messages.properties b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/messages.properties
index 76e251a62..ba1a0e7a7 100644
--- a/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/messages.properties
+++ b/org.eclipse.mylyn.gerrit.ui/src/org/eclipse/mylyn/internal/gerrit/ui/operations/messages.properties
@@ -16,6 +16,10 @@ PublishDialog_Change_X_dash_Y=Change {0} - {1}
PublishDialog_Publish_Comments=Publish Comments
PublishDialog_Publishes_1_draft=Publishes 1 draft.
PublishDialog_Publishes_X_drafts=Publishes {0} drafts.
+CherryPickDialog_Cherry_Pick=Cherry Pick Change to Another Branch
+CherryPickDialog_Change_X_Set_Y=Change: {0} - Patch Set: {1}
+CherryPickDialog_Cherry_Pick_to_Branch=Cherry Pick to Branch:
+CherryPickDialog_Cherry_Pick_Commit_Message=Cherry Pick Commit Message:
RebaseDialog_Rebase_Patch_Set=Rebase Patch Set
RebaseDialog_Rebase_patch_set_X=Rebase patch set {0}
RestoreDialog_Enter_message=Enter an optional message.

Back to the top