Fix dependency providers in a Bundle chain
Fixes wixtoolset/issues#6388
Rob Mensching committed
Mar 23, 2021 at 14:00 UTC
26442d4177bd6e108f2cf4cc2fb2599e624ff6c4
7 files changed
+35
-51
src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+2
-2
@@ -369,7 +369,7 @@ namespace WixToolset.Core.Burn
369
this.BackendHelper.ResolveDelayedFields(this.DelayedFields, variableCache);
370
}
371
372
- Dictionary<string, ProvidesDependencySymbol> dependencySymbolsByKey;
372
+ Dictionary<string, WixDependencyProviderSymbol> dependencySymbolsByKey;
373
{
374
var command = new ProcessDependencyProvidersCommand(this.Messaging, section, facades);
375
command.Execute();
@@ -542,7 +542,7 @@ namespace WixToolset.Core.Burn
542
543
private void ResolveBundleInstallScope(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable<PackageFacade> facades)
544
{
545
- var dependencySymbolsById = section.Symbols.OfType<ProvidesDependencySymbol>().ToDictionary(t => t.Id.Id);
545
+ var dependencySymbolsById = section.Symbols.OfType<WixDependencyProviderSymbol>().ToDictionary(t => t.Id.Id);
546
547
foreach (var facade in facades)
548
{
src/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
+21
-36
@@ -22,7 +22,7 @@ namespace WixToolset.Core.Burn.Bind
22
23
public string BundleProviderKey { get; private set; }
24
25
- public Dictionary<string, ProvidesDependencySymbol> DependencySymbolsByKey { get; private set; }
25
+ public Dictionary<string, WixDependencyProviderSymbol> DependencySymbolsByKey { get; private set; }
26
27
private IMessaging Messaging { get; }
28
@@ -38,43 +38,34 @@ namespace WixToolset.Core.Burn.Bind
38
/// </summary>
39
public void Execute()
40
{
41
- var wixDependencyProviderSymbols = this.Section.Symbols.OfType<WixDependencyProviderSymbol>();
41
+ var dependencySymbols = this.Section.Symbols.OfType<WixDependencyProviderSymbol>();
42
43
- foreach (var wixDependencyProviderSymbol in wixDependencyProviderSymbols)
43
+ foreach (var dependency in dependencySymbols)
44
{
45
// Sets the provider key for the bundle, if it is not set already.
46
if (String.IsNullOrEmpty(this.BundleProviderKey))
47
{
48
- if (wixDependencyProviderSymbol.Bundle)
48
+ if (dependency.Bundle)
49
{
50
- this.BundleProviderKey = wixDependencyProviderSymbol.ProviderKey;
50
+ this.BundleProviderKey = dependency.ProviderKey;
51
}
52
}
53
54
// Import any authored dependencies. These may merge with imported provides from MSI packages.
55
- var packageId = wixDependencyProviderSymbol.Id.Id;
55
+ var packageId = dependency.ParentRef;
56
57
if (this.Facades.TryGetValue(packageId, out var facade))
58
{
59
- var dependency = this.Section.AddSymbol(new ProvidesDependencySymbol(wixDependencyProviderSymbol.SourceLineNumbers, wixDependencyProviderSymbol.Id)
60
- {
61
- PackageRef = packageId,
62
- Key = wixDependencyProviderSymbol.ProviderKey,
63
- Version = wixDependencyProviderSymbol.Version,
64
- DisplayName = wixDependencyProviderSymbol.DisplayName,
65
- Attributes = (int)wixDependencyProviderSymbol.Attributes
66
- });
67
-
68
- if (String.IsNullOrEmpty(dependency.Key))
59
+ if (String.IsNullOrEmpty(dependency.ProviderKey))
60
{
61
switch (facade.SpecificPackageSymbol)
62
{
63
// The WixDependencyExtension allows an empty Key for MSIs and MSPs.
64
case WixBundleMsiPackageSymbol msiPackage:
74
- dependency.Key = msiPackage.ProductCode;
65
+ dependency.ProviderKey = msiPackage.ProductCode;
66
break;
67
case WixBundleMspPackageSymbol mspPackage:
77
- dependency.Key = mspPackage.PatchCode;
68
+ dependency.ProviderKey = mspPackage.PatchCode;
69
break;
70
}
71
}
@@ -84,7 +75,7 @@ namespace WixToolset.Core.Burn.Bind
75
dependency.Version = facade.PackageSymbol.Version;
76
}
77
87
- // If the version is still missing, a version could not be harvested from the package and was not authored.
78
+ // If the version is still missing, a version could not be gathered from the package and was not authored.
79
if (String.IsNullOrEmpty(dependency.Version))
80
{
81
this.Messaging.Write(ErrorMessages.MissingDependencyVersion(facade.PackageId));
@@ -97,62 +88,56 @@ namespace WixToolset.Core.Burn.Bind
88
}
89
}
90
100
- this.DependencySymbolsByKey = this.GetDependencySymbolsByKey();
91
+ this.DependencySymbolsByKey = this.GetDependencySymbolsByKey(dependencySymbols);
92
93
// Generate providers for MSI and MSP packages that still do not have providers.
94
foreach (var facade in this.Facades.Values)
95
{
96
string key = null;
97
107
- //if (WixBundlePackageType.Msi == facade.PackageSymbol.Type)
98
if (facade.SpecificPackageSymbol is WixBundleMsiPackageSymbol msiPackage)
99
{
110
- //var msiPackage = (WixBundleMsiPackageSymbol)facade.SpecificPackageSymbol;
100
key = msiPackage.ProductCode;
101
}
113
- //else if (WixBundlePackageType.Msp == facade.PackageSymbol.Type)
102
else if (facade.SpecificPackageSymbol is WixBundleMspPackageSymbol mspPackage)
103
{
116
- //var mspPackage = (WixBundleMspPackageSymbol)facade.SpecificPackageSymbol;
104
key = mspPackage.PatchCode;
105
}
106
107
if (!String.IsNullOrEmpty(key) && !this.DependencySymbolsByKey.ContainsKey(key))
108
{
122
- var dependency = this.Section.AddSymbol(new ProvidesDependencySymbol(facade.PackageSymbol.SourceLineNumbers, facade.PackageSymbol.Id)
109
+ var dependency = this.Section.AddSymbol(new WixDependencyProviderSymbol(facade.PackageSymbol.SourceLineNumbers, facade.PackageSymbol.Id)
110
{
124
- PackageRef = facade.PackageId,
125
- Key = key,
111
+ ParentRef = facade.PackageId,
112
+ ProviderKey = key,
113
Version = facade.PackageSymbol.Version,
114
DisplayName = facade.PackageSymbol.DisplayName
115
});
116
130
- this.DependencySymbolsByKey.Add(dependency.Key, dependency);
117
+ this.DependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
118
}
119
}
120
}
121
135
- private Dictionary<string, ProvidesDependencySymbol> GetDependencySymbolsByKey()
122
+ private Dictionary<string, WixDependencyProviderSymbol> GetDependencySymbolsByKey(IEnumerable<WixDependencyProviderSymbol> dependencySymbols)
123
{
137
- var dependencySymbolsByKey = new Dictionary<string, ProvidesDependencySymbol>();
138
-
139
- var dependencySymbols = this.Section.Symbols.OfType<ProvidesDependencySymbol>();
124
+ var dependencySymbolsByKey = new Dictionary<string, WixDependencyProviderSymbol>();
125
126
foreach (var dependency in dependencySymbols)
127
{
143
- if (dependencySymbolsByKey.TryGetValue(dependency.Key, out var collision))
128
+ if (dependencySymbolsByKey.TryGetValue(dependency.ProviderKey, out var collision))
129
{
130
// If not a perfect dependency collision, display an error.
146
- if (dependency.Key != collision.Key ||
131
+ if (dependency.ProviderKey != collision.ProviderKey ||
132
dependency.Version != collision.Version ||
133
dependency.DisplayName != collision.DisplayName)
134
{
150
- this.Messaging.Write(ErrorMessages.DuplicateProviderDependencyKey(dependency.Key, dependency.PackageRef));
135
+ this.Messaging.Write(ErrorMessages.DuplicateProviderDependencyKey(dependency.ProviderKey, dependency.ParentRef));
136
}
137
}
138
else
139
{
155
- dependencySymbolsByKey.Add(dependency.Key, dependency);
140
+ dependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
141
}
142
}
143
src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
+2
-2
@@ -336,7 +336,7 @@ namespace WixToolset.Core.Burn.Bundles
336
var exitCodesByPackage = this.Section.Symbols.OfType<WixBundlePackageExitCodeSymbol>().ToLookup(r => r.ChainPackageId);
337
var commandLinesByPackage = this.Section.Symbols.OfType<WixBundlePackageCommandLineSymbol>().ToLookup(r => r.WixBundlePackageRef);
338
339
- var dependenciesByPackage = this.Section.Symbols.OfType<ProvidesDependencySymbol>().ToLookup(p => p.PackageRef);
339
+ var dependenciesByPackage = this.Section.Symbols.OfType<WixDependencyProviderSymbol>().ToLookup(p => p.ParentRef);
340
341
342
// Build up the list of target codes from all the MSPs in the chain.
@@ -511,7 +511,7 @@ namespace WixToolset.Core.Burn.Bundles
511
foreach (var dependency in dependencies)
512
{
513
writer.WriteStartElement("Provides");
514
- writer.WriteAttributeString("Key", dependency.Key);
514
+ writer.WriteAttributeString("Key", dependency.ProviderKey);
515
516
if (!String.IsNullOrEmpty(dependency.Version))
517
{
src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs
+4
-5
@@ -541,14 +541,13 @@ namespace WixToolset.Core.Burn.Bundles
541
var id = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", msiPackage.Id.Id, record.GetString(1)));
542
543
// Import the provider key and attributes.
544
- this.Section.AddSymbol(new ProvidesDependencySymbol(msiPackage.SourceLineNumbers, id)
544
+ this.Section.AddSymbol(new WixDependencyProviderSymbol(msiPackage.SourceLineNumbers, id)
545
{
546
- PackageRef = msiPackage.Id.Id,
547
- Key = record.GetString(2),
546
+ ParentRef = msiPackage.Id.Id,
547
+ ProviderKey = record.GetString(2),
548
Version = record.GetString(3) ?? msiPackage.ProductVersion,
549
DisplayName = record.GetString(4) ?? this.Facade.PackageSymbol.DisplayName,
550
- Attributes = record.GetInteger(5),
551
- Imported = true
550
+ Attributes = WixDependencyProviderAttributes.ProvidesAttributesImported | (WixDependencyProviderAttributes)record.GetInteger(5),
551
});
552
}
553
}
src/WixToolset.Core.WindowsInstaller/Bind/ProcessDependencyReferencesCommand.cs
+1
-1
@@ -58,7 +58,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
58
var keyRequires = String.Format(@"{0}{1}\{2}\{3}", DependencyRegistryRoot, requiresKey, RegistryDependents, providesKey);
59
60
// Get the component ID from the provider.
61
- var componentId = wixDependencyProviderRow.ComponentRef;
61
+ var componentId = wixDependencyProviderRow.ParentRef;
62
63
var id = this.BackendHelper.GenerateIdentifier("reg", providesId, requiresId, "(Default)");
64
this.Section.AddSymbol(new RegistrySymbol(wixDependencyRefRow.SourceLineNumbers, new Identifier(AccessModifier.Section, id))
src/WixToolset.Core/Compiler_Dependency.cs
+2
-2
@@ -53,7 +53,7 @@ namespace WixToolset.Core
53
// in the table definition but unused for bundles, so just set it to the valid ID.
54
this.Core.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id)
55
{
56
- ComponentRef = id.Id,
56
+ ParentRef = id.Id,
57
ProviderKey = providerKey,
58
Attributes = WixDependencyProviderAttributes.ProvidesAttributesBundle,
59
});
@@ -187,7 +187,7 @@ namespace WixToolset.Core
187
{
188
var symbol = this.Core.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id)
189
{
190
- ComponentRef = parentId,
190
+ ParentRef = parentId,
191
ProviderKey = key,
192
});
193
src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
+3
-3
@@ -12,7 +12,7 @@ namespace WixToolsetTest.CoreIntegration
12
13
public class DependencyExtensionFixture
14
{
15
- [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6388")]
15
+ [Fact]
16
public void CanBuildBundleUsingExePackageWithProvides()
17
{
18
var folder = TestData.Get(@"TestData");
@@ -50,7 +50,7 @@ namespace WixToolsetTest.CoreIntegration
50
.ToArray();
51
WixAssert.CompareLineByLine(new string[]
52
{
53
- "<Provides Key='DependencyTests_ExeA,v1.0' Version='1.0.0.0' />",
53
+ "<Provides Key='DependencyTests_ExeA,v1.0' Version='1.0.0.0' DisplayName='Windows Installer XML Toolset' />",
54
}, provides);
55
}
56
}
@@ -106,7 +106,7 @@ namespace WixToolsetTest.CoreIntegration
106
.ToArray();
107
WixAssert.CompareLineByLine(new string[]
108
{
109
- "<Provides Key='UsingProvides' Imported='yes' />",
109
+ "<Provides Key='UsingProvides' Version='1.0.0.0' DisplayName='MsiPackage' Imported='yes' />",
110
"<Provides Key='{A81D50F9-B696-4F3D-ABE0-E64D61590E5F}' Version='1.0.0.0' DisplayName='MsiPackage' />",
111
}, provides);
112
}