From 5157ffc8959ff0a6999d249b77ea4deffbdd3b35 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 26 Mar 2025 16:16:34 -0500 Subject: [PATCH] cmdpal: Skip dependency installs for extensions (#38175) It appears there are two issues in WinGet regarding the installation of dependencies. https://github.com/microsoft/winget-cli/issues/4661 https://github.com/microsoft/winget-cli/issues/4679 For CmdPal 0.1, we're going to skip installing dependencies to make extension installation more robust. This will mostly work because extensions will depend on the same frameworks as the command palette itself (for now). We will revert this once these two issues are fixed. --- .../Pages/InstallPackageCommand.cs | 6 ++- .../Pages/InstallPackageListItem.cs | 40 ++++++++++++------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/modules/cmdpal/exts/Microsoft.CmdPal.Ext.WinGet/Pages/InstallPackageCommand.cs b/src/modules/cmdpal/exts/Microsoft.CmdPal.Ext.WinGet/Pages/InstallPackageCommand.cs index 22fccadefa..1aa22bfa26 100644 --- a/src/modules/cmdpal/exts/Microsoft.CmdPal.Ext.WinGet/Pages/InstallPackageCommand.cs +++ b/src/modules/cmdpal/exts/Microsoft.CmdPal.Ext.WinGet/Pages/InstallPackageCommand.cs @@ -17,7 +17,6 @@ namespace Microsoft.CmdPal.Ext.WinGet.Pages; public partial class InstallPackageCommand : InvokableCommand { private readonly CatalogPackage _package; - private readonly StatusMessage _installBanner = new(); private IAsyncOperationWithProgress? _installAction; private IAsyncOperationWithProgress? _unInstallAction; @@ -43,6 +42,8 @@ public partial class InstallPackageCommand : InvokableCommand private static readonly CompositeFormat UninstallPackageFinishing = System.Text.CompositeFormat.Parse(Properties.Resources.winget_uninstall_package_finishing); private static readonly CompositeFormat DownloadProgress = System.Text.CompositeFormat.Parse(Properties.Resources.winget_download_progress); + internal bool SkipDependencies { get; set; } + public InstallPackageCommand(CatalogPackage package, bool isInstalled) { _package = package; @@ -96,6 +97,9 @@ public partial class InstallPackageCommand : InvokableCommand var installOptions = WinGetStatics.WinGetFactory.CreateInstallOptions(); installOptions.PackageInstallScope = PackageInstallScope.Any; + + installOptions.SkipDependencies = SkipDependencies; + _installAction = WinGetStatics.Manager.InstallPackageAsync(_package, installOptions); var handler = new AsyncOperationProgressHandler(OnInstallProgress); diff --git a/src/modules/cmdpal/exts/Microsoft.CmdPal.Ext.WinGet/Pages/InstallPackageListItem.cs b/src/modules/cmdpal/exts/Microsoft.CmdPal.Ext.WinGet/Pages/InstallPackageListItem.cs index df97f39b25..8b1a98d136 100644 --- a/src/modules/cmdpal/exts/Microsoft.CmdPal.Ext.WinGet/Pages/InstallPackageListItem.cs +++ b/src/modules/cmdpal/exts/Microsoft.CmdPal.Ext.WinGet/Pages/InstallPackageListItem.cs @@ -31,7 +31,7 @@ public partial class InstallPackageListItem : ListItem { _package = package; - PackageVersionInfo version = _package.DefaultInstallVersion; + var version = _package.DefaultInstallVersion; var versionTagText = "Unknown"; if (version != null) { @@ -49,16 +49,24 @@ public partial class InstallPackageListItem : ListItem private Details? BuildDetails(PackageVersionInfo? version) { - CatalogPackageMetadata? metadata = version?.GetCatalogPackageMetadata(); + var metadata = version?.GetCatalogPackageMetadata(); if (metadata != null) { + if (metadata.Tags.Where(t => t.Equals(WinGetExtensionPage.ExtensionsTag, StringComparison.OrdinalIgnoreCase)).Any()) + { + if (_installCommand != null) + { + _installCommand.SkipDependencies = true; + } + } + var description = string.IsNullOrEmpty(metadata.Description) ? metadata.ShortDescription : metadata.Description; var detailsBody = $""" {description} """; IconInfo heroIcon = new(string.Empty); - IReadOnlyList icons = metadata.Icons; + var icons = metadata.Icons; if (icons.Count > 0) { // There's also a .Theme property we could probably use to @@ -89,21 +97,23 @@ public partial class InstallPackageListItem : ListItem { Properties.Resources.winget_publisher, (metadata.Publisher, metadata.PublisherUrl) }, { Properties.Resources.winget_copyright, (metadata.Copyright, metadata.CopyrightUrl) }, { Properties.Resources.winget_license, (metadata.License, metadata.LicenseUrl) }, - { Properties.Resources.winget_release_notes, (metadata.ReleaseNotes, string.Empty) }, + { Properties.Resources.winget_publisher_support, (string.Empty, metadata.PublisherSupportUrl) }, // The link to the release notes will only show up if there is an // actual URL for the release notes { Properties.Resources.winget_view_release_notes, (string.IsNullOrEmpty(metadata.ReleaseNotesUrl) ? string.Empty : Properties.Resources.winget_view_online, metadata.ReleaseNotesUrl) }, - { Properties.Resources.winget_publisher_support, (string.Empty, metadata.PublisherSupportUrl) }, + + // These can be l o n g + { Properties.Resources.winget_release_notes, (metadata.ReleaseNotes, string.Empty) }, }; - Documentation[] docs = metadata.Documentations.ToArray(); - foreach (Documentation? item in docs) + var docs = metadata.Documentations.ToArray(); + foreach (var item in docs) { simpleData.Add(item.DocumentLabel, (string.Empty, item.DocumentUrl)); } UriCreationOptions options = default; - foreach (KeyValuePair kv in simpleData) + foreach (var kv in simpleData) { var text = string.IsNullOrEmpty(kv.Value.Item1) ? kv.Value.Item2 : kv.Value.Item1; var target = kv.Value.Item2; @@ -136,8 +146,8 @@ public partial class InstallPackageListItem : ListItem private async void UpdatedInstalledStatus() { - CheckInstalledStatusResult status = await _package.CheckInstalledStatusAsync(); - bool isInstalled = _package.InstalledVersion != null; + var status = await _package.CheckInstalledStatusAsync(); + var isInstalled = _package.InstalledVersion != null; // might be an uninstall command InstallPackageCommand installCommand = new(_package, isInstalled); @@ -155,8 +165,8 @@ public partial class InstallPackageListItem : ListItem if (WinGetStatics.AppSearchCallback != null) { - Func callback = WinGetStatics.AppSearchCallback; - ICommandItem? installedApp = callback(_package.DefaultInstallVersion == null ? _package.Name : _package.DefaultInstallVersion.DisplayName); + var callback = WinGetStatics.AppSearchCallback; + var installedApp = callback(_package.DefaultInstallVersion == null ? _package.Name : _package.DefaultInstallVersion.DisplayName); if (installedApp != null) { this.Command = installedApp.Command; @@ -193,11 +203,11 @@ public partial class InstallPackageListItem : ListItem Stopwatch s = new(); Logger.LogDebug($"Starting RefreshPackageCatalogAsync"); s.Start(); - PackageCatalogReference[] refs = WinGetStatics.AvailableCatalogs.ToArray(); + var refs = WinGetStatics.AvailableCatalogs.ToArray(); - foreach (PackageCatalogReference? catalog in refs) + foreach (var catalog in refs) { - global::Windows.Foundation.IAsyncOperationWithProgress operation = catalog.RefreshPackageCatalogAsync(); + var operation = catalog.RefreshPackageCatalogAsync(); operation.Wait(); }