diff options
author | Matt Ward <matt.ward@xamarin.com> | 2015-12-15 22:58:39 +0300 |
---|---|---|
committer | Matt Ward <matt.ward@xamarin.com> | 2015-12-16 13:14:20 +0300 |
commit | 874d975fcb3f8f9cebcd7a9fc9299be591b11bf7 (patch) | |
tree | b67d055d2cddb8e53d3ef742ffab464123ce8359 /main | |
parent | db5f99bad79b1626a465cb685698e32781fd0ac8 (diff) |
[NuGet] Stop using DispatcherService.
The NuGet addin no longer uses the DispatcherService to run package
actions in the background. It now uses its own background thread to
queue and run these actions.
Due to being unable to use the original DispatcherService's
BackgroundDispatchAndWait without locking up the UI the
PackageManagementProjectOperations.InstallPackages has been changed
to return when the package install has started. Previously it would
wait until the packages were finished installing.
Also the PackageManagementProjectOperations.GetIstalledPackages now
returns installed packages as well as those being installed. This
prevents a Xamarin Component that installs a NuGet package from
showing an error when it is installed. Unfortunately one side effect
of this change is that if the NuGet package fails to install the
Component does not show an error icon when previously it did since
originally the packages were installed and then the list of packages
was checked. Now this happens whilst the packages are being installed.
Diffstat (limited to 'main')
16 files changed, 145 insertions, 102 deletions
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/PackageManagementStartupHandler.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/PackageManagementStartupHandler.cs index 2923b1732c..60e1ecefc1 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/PackageManagementStartupHandler.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/PackageManagementStartupHandler.cs @@ -62,7 +62,7 @@ namespace MonoDevelop.PackageManagement.Commands // the check for updates starts. Otherwise the check for updates finishes
// before the solution loads and the status bar never reports that
// package updates were being checked.
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
CheckForUpdates ();
});
}
@@ -91,7 +91,7 @@ namespace MonoDevelop.PackageManagement.Commands bool checkUpdatesAfterRestore = ShouldCheckForUpdates && AnyProjectHasPackages ();
var restorer = new PackageRestorer (projectService.OpenSolution.Solution);
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
restorer.Restore ();
if (checkUpdatesAfterRestore && !restorer.RestoreFailed) {
CheckForUpdates ();
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesHandler.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesHandler.cs index dea452c44d..208dd75003 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesHandler.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesHandler.cs @@ -42,7 +42,7 @@ namespace MonoDevelop.PackageManagement.Commands protected override void Run ()
{
var runner = new PackageRestoreRunner ();
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
runner.Run ();
});
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs index cd12b8ef75..d130b4b906 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs @@ -40,7 +40,7 @@ namespace MonoDevelop.PackageManagement.Commands ProgressMonitorStatusMessage progressMessage = ProgressMonitorStatusMessageFactory.CreateRestoringPackagesInProjectMessage ();
var runner = new PackageRestoreRunner ();
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
runner.Run (project, progressMessage);
});
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/AddPackagesDialog.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/AddPackagesDialog.cs index 22c835f102..be46db225f 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/AddPackagesDialog.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/AddPackagesDialog.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
+using System.Threading.Tasks;
using MonoDevelop.PackageManagement;
using Mono.Unix;
using MonoDevelop.Core;
@@ -446,7 +447,7 @@ namespace MonoDevelop.PackageManagement // Workaround: Image loading is incorrectly being done on GUI thread
// since the wrong synchronization context seems to be used. So
// here we switch to a background thread and then back to the GUI thread.
- DispatchService.BackgroundDispatch (() => LoadImage (packageViewModel.IconUrl, row));
+ Task.Run (() => LoadImage (packageViewModel.IconUrl, row));
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs index dedc197577..452deaae32 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableBackgroundPackageActionRunner.cs @@ -35,7 +35,7 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers {
public class TestableBackgroundPackageActionRunner : BackgroundPackageActionRunner
{
- public List<MessageHandler> BackgroundDispatchersQueued = new List<MessageHandler> ();
+ public List<Action> BackgroundActionsQueued = new List<Action> ();
public TestableBackgroundPackageActionRunner (
IPackageManagementProgressMonitorFactory progressMonitorFactory,
@@ -56,37 +56,26 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers public void ExecuteSingleBackgroundDispatch ()
{
- BackgroundDispatchersQueued [0].Invoke ();
- BackgroundDispatchersQueued.RemoveAt (0);
+ BackgroundActionsQueued [0].Invoke ();
+ BackgroundActionsQueued.RemoveAt (0);
}
public void ExecuteBackgroundDispatch ()
{
- foreach (MessageHandler dispatcher in BackgroundDispatchersQueued) {
- dispatcher.Invoke ();
+ foreach (Action action in BackgroundActionsQueued) {
+ action ();
}
- BackgroundDispatchersQueued.Clear ();
+ BackgroundActionsQueued.Clear ();
}
- protected override void BackgroundDispatch (MessageHandler handler)
+ protected override void BackgroundDispatch (Action action)
{
- BackgroundDispatchersQueued.Add (handler);
+ BackgroundActionsQueued.Add (action);
}
- public bool InvokeBackgroundDispatchAndWaitImmediately = true;
-
- protected override void BackgroundDispatchAndWait (MessageHandler handler)
- {
- if (InvokeBackgroundDispatchAndWaitImmediately) {
- handler.Invoke ();
- } else {
- BackgroundDispatchersQueued.Add (handler);
- }
- }
-
- protected override void GuiDispatch (Action handler)
+ protected override void GuiDispatch (Action action)
{
- handler.Invoke ();
+ action ();
}
public Func<ProgressMonitor,
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableCheckForUpdatesTaskRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableCheckForUpdatesTaskRunner.cs index 6410713a0a..e90cb7a2e9 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableCheckForUpdatesTaskRunner.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableCheckForUpdatesTaskRunner.cs @@ -41,11 +41,6 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers {
}
- protected override void GuiBackgroundDispatch (MessageHandler handler)
- {
- handler.Invoke ();
- }
-
protected override void LogError (string message, Exception ex)
{
LoggedErrorMessages.Add (message);
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs index 552b3b2bc0..ebe2866295 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs @@ -76,18 +76,6 @@ namespace MonoDevelop.PackageManagement.Tests runner.Run (progressMessage, actions);
}
- void RunAndWait ()
- {
- runner.InvokeBackgroundDispatchAndWaitImmediately = true;
- runner.RunAndWait (progressMessage, actions);
- }
-
- void RunAndWaitWithoutBackgroundDispatch ()
- {
- runner.InvokeBackgroundDispatchAndWaitImmediately = false;
- runner.RunAndWait (progressMessage, actions);
- }
-
FakeInstallPackageAction AddInstallAction ()
{
var action = new FakeInstallPackageAction (new FakePackageManagementProject (), packageManagementEvents);
@@ -567,26 +555,6 @@ namespace MonoDevelop.PackageManagement.Tests }
[Test]
- public void IsRunning_OneUninstallActionAndRunAndWaitCalledButDispatcherNotComplete_IsRunningIsTrue ()
- {
- CreateRunner ();
- AddUninstallAction ();
- RunAndWaitWithoutBackgroundDispatch ();
-
- Assert.IsTrue (runner.IsRunning);
- }
-
- [Test]
- public void IsRunning_OneUninstallActionAndRunAndWaitCalledAndDispatcherCompletes_IsRunningIsFalse ()
- {
- CreateRunner ();
- AddUninstallAction ();
- RunAndWait ();
-
- Assert.IsFalse (runner.IsRunning);
- }
-
- [Test]
public void IsRunning_ExceptionThrownRunningBackgroundDispatcher_IsRunningIsFalse ()
{
CreateRunner ();
@@ -599,20 +567,6 @@ namespace MonoDevelop.PackageManagement.Tests Assert.IsFalse (runner.IsRunning);
}
-
- [Test]
- public void IsRunning_ExceptionThrownRunningBackgroundDispatcherWithRunAndWait_IsRunningIsFalse ()
- {
- CreateRunner ();
- AddUninstallAction ();
- runner.CreateEventMonitorAction = (monitor, packageManagementEvents, progressProvider) => {
- throw new ApplicationException ("Error");
- };
-
- RunAndWait ();
-
- Assert.IsFalse (runner.IsRunning);
- }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj index cee2d2dc34..107006899e 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj @@ -374,6 +374,7 @@ <Compile Include="MonoDevelop.PackageManagement\MonoDevelopProjectManager.cs" /> <Compile Include="MonoDevelop.PackageManagement\MonoDevelopProjectSystem.cs" /> <Compile Include="MonoDevelop.PackageManagement\MonoDevelopProjectSystemFactory.cs" /> + <Compile Include="MonoDevelop.PackageManagement\PackageManagementBackgroundDispatcher.cs" /> </ItemGroup> <ItemGroup> <EmbeddedResource Include="MonoDevelop.PackageManagement.addin.xml" /> diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs index 26cedc9004..d7ad16154e 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/BackgroundPackageActionRunner.cs @@ -89,14 +89,6 @@ namespace MonoDevelop.PackageManagement }
}
- public void RunAndWait (ProgressMonitorStatusMessage progressMessage, IEnumerable<IPackageAction> actions)
- {
- AddInstallActionsToPendingQueue (actions);
- packageManagementEvents.OnPackageOperationsStarting ();
- runCount++;
- BackgroundDispatchAndWait (() => TryRunActionsWithProgressMonitor (progressMessage, actions.ToList ()));
- }
-
void TryRunActionsWithProgressMonitor (ProgressMonitorStatusMessage progressMessage, IList<IPackageAction> actions)
{
try {
@@ -223,14 +215,9 @@ namespace MonoDevelop.PackageManagement }
}
- protected virtual void BackgroundDispatch (MessageHandler handler)
- {
- DispatchService.BackgroundDispatch (handler);
- }
-
- protected virtual void BackgroundDispatchAndWait (MessageHandler handler)
+ protected virtual void BackgroundDispatch (Action action)
{
- DispatchService.BackgroundDispatchAndWait (handler);
+ PackageManagementBackgroundDispatcher.Dispatch (action);
}
protected virtual void GuiDispatch (Action handler) diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatedPackagesAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatedPackagesAction.cs index 2d95866fa5..5b7f38e03d 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatedPackagesAction.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatedPackagesAction.cs @@ -54,7 +54,7 @@ namespace MonoDevelop.PackageManagement {
// Queue the check for updates with the background dispatcher so
// the NuGet addin does not create another separate Package Console.
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
updatedPackagesInSolution.CheckForUpdates ();
});
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatesTaskRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatesTaskRunner.cs index d33aa8bd9a..33f1924aa2 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatesTaskRunner.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/CheckForUpdatesTaskRunner.cs @@ -132,9 +132,9 @@ namespace MonoDevelop.PackageManagement return taskToCompare == task;
}
- protected virtual void GuiBackgroundDispatch (MessageHandler handler)
+ protected virtual void GuiBackgroundDispatch (Action action)
{
- DispatchService.BackgroundDispatch (handler);
+ PackageManagementBackgroundDispatcher.Dispatch (action);
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageCompatibilityRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageCompatibilityRunner.cs index 6d46b594b8..1dede8577d 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageCompatibilityRunner.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageCompatibilityRunner.cs @@ -26,6 +26,7 @@ using System;
using System.Collections.Generic;
+using System.Threading.Tasks;
using MonoDevelop.PackageManagement;
using MonoDevelop.Core;
using MonoDevelop.Ide;
@@ -78,7 +79,7 @@ namespace MonoDevelop.PackageManagement protected virtual void BackgroundDispatch (MessageHandler handler)
{
- DispatchService.BackgroundDispatch (() => RunInternal ());
+ PackageManagementBackgroundDispatcher.Dispatch (() => RunInternal ());
}
void RunInternal ()
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementBackgroundDispatcher.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementBackgroundDispatcher.cs new file mode 100644 index 0000000000..1839762c2c --- /dev/null +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementBackgroundDispatcher.cs @@ -0,0 +1,96 @@ +// +// PackageManagementBackgroundDispatcher.cs +// +// Author: +// Todd Berman <tberman@off.net> +// Lluis Sanchez Gual <lluis@novell.com> +// +// Copyright (c) 2005 Todd Berman <tberman@off.net> +// Copyright (c) 2005 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using MonoDevelop.Core; + +namespace MonoDevelop.PackageManagement +{ + class PackageManagementBackgroundDispatcher + { + static Queue<Action> backgroundQueue = new Queue<Action> (); + static ManualResetEvent backgroundThreadWait = new ManualResetEvent (false); + static Thread backgroundThread; + + public static void Initialize () + { + backgroundThread = new Thread (new ThreadStart (RunDispatcher)) { + Name = "NuGet background dispatcher", + IsBackground = true, + Priority = ThreadPriority.Lowest, + }; + backgroundThread.Start (); + } + + static void RunDispatcher () + { + while (true) { + Action action = null; + bool wait = false; + lock (backgroundQueue) { + if (backgroundQueue.Count == 0) { + backgroundThreadWait.Reset (); + wait = true; + } else + action = backgroundQueue.Dequeue (); + } + + if (wait) { + backgroundThreadWait.WaitOne (); + continue; + } + + if (action != null) { + try { + action (); + } catch (Exception ex) { + LoggingService.LogError ("BackgroundDispatcher error.", ex); + } + } + } + } + + public static void Dispatch (Action action) + { + QueueBackground (action); + } + + static void QueueBackground (Action action) + { + lock (backgroundQueue) { + backgroundQueue.Enqueue (action); + if (backgroundQueue.Count == 1) + backgroundThreadWait.Set (); + } + } + } +} + diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs index ee2d961cd2..1444eac49e 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs @@ -40,7 +40,6 @@ namespace MonoDevelop.PackageManagement IPackageManagementSolution solution;
IRegisteredPackageRepositories registeredPackageRepositories;
BackgroundPackageActionRunner backgroundActionRunner;
- IPackageManagementEvents packageManagementEvents;
public PackageManagementProjectOperations (
IPackageManagementSolution solution,
@@ -51,7 +50,6 @@ namespace MonoDevelop.PackageManagement this.solution = solution;
this.registeredPackageRepositories = registeredPackageRepositories;
this.backgroundActionRunner = backgroundActionRunner;
- this.packageManagementEvents = packageManagementEvents;
packageManagementEvents.ParentPackageInstalled += PackageInstalled;
packageManagementEvents.ParentPackageUninstalled += PackageUninstalled;
@@ -79,7 +77,7 @@ namespace MonoDevelop.PackageManagement }).Wait ();
ProgressMonitorStatusMessage progressMessage = GetProgressMonitorStatusMessages (actions);
- backgroundActionRunner.RunAndWait (progressMessage, actions);
+ backgroundActionRunner.Run (progressMessage, actions);
}
IPackageRepository CreatePackageRepository (string packageSourceUrl)
@@ -103,11 +101,31 @@ namespace MonoDevelop.PackageManagement string url = RegisteredPackageSources.DefaultPackageSourceUrl;
var repository = registeredPackageRepositories.CreateRepository (new PackageSource (url));
IPackageManagementProject packageManagementProject = solution.GetProject (repository, new DotNetProjectProxy ((DotNetProject)project));
- return packageManagementProject
+ + var packages = packageManagementProject
.GetPackageReferences ()
.Select (packageReference => new PackageManagementPackageReference (packageReference.Id, packageReference.Version.ToString ()))
- .ToList ();
+ .ToList (); + + packages.AddRange (GetMissingPackagesBeingInstalled (packages, (DotNetProject)project)); + return packages;
}).Result;
+ } + + IEnumerable<PackageManagementPackageReference> GetMissingPackagesBeingInstalled ( + IEnumerable<PackageManagementPackageReference> existingPackages, + DotNetProject project) + { + return GetPackagesBeingInstalled (project) + .Where (package => !existingPackages.Any (existingPackage => existingPackage.Id == package.Id)); + } + + static IEnumerable<PackageManagementPackageReference> GetPackagesBeingInstalled (DotNetProject project) + { + return PackageManagementServices.BackgroundPackageActionRunner.PendingInstallActionsForProject (project) + .Select (installAction => new PackageManagementPackageReference ( + installAction.GetPackageId (), + installAction.GetPackageVersion ().ToString ())); }
void PackageUninstalled (object sender, ParentPackageOperationEventArgs e)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs index 4571ed6e06..559408302c 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementServices.cs @@ -81,6 +81,7 @@ namespace MonoDevelop.PackageManagement projectOperations = new PackageManagementProjectOperations (solution, registeredPackageRepositories, backgroundPackageActionRunner, packageManagementEvents);
InitializeCredentialProvider();
+ PackageManagementBackgroundDispatcher.Initialize ();
}
public static void InitializeCredentialProvider()
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreBeforeUpdateAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreBeforeUpdateAction.cs index 363f47894b..5cb25cd213 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreBeforeUpdateAction.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreBeforeUpdateAction.cs @@ -83,7 +83,7 @@ namespace MonoDevelop.PackageManagement {
ProgressMonitorStatusMessage progressMessage = ProgressMonitorStatusMessageFactory.CreateRestoringPackagesBeforeUpdateMessage ();
- DispatchService.BackgroundDispatch (() => {
+ PackageManagementBackgroundDispatcher.Dispatch (() => {
restorer.Restore (progressMessage);
if (!restorer.RestoreFailed) {
afterRestore ();
|