Skip to content

Commit e0d5035

Browse files
authored
Correct message in the case that a higher version of package is already installed (#5743)
1 parent f6615e7 commit e0d5035

4 files changed

Lines changed: 61 additions & 8 deletions

File tree

src/NuGet.Clients/NuGet.CommandLine/Commands/InstallCommand.cs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -350,18 +350,30 @@ private async Task InstallPackageAsync(
350350
PackageSaveMode = EffectivePackageSaveMode;
351351
}
352352

353-
// Check if the package already exists or a higher version exists already.
354-
var skipInstall = project.PackageExists(packageIdentity, PackageSaveMode);
353+
var exactVersionExists = project.PackageExists(packageIdentity, PackageSaveMode);
354+
var higherVersionExists = alreadyInstalledVersions.Any(e => e >= version);
355355

356-
// For SxS allow other versions to install. For non-SxS skip if a higher version exists.
357-
skipInstall |= (ExcludeVersion && alreadyInstalledVersions.Any(e => e >= version));
356+
// For SxS skip if exact version exists. For non-SxS skip if a higher version exists.
357+
var skipInstall = exactVersionExists || (ExcludeVersion && higherVersionExists);
358358

359359
if (skipInstall)
360360
{
361-
var message = string.Format(
362-
CultureInfo.CurrentCulture,
363-
LocalizedResourceManager.GetString("InstallCommandPackageAlreadyExists"),
364-
packageIdentity);
361+
string message;
362+
if (exactVersionExists)
363+
{
364+
message = string.Format(
365+
CultureInfo.CurrentCulture,
366+
LocalizedResourceManager.GetString("InstallCommandPackageAlreadyExists"),
367+
packageIdentity);
368+
}
369+
else
370+
{
371+
var higherPackageIdentity = new PackageIdentity(packageId, alreadyInstalledVersions.FirstOrDefault(e => e >= version));
372+
message = string.Format(
373+
CultureInfo.CurrentCulture,
374+
LocalizedResourceManager.GetString("InstallCommandHigherVersionAlreadyExists"),
375+
packageIdentity, higherPackageIdentity);
376+
}
365377

366378
Console.LogMinimal(message);
367379
}

src/NuGet.Clients/NuGet.CommandLine/NuGetResources.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/NuGet.Clients/NuGet.CommandLine/NuGetResources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,9 @@
303303
<data name="InstallCommandPackageAlreadyExists" xml:space="preserve">
304304
<value>Package "{0}" is already installed.</value>
305305
</data>
306+
<data name="InstallCommandHigherVersionAlreadyExists" xml:space="preserve">
307+
<value>Skipping installation of package "{0}" because higher version "{1}" is already installed.</value>
308+
</data>
306309
<data name="PackageCommandNoFilesForLibPackage" xml:space="preserve">
307310
<value>Failed to build package. Ensure '{0}' includes assembly files. For help on building symbols package, visit {1}.</value>
308311
</data>

test/NuGet.Clients.Tests/NuGet.CommandLine.Test/NuGetInstallCommandTest.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,35 @@ public void InstallCommand_PackageSaveModeNuspecReinstall()
854854
}
855855
}
856856

857+
[Fact]
858+
public void InstallCommand_ExcludeVersion_HigherVersionAlreadyInstalled()
859+
{
860+
using (var pathContext = new SimpleTestPathContext())
861+
{
862+
var outputDirectory = pathContext.SolutionRoot;
863+
var source = pathContext.PackageSource;
864+
// Arrange
865+
PackageCreator.CreatePackage("testPackage", "1.2.0", source);
866+
PackageCreator.CreatePackage("testPackage", "1.1.0", source);
867+
868+
// Act
869+
var r = RunInstall(pathContext, "testPackage", 0, new[] { "-OutputDirectory", outputDirectory, "-ExcludeVersion", "-Version", "1.2.0" });
870+
871+
// Assert
872+
Assert.Equal(0, r.ExitCode);
873+
874+
// Act
875+
var result = RunInstall(pathContext, "testPackage", 0, new[] { "-OutputDirectory", outputDirectory, "-ExcludeVersion", "-Version", "1.1.0" });
876+
877+
var output = result.Output;
878+
879+
// Assert
880+
var alreadyInstalledMessage = string.Format(CultureInfo.CurrentCulture, NuGetResources.InstallCommandHigherVersionAlreadyExists, "testPackage.1.1.0", "testPackage.1.2.0");
881+
Assert.Contains(alreadyInstalledMessage, output, StringComparison.OrdinalIgnoreCase);
882+
r.ExitCode.Should().Be(0);
883+
}
884+
}
885+
857886
// Test that PackageSaveMode specified in nuget.config file is used.
858887
[Fact]
859888
public void InstallCommand_PackageSaveModeInConfigFile()

0 commit comments

Comments
 (0)