Skip to content

Commit 6edc5d1

Browse files
committed
Add Package/@id and Bundle/@id that can replace UpgradeCodes
Completes 8584
1 parent d9bb113 commit 6edc5d1

47 files changed

Lines changed: 104 additions & 69 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/setup/ThmViewerPackage/ThmViewerPackage.wxs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
22
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3-
<Package Name="WiX Toolset Theme Viewer" Manufacturer="WiX Toolset" Language="1033" Version="!(bind.fileVersion.ThmViewerFile)" UpgradeCode="59c4b122-5167-445b-8fc4-09dcd4eced89">
3+
<Package Id="WixToolset.ThemeViewer.Package" Name="WiX Toolset Theme Viewer" Manufacturer="WiX Toolset" Language="1033" Version="!(bind.fileVersion.ThmViewerFile)">
44
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
55

66
<Feature Id="Main">

src/setup/WixAdditionalTools/WixAdditionalTools.wxs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
44
xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
5-
<Bundle Name="!(loc.Name)" Manufacturer="WiX Toolset" Version="$(SetupVersion)" UpgradeCode="fc48131d-214a-439b-9a31-ef2ea5c69ea5"
5+
<Bundle Id="WixToolset.WixAdditionalTools" Name="!(loc.Name)" Manufacturer="WiX Toolset" Version="$(SetupVersion)"
66
AboutUrl="!(loc.AboutUrl)" HelpUrl="!(loc.SupportUrl)" UpdateUrl="!(loc.UpdateUrl)">
77
<BootstrapperApplication>
88
<bal:WixStandardBootstrapperApplication

src/setup/wix-cli/Package.wxs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
22
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3-
<Package Name="WiX Toolset Command-Line Tools" Manufacturer="WiX Toolset" Version="!(bind.fileVersion.WixExe)" UpgradeCode="2e85dc76-769f-46d2-82a7-46cb3a0c9d50">
3+
<Package Id="WixToolset.CommandLineTools.Package" Name="WiX Toolset Command-Line Tools" Manufacturer="WiX Toolset" Version="!(bind.fileVersion.WixExe)">
44
<MediaTemplate EmbedCab="yes" />
55

66
<ComponentGroupRef Id="BinaryFiles" />

src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6216,6 +6216,9 @@ private void DecompilePropertyTable(Table table)
62166216
case "Manufacturer":
62176217
this.DecompilerHelper.RootElement.SetAttributeValue("Manufacturer", value);
62186218
continue;
6219+
case "PackageId":
6220+
this.DecompilerHelper.RootElement.SetAttributeValue("Id", value);
6221+
continue;
62196222
case "ProductCode":
62206223
this.DecompilerHelper.RootElement.SetAttributeValue("ProductCode", value.ToUpper(CultureInfo.InvariantCulture));
62216224
continue;

src/wix/WixToolset.Core/Compiler.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ internal partial class Compiler : ICompiler
2929
private const char ComponentIdPlaceholderEnd = (char)167;
3030
private Dictionary<string, string> componentIdPlaceholders;
3131

32+
// As outlined in RFC 4122, this is our namespace for generating name-based (version 3) UUIDs for upgrade codes.
33+
private static readonly Guid UpgradeCodeGuidNamespace = new Guid("{D9C5E8D9-0F97-4D24-A235-91BD2FA169A6}");
34+
3235
// If these are true you know you are building a module or product
3336
// but if they are false you cannot not be sure they will not end
3437
// up a product or module. Use these flags carefully.

