From d9bb1133c2913d7129b3b103bd4a75f01d24625c Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Sat, 28 Dec 2024 17:50:50 -0800 Subject: Use PerUserProgramFilesFolder for default INSTALLFOLDER in a per-user package Fixes 8101 --- .../Link/AddDefaultSymbolsCommand.cs | 17 ++++---- .../DirectoryFixture.cs | 48 +++++++++++++++++++--- .../TestData/AllUsers/PerMachine.wxs | 2 +- .../TestData/AllUsers/PerUser.wxs | 2 +- .../TestData/AllUsers/PerUserOrMachine.wxs | 2 +- 5 files changed, 54 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/wix/WixToolset.Core/Link/AddDefaultSymbolsCommand.cs b/src/wix/WixToolset.Core/Link/AddDefaultSymbolsCommand.cs index b433b039..bf5e748c 100644 --- a/src/wix/WixToolset.Core/Link/AddDefaultSymbolsCommand.cs +++ b/src/wix/WixToolset.Core/Link/AddDefaultSymbolsCommand.cs @@ -11,7 +11,8 @@ namespace WixToolset.Core.Link internal class AddDefaultSymbolsCommand { public static readonly string WixStandardInstallFolder = "INSTALLFOLDER"; - public static readonly string WixStandardInstallFolderParent = "ProgramFiles6432Folder"; + public static readonly string WixStandardPerMachineInstallFolderParent = "ProgramFiles6432Folder"; + public static readonly string WixStandardPerUserInstallFolderParent = "PerUserProgramFilesFolder"; public static readonly string WixStandardInstallFolderReference = "Directory:INSTALLFOLDER"; public AddDefaultSymbolsCommand(FindEntrySectionAndLoadSymbolsCommand find, IList sections) @@ -26,28 +27,31 @@ namespace WixToolset.Core.Link public void Execute() { - if (this.Find.EntrySection.Type != SectionType.Package) + if (this.Find.EntrySection.Type != SectionType.Package || this.Find.EntrySection.Symbols.Count == 0) { // Only packages...for now. return; } + var packageSymbol = this.Find.EntrySection.Symbols.OfType().First(); + // If a directory with id INSTALLFOLDER hasn't been authored, provide a default one. if (!this.Find.SymbolsByName.ContainsKey(WixStandardInstallFolderReference)) { var sourceLineNumber = new SourceLineNumber("DefaultInstallFolder"); + var parentDirectoryRef = (packageSymbol.Scope == WixPackageScope.PerUser) ? WixStandardPerUserInstallFolderParent : WixStandardPerMachineInstallFolderParent; this.AddSymbolsToNewSection(WixStandardInstallFolder, new DirectorySymbol(sourceLineNumber, new Identifier(AccessModifier.Global, WixStandardInstallFolder)) { - ParentDirectoryRef = WixStandardInstallFolderParent, + ParentDirectoryRef = parentDirectoryRef, Name = "!(bind.Property.Manufacturer) !(bind.Property.ProductName)", SourceName = ".", }, new WixSimpleReferenceSymbol(sourceLineNumber, new Identifier(AccessModifier.Global, WixStandardInstallFolder)) { Table = "Directory", - PrimaryKeys = WixStandardInstallFolderParent, + PrimaryKeys = parentDirectoryRef, } ); } @@ -58,10 +62,7 @@ namespace WixToolset.Core.Link var symbols = this.Sections.SelectMany(section => section.Symbols); if (!symbols.OfType().Any(us => !us.OnlyDetect)) { - var packageSymbol = this.Find.EntrySection.Symbols.OfType().FirstOrDefault(); - - if (packageSymbol?.UpgradeStrategy == WixPackageUpgradeStrategy.MajorUpgrade - && !String.IsNullOrEmpty(packageSymbol?.UpgradeCode)) + if (packageSymbol.UpgradeStrategy == WixPackageUpgradeStrategy.MajorUpgrade && !String.IsNullOrEmpty(packageSymbol?.UpgradeCode)) { this.AddDefaultMajorUpgrade(packageSymbol); } diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs index 7f019692..4781a115 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs @@ -14,15 +14,15 @@ namespace WixToolsetTest.CoreIntegration public class DirectoryFixture { [Fact] - public void CanGetDefaultInstallFolder() + public void CanGetDefaultPerMachineInstallFolder() { - var folder = TestData.Get(@"TestData\SingleFile"); + var folder = TestData.Get("TestData", "SingleFile"); using (var fs = new DisposableFileSystem()) { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); - var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); + var msiPath = Path.Combine(baseFolder, "bin", "test.msi"); var result = WixRunner.Execute(new[] { @@ -37,7 +37,7 @@ namespace WixToolsetTest.CoreIntegration result.AssertSuccess(); - var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); + var intermediate = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb")); var section = intermediate.Sections.Single(); var dirSymbols = section.Symbols.OfType().ToList(); @@ -51,6 +51,42 @@ namespace WixToolsetTest.CoreIntegration } } + [Fact] + public void CanGetDefaultPerUserInstallFolder() + { + var folder = TestData.Get("TestData", "AllUsers"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + var intermediateFolder = Path.Combine(baseFolder, "obj"); + var msiPath = Path.Combine(baseFolder, "bin", "test.msi"); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "PerUser.wxs"), + "-bindpath", folder, + "-intermediateFolder", intermediateFolder, + "-o", msiPath + }); + + result.AssertSuccess(); + + var intermediate = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb")); + var section = intermediate.Sections.Single(); + + var dirSymbols = section.Symbols.OfType().ToList(); + WixAssert.CompareLineByLine(new[] + { + "INSTALLFOLDER:PerUserProgramFilesFolder:Example Corporation MsiPackage", + "LocalAppDataFolder:TARGETDIR:LocalApp", + "PerUserProgramFilesFolder:LocalAppDataFolder:Programs", + "TARGETDIR::SourceDir", + }, dirSymbols.OrderBy(d => d.Id.Id).Select(d => d.Id.Id + ":" + d.ParentDirectoryRef + ":" + d.Name).ToArray()); + } + } + [Fact] public void CanGet32bitProgramFiles6432Folder() { @@ -60,7 +96,7 @@ namespace WixToolsetTest.CoreIntegration { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); - var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); + var msiPath = Path.Combine(baseFolder, "bin", "test.msi"); var result = WixRunner.Execute(new[] { @@ -74,7 +110,7 @@ namespace WixToolsetTest.CoreIntegration result.AssertSuccess(); - var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); + var intermediate = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb")); var section = intermediate.Sections.Single(); var dirSymbols = section.Symbols.OfType().ToList(); diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerMachine.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerMachine.wxs index 3f19277b..ee243815 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerMachine.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerMachine.wxs @@ -7,7 +7,7 @@ - + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUser.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUser.wxs index 12ba9c59..cc8f7bcd 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUser.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUser.wxs @@ -7,7 +7,7 @@ - + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUserOrMachine.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUserOrMachine.wxs index 293cf1fa..19c2cb6e 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUserOrMachine.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUserOrMachine.wxs @@ -7,7 +7,7 @@ - + -- cgit v1.2.3-55-g6feb