@joebigelow / wix-1 / commits / 24d9e661

Fix "wix extension list" to correctly display machine-wide extensions

Fixes 8625

Rob Mensching committed Jul 12, 2024 at 01:25 UTC 24d9e661a9613b3a52c37d00e4e44171b9afd998
1 file changed +46 -31
src/wix/WixToolset.Core.ExtensionCache/ExtensionCacheManager.cs
+46 -31
@@ -83,51 +83,54 @@ namespace WixToolset.Core.ExtensionCache
83
84 (var extensionId, var extensionVersion) = ParseExtensionReference(extension);
85
86 - var cacheFolder = this.GetCacheFolder(global);
87 -
88 - var searchFolder = Path.Combine(cacheFolder, extensionId, extensionVersion);
86 + var cacheFolders = this.GetCacheFolders(global);
87
90 - if (!Directory.Exists(searchFolder))
91 - {
92 - }
93 - else if (!String.IsNullOrEmpty(extensionVersion)) // looking for an explicit version of an extension.
88 + foreach (var cacheFolder in cacheFolders)
89 {
95 - var present = this.ExtensionFileExists(cacheFolder, extensionId, extensionVersion);
96 - found.Add(new CachedExtension(extensionId, extensionVersion, !present));
97 - }
98 - else // looking for all versions of an extension or all versions of all extensions.
99 - {
100 - IEnumerable<string> foundExtensionIds;
90 + var searchFolder = Path.Combine(cacheFolder, extensionId, extensionVersion);
91
102 - if (String.IsNullOrEmpty(extensionId))
92 + if (!Directory.Exists(searchFolder))
93 {
104 - // Looking for all versions of all extensions.
105 - foundExtensionIds = Directory.GetDirectories(cacheFolder).Select(folder => Path.GetFileName(folder)).ToList();
94 }
107 - else
95 + else if (!String.IsNullOrEmpty(extensionVersion)) // looking for an explicit version of an extension.
96 {
109 - // Looking for all versions of a single extension.
110 - var extensionFolder = Path.Combine(cacheFolder, extensionId);
111 - foundExtensionIds = Directory.Exists(extensionFolder) ? new[] { extensionId } : Array.Empty<string>();
97 + var present = this.ExtensionFileExists(cacheFolder, extensionId, extensionVersion);
98 + found.Add(new CachedExtension(extensionId, extensionVersion, !present));
99 }
113 -
114 - foreach (var foundExtensionId in foundExtensionIds)
100 + else // looking for all versions of an extension or all versions of all extensions.
101 {
116 - var extensionFolder = Path.Combine(cacheFolder, foundExtensionId);
102 + IEnumerable<string> foundExtensionIds;
103
118 - foreach (var folder in Directory.GetDirectories(extensionFolder))
104 + if (String.IsNullOrEmpty(extensionId))
105 + {
106 + // Looking for all versions of all extensions.
107 + foundExtensionIds = Directory.GetDirectories(cacheFolder).Select(folder => Path.GetFileName(folder)).ToList();
108 + }
109 + else
110 {
120 - cancellationToken.ThrowIfCancellationRequested();
111 + // Looking for all versions of a single extension.
112 + var extensionFolder = Path.Combine(cacheFolder, extensionId);
113 + foundExtensionIds = Directory.Exists(extensionFolder) ? new[] { extensionId } : Array.Empty<string>();
114 + }
115
122 - var foundExtensionVersion = Path.GetFileName(folder);
116 + foreach (var foundExtensionId in foundExtensionIds)
117 + {
118 + var extensionFolder = Path.Combine(cacheFolder, foundExtensionId);
119
124 - if (!NuGetVersion.TryParse(foundExtensionVersion, out _))
120 + foreach (var foundExtensionVersionFolder in Directory.GetDirectories(extensionFolder))
121 {
126 - continue;
127 - }
122 + cancellationToken.ThrowIfCancellationRequested();
123 +
124 + var foundExtensionVersion = Path.GetFileName(foundExtensionVersionFolder);
125
129 - var present = this.ExtensionFileExists(cacheFolder, foundExtensionId, foundExtensionVersion);
130 - found.Add(new CachedExtension(foundExtensionId, foundExtensionVersion, !present));
126 + if (!NuGetVersion.TryParse(foundExtensionVersion, out _))
127 + {
128 + continue;
129 + }
130 +
131 + var present = this.ExtensionFileExists(cacheFolder, foundExtensionId, foundExtensionVersion);
132 + found.Add(new CachedExtension(foundExtensionId, foundExtensionVersion, !present));
133 + }
134 }
135 }
136 }
@@ -149,6 +152,18 @@ namespace WixToolset.Core.ExtensionCache
152 return cacheLocation.Path;
153 }
154
155 + private IEnumerable<string> GetCacheFolders(bool global)
156 + {
157 + if (this.cacheLocations == null)
158 + {
159 + this.cacheLocations = this.ExtensionManager.GetCacheLocations();
160 + }
161 +
162 + var cacheLocations = this.cacheLocations.Where(l => global || l.Scope == ExtensionCacheLocationScope.Project).OrderBy(l => l.Scope).Select(l => l.Path);
163 +
164 + return cacheLocations;
165 + }
166 +
167 private async Task<bool> DownloadAndExtractAsync(bool global, string id, string version, CancellationToken cancellationToken)
168 {
169 var logger = NullLogger.Instance;