src/wix/WixToolset.Core/Compiler_Bundle.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ private void ParseApprovedExeForElevation(XElement node)
115115
private void ParseBundleElement(XElement node)
116116
{
117117
var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
118+
Identifier id = null;
118119
string copyright = null;
119120
string aboutUrl = null;
120121
var modifyType = WixBundleModifyType.Allowed;
@@ -144,6 +145,9 @@ private void ParseBundleElement(XElement node)
144145
{
145146
switch (attrib.Name.LocalName)
146147
{
148+
case "Id":
149+
id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
150+
break;
147151
case "AboutUrl":
148152
aboutUrl = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
149153
break;
@@ -233,7 +237,14 @@ private void ParseBundleElement(XElement node)
233237

234238
if (String.IsNullOrEmpty(upgradeCode))
235239
{
236-
this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "UpgradeCode"));
240+
if (id is null)
241+
{
242+
this.Core.Write(ErrorMessages.ExpectedAttributes(sourceLineNumbers, node.Name.LocalName, "Id", "UpgradeCode"));
243+
}
244+
else
245+
{
246+
upgradeCode = this.Core.CreateGuid(Compiler.UpgradeCodeGuidNamespace, id.Id);
247+
}
237248
}
238249

239250
if (String.IsNullOrEmpty(copyright))
@@ -265,7 +276,7 @@ private void ParseBundleElement(XElement node)
265276
logVariablePrefixAndExtension = String.Concat("WixBundleLog:", fileSystemSafeBundleName, ":log");
266277
}
267278

268-
this.activeName = String.IsNullOrEmpty(name) ? Common.GenerateGuid() : name;
279+
this.activeName = String.IsNullOrEmpty(name) ? String.IsNullOrEmpty(id?.Id) ? Common.GenerateGuid() : id.Id : name;
269280
this.Core.CreateActiveSection(this.activeName, SectionType.Bundle, this.Context.CompilationId);
270281

271282
// Now that the active section is initialized, process only extension attributes and the special ProviderKey attribute.
@@ -401,7 +412,7 @@ private void ParseBundleElement(XElement node)
401412

402413
if (!this.Core.EncounteredError)
403414
{
404-
var symbol = this.Core.AddSymbol(new WixBundleSymbol(sourceLineNumbers)
415+
var symbol = this.Core.AddSymbol(new WixBundleSymbol(sourceLineNumbers, id)
405416
{
406417
UpgradeCode = upgradeCode,
407418
Version = version,

src/wix/WixToolset.Core/Compiler_Package.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ internal partial class Compiler : ICompiler
2525
private void ParsePackageElement(XElement node)
2626
{
2727
var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
28+
Identifier id = null;
2829
var compressed = YesNoDefaultType.Default;
2930
var sourceBits = 0;
3031
string codepage = null;
@@ -53,6 +54,9 @@ private void ParsePackageElement(XElement node)
5354
{
5455
switch (attrib.Name.LocalName)
5556
{
57+
case "Id":
58+
id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
59+
break;
5660
case "Codepage":
5761
codepage = this.Core.GetAttributeLocalizableCodePageValue(sourceLineNumbers, attrib);
5862
break;
@@ -156,7 +160,14 @@ private void ParsePackageElement(XElement node)
156160

157161
if (null == upgradeCode)
158162
{
159-
this.Core.Write(WarningMessages.MissingUpgradeCode(sourceLineNumbers));
163+
if (id is null)
164+
{
165+
this.Core.Write(WarningMessages.MissingUpgradeCode(sourceLineNumbers));
166+
}
167+
else
168+
{
169+
upgradeCode = this.Core.CreateGuid(Compiler.UpgradeCodeGuidNamespace, id.Id);
170+
}
160171
}
161172

162173
if (null == version)
@@ -179,6 +190,11 @@ private void ParsePackageElement(XElement node)
179190
this.compilingProduct = true;
180191
this.Core.CreateActiveSection(productCode, SectionType.Package, this.Context.CompilationId);
181192

193+
if (null != id)
194+
{
195+
this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "PackageId"), id.Id, false, false, false, true);
196+
}
197+
182198
this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "Manufacturer"), manufacturer, false, false, false, true);
183199
this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "ProductCode"), productCode, false, false, false, true);
184200
this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "ProductLanguage"), productLanguage, false, false, false, true);
@@ -392,7 +408,7 @@ private void ParsePackageElement(XElement node)
392408

