Index: dart/editor/tools/plugins/com.google.dart.tools.debug.ui/src/com/google/dart/tools/debug/ui/internal/util/LaunchUtils.java |
=================================================================== |
--- dart/editor/tools/plugins/com.google.dart.tools.debug.ui/src/com/google/dart/tools/debug/ui/internal/util/LaunchUtils.java (revision 29808) |
+++ dart/editor/tools/plugins/com.google.dart.tools.debug.ui/src/com/google/dart/tools/debug/ui/internal/util/LaunchUtils.java (working copy) |
@@ -25,21 +25,21 @@ |
import com.google.dart.tools.debug.core.DartLaunchConfigWrapper; |
import com.google.dart.tools.debug.ui.internal.DartDebugUIPlugin; |
import com.google.dart.tools.debug.ui.internal.DartUtil; |
-import com.google.dart.tools.debug.ui.internal.DebugErrorHandler; |
import com.google.dart.tools.debug.ui.internal.browser.BrowserLaunchShortcut; |
import com.google.dart.tools.debug.ui.internal.dartium.DartiumLaunchShortcut; |
import com.google.dart.tools.debug.ui.internal.server.DartServerLaunchShortcut; |
import org.apache.commons.lang3.ObjectUtils; |
+import org.eclipse.core.resources.IFile; |
import org.eclipse.core.resources.IProject; |
import org.eclipse.core.resources.IResource; |
+import org.eclipse.core.resources.ResourcesPlugin; |
import org.eclipse.core.runtime.CoreException; |
import org.eclipse.core.runtime.IConfigurationElement; |
import org.eclipse.core.runtime.IExtensionPoint; |
-import org.eclipse.core.runtime.IProgressMonitor; |
-import org.eclipse.core.runtime.IStatus; |
+import org.eclipse.core.runtime.OperationCanceledException; |
import org.eclipse.core.runtime.Platform; |
-import org.eclipse.core.runtime.Status; |
+import org.eclipse.core.runtime.jobs.IJobManager; |
import org.eclipse.core.runtime.jobs.Job; |
import org.eclipse.debug.core.DebugPlugin; |
import org.eclipse.debug.core.ILaunchConfiguration; |
@@ -52,7 +52,6 @@ |
import org.eclipse.jface.viewers.ISelectionProvider; |
import org.eclipse.jface.viewers.IStructuredSelection; |
import org.eclipse.jface.window.Window; |
-import org.eclipse.swt.widgets.Display; |
import org.eclipse.ui.IEditorPart; |
import org.eclipse.ui.IWorkbenchPage; |
import org.eclipse.ui.IWorkbenchPart; |
@@ -84,6 +83,35 @@ |
private static List<ILaunchShortcut> shortcuts; |
/** |
+ * Returns true if the given launch config can be launched w/o waiting on the builder. |
+ */ |
+ public static boolean canFastLaunch(ILaunchConfiguration config) { |
+ DartLaunchConfigWrapper wrapper = new DartLaunchConfigWrapper(config); |
+ IProject project = wrapper.getProject(); |
+ |
+ if (project == null) { |
+ return false; |
+ } |
+ |
+ // if pubspec.yaml is not up-to-date, return false |
+ IFile pubspecYamlFile = project.getFile(DartCore.PUBSPEC_FILE_NAME); |
+ |
+ if (pubspecYamlFile.exists()) { |
+ IFile pubspecLockFile = project.getFile(DartCore.PUBSPEC_LOCK_FILE_NAME); |
+ |
+ if (!pubspecLockFile.exists()) { |
+ return false; |
+ } |
+ |
+ if (pubspecLockFile.getLocalTimeStamp() < pubspecYamlFile.getLocalTimeStamp()) { |
+ return false; |
+ } |
+ } |
+ |
+ return true; |
+ } |
+ |
+ /** |
* Allow the user to choose one from a set of launch configurations. |
* |
* @param configList |
@@ -458,43 +486,30 @@ |
* @param mode the launch mode |
*/ |
public static void launch(final ILaunchConfiguration config, final String mode) { |
- if (DartDebugCorePlugin.canFastLaunch(config)) { |
- // If there are any dirty editors for the given project, save them now. |
- DartLaunchConfigWrapper wrapper = new DartLaunchConfigWrapper(config); |
- IProject project = wrapper.getProject(); |
+ // If there are any dirty editors for the given project, save them now. |
+ DartLaunchConfigWrapper wrapper = new DartLaunchConfigWrapper(config); |
+ IProject project = wrapper.getProject(); |
- if (project != null) { |
- IDE.saveAllEditors(new IResource[] {project}, false); |
- } |
+ if (project != null) { |
+ IDE.saveAllEditors(new IResource[] {project}, false); |
+ } |
- Job launchJob = new Job("Launching " + config.getName()) { |
- @Override |
- protected IStatus run(IProgressMonitor monitor) { |
- try { |
- config.launch(mode, monitor, false); |
- } catch (final CoreException e) { |
- Display.getDefault().asyncExec(new Runnable() { |
- @Override |
- public void run() { |
- DebugErrorHandler.errorDialog( |
- null, |
- "Error Launching " + config.getName(), |
- e.toString(), |
- e.getStatus()); |
- } |
- }); |
- } |
+ if (!canFastLaunch(config)) { |
+ try { |
+ // Wait on any existing builds (i.e., something like provisioning pub). |
+ IJobManager jobManager = Job.getJobManager(); |
- monitor.done(); |
+ jobManager.join(ResourcesPlugin.FAMILY_MANUAL_BUILD, null); |
+ jobManager.join(ResourcesPlugin.FAMILY_AUTO_BUILD, null); |
+ } catch (OperationCanceledException e) { |
+ // user cancelled |
- return Status.OK_STATUS; |
- } |
- }; |
+ } catch (InterruptedException e) { |
+ DartDebugCorePlugin.logError(e); |
+ } |
+ } |
- launchJob.schedule(); |
- } else { |
- DebugUITools.launch(config, mode); |
- } |
+ DebugUITools.launch(config, mode); |
} |
/** |