public async Task MultiRunConfig_ReloadProject_ProjectRunConfigUpdatedInMultiRunConfig() { string solFile = Util.GetSampleProject("test-multi-run-config-reload", "test-multi-run-config-reload.sln"); using (var sol = (Solution)await Services.ProjectService.ReadWorkspaceItem(Util.GetMonitor(), solFile)) { var projectA = (DotNetProject)sol.FindProjectByName("ProjectA"); var projectB = (DotNetProject)sol.FindProjectByName("ProjectB"); Assert.IsNotNull(projectA); Assert.IsNotNull(projectB); var multiRunConfig = new MultiItemSolutionRunConfiguration("MultiTestId", "multi"); var startupItem1 = new StartupItem(projectA, projectA.RunConfigurations.Single()); multiRunConfig.Items.Add(startupItem1); var startupItem2 = new StartupItem(projectB, projectB.RunConfigurations.Single()); multiRunConfig.Items.Add(startupItem2); sol.MultiStartupRunConfigurations.Add(multiRunConfig); await sol.RootFolder.ReloadItem(Util.GetMonitor(), projectA); // Ensure latest project instance is used by getting them from the solution again. projectA = (DotNetProject)sol.FindProjectByName("ProjectA"); projectB = (DotNetProject)sol.FindProjectByName("ProjectB"); var runConfigA = multiRunConfig.Items.Single(item => item.SolutionItem == projectA); Assert.AreEqual(projectA.RunConfigurations.Single(), runConfigA.RunConfiguration, "Multi-run config does not match project's run config (ProjectA)"); var runConfigB = multiRunConfig.Items.Single(item => item.SolutionItem == projectB); Assert.AreEqual(projectB.RunConfigurations.Single(), runConfigB.RunConfiguration, "Multi-run config does not match project's run config (ProjectB)"); } }
protected internal override void OnExecute(IProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration) { if (SingleStartup) { if (StartupItem == null) { monitor.ReportError(GettextCatalog.GetString("Startup item not set"), null); return; } StartupItem.Execute(monitor, context, configuration); } else { List <IAsyncOperation> list = new List <IAsyncOperation> (); monitor.BeginTask("Executing projects", 1); SynchronizedProgressMonitor syncMonitor = new SynchronizedProgressMonitor(monitor); foreach (SolutionEntityItem it in MultiStartupItems) { if (!it.CanExecute(context, configuration)) { continue; } AggregatedProgressMonitor mon = new AggregatedProgressMonitor(); mon.AddSlaveMonitor(syncMonitor, MonitorAction.ReportError | MonitorAction.ReportWarning | MonitorAction.SlaveCancel); list.Add(mon.AsyncOperation); SolutionEntityItem cit = it; Thread t = new Thread(delegate() { try { using (mon) { cit.Execute(mon, context, configuration); } } catch (Exception ex) { LoggingService.LogError("Project execution failed", ex); } }); t.Name = "Project execution"; t.IsBackground = true; t.Start(); } foreach (IAsyncOperation op in list) { op.WaitForCompleted(); } monitor.EndTask(); } }
void SetupNewItem(SolutionItem item, SolutionItem replacedItem) { ConvertToSolutionFormat(item, false); SolutionEntityItem eitem = item as SolutionEntityItem; if (eitem != null) { eitem.NeedsReload = false; if (eitem.SupportsConfigurations() || replacedItem != null) { if (replacedItem == null) { // Register the new entry in every solution configuration foreach (SolutionConfiguration conf in Configurations) { conf.AddItem(eitem); } // If there is no startup project or it is an invalid one, use the new project as startup if possible if ((StartupItem == null || !StartupItem.SupportsExecute()) && eitem.SupportsExecute()) { StartupItem = eitem; } } else { // Reuse the configuration information of the replaced item foreach (SolutionConfiguration conf in Configurations) { conf.ReplaceItem((SolutionEntityItem)replacedItem, eitem); } if (StartupItem == replacedItem) { StartupItem = eitem; } else { int i = MultiStartupItems.IndexOf((SolutionEntityItem)replacedItem); if (i != -1) { MultiStartupItems [i] = eitem; } } } } } }
/*protected virtual*/ async Task OnExecute(ProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration) { if (SingleStartup) { if (StartupItem == null) { monitor.ReportError(GettextCatalog.GetString("Startup item not set"), null); return; } await StartupItem.Execute(monitor, context, configuration); } else { var tasks = new List <Task> (); var monitors = new List <AggregatedProgressMonitor> (); monitor.BeginTask("Executing projects", 1); foreach (SolutionItem it in MultiStartupItems) { if (!it.CanExecute(context, configuration)) { continue; } AggregatedProgressMonitor mon = new AggregatedProgressMonitor(); mon.AddSlaveMonitor(monitor, MonitorAction.ReportError | MonitorAction.ReportWarning | MonitorAction.SlaveCancel); monitors.Add(mon); tasks.Add(it.Execute(mon, context, configuration)); } try { await Task.WhenAll(tasks); } catch (Exception ex) { LoggingService.LogError("Project execution failed", ex); } finally { foreach (var m in monitors) { m.Dispose(); } } monitor.EndTask(); } }
protected internal override bool OnGetCanExecute(ExecutionContext context, ConfigurationSelector configuration) { if (SingleStartup) { if (StartupItem == null) { return(false); } return(StartupItem.CanExecute(context, configuration)); } else { foreach (SolutionEntityItem it in MultiStartupItems) { if (it.CanExecute(context, configuration)) { return(true); } } return(false); } }