393409
if (!this.Core.EncounteredError)
394410
{
395-
this.Core.AddSymbol(new WixPackageSymbol(sourceLineNumbers)
411+
this.Core.AddSymbol(new WixPackageSymbol(sourceLineNumbers, id)
396412
{
397413
PackageId = productCode,
398414
UpgradeCode = upgradeCode,

src/wix/test/WixToolsetTest.CoreIntegration/BundlePackageFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ public void CanBuildBundleWithAllUsersPackage()
386386
var packageElements = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixPackageProperties", ignoreAttributesByElementName);
387387
WixAssert.CompareLineByLine(new[]
388388
{
389-
"<WixPackageProperties Package='test.msi' Vital='yes' DisplayName='All Users Package' DownloadSize='*' PackageSize='*' InstalledSize='28' PackageType='Msi' Permanent='no' LogPathVariable='WixBundleLog_test.msi' RollbackLogPathVariable='WixBundleRollbackLog_test.msi' Compressed='no' ProductCode='{33333333-3333-3333-3333-333333333333}' UpgradeCode='{4BE34BEE-CA23-488E-96A0-B15878E3654B}' Version='1.0' Cache='keep' />",
389+
"<WixPackageProperties Package='test.msi' Vital='yes' DisplayName='All Users Package' DownloadSize='*' PackageSize='*' InstalledSize='28' PackageType='Msi' Permanent='no' LogPathVariable='WixBundleLog_test.msi' RollbackLogPathVariable='WixBundleRollbackLog_test.msi' Compressed='no' ProductCode='{33333333-3333-3333-3333-333333333333}' UpgradeCode='{C00D7E9A-1276-51ED-B782-A20AB34D4070}' Version='1.0' Cache='keep' />",
390390
}, packageElements);
391391
}
392392
}

src/wix/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,21 +149,21 @@ public void HarvestedPayloadsArePutInCorrectPackage()
149149
var msiPackages = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Chain/burn:MsiPackage", ignoreAttributes);
150150
WixAssert.CompareLineByLine(new[]
151151
{
152-
"<MsiPackage Id='FirstX86.msi' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' LogPathVariable='WixBundleLog_FirstX86.msi' RollbackLogPathVariable='WixBundleRollbackLog_FirstX86.msi' ProductCode='*' Language='1033' Version='1.0.0.0' UpgradeCode='{12E4699F-E774-4D05-8A01-5BDD41BBA127}'>" +
152+
"<MsiPackage Id='FirstX86.msi' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' LogPathVariable='WixBundleLog_FirstX86.msi' RollbackLogPathVariable='WixBundleRollbackLog_FirstX86.msi' ProductCode='*' Language='1033' Version='1.0.0.0' UpgradeCode='{C00D7E9A-1276-51ED-B782-A20AB34D4070}'>" +
153153
"<MsiProperty Id='MSIFASTINSTALL' Value='1' />" +
154154
"<MsiProperty Id='ARPSYSTEMCOMPONENT' Value='1' />" +
155155
$"<Provides Key='{GetProductCodeFromMsiPdb(pdbPaths[0])}_v1.0.0.0' Version='1.0.0.0' DisplayName='MsiPackage' />" +
156-
"<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='yes'><Language Id='1033' /></RelatedPackage>" +
157-
"<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MinVersion='1.0.0.0' MinInclusive='no' OnlyDetect='yes' LangInclusive='yes'><Language Id='1033' /></RelatedPackage>" +
156+
"<RelatedPackage Id='{C00D7E9A-1276-51ED-B782-A20AB34D4070}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='yes'><Language Id='1033' /></RelatedPackage>" +
157+
"<RelatedPackage Id='{C00D7E9A-1276-51ED-B782-A20AB34D4070}' MinVersion='1.0.0.0' MinInclusive='no' OnlyDetect='yes' LangInclusive='yes'><Language Id='1033' /></RelatedPackage>" +
158158
"<PayloadRef Id='FirstX86.msi' />" +
159159
"<PayloadRef Id='fk1m38Cf9RZ2Bx_ipinRY6BftelU' />" +
160160
"</MsiPackage>",
161-
"<MsiPackage Id='FirstX64.msi' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_FirstX64.msi' RollbackLogPathVariable='WixBundleRollbackLog_FirstX64.msi' ProductCode='*' Language='1033' Version='1.0.0.0' UpgradeCode='{12E4699F-E774-4D05-8A01-5BDD41BBA127}'>" +
161+
"<MsiPackage Id='FirstX64.msi' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_FirstX64.msi' RollbackLogPathVariable='WixBundleRollbackLog_FirstX64.msi' ProductCode='*' Language='1033' Version='1.0.0.0' UpgradeCode='{C00D7E9A-1276-51ED-B782-A20AB34D4070}'>" +
162162
"<MsiProperty Id='ARPSYSTEMCOMPONENT' Value='1' />" +
163163
"<MsiProperty Id='MSIFASTINSTALL' Value='7' />" +
164164
$"<Provides Key='{GetProductCodeFromMsiPdb(pdbPaths[1])}_v1.0.0.0' Version='1.0.0.0' DisplayName='MsiPackage' />" +
165-
"<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='yes'><Language Id='1033' /></RelatedPackage>" +
166-
"<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MinVersion='1.0.0.0' MinInclusive='no' OnlyDetect='yes' LangInclusive='yes'><Language Id='1033' /></RelatedPackage>" +
165+
"<RelatedPackage Id='{C00D7E9A-1276-51ED-B782-A20AB34D4070}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='yes'><Language Id='1033' /></RelatedPackage>" +
166+
"<RelatedPackage Id='{C00D7E9A-1276-51ED-B782-A20AB34D4070}' MinVersion='1.0.0.0' MinInclusive='no' OnlyDetect='yes' LangInclusive='yes'><Language Id='1033' /></RelatedPackage>" +
167167
"<PayloadRef Id='FirstX64.msi' />" +
168168
"<PayloadRef Id='fC0n41rZK8oW3JK8LzHu6AT3CjdQ' />" +
169169
"</MsiPackage>",

src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
namespace WixToolsetTest.CoreIntegration
44
{
5-
using System;
65
using System.IO;
76
using System.Linq;
8-
using Example.Extension;
9-
using WixInternal.TestSupport;
107
using WixInternal.Core.TestPackage;
8+
using WixInternal.TestSupport;
119
using Xunit;
1210

1311
public class MsiQueryFixture
@@ -929,16 +927,20 @@ public void PopulatesUpgradeTableFromDetectOnlyUpgrade()
929927
result.AssertSuccess();
930928

931929
Assert.True(File.Exists(msiPath));
932-
var results = Query.QueryDatabase(msiPath, new[] { "Upgrade" });
930+
var results = Query.QueryDatabase(msiPath, new[] { "Property", "Upgrade" });
931+
var upgradeRows = results.Where(r => r.StartsWith("Upgrade:")).OrderBy(s => s).ToArray();
933932
WixAssert.CompareLineByLine(new[]
934933
{
935-
"Upgrade:{12E4699F-E774-4D05-8A01-5BDD41BBA127}\t\t1.0.0.0\t1033\t1\t\tWIX_UPGRADE_DETECTED",
936-
"Upgrade:{12E4699F-E774-4D05-8A01-5BDD41BBA127}\t1.0.0.0\t\t1033\t2\t\tWIX_DOWNGRADE_DETECTED",
937934
"Upgrade:{B05772EA-82B8-4DE0-B7EB-45B5F0CCFE6D}\t1.0.0\t\t\t256\t\tRELPRODFOUND",
938-
}, results);
935+
"Upgrade:{C00D7E9A-1276-51ED-B782-A20AB34D4070}\t\t1.0.0.0\t1033\t1\t\tWIX_UPGRADE_DETECTED",
936+
"Upgrade:{C00D7E9A-1276-51ED-B782-A20AB34D4070}\t1.0.0.0\t\t1033\t2\t\tWIX_DOWNGRADE_DETECTED",
937+
}, upgradeRows);
938+
939+
var packageId = results.Where(r => r.StartsWith("Property:PackageId\t")).Single();
940+
Assert.Equal("Property:PackageId\tWixToolsetTest.TestPackage", packageId);
939941

940942
var prefix = "Property:SecureCustomProperties\t";
941-
var secureProperties = Query.QueryDatabase(msiPath, new[] { "Property" }).Where(p => p.StartsWith(prefix)).Single();
943+
var secureProperties = results.Where(p => p.StartsWith(prefix)).Single();
942944
WixAssert.CompareLineByLine(new[]
943945
{
944946
"RELPRODFOUND",

0 commit comments

Comments
 (0)