diff options
author | Nicholas Folk | 2014-12-26 21:20:50 +0000 |
---|---|---|
committer | Sam Davis | 2015-01-21 18:42:33 +0000 |
commit | 715e2076cdf282244f1363d51476ff95be9e4909 (patch) | |
tree | d5ccee8a45291d382f4c9b8668b24de4b9869583 /org.eclipse.mylyn.gerrit.ui | |
parent | c20f5bf37ed0831a032929b065e3b8129793d93b (diff) | |
download | org.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')
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. |