Skip to content

Commit 6ff0cd5

Browse files
committed
Use PerUserProgramFilesFolder for default INSTALLFOLDER in a per-user package
Fixes 8101
1 parent 6cbeb88 commit 6ff0cd5

File tree

5 files changed

+54
-17
lines changed

5 files changed

+54
-17
lines changed

src/wix/WixToolset.Core/Link/AddDefaultSymbolsCommand.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ namespace WixToolset.Core.Link
1111
internal class AddDefaultSymbolsCommand
1212
{
1313
public static readonly string WixStandardInstallFolder = "INSTALLFOLDER";
14-
public static readonly string WixStandardInstallFolderParent = "ProgramFiles6432Folder";
14+
public static readonly string WixStandardPerMachineInstallFolderParent = "ProgramFiles6432Folder";
15+
public static readonly string WixStandardPerUserInstallFolderParent = "PerUserProgramFilesFolder";
1516
public static readonly string WixStandardInstallFolderReference = "Directory:INSTALLFOLDER";
1617

1718
public AddDefaultSymbolsCommand(FindEntrySectionAndLoadSymbolsCommand find, IList<IntermediateSection> sections)
@@ -26,28 +27,31 @@ public AddDefaultSymbolsCommand(FindEntrySectionAndLoadSymbolsCommand find, ILis
2627

2728
public void Execute()
2829
{
29-
if (this.Find.EntrySection.Type != SectionType.Package)
30+
if (this.Find.EntrySection.Type != SectionType.Package || this.Find.EntrySection.Symbols.Count == 0)
3031
{
3132
// Only packages...for now.
3233
return;
3334
}
3435

36+
var packageSymbol = this.Find.EntrySection.Symbols.OfType<WixPackageSymbol>().First();
37+
3538
// If a directory with id INSTALLFOLDER hasn't been authored, provide a default one.
3639
if (!this.Find.SymbolsByName.ContainsKey(WixStandardInstallFolderReference))
3740
{
3841
var sourceLineNumber = new SourceLineNumber("DefaultInstallFolder");
42+
var parentDirectoryRef = (packageSymbol.Scope == WixPackageScope.PerUser) ? WixStandardPerUserInstallFolderParent : WixStandardPerMachineInstallFolderParent;
3943

4044
this.AddSymbolsToNewSection(WixStandardInstallFolder,
4145
new DirectorySymbol(sourceLineNumber, new Identifier(AccessModifier.Global, WixStandardInstallFolder))
4246
{
43-
ParentDirectoryRef = WixStandardInstallFolderParent,
47+
ParentDirectoryRef = parentDirectoryRef,
4448
Name = "!(bind.Property.Manufacturer) !(bind.Property.ProductName)",
4549
SourceName = ".",
4650
},
4751
new WixSimpleReferenceSymbol(sourceLineNumber, new Identifier(AccessModifier.Global, WixStandardInstallFolder))
4852
{
4953
Table = "Directory",
50-
PrimaryKeys = WixStandardInstallFolderParent,
54+
PrimaryKeys = parentDirectoryRef,
5155
}
5256
);
5357
}
@@ -58,10 +62,7 @@ public void Execute()
5862
var symbols = this.Sections.SelectMany(section => section.Symbols);
5963
if (!symbols.OfType<UpgradeSymbol>().Any(us => !us.OnlyDetect))
6064
{
61-
var packageSymbol = this.Find.EntrySection.Symbols.OfType<WixPackageSymbol>().FirstOrDefault();
62-
63-
if (packageSymbol?.UpgradeStrategy == WixPackageUpgradeStrategy.MajorUpgrade
64-
&& !String.IsNullOrEmpty(packageSymbol?.UpgradeCode))
65+
if (packageSymbol.UpgradeStrategy == WixPackageUpgradeStrategy.MajorUpgrade && !String.IsNullOrEmpty(packageSymbol?.UpgradeCode))
6566
{
6667
this.AddDefaultMajorUpgrade(packageSymbol);
6768
}

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

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ namespace WixToolsetTest.CoreIntegration
1414
public class DirectoryFixture
1515
{
1616
[Fact]
17-
public void CanGetDefaultInstallFolder()
17+
public void CanGetDefaultPerMachineInstallFolder()
1818
{
19-
var folder = TestData.Get(@"TestData\SingleFile");
19+
var folder = TestData.Get("TestData", "SingleFile");
2020

2121
using (var fs = new DisposableFileSystem())
2222
{
2323
var baseFolder = fs.GetFolder();
2424
var intermediateFolder = Path.Combine(baseFolder, "obj");
25-
var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
25+
var msiPath = Path.Combine(baseFolder, "bin", "test.msi");
2626

2727
var result = WixRunner.Execute(new[]
2828
{
@@ -37,7 +37,7 @@ public void CanGetDefaultInstallFolder()
3737

3838
result.AssertSuccess();
3939

40-
var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
40+
var intermediate = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb"));
4141
var section = intermediate.Sections.Single();
4242

4343
var dirSymbols = section.Symbols.OfType<WixToolset.Data.Symbols.DirectorySymbol>().ToList();
@@ -51,6 +51,42 @@ public void CanGetDefaultInstallFolder()
5151
}
5252
}
5353

54+
[Fact]
55+
public void CanGetDefaultPerUserInstallFolder()
56+
{
57+
var folder = TestData.Get("TestData", "AllUsers");
58+
59+
using (var fs = new DisposableFileSystem())
60+
{
61+
var baseFolder = fs.GetFolder();
62+
var intermediateFolder = Path.Combine(baseFolder, "obj");
63+
var msiPath = Path.Combine(baseFolder, "bin", "test.msi");
64+
65+
var result = WixRunner.Execute(new[]
66+
{
67+
"build",
68+
Path.Combine(folder, "PerUser.wxs"),
69+
"-bindpath", folder,
70+
"-intermediateFolder", intermediateFolder,
71+
"-o", msiPath
72+
});
73+
74+
result.AssertSuccess();
75+
76+
var intermediate = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb"));
77+
var section = intermediate.Sections.Single();
78+
79+
var dirSymbols = section.Symbols.OfType<WixToolset.Data.Symbols.DirectorySymbol>().ToList();
80+
WixAssert.CompareLineByLine(new[]
81+
{
82+
"INSTALLFOLDER:PerUserProgramFilesFolder:Example Corporation MsiPackage",
83+
"LocalAppDataFolder:TARGETDIR:LocalApp",
84+
"PerUserProgramFilesFolder:LocalAppDataFolder:Programs",
85+
"TARGETDIR::SourceDir",
86+
}, dirSymbols.OrderBy(d => d.Id.Id).Select(d => d.Id.Id + ":" + d.ParentDirectoryRef + ":" + d.Name).ToArray());
87+
}
88+
}
89+
5490
[Fact]
5591
public void CanGet32bitProgramFiles6432Folder()
5692
{
@@ -60,7 +96,7 @@ public void CanGet32bitProgramFiles6432Folder()
6096
{
6197
var baseFolder = fs.GetFolder();
6298
var intermediateFolder = Path.Combine(baseFolder, "obj");
63-
var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
99+
var msiPath = Path.Combine(baseFolder, "bin", "test.msi");
64100

65101
var result = WixRunner.Execute(new[]
66102
{
@@ -74,7 +110,7 @@ public void CanGet32bitProgramFiles6432Folder()
74110

75111
result.AssertSuccess();
76112

77-
var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
113+
var intermediate = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb"));
78114
var section = intermediate.Sections.Single();
79115

80116
var dirSymbols = section.Symbols.OfType<WixToolset.Data.Symbols.DirectorySymbol>().ToList();

src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerMachine.wxs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<MajorUpgrade DowngradeErrorMessage="Downgrade not allowed" />
88

99
<Feature Id="ProductFeature" Title="Feature title">
10-
<Component Directory="DesktopFolder">
10+
<Component>
1111
<File Source="PerUser.wxs" />
1212
</Component>
1313
</Feature>

src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUser.wxs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<MajorUpgrade DowngradeErrorMessage="Downgrade not allowed" />
88

99
<Feature Id="ProductFeature" Title="Feature title">
10-
<Component Directory="DesktopFolder">
10+
<Component>
1111
<File Source="PerUser.wxs" />
1212
</Component>
1313
</Feature>

src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerUserOrMachine.wxs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<MajorUpgrade DowngradeErrorMessage="Downgrade not allowed" />
88

99
<Feature Id="ProductFeature" Title="Feature title">
10-
<Component Directory="DesktopFolder">
10+
<Component>
1111
<File Source="PerUser.wxs" />
1212
</Component>
1313
</Feature>

0 commit comments

Comments
 (0)