Skip to content
This repository was archived by the owner on Oct 4, 2021. It is now read-only.

Commit b01f3bc

Browse files
mrwardmonojenkins
authored andcommitted
[NuGet] Update multiple packages together in a batch
Updating two NuGet package references that have a strict dependency on a single version of another NuGet package not explicitly added to the project would fail in the Manage NuGet Packages dialog. This was because the update would be done one package at a time. Doing the update of the two NuGet packages together allows NuGet to update both so they then use the new strict dependency. Note that updating all packages in the project from the Solution window does not have this problem since there the packages are updated together in a batch. Fixes VSTS #986960 - Solution nuget updater fails to update a set of packages that all have a related dependency update
1 parent be5bad7 commit b01f3bc

22 files changed

+1701
-60
lines changed

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -757,8 +757,16 @@ static ProgressMonitorStatusMessage GetProgressMonitorUpdateMessages (List<IPack
757757
{
758758
int count = packageActions.Count;
759759
if (count == 1) {
760-
string packageId = packageActions.Cast<INuGetPackageAction> ().First ().PackageId;
761-
return ProgressMonitorStatusMessageFactory.CreateUpdatingSinglePackageMessage (packageId);
760+
if (packageActions [0] is UpdateMultipleNuGetPackagesAction updateMultiplePackagesAction) {
761+
count = updateMultiplePackagesAction.PackagesToUpdate.Count ();
762+
if (count == 1) {
763+
return ProgressMonitorStatusMessageFactory.CreateUpdatingSinglePackageMessage (
764+
updateMultiplePackagesAction.PackagesToUpdate.First ().Id);
765+
}
766+
} else {
767+
string packageId = packageActions.Cast<INuGetPackageAction> ().First ().PackageId;
768+
return ProgressMonitorStatusMessageFactory.CreateUpdatingSinglePackageMessage (packageId);
769+
}
762770
}
763771

764772
return new ProgressMonitorStatusMessage (

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeNuGetPackageManager.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public void SetDirectInstall (PackageIdentity directInstall, INuGetProjectContex
5959
public NuGetProject ExecutedNuGetProject;
6060
public List<NuGetProjectAction> ExecutedActions;
6161
public INuGetProjectContext ExecutedProjectContext;
62+
public SourceCacheContext ExecutedSourceCacheContext;
6263
public CancellationToken ExecutedCancellationToken;
6364

6465
public Action BeforeExecuteAction = () => { };
@@ -74,6 +75,7 @@ public Task ExecuteNuGetProjectActionsAsync (
7475
ExecutedNuGetProject = nuGetProject;
7576
ExecutedActions = nuGetProjectActions.ToList ();
7677
ExecutedProjectContext = nuGetProjectContext;
78+
ExecutedSourceCacheContext = sourceCacheContext;
7779
ExecutedCancellationToken = token;
7880

7981
BeforeExecuteAction ();
@@ -84,6 +86,25 @@ public Task ExecuteNuGetProjectActionsAsync (
8486
return Task.FromResult (0);
8587
}
8688

89+
public List<NuGetProject> ExecutedNuGetProjects;
90+
91+
public Task ExecuteNuGetProjectActionsAsync (
92+
IEnumerable<NuGetProject> nuGetProjects,
93+
IEnumerable<NuGetProjectAction> nuGetProjectActions,
94+
INuGetProjectContext nuGetProjectContext,
95+
SourceCacheContext sourceCacheContext,
96+
CancellationToken token)
97+
{
98+
ExecutedNuGetProjects = nuGetProjects.ToList ();
99+
100+
return ExecuteNuGetProjectActionsAsync (
101+
(NuGetProject)null,
102+
nuGetProjectActions,
103+
nuGetProjectContext,
104+
sourceCacheContext,
105+
token);
106+
}
107+
87108
public NuGetVersion LatestVersion = new NuGetVersion ("1.2.3");
88109
public string GetLatestVersionPackageId;
89110
public NuGetProject GetLatestVersionProject;
@@ -203,6 +224,30 @@ public Task<IEnumerable<NuGetProjectAction>> PreviewUpdatePackagesAsync (
203224
);
204225
}
205226

227+
public List<PackageIdentity> PreviewUpdatePackages;
228+
public List<NuGetProject> PreviewUpdateProjects;
229+
230+
public Task<IEnumerable<NuGetProjectAction>> PreviewUpdatePackagesAsync (
231+
List<PackageIdentity> packageIdentities,
232+
IEnumerable<NuGetProject> nuGetProjects,
233+
ResolutionContext resolutionContext,
234+
INuGetProjectContext nuGetProjectContext,
235+
IEnumerable<SourceRepository> primarySources,
236+
IEnumerable<SourceRepository> secondarySources,
237+
CancellationToken token)
238+
{
239+
PreviewUpdatePackages = packageIdentities;
240+
PreviewUpdateProjects = nuGetProjects.ToList ();
241+
242+
return PreviewUpdatePackagesAsync (
243+
null,
244+
resolutionContext,
245+
nuGetProjectContext,
246+
primarySources,
247+
secondarySources,
248+
token);
249+
}
250+
206251
public void AddPackageToPackagesFolder (string packageId, string version)
207252
{
208253
var package = new PackageIdentity (packageId, new NuGetVersion (version));
@@ -239,6 +284,7 @@ public Task<IEnumerable<NuGetProjectAction>> PreviewUninstallPackageAsync (
239284
}
240285

241286
public NuGetProject OpenReadmeFilesForProject;
287+
public List<NuGetProject> OpenReadmeFilesForProjects;
242288
public List<PackageIdentity> OpenReadmeFilesForPackages;
243289
public INuGetProjectContext OpenReadmeFilesWithProjectContext;
244290
public CancellationToken OpenReadmeFilesWithCancellationToken;
@@ -257,6 +303,20 @@ public Task OpenReadmeFiles (
257303
return Task.FromResult (0);
258304
}
259305

306+
public Task OpenReadmeFiles (
307+
IEnumerable<NuGetProject> projects,
308+
IEnumerable<PackageIdentity> packages,
309+
INuGetProjectContext nuGetProjectContext,
310+
CancellationToken token)
311+
{
312+
OpenReadmeFilesForProjects = projects.ToList ();
313+
OpenReadmeFilesForPackages = packages.ToList ();
314+
OpenReadmeFilesWithProjectContext = nuGetProjectContext;
315+
OpenReadmeFilesWithCancellationToken = token;
316+
317+
return Task.FromResult (0);
318+
}
319+
260320
public IBuildIntegratedNuGetProject PreviewBuildIntegratedProject;
261321
public List<NuGetProjectAction> PreviewBuildIntegratedProjectActions;
262322
public INuGetProjectContext PreviewBuildIntegratedContext;
@@ -278,6 +338,20 @@ public Task<BuildIntegratedProjectAction> PreviewBuildIntegratedProjectActionsAs
278338

279339
return Task.FromResult (BuildIntegratedProjectAction);
280340
}
341+
342+
public INuGetProjectContext RunPostProcessAsyncProjectContext;
343+
public List<NuGetProject> RunPostProcessAsyncProjects;
344+
345+
public Task RunPostProcessAsync (
346+
List<NuGetProject> nuGetProjects,
347+
INuGetProjectContext nuGetProjectContext,
348+
CancellationToken token)
349+
{
350+
RunPostProcessAsyncProjectContext = nuGetProjectContext;
351+
RunPostProcessAsyncProjects = nuGetProjects;
352+
353+
return Task.CompletedTask;
354+
}
281355
}
282356
}
283357

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeNuGetProjectAction.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
using NuGet.PackageManagement;
2828
using NuGet.Packaging.Core;
29+
using NuGet.ProjectManagement;
2930
using NuGet.Versioning;
3031

3132
namespace MonoDevelop.PackageManagement.Tests.Helpers
@@ -43,6 +44,18 @@ public FakeNuGetProjectAction (
4344
{
4445
}
4546

47+
public FakeNuGetProjectAction (
48+
NuGetProject project,
49+
string packageId,
50+
string packageVersion,
51+
NuGetProjectActionType actionType)
52+
: base (
53+
CreatePackageIdentity (packageId, packageVersion),
54+
actionType,
55+
project)
56+
{
57+
}
58+
4659
static PackageIdentity CreatePackageIdentity (string packageId, string packageVersion)
4760
{
4861
NuGetVersion nuGetVersion = null;

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeNuGetProjectContext.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ public FileConflictAction ResolveFileConflict (string message)
7272

7373
public void Log (ILogMessage message)
7474
{
75+
if (LogToConsole)
76+
Console.WriteLine (message.Message);
7577
}
7678

7779
public void ReportError (ILogMessage message)

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRestoreManager.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,16 @@ public void EnableCurrentSolutionForRestore (bool fromActivation)
7777
new Dictionary<string, List<PackageRestoreData>> ();
7878

7979
public void AddUnrestoredPackageForProject (string projectName, string solutionDirectory)
80+
{
81+
AddPackageForProject (projectName, solutionDirectory, isMissing: true);
82+
}
83+
84+
public void AddRestoredPackageForProject (string projectName, string solutionDirectory)
85+
{
86+
AddPackageForProject (projectName, solutionDirectory, isMissing: false);
87+
}
88+
89+
public void AddPackageForProject (string projectName, string solutionDirectory, bool isMissing)
8090
{
8191
var packageReference = new PackageReference (
8292
new PackageIdentity ("Test", new NuGetVersion ("1.0")),
@@ -85,11 +95,11 @@ public void AddUnrestoredPackageForProject (string projectName, string solutionD
8595
var restoreData = new PackageRestoreData (
8696
packageReference,
8797
new [] { projectName },
88-
isMissing: true);
98+
isMissing);
8999

90100
var restoreDataList = new List<PackageRestoreData> ();
91101
restoreDataList.Add (restoreData);
92-
PackagesInSolution[solutionDirectory] = restoreDataList;
102+
PackagesInSolution [solutionDirectory] = restoreDataList;
93103
}
94104

95105
public Task<IEnumerable<PackageRestoreData>> GetPackagesInSolutionAsync (
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
//
2+
// TestableUpdateMultipleNuGetPackagesAction.cs
3+
//
4+
// Author:
5+
// Matt Ward <[email protected]>
6+
//
7+
// Copyright (c) 2019 Microsoft Corporation
8+
//
9+
// Permission is hereby granted, free of charge, to any person obtaining a copy
10+
// of this software and associated documentation files (the "Software"), to deal
11+
// in the Software without restriction, including without limitation the rights
12+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13+
// copies of the Software, and to permit persons to whom the Software is
14+
// furnished to do so, subject to the following conditions:
15+
//
16+
// The above copyright notice and this permission notice shall be included in
17+
// all copies or substantial portions of the Software.
18+
//
19+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25+
// THE SOFTWARE.
26+
27+
using System.Collections.Generic;
28+
using NuGet.Protocol.Core.Types;
29+
30+
namespace MonoDevelop.PackageManagement.Tests.Helpers
31+
{
32+
class TestableUpdateMultipleNuGetPackagesAction : UpdateMultipleNuGetPackagesAction
33+
{
34+
public FakeNuGetProjectContext ProjectContext;
35+
public FakeNuGetPackageManager PackageManager;
36+
public FakePackageRestoreManager RestoreManager;
37+
public PackageManagementEvents PackageManagementEvents;
38+
public FakeLicenseAcceptanceService LicenseAcceptanceService = new FakeLicenseAcceptanceService ();
39+
public FakeFileRemover FileRemover = new FakeFileRemover ();
40+
41+
public TestableUpdateMultipleNuGetPackagesAction (
42+
IEnumerable<SourceRepository> primarySources,
43+
FakeSolutionManager solutionManager)
44+
: this (
45+
primarySources,
46+
solutionManager,
47+
new FakeNuGetProjectContext (),
48+
new FakeNuGetPackageManager (),
49+
new FakePackageRestoreManager (),
50+
new PackageManagementEvents ())
51+
{
52+
}
53+
54+
public TestableUpdateMultipleNuGetPackagesAction (
55+
IEnumerable<SourceRepository> primarySources,
56+
FakeSolutionManager solutionManager,
57+
FakeNuGetProjectContext projectContext,
58+
FakeNuGetPackageManager packageManager,
59+
FakePackageRestoreManager restoreManager,
60+
PackageManagementEvents packageManagementEvents)
61+
: base (
62+
primarySources,
63+
solutionManager,
64+
projectContext,
65+
packageManager,
66+
restoreManager,
67+
packageManagementEvents)
68+
{
69+
ProjectContext = projectContext;
70+
PackageManager = packageManager;
71+
RestoreManager = restoreManager;
72+
73+
PackageManagementEvents = packageManagementEvents;
74+
}
75+
76+
protected override ILicenseAcceptanceService GetLicenseAcceptanceService ()
77+
{
78+
return LicenseAcceptanceService;
79+
}
80+
81+
protected override IFileRemover GetFileRemover ()
82+
{
83+
return FileRemover;
84+
}
85+
}
86+
}

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@
156156
<Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableManagePackagesViewModel.cs" />
157157
<Compile Include="MonoDevelop.PackageManagement.Tests\PackageManagementCanReferenceProjectExtensionTests.cs" />
158158
<Compile Include="MonoDevelop.PackageManagement.Tests\PackageLoadContextTests.cs" />
159+
<Compile Include="MonoDevelop.PackageManagement.Tests\UpdateStrictPackageDependenciesTests.cs" />
160+
<Compile Include="MonoDevelop.PackageManagement.Tests\UpdateMultipleNuGetPackagesActionTests.cs" />
161+
<Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableUpdateMultipleNuGetPackagesAction.cs" />
159162
</ItemGroup>
160163
<ItemGroup>
161164
<ProjectReference Include="..\..\..\core\MonoDevelop.Core\MonoDevelop.Core.csproj">

0 commit comments

Comments
 (0)