diff --git a/src/NuGet.Clients/NuGet.PackageManagement.UI/Xamls/PackageManagerControl.xaml.cs b/src/NuGet.Clients/NuGet.PackageManagement.UI/Xamls/PackageManagerControl.xaml.cs index 56ed1fbb80e..058338c323f 100644 --- a/src/NuGet.Clients/NuGet.PackageManagement.UI/Xamls/PackageManagerControl.xaml.cs +++ b/src/NuGet.Clients/NuGet.PackageManagement.UI/Xamls/PackageManagerControl.xaml.cs @@ -1553,7 +1553,7 @@ private void ExecuteInstallPackageCommand(object sender, ExecutedRoutedEventArgs private void PackageList_UpdateButtonClicked(PackageItemListViewModel[] selectedPackages) { var packagesToUpdate = selectedPackages - .Select(package => new PackageIdentity(package.Id, package.LatestVersion)) + .Select(package => new PackageIdentity(package.Id, package.Version)) .ToList(); UpdatePackage(packagesToUpdate); diff --git a/src/NuGet.Core/NuGet.PackageManagement/NuGetPackageManager.cs b/src/NuGet.Core/NuGet.PackageManagement/NuGetPackageManager.cs index 8d6746d1349..8f04dd861f0 100644 --- a/src/NuGet.Core/NuGet.PackageManagement/NuGetPackageManager.cs +++ b/src/NuGet.Core/NuGet.PackageManagement/NuGetPackageManager.cs @@ -605,6 +605,11 @@ private async Task> PreviewUpdatePackagesAsync( IEnumerable secondarySources, CancellationToken token) { + if (packageIdentities == null) + { + throw new ArgumentNullException(nameof(packageIdentities)); + } + if (nuGetProjects == null) { throw new ArgumentNullException(nameof(nuGetProjects)); diff --git a/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/NuGetPackageManagerTests.cs b/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/NuGetPackageManagerTests.cs index bdabdd8fe69..126344f6c3c 100644 --- a/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/NuGetPackageManagerTests.cs +++ b/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/NuGetPackageManagerTests.cs @@ -6975,6 +6975,73 @@ await nuGetPackageManager.PreviewBuildIntegratedProjectsActionsAsync( } } + /// + /// Repro for a bug caused by a NullReferenceException being thrown due to a null + /// (https://github.com/NuGet/Home/issues/9882). + /// + /// + [Fact] + public async Task TestPacMan_PreviewInstallPackage_BuildIntegrated_NullVersion_Throws() + { + // Arrange + + // Set up Package Source + var packages = new List + { + new SourcePackageDependencyInfo("a", new NuGetVersion(1, 0, 0), new PackageDependency[] { }, true, null), + new SourcePackageDependencyInfo("a", new NuGetVersion(2, 0, 0), new PackageDependency[] { }, true, null), + new SourcePackageDependencyInfo("a", new NuGetVersion(3, 0, 0), new PackageDependency[] { }, true, null), + }; + + SourceRepositoryProvider sourceRepositoryProvider = CreateSource(packages); + + // Set up NuGetProject + var fwk45 = NuGetFramework.Parse("net45"); + + var installedPackages = new List + { + new PackageReference(new PackageIdentity("a", new NuGetVersion(1, 0, 0)), fwk45, true), + }; + + var packageIdentity = _packageWithDependents[0]; + + // Create Package Manager + using (var solutionManager = new TestSolutionManager()) + { + var nuGetPackageManager = new NuGetPackageManager( + sourceRepositoryProvider, + NullSettings.Instance, + solutionManager, + new TestDeleteOnRestartManager()); + + var buildIntegratedProjectA = new Mock(); + buildIntegratedProjectA.Setup(p => p.GetInstalledPackagesAsync(CancellationToken.None)) + .Returns(() => Task.FromResult(installedPackages.AsEnumerable())); + + var projectList = new List { buildIntegratedProjectA.Object }; + solutionManager.NuGetProjects = projectList; + + // Main Act + var targets = new List + { + new PackageIdentity("a", null) + }; + + // Assert + var ex = await Assert.ThrowsAsync(async () => + { + IEnumerable result = await nuGetPackageManager.PreviewUpdatePackagesAsync( + targets, + projectList, + new ResolutionContext(), + new TestNuGetProjectContext(), + sourceRepositoryProvider.GetRepositories(), + sourceRepositoryProvider.GetRepositories(), + CancellationToken.None); + }); + } + } + private void VerifyPreviewActionsTelemetryEvents_PackagesConfig(IEnumerable actual) { Assert.True(actual.Contains(TelemetryConstants.GatherDependencyStepName));