From 03e36f8882640a9e8d5d34f82752291b998deca3 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 25 Sep 2025 20:19:41 +0000
Subject: [PATCH 1/2] Initial plan
From 6bd5123ad0a164310777abd09b4b7934871d23b5 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 25 Sep 2025 20:40:57 +0000
Subject: [PATCH 2/2] Add warning functionality for newer tool versions during
restore
Co-authored-by: marcpopMSFT <12663534+marcpopMSFT@users.noreply.github.com>
---
.../dotnet/Commands/CliCommandStrings.resx | 3 +
.../Tool/Restore/ToolPackageRestorer.cs | 44 ++++++++++++++-
.../Tool/Restore/ToolRestoreCommand.cs | 31 +++++++++--
.../Commands/xlf/CliCommandStrings.cs.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.de.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.es.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.fr.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.it.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.ja.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.ko.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.pl.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.pt-BR.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.ru.xlf | 5 ++
.../Commands/xlf/CliCommandStrings.tr.xlf | 5 ++
.../xlf/CliCommandStrings.zh-Hans.xlf | 5 ++
.../xlf/CliCommandStrings.zh-Hant.xlf | 5 ++
.../Tool/Restore/ToolRestoreCommandTests.cs | 55 +++++++++++++++++++
17 files changed, 191 insertions(+), 7 deletions(-)
diff --git a/src/Cli/dotnet/Commands/CliCommandStrings.resx b/src/Cli/dotnet/Commands/CliCommandStrings.resx
index 16a3a06f0d6d..8703f8d1a234 100644
--- a/src/Cli/dotnet/Commands/CliCommandStrings.resx
+++ b/src/Cli/dotnet/Commands/CliCommandStrings.resx
@@ -1733,6 +1733,9 @@ The default is to publish a framework-dependent application.
Tool '{0}' (version '{1}') was restored. Available commands: {2}
+
+ A newer version of tool '{0}' is available (version '{1}'). Consider updating your manifest file.
+
Invalid rollback definition. The manifest IDs in rollback definition {0} do not match installed manifest IDs {1}.
diff --git a/src/Cli/dotnet/Commands/Tool/Restore/ToolPackageRestorer.cs b/src/Cli/dotnet/Commands/Tool/Restore/ToolPackageRestorer.cs
index b1c3b3f4ed52..8ac5c500c371 100644
--- a/src/Cli/dotnet/Commands/Tool/Restore/ToolPackageRestorer.cs
+++ b/src/Cli/dotnet/Commands/Tool/Restore/ToolPackageRestorer.cs
@@ -83,6 +83,9 @@ public ToolRestoreResult InstallPackage(
toolPackage.Command.Name));
}
+ // Check for newer versions and prepare warning message
+ string warning = CheckForNewerVersion(package, configFile);
+
return ToolRestoreResult.Success(
saveToCache:
(new RestoredCommandIdentifier(
@@ -96,7 +99,8 @@ public ToolRestoreResult InstallPackage(
CliCommandStrings.RestoreSuccessful,
package.PackageId,
package.Version.ToNormalizedString(),
- string.Join(" ", package.CommandNames)));
+ string.Join(" ", package.CommandNames)),
+ warning: warning);
}
catch (ToolPackageException e)
{
@@ -129,6 +133,44 @@ public bool PackageHasBeenRestored(
&& _fileSystem.File.Exists(toolCommand.Executable.Value);
}
+ private string CheckForNewerVersion(ToolManifestPackage package, FilePath? configFile)
+ {
+ try
+ {
+ // Use wildcard version range to get the latest version
+ var latestVersionRange = VersionRange.Parse("*");
+
+ var (latestVersion, _) = _toolPackageDownloader.GetNuGetVersion(
+ new PackageLocation(
+ nugetConfig: configFile,
+ additionalFeeds: _additionalSources,
+ sourceFeedOverrides: _overrideSources,
+ rootConfigDirectory: package.FirstEffectDirectory),
+ package.PackageId,
+ _verbosity,
+ latestVersionRange,
+ _restoreActionConfig);
+
+ // Compare versions - only warn if there's a newer stable version or if the manifest uses prerelease
+ if (latestVersion != null && latestVersion > package.Version)
+ {
+ // If the current version is prerelease, show warning for any newer version
+ // If the current version is stable, only show warning for newer stable versions
+ if (package.Version.IsPrerelease || !latestVersion.IsPrerelease)
+ {
+ return string.Format(CliCommandStrings.RestoreNewVersionAvailable, package.PackageId, latestVersion.ToNormalizedString());
+ }
+ }
+ }
+ catch
+ {
+ // If we can't check for newer versions, don't show a warning
+ // This could happen due to network issues, package source problems, etc.
+ }
+
+ return string.Empty;
+ }
+
private static string JoinBySpaceWithQuote(IEnumerable