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;