From 308ebeed15005e4a990ec91b0bd51727a4dec48d Mon Sep 17 00:00:00 2001 From: Thomas Wolf Date: Sat, 31 Dec 2016 15:58:46 +0100 Subject: [PATCH] [duplicate code] Unify scheduling of merge jobs MergeActionHandler and the history view's MergeHandler had lots of duplicated code. Refactor to avoid code duplication and use JobUtil to schedule the job. Change-Id: I111133a92e16381d4defcfef3915ff4e5c3cc7a4 Signed-off-by: Thomas Wolf --- .../src/org/eclipse/egit/ui/JobFamilies.java | 5 + .../ui/internal/actions/MergeActionHandler.java | 119 ++++++++++----------- .../ui/internal/history/command/MergeHandler.java | 103 +++--------------- 3 files changed, 78 insertions(+), 149 deletions(-) diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/JobFamilies.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/JobFamilies.java index c45a46297..06af3f6c6 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/JobFamilies.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/JobFamilies.java @@ -66,6 +66,11 @@ public class JobFamilies { public final static Object CHECKOUT = new JobFamily(UIIcons.CHECKOUT); /** + * Merge job + */ + public final static Object MERGE = new JobFamily(UIIcons.MERGE); + + /** * Push job */ public final static Object PUSH = new JobFamily(UIIcons.PUSH); diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/MergeActionHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/MergeActionHandler.java index e004e4857..8500e084e 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/MergeActionHandler.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/MergeActionHandler.java @@ -17,15 +17,13 @@ import java.io.IOException; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.WorkspaceJob; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import org.eclipse.egit.core.internal.job.JobUtil; import org.eclipse.egit.core.op.MergeOperation; import org.eclipse.egit.ui.Activator; +import org.eclipse.egit.ui.JobFamilies; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.egit.ui.internal.branch.LaunchFinder; import org.eclipse.egit.ui.internal.dialogs.BasicConfigurationDialog; @@ -38,7 +36,6 @@ import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryState; import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; @@ -49,74 +46,24 @@ public class MergeActionHandler extends RepositoryActionHandler { @Override public Object execute(final ExecutionEvent event) throws ExecutionException { - final Repository repository = getRepository(true, event); + Repository repository = getRepository(true, event); + Shell shell = getShell(event); if (repository == null - || !checkMergeIsPossible(repository, getShell(event)) + || !checkMergeIsPossible(repository, shell) || LaunchFinder.shouldCancelBecauseOfRunningLaunches(repository, null)) { return null; } BasicConfigurationDialog.show(repository); MergeTargetSelectionDialog mergeTargetSelectionDialog = new MergeTargetSelectionDialog( - getShell(event), repository); + shell, repository); if (mergeTargetSelectionDialog.open() == IDialogConstants.OK_ID) { - - final String refName = mergeTargetSelectionDialog.getRefName(); - - String jobname = NLS.bind(UIText.MergeAction_JobNameMerge, refName); - final MergeOperation op = new MergeOperation(repository, refName); + String refName = mergeTargetSelectionDialog.getRefName(); + MergeOperation op = new MergeOperation(repository, refName); op.setSquash(mergeTargetSelectionDialog.isMergeSquash()); op.setFastForwardMode(mergeTargetSelectionDialog.getFastForwardMode()); op.setCommit(mergeTargetSelectionDialog.isCommit()); - Job job = new WorkspaceJob(jobname) { - @Override - public IStatus runInWorkspace(IProgressMonitor monitor) { - try { - op.execute(monitor); - } catch (final CoreException e) { - return e.getStatus(); - } - return Status.OK_STATUS; - } - }; - job.setUser(true); - job.setRule(op.getSchedulingRule()); - job.addJobChangeListener(new JobChangeAdapter() { - @Override - public void done(IJobChangeEvent cevent) { - IStatus result = cevent.getJob().getResult(); - if (result.getSeverity() == IStatus.CANCEL) - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - // don't use getShell(event) here since - // the active shell has changed since the - // execution has been triggered. - Shell shell = PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getShell(); - MessageDialog - .openInformation( - shell, - UIText.MergeAction_MergeCanceledTitle, - UIText.MergeAction_MergeCanceledMessage); - } - }); - else if (!result.isOK()) - Activator.handleError(result.getMessage(), result - .getException(), true); - else - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - Shell shell = PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getShell(); - MergeResultDialog.getDialog(shell, repository, op - .getResult()).open(); - } - }); - } - }); - job.schedule(); + doMerge(repository, op, refName); } return null; } @@ -162,4 +109,52 @@ public class MergeActionHandler extends RepositoryActionHandler { MessageDialog.openError(shell, UIText.MergeAction_CannotMerge, message); return (message == null); } + + /** + * Run a {@link MergeOperation} in a {@link WorkspaceJob} and report the + * result in a dialog. + * + * @param repository + * the merge operates on + * @param op + * performing the merge + * @param refName + * the merge is for; used in the job's name + */ + public static void doMerge(Repository repository, MergeOperation op, + String refName) { + JobUtil.scheduleUserWorkspaceJob(op, + NLS.bind(UIText.MergeAction_JobNameMerge, refName), + JobFamilies.MERGE, new JobChangeAdapter() { + + @Override + public void done(IJobChangeEvent event) { + IStatus result = event.getJob().getResult(); + if (result.getSeverity() == IStatus.CANCEL) { + PlatformUI.getWorkbench().getDisplay() + .asyncExec(() -> { + Shell shell = PlatformUI.getWorkbench() + .getActiveWorkbenchWindow() + .getShell(); + MessageDialog.openInformation(shell, + UIText.MergeAction_MergeCanceledTitle, + UIText.MergeAction_MergeCanceledMessage); + }); + } else if (!result.isOK()) { + Activator.handleError(result.getMessage(), + result.getException(), true); + } else { + PlatformUI.getWorkbench().getDisplay() + .asyncExec(() -> { + Shell shell = PlatformUI.getWorkbench() + .getActiveWorkbenchWindow() + .getShell(); + MergeResultDialog.getDialog(shell, + repository, op.getResult()) + .open(); + }); + } + } + }); + } } diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/MergeHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/MergeHandler.java index e852ac363..dbfdb8777 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/MergeHandler.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/MergeHandler.java @@ -19,32 +19,18 @@ import java.util.List; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.resources.WorkspaceJob; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.egit.core.op.MergeOperation; -import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.egit.ui.internal.actions.MergeActionHandler; import org.eclipse.egit.ui.internal.branch.LaunchFinder; import org.eclipse.egit.ui.internal.dialogs.BranchSelectionDialog; -import org.eclipse.egit.ui.internal.merge.MergeResultDialog; -import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.window.Window; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryState; -import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.HandlerUtil; /** @@ -53,22 +39,15 @@ import org.eclipse.ui.handlers.HandlerUtil; public class MergeHandler extends AbstractHistoryCommandHandler { @Override - public boolean isEnabled() { - final Repository repository = getRepository(getPage()); - if (repository == null) - return false; - return repository.getRepositoryState().equals(RepositoryState.SAFE); - } - - @Override public Object execute(ExecutionEvent event) throws ExecutionException { ObjectId commitId = getSelectedCommitId(event); - final Repository repository = getRepository(event); - if (repository == null) + Repository repository = getRepository(event); + if (repository == null) { return null; + } + Shell shell = HandlerUtil.getActiveShellChecked(event); - if (!MergeActionHandler.checkMergeIsPossible(repository, - getShell(event)) + if (!MergeActionHandler.checkMergeIsPossible(repository, shell) || LaunchFinder.shouldCancelBecauseOfRunningLaunches(repository, null)) { return null; @@ -90,75 +69,25 @@ public class MergeHandler extends AbstractHistoryCommandHandler { refName = nodes.get(0).getName(); } else { BranchSelectionDialog dlg = new BranchSelectionDialog<>( - HandlerUtil.getActiveShellChecked(event), nodes, + shell, nodes, UIText.MergeHandler_SelectBranchTitle, UIText.MergeHandler_SelectBranchMessage, SWT.SINGLE); - if (dlg.open() == Window.OK) + if (dlg.open() == Window.OK) { refName = dlg.getSelectedNode().getName(); - else + } else { return null; - } - String jobname = NLS.bind(UIText.MergeAction_JobNameMerge, refName); - final MergeOperation op = new MergeOperation(repository, refName); - Job job = new WorkspaceJob(jobname) { - - @Override - public IStatus runInWorkspace(IProgressMonitor monitor) { - try { - op.execute(monitor); - } catch (final CoreException e) { - return e.getStatus(); - } - return Status.OK_STATUS; - } - }; - job.setUser(true); - job.setRule(op.getSchedulingRule()); - job.addJobChangeListener(new JobChangeAdapter() { - @Override - public void done(IJobChangeEvent cevent) { - IStatus result = cevent.getJob().getResult(); - if (result.getSeverity() == IStatus.CANCEL) - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - // don't use getShell(event) here since - // the active shell has changed since the - // execution has been triggered. - Shell shell = PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getShell(); - MessageDialog - .openInformation( - shell, - UIText.MergeAction_MergeCanceledTitle, - UIText.MergeAction_MergeCanceledMessage); - } - }); - else if (!result.isOK()) - Activator.handleError(result.getMessage(), result - .getException(), true); - else - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - Shell shell = PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getShell(); - MergeResultDialog.getDialog(shell, repository, op - .getResult()).open(); - } - }); } - }); - job.schedule(); + } + MergeOperation op = new MergeOperation(repository, refName); + MergeActionHandler.doMerge(repository, op, refName); return null; } - /** - * @param event - * @return the shell for the event - */ - public Shell getShell(ExecutionEvent event) { - return HandlerUtil.getActiveShell(event); + @Override + public boolean isEnabled() { + Repository repository = getRepository(getPage()); + return repository != null + && repository.getRepositoryState().equals(RepositoryState.SAFE); } } -- 2.11.4.GIT