diff options
| author | Rob Mensching <rob@firegiant.com> | 2020-07-21 14:31:53 -0700 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2020-07-21 14:41:12 -0700 |
| commit | b62a7a0beb7ceb7987de28ec768c7814cadb83b9 (patch) | |
| tree | 69a9183a3182334f0d48a39ab8e411ee3fc3aecd | |
| parent | 414c07f7adce9c9fd0132ab0fade0267f743f665 (diff) | |
| download | wix-b62a7a0beb7ceb7987de28ec768c7814cadb83b9.tar.gz wix-b62a7a0beb7ceb7987de28ec768c7814cadb83b9.tar.bz2 wix-b62a7a0beb7ceb7987de28ec768c7814cadb83b9.zip | |
Support implicit standard directory reference and "3264" platform folders
Completes wixtoolset/issues#5798 and wixtoolset/issues#5835
17 files changed, 437 insertions, 72 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/AddRequiredStandardDirectories.cs b/src/WixToolset.Core.WindowsInstaller/Bind/AddRequiredStandardDirectories.cs new file mode 100644 index 00000000..4597639b --- /dev/null +++ b/src/WixToolset.Core.WindowsInstaller/Bind/AddRequiredStandardDirectories.cs | |||
| @@ -0,0 +1,95 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | namespace WixToolset.Core.WindowsInstaller.Bind | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.Collections.Generic; | ||
| 7 | using System.Linq; | ||
| 8 | using WixToolset.Data; | ||
| 9 | using WixToolset.Data.Symbols; | ||
| 10 | using WixToolset.Data.WindowsInstaller; | ||
| 11 | |||
| 12 | /// <summary> | ||
| 13 | /// Add referenced standard directory symbols, if not already present. | ||
| 14 | /// </summary> | ||
| 15 | internal class AddRequiredStandardDirectories | ||
| 16 | { | ||
| 17 | internal AddRequiredStandardDirectories(IntermediateSection section, Platform platform) | ||
| 18 | { | ||
| 19 | this.Section = section; | ||
| 20 | this.Platform = platform; | ||
| 21 | } | ||
| 22 | |||
| 23 | private IntermediateSection Section { get; } | ||
| 24 | |||
| 25 | private Platform Platform { get; } | ||
| 26 | |||
| 27 | public void Execute() | ||
| 28 | { | ||
| 29 | var directories = this.Section.Symbols.OfType<DirectorySymbol>().ToList(); | ||
| 30 | var directoriesById = directories.ToDictionary(d => d.Id.Id); | ||
| 31 | |||
| 32 | foreach (var directory in directories) | ||
| 33 | { | ||
| 34 | var parentDirectoryId = directory.ParentDirectoryRef; | ||
| 35 | |||
| 36 | if (String.IsNullOrEmpty(parentDirectoryId)) | ||
| 37 | { | ||
| 38 | if (directory.Id.Id != "TARGETDIR") | ||
| 39 | { | ||
| 40 | directory.ParentDirectoryRef = "TARGETDIR"; | ||
| 41 | } | ||
| 42 | } | ||
| 43 | else | ||
| 44 | { | ||
| 45 | this.EnsureStandardDirectoryAdded(directoriesById, parentDirectoryId, directory.SourceLineNumbers); | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | if (!directoriesById.ContainsKey("TARGETDIR") && WindowsInstallerStandard.TryGetStandardDirectory("TARGETDIR", out var targetDir)) | ||
| 50 | { | ||
| 51 | directoriesById.Add(targetDir.Id.Id, targetDir); | ||
| 52 | this.Section.AddSymbol(targetDir); | ||
| 53 | } | ||
| 54 | } | ||
| 55 | |||
| 56 | private void EnsureStandardDirectoryAdded(Dictionary<string, DirectorySymbol> directoriesById, string directoryId, SourceLineNumber sourceLineNumbers) | ||
| 57 | { | ||
| 58 | if (!directoriesById.ContainsKey(directoryId) && WindowsInstallerStandard.TryGetStandardDirectory(directoryId, out var standardDirectory)) | ||
| 59 | { | ||
| 60 | var parentDirectoryId = this.GetStandardDirectoryParent(directoryId); | ||
| 61 | |||
| 62 | var directory = new DirectorySymbol(sourceLineNumbers, standardDirectory.Id) | ||
| 63 | { | ||
| 64 | Name = standardDirectory.Name, | ||
| 65 | ParentDirectoryRef = parentDirectoryId, | ||
| 66 | }; | ||
| 67 | |||
| 68 | directoriesById.Add(directory.Id.Id, directory); | ||
| 69 | this.Section.AddSymbol(directory); | ||
| 70 | |||
| 71 | if (!String.IsNullOrEmpty(parentDirectoryId)) | ||
| 72 | { | ||
| 73 | this.EnsureStandardDirectoryAdded(directoriesById, parentDirectoryId, sourceLineNumbers); | ||
| 74 | } | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | private string GetStandardDirectoryParent(string directoryId) | ||
| 79 | { | ||
| 80 | switch (directoryId) | ||
| 81 | { | ||
| 82 | case "TARGETDIR": | ||
| 83 | return null; | ||
| 84 | |||
| 85 | case "CommonFiles6432Folder": | ||
| 86 | case "ProgramFiles6432Folder": | ||
| 87 | case "System6432Folder": | ||
| 88 | return WindowsInstallerStandard.GetPlatformSpecificDirectoryId(directoryId, this.Platform); | ||
| 89 | |||
| 90 | default: | ||
| 91 | return "TARGETDIR"; | ||
| 92 | } | ||
| 93 | } | ||
| 94 | } | ||
| 95 | } | ||
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs index 950fe1c1..93c617d9 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs | |||
| @@ -133,6 +133,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 133 | bool compressed; | 133 | bool compressed; |
| 134 | bool longNames; | 134 | bool longNames; |
| 135 | int installerVersion; | 135 | int installerVersion; |
| 136 | Platform platform; | ||
| 136 | string modularizationSuffix; | 137 | string modularizationSuffix; |
| 137 | { | 138 | { |
| 138 | var command = new BindSummaryInfoCommand(section); | 139 | var command = new BindSummaryInfoCommand(section); |
| @@ -141,6 +142,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 141 | compressed = command.Compressed; | 142 | compressed = command.Compressed; |
| 142 | longNames = command.LongNames; | 143 | longNames = command.LongNames; |
| 143 | installerVersion = command.InstallerVersion; | 144 | installerVersion = command.InstallerVersion; |
| 145 | platform = command.Platform; | ||
| 144 | modularizationSuffix = command.ModularizationSuffix; | 146 | modularizationSuffix = command.ModularizationSuffix; |
| 145 | } | 147 | } |
| 146 | 148 | ||
| @@ -194,6 +196,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 194 | } | 196 | } |
| 195 | 197 | ||
| 196 | { | 198 | { |
| 199 | var command = new AddRequiredStandardDirectories(section, platform); | ||
| 200 | command.Execute(); | ||
| 201 | } | ||
| 202 | |||
| 203 | { | ||
| 197 | var command = new CreateSpecialPropertiesCommand(section); | 204 | var command = new CreateSpecialPropertiesCommand(section); |
| 198 | command.Execute(); | 205 | command.Execute(); |
| 199 | } | 206 | } |
| @@ -332,7 +339,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 332 | 339 | ||
| 333 | // Set generated component guids. | 340 | // Set generated component guids. |
| 334 | { | 341 | { |
| 335 | var command = new CalculateComponentGuids(this.Messaging, this.BackendHelper, this.PathResolver, section); | 342 | var command = new CalculateComponentGuids(this.Messaging, this.BackendHelper, this.PathResolver, section, platform); |
| 336 | command.Execute(); | 343 | command.Execute(); |
| 337 | } | 344 | } |
| 338 | 345 | ||
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs index 82688edf..63691016 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs | |||
| @@ -32,6 +32,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 32 | 32 | ||
| 33 | public int InstallerVersion { get; private set; } | 33 | public int InstallerVersion { get; private set; } |
| 34 | 34 | ||
| 35 | public Platform Platform { get; private set; } | ||
| 36 | |||
| 35 | /// <summary> | 37 | /// <summary> |
| 36 | /// Modularization guid, or null if the output is not a module. | 38 | /// Modularization guid, or null if the output is not a module. |
| 37 | /// </summary> | 39 | /// </summary> |
| @@ -66,6 +68,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 66 | summaryInformationSymbol.Value = Common.GetValidCodePage(codepage, false, false, summaryInformationSymbol.SourceLineNumbers).ToString(CultureInfo.InvariantCulture); | 68 | summaryInformationSymbol.Value = Common.GetValidCodePage(codepage, false, false, summaryInformationSymbol.SourceLineNumbers).ToString(CultureInfo.InvariantCulture); |
| 67 | } | 69 | } |
| 68 | break; | 70 | break; |
| 71 | case SummaryInformationType.PlatformAndLanguage: | ||
| 72 | this.Platform = GetPlatformFromSummaryInformation(summaryInformationSymbol.Value); | ||
| 73 | break; | ||
| 74 | |||
| 69 | case SummaryInformationType.PackageCode: // PID_REVNUMBER | 75 | case SummaryInformationType.PackageCode: // PID_REVNUMBER |
| 70 | var packageCode = summaryInformationSymbol.Value; | 76 | var packageCode = summaryInformationSymbol.Value; |
| 71 | 77 | ||
| @@ -137,5 +143,30 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 137 | }); | 143 | }); |
| 138 | } | 144 | } |
| 139 | } | 145 | } |
| 146 | |||
| 147 | private static Platform GetPlatformFromSummaryInformation(string value) | ||
| 148 | { | ||
| 149 | var separatorIndex = value.IndexOf(';'); | ||
| 150 | var platformValue = separatorIndex > 0 ? value.Substring(0, separatorIndex) : value; | ||
| 151 | |||
| 152 | switch (platformValue) | ||
| 153 | { | ||
| 154 | case "x64": | ||
| 155 | return Platform.X64; | ||
| 156 | |||
| 157 | case "Arm": | ||
| 158 | return Platform.ARM; | ||
| 159 | |||
| 160 | case "Arm64": | ||
| 161 | return Platform.ARM64; | ||
| 162 | |||
| 163 | case "Intel64": | ||
| 164 | return Platform.IA64; | ||
| 165 | |||
| 166 | case "Intel": | ||
| 167 | default: | ||
| 168 | return Platform.X86; | ||
| 169 | } | ||
| 170 | } | ||
| 140 | } | 171 | } |
| 141 | } | 172 | } |
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/CalculateComponentGuids.cs b/src/WixToolset.Core.WindowsInstaller/Bind/CalculateComponentGuids.cs index a1e3ac83..02336cae 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/CalculateComponentGuids.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/CalculateComponentGuids.cs | |||
| @@ -16,12 +16,13 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 16 | /// </summary> | 16 | /// </summary> |
| 17 | internal class CalculateComponentGuids | 17 | internal class CalculateComponentGuids |
| 18 | { | 18 | { |
| 19 | internal CalculateComponentGuids(IMessaging messaging, IBackendHelper helper, IPathResolver pathResolver, IntermediateSection section) | 19 | internal CalculateComponentGuids(IMessaging messaging, IBackendHelper helper, IPathResolver pathResolver, IntermediateSection section, Platform platform) |
| 20 | { | 20 | { |
| 21 | this.Messaging = messaging; | 21 | this.Messaging = messaging; |
| 22 | this.BackendHelper = helper; | 22 | this.BackendHelper = helper; |
| 23 | this.PathResolver = pathResolver; | 23 | this.PathResolver = pathResolver; |
| 24 | this.Section = section; | 24 | this.Section = section; |
| 25 | this.Platform = platform; | ||
| 25 | } | 26 | } |
| 26 | 27 | ||
| 27 | private IMessaging Messaging { get; } | 28 | private IMessaging Messaging { get; } |
| @@ -32,6 +33,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 32 | 33 | ||
| 33 | private IntermediateSection Section { get; } | 34 | private IntermediateSection Section { get; } |
| 34 | 35 | ||
| 36 | private Platform Platform { get; } | ||
| 37 | |||
| 35 | public void Execute() | 38 | public void Execute() |
| 36 | { | 39 | { |
| 37 | Dictionary<string, RegistrySymbol> registryKeyRows = null; | 40 | Dictionary<string, RegistrySymbol> registryKeyRows = null; |
| @@ -42,7 +45,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 42 | // Find components with generatable guids. | 45 | // Find components with generatable guids. |
| 43 | foreach (var componentSymbol in this.Section.Symbols.OfType<ComponentSymbol>()) | 46 | foreach (var componentSymbol in this.Section.Symbols.OfType<ComponentSymbol>()) |
| 44 | { | 47 | { |
| 45 | // Skip components that do not specify generate guid. | 48 | // Skip components that do not specify generate guid. |
| 46 | if (componentSymbol.ComponentId != "*") | 49 | if (componentSymbol.ComponentId != "*") |
| 47 | { | 50 | { |
| 48 | continue; | 51 | continue; |
| @@ -135,7 +138,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 135 | if (fileRow.Id.Id == componentSymbol.KeyPath) | 138 | if (fileRow.Id.Id == componentSymbol.KeyPath) |
| 136 | { | 139 | { |
| 137 | // calculate the key file's canonical target path | 140 | // calculate the key file's canonical target path |
| 138 | string directoryPath = this.PathResolver.GetDirectoryPath(targetPathsByDirectoryId, componentIdGenSeeds, componentSymbol.DirectoryRef, true); | 141 | string directoryPath = this.PathResolver.GetCanonicalDirectoryPath(targetPathsByDirectoryId, componentIdGenSeeds, componentSymbol.DirectoryRef, this.Platform); |
| 139 | string fileName = Common.GetName(fileRow.Name, false, true).ToLowerInvariant(); | 142 | string fileName = Common.GetName(fileRow.Name, false, true).ToLowerInvariant(); |
| 140 | path = Path.Combine(directoryPath, fileName); | 143 | path = Path.Combine(directoryPath, fileName); |
| 141 | 144 | ||
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs index 7f43da9a..93e25878 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs | |||
| @@ -34,25 +34,25 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 34 | { | 34 | { |
| 35 | var requiredActionSymbols = new Dictionary<string, WixActionSymbol>(); | 35 | var requiredActionSymbols = new Dictionary<string, WixActionSymbol>(); |
| 36 | 36 | ||
| 37 | // Get the standard actions required based on symbols in the section. | ||
| 38 | var overridableActionSymbols = this.GetRequiredStandardActions(); | ||
| 39 | |||
| 40 | // Index all the action symbols and look for collisions. | 37 | // Index all the action symbols and look for collisions. |
| 41 | foreach (var actionSymbol in this.Section.Symbols.OfType<WixActionSymbol>()) | 38 | foreach (var actionSymbol in this.Section.Symbols.OfType<WixActionSymbol>()) |
| 42 | { | 39 | { |
| 43 | if (actionSymbol.Overridable) // overridable action | 40 | if (actionSymbol.Overridable) // overridable action |
| 44 | { | 41 | { |
| 45 | if (overridableActionSymbols.TryGetValue(actionSymbol.Id.Id, out var collidingActionSymbol)) | 42 | if (requiredActionSymbols.TryGetValue(actionSymbol.Id.Id, out var collidingActionSymbol)) |
| 46 | { | 43 | { |
| 47 | this.Messaging.Write(ErrorMessages.OverridableActionCollision(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action)); | 44 | if (collidingActionSymbol.Overridable) |
| 48 | if (null != collidingActionSymbol.SourceLineNumbers) | ||
| 49 | { | 45 | { |
| 50 | this.Messaging.Write(ErrorMessages.OverridableActionCollision2(collidingActionSymbol.SourceLineNumbers)); | 46 | this.Messaging.Write(ErrorMessages.OverridableActionCollision(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action)); |
| 47 | if (null != collidingActionSymbol.SourceLineNumbers) | ||
| 48 | { | ||
| 49 | this.Messaging.Write(ErrorMessages.OverridableActionCollision2(collidingActionSymbol.SourceLineNumbers)); | ||
| 50 | } | ||
| 51 | } | 51 | } |
| 52 | } | 52 | } |
| 53 | else | 53 | else |
| 54 | { | 54 | { |
| 55 | overridableActionSymbols.Add(actionSymbol.Id.Id, actionSymbol); | 55 | requiredActionSymbols.Add(actionSymbol.Id.Id, actionSymbol); |
| 56 | } | 56 | } |
| 57 | } | 57 | } |
| 58 | else // unsequenced or sequenced action. | 58 | else // unsequenced or sequenced action. |
| @@ -71,7 +71,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 71 | } | 71 | } |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | if (requiredActionSymbols.TryGetValue(actionSymbol.Id.Id, out var collidingActionSymbol)) | 74 | if (requiredActionSymbols.TryGetValue(actionSymbol.Id.Id, out var collidingActionSymbol) && !collidingActionSymbol.Overridable) |
| 75 | { | 75 | { |
| 76 | this.Messaging.Write(ErrorMessages.ActionCollision(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action)); | 76 | this.Messaging.Write(ErrorMessages.ActionCollision(actionSymbol.SourceLineNumbers, actionSymbol.SequenceTable.ToString(), actionSymbol.Action)); |
| 77 | if (null != collidingActionSymbol.SourceLineNumbers) | 77 | if (null != collidingActionSymbol.SourceLineNumbers) |
| @@ -81,13 +81,16 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 81 | } | 81 | } |
| 82 | else | 82 | else |
| 83 | { | 83 | { |
| 84 | requiredActionSymbols.Add(actionSymbol.Id.Id, actionSymbol); | 84 | requiredActionSymbols[actionSymbol.Id.Id] = actionSymbol; |
| 85 | } | 85 | } |
| 86 | } | 86 | } |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | // Get the standard actions required based on symbols in the section. | ||
| 90 | var requiredStandardActions = this.GetRequiredStandardActions(); | ||
| 91 | |||
| 89 | // Add the overridable action symbols that are not overridden to the required action symbols. | 92 | // Add the overridable action symbols that are not overridden to the required action symbols. |
| 90 | foreach (var actionSymbol in overridableActionSymbols.Values) | 93 | foreach (var actionSymbol in requiredStandardActions.Values) |
| 91 | { | 94 | { |
| 92 | if (!requiredActionSymbols.ContainsKey(actionSymbol.Id.Id)) | 95 | if (!requiredActionSymbols.ContainsKey(actionSymbol.Id.Id)) |
| 93 | { | 96 | { |
| @@ -557,17 +560,6 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 557 | return set; | 560 | return set; |
| 558 | } | 561 | } |
| 559 | 562 | ||
| 560 | private IEnumerable<WixActionSymbol> GetActions(SequenceTable sequence, string[] actionNames) | ||
| 561 | { | ||
| 562 | foreach (var action in WindowsInstallerStandard.StandardActions()) | ||
| 563 | { | ||
| 564 | if (action.SequenceTable == sequence && actionNames.Contains(action.Action)) | ||
| 565 | { | ||
| 566 | yield return action; | ||
| 567 | } | ||
| 568 | } | ||
| 569 | } | ||
| 570 | |||
| 571 | /// <summary> | 563 | /// <summary> |
| 572 | /// Sequence an action before or after a standard action. | 564 | /// Sequence an action before or after a standard action. |
| 573 | /// </summary> | 565 | /// </summary> |
diff --git a/src/WixToolset.Core/Compiler.cs b/src/WixToolset.Core/Compiler.cs index c504e96f..c641bceb 100644 --- a/src/WixToolset.Core/Compiler.cs +++ b/src/WixToolset.Core/Compiler.cs | |||
| @@ -4279,8 +4279,7 @@ namespace WixToolset.Core | |||
| 4279 | this.Core.AddInlineDirectoryId(inlineSyntax, id.Id); | 4279 | this.Core.AddInlineDirectoryId(inlineSyntax, id.Id); |
| 4280 | } | 4280 | } |
| 4281 | } | 4281 | } |
| 4282 | 4282 | else if ("TARGETDIR".Equals(id.Id, StringComparison.Ordinal) && !("SourceDir".Equals(name, StringComparison.Ordinal) && shortName == null && shortSourceName == null && sourceName == null)) | |
| 4283 | if ("TARGETDIR".Equals(id.Id, StringComparison.Ordinal) && !("SourceDir".Equals(name, StringComparison.Ordinal) && shortName == null && shortSourceName == null && sourceName == null)) | ||
| 4284 | { | 4283 | { |
| 4285 | this.Core.Write(ErrorMessages.IllegalTargetDirDefaultDir(sourceLineNumbers, name)); | 4284 | this.Core.Write(ErrorMessages.IllegalTargetDirDefaultDir(sourceLineNumbers, name)); |
| 4286 | } | 4285 | } |
diff --git a/src/WixToolset.Core/ExtensibilityServices/PathResolver.cs b/src/WixToolset.Core/ExtensibilityServices/PathResolver.cs index 15cd4fc9..72be2bcb 100644 --- a/src/WixToolset.Core/ExtensibilityServices/PathResolver.cs +++ b/src/WixToolset.Core/ExtensibilityServices/PathResolver.cs | |||
| @@ -12,7 +12,7 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 12 | 12 | ||
| 13 | internal class PathResolver : IPathResolver | 13 | internal class PathResolver : IPathResolver |
| 14 | { | 14 | { |
| 15 | public string GetDirectoryPath(Dictionary<string, IResolvedDirectory> directories, Dictionary<string, string> componentIdGenSeeds, string directory, bool canonicalize) | 15 | public string GetCanonicalDirectoryPath(Dictionary<string, IResolvedDirectory> directories, Dictionary<string, string> componentIdGenSeeds, string directory, Platform platform) |
| 16 | { | 16 | { |
| 17 | if (!directories.TryGetValue(directory, out var resolvedDirectory)) | 17 | if (!directories.TryGetValue(directory, out var resolvedDirectory)) |
| 18 | { | 18 | { |
| @@ -25,19 +25,13 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 25 | { | 25 | { |
| 26 | resolvedDirectory.Path = componentIdGenSeeds[directory]; | 26 | resolvedDirectory.Path = componentIdGenSeeds[directory]; |
| 27 | } | 27 | } |
| 28 | else if (canonicalize && WindowsInstallerStandard.IsStandardDirectory(directory)) | 28 | else if (WindowsInstallerStandard.IsStandardDirectory(directory)) |
| 29 | { | 29 | { |
| 30 | // when canonicalization is on, standard directories are treated equally | 30 | resolvedDirectory.Path = WindowsInstallerStandard.GetPlatformSpecificDirectoryId(directory, platform); |
| 31 | resolvedDirectory.Path = directory; | ||
| 32 | } | 31 | } |
| 33 | else | 32 | else |
| 34 | { | 33 | { |
| 35 | string name = resolvedDirectory.Name; | 34 | var name = resolvedDirectory.Name?.ToLowerInvariant(); |
| 36 | |||
| 37 | if (canonicalize) | ||
| 38 | { | ||
| 39 | name = name?.ToLowerInvariant(); | ||
| 40 | } | ||
| 41 | 35 | ||
| 42 | if (String.IsNullOrEmpty(resolvedDirectory.DirectoryParent)) | 36 | if (String.IsNullOrEmpty(resolvedDirectory.DirectoryParent)) |
| 43 | { | 37 | { |
| @@ -45,7 +39,7 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 45 | } | 39 | } |
| 46 | else | 40 | else |
| 47 | { | 41 | { |
| 48 | var parentPath = this.GetDirectoryPath(directories, componentIdGenSeeds, resolvedDirectory.DirectoryParent, canonicalize); | 42 | var parentPath = this.GetCanonicalDirectoryPath(directories, componentIdGenSeeds, resolvedDirectory.DirectoryParent, platform); |
| 49 | 43 | ||
| 50 | if (null != resolvedDirectory.Name) | 44 | if (null != resolvedDirectory.Name) |
| 51 | { | 45 | { |
| @@ -62,6 +56,39 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 62 | return resolvedDirectory.Path; | 56 | return resolvedDirectory.Path; |
| 63 | } | 57 | } |
| 64 | 58 | ||
| 59 | public string GetDirectoryPath(Dictionary<string, IResolvedDirectory> directories, string directory) | ||
| 60 | { | ||
| 61 | if (!directories.TryGetValue(directory, out var resolvedDirectory)) | ||
| 62 | { | ||
| 63 | throw new WixException(ErrorMessages.ExpectedDirectory(directory)); | ||
| 64 | } | ||
| 65 | |||
| 66 | if (null == resolvedDirectory.Path) | ||
| 67 | { | ||
| 68 | var name = resolvedDirectory.Name; | ||
| 69 | |||
| 70 | if (String.IsNullOrEmpty(resolvedDirectory.DirectoryParent)) | ||
| 71 | { | ||
| 72 | resolvedDirectory.Path = name; | ||
| 73 | } | ||
| 74 | else | ||
| 75 | { | ||
| 76 | var parentPath = this.GetDirectoryPath(directories, resolvedDirectory.DirectoryParent); | ||
| 77 | |||
| 78 | if (null != resolvedDirectory.Name) | ||
| 79 | { | ||
| 80 | resolvedDirectory.Path = Path.Combine(parentPath, name); | ||
| 81 | } | ||
| 82 | else | ||
| 83 | { | ||
| 84 | resolvedDirectory.Path = parentPath; | ||
| 85 | } | ||
| 86 | } | ||
| 87 | } | ||
| 88 | |||
| 89 | return resolvedDirectory.Path; | ||
| 90 | } | ||
| 91 | |||
| 65 | public string GetFileSourcePath(Dictionary<string, IResolvedDirectory> directories, string directoryId, string fileName, bool compressed, bool useLongName) | 92 | public string GetFileSourcePath(Dictionary<string, IResolvedDirectory> directories, string directoryId, string fileName, bool compressed, bool useLongName) |
| 66 | { | 93 | { |
| 67 | var fileSourcePath = Common.GetName(fileName, true, useLongName); | 94 | var fileSourcePath = Common.GetName(fileName, true, useLongName); |
| @@ -75,7 +102,7 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 75 | { | 102 | { |
| 76 | // Get the relative path of where we want the file to be layed out as specified | 103 | // Get the relative path of where we want the file to be layed out as specified |
| 77 | // in the Directory table. | 104 | // in the Directory table. |
| 78 | var directoryPath = this.GetDirectoryPath(directories, null, directoryId, false); | 105 | var directoryPath = this.GetDirectoryPath(directories, directoryId); |
| 79 | fileSourcePath = Path.Combine(directoryPath, fileSourcePath); | 106 | fileSourcePath = Path.Combine(directoryPath, fileSourcePath); |
| 80 | } | 107 | } |
| 81 | 108 | ||
diff --git a/src/WixToolset.Core/Link/ResolveReferencesCommand.cs b/src/WixToolset.Core/Link/ResolveReferencesCommand.cs index d2be0699..90b61e8b 100644 --- a/src/WixToolset.Core/Link/ResolveReferencesCommand.cs +++ b/src/WixToolset.Core/Link/ResolveReferencesCommand.cs | |||
| @@ -72,27 +72,22 @@ namespace WixToolset.Core.Link | |||
| 72 | continue; | 72 | continue; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | if (!this.symbolsWithSections.TryGetValue(wixSimpleReferenceRow.SymbolicName, out var symbolWithSection)) | 75 | // See if the symbol (and any of its duplicates) are appropriately accessible. |
| 76 | { | 76 | if (this.symbolsWithSections.TryGetValue(wixSimpleReferenceRow.SymbolicName, out var symbolWithSection)) |
| 77 | this.Messaging.Write(ErrorMessages.UnresolvedReference(wixSimpleReferenceRow.SourceLineNumbers, wixSimpleReferenceRow.SymbolicName)); | ||
| 78 | } | ||
| 79 | else // see if the symbol (and any of its duplicates) are appropriately accessible. | ||
| 80 | { | 77 | { |
| 81 | var accessible = this.DetermineAccessibleSymbols(section, symbolWithSection); | 78 | var accessible = this.DetermineAccessibleSymbols(section, symbolWithSection); |
| 82 | if (!accessible.Any()) | 79 | if (accessible.Count == 1) |
| 83 | { | ||
| 84 | this.Messaging.Write(ErrorMessages.UnresolvedReference(wixSimpleReferenceRow.SourceLineNumbers, wixSimpleReferenceRow.SymbolicName, symbolWithSection.Access)); | ||
| 85 | } | ||
| 86 | else if (1 == accessible.Count) | ||
| 87 | { | 80 | { |
| 88 | var accessibleSymbol = accessible[0]; | 81 | var accessibleSymbol = accessible[0]; |
| 89 | this.referencedSymbols.Add(accessibleSymbol); | 82 | if (this.referencedSymbols.Add(accessibleSymbol) && null != accessibleSymbol.Section) |
| 90 | |||
| 91 | if (null != accessibleSymbol.Section) | ||
| 92 | { | 83 | { |
| 93 | this.RecursivelyResolveReferences(accessibleSymbol.Section); | 84 | this.RecursivelyResolveReferences(accessibleSymbol.Section); |
| 94 | } | 85 | } |
| 95 | } | 86 | } |
| 87 | else if (accessible.Count == 0) | ||
| 88 | { | ||
| 89 | this.Messaging.Write(ErrorMessages.UnresolvedReference(wixSimpleReferenceRow.SourceLineNumbers, wixSimpleReferenceRow.SymbolicName, symbolWithSection.Access)); | ||
| 90 | } | ||
| 96 | else // display errors for the duplicate symbols. | 91 | else // display errors for the duplicate symbols. |
| 97 | { | 92 | { |
| 98 | var accessibleSymbol = accessible[0]; | 93 | var accessibleSymbol = accessible[0]; |
| @@ -113,6 +108,10 @@ namespace WixToolset.Core.Link | |||
| 113 | } | 108 | } |
| 114 | } | 109 | } |
| 115 | } | 110 | } |
| 111 | else | ||
| 112 | { | ||
| 113 | this.Messaging.Write(ErrorMessages.UnresolvedReference(wixSimpleReferenceRow.SourceLineNumbers, wixSimpleReferenceRow.SymbolicName)); | ||
| 114 | } | ||
| 116 | } | 115 | } |
| 117 | } | 116 | } |
| 118 | 117 | ||
diff --git a/src/WixToolset.Core/Link/SymbolWithSection.cs b/src/WixToolset.Core/Link/SymbolWithSection.cs new file mode 100644 index 00000000..c8934d0f --- /dev/null +++ b/src/WixToolset.Core/Link/SymbolWithSection.cs | |||
| @@ -0,0 +1,91 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | namespace WixToolset.Core.Link | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.Collections.Generic; | ||
| 7 | using System.Linq; | ||
| 8 | using WixToolset.Data; | ||
| 9 | |||
| 10 | /// <summary> | ||
| 11 | /// Symbol with section representing a single unique symbol. | ||
| 12 | /// </summary> | ||
| 13 | internal class SymbolWithSection | ||
| 14 | { | ||
| 15 | private HashSet<SymbolWithSection> possibleConflicts; | ||
| 16 | private HashSet<SymbolWithSection> redundants; | ||
| 17 | |||
| 18 | /// <summary> | ||
| 19 | /// Creates a symbol for a symbol. | ||
| 20 | /// </summary> | ||
| 21 | /// <param name="symbol">Symbol for the symbol</param> | ||
| 22 | public SymbolWithSection(IntermediateSection section, IntermediateSymbol symbol) | ||
| 23 | { | ||
| 24 | this.Symbol = symbol; | ||
| 25 | this.Section = section; | ||
| 26 | this.Name = String.Concat(this.Symbol.Definition.Name, ":", this.Symbol.Id.Id); | ||
| 27 | } | ||
| 28 | |||
| 29 | /// <summary> | ||
| 30 | /// Gets the accessibility of the symbol which is a direct reflection of the accessibility of the row's accessibility. | ||
| 31 | /// </summary> | ||
| 32 | /// <value>Accessbility of the symbol.</value> | ||
| 33 | public AccessModifier Access => this.Symbol.Id.Access; | ||
| 34 | |||
| 35 | /// <summary> | ||
| 36 | /// Gets the name of the symbol. | ||
| 37 | /// </summary> | ||
| 38 | /// <value>Name of the symbol.</value> | ||
| 39 | public string Name { get; } | ||
| 40 | |||
| 41 | /// <summary> | ||
| 42 | /// Gets the symbol for this symbol. | ||
| 43 | /// </summary> | ||
| 44 | /// <value>Symbol for this symbol.</value> | ||
| 45 | public IntermediateSymbol Symbol { get; } | ||
| 46 | |||
| 47 | /// <summary> | ||
| 48 | /// Gets the section for the symbol. | ||
| 49 | /// </summary> | ||
| 50 | /// <value>Section for the symbol.</value> | ||
| 51 | public IntermediateSection Section { get; } | ||
| 52 | |||
| 53 | /// <summary> | ||
| 54 | /// Gets any duplicates of this symbol with sections that are possible conflicts. | ||
| 55 | /// </summary> | ||
| 56 | public IEnumerable<SymbolWithSection> PossiblyConflicts => this.possibleConflicts ?? Enumerable.Empty<SymbolWithSection>(); | ||
| 57 | |||
| 58 | /// <summary> | ||
| 59 | /// Gets any duplicates of this symbol with sections that are redundant. | ||
| 60 | /// </summary> | ||
| 61 | public IEnumerable<SymbolWithSection> Redundants => this.redundants ?? Enumerable.Empty<SymbolWithSection>(); | ||
| 62 | |||
| 63 | /// <summary> | ||
| 64 | /// Adds a duplicate symbol with sections that is a possible conflict. | ||
| 65 | /// </summary> | ||
| 66 | /// <param name="symbolWithSection">Symbol with section that is a possible conflict of this symbol.</param> | ||
| 67 | public void AddPossibleConflict(SymbolWithSection symbolWithSection) | ||
| 68 | { | ||
| 69 | if (null == this.possibleConflicts) | ||
| 70 | { | ||
| 71 | this.possibleConflicts = new HashSet<SymbolWithSection>(); | ||
| 72 | } | ||
| 73 | |||
| 74 | this.possibleConflicts.Add(symbolWithSection); | ||
| 75 | } | ||
| 76 | |||
| 77 | /// <summary> | ||
| 78 | /// Adds a duplicate symbol that is redundant. | ||
| 79 | /// </summary> | ||
| 80 | /// <param name="symbolWithSection">Symbol with section that is redundant of this symbol.</param> | ||
| 81 | public void AddRedundant(SymbolWithSection symbolWithSection) | ||
| 82 | { | ||
| 83 | if (null == this.redundants) | ||
| 84 | { | ||
| 85 | this.redundants = new HashSet<SymbolWithSection>(); | ||
| 86 | } | ||
| 87 | |||
| 88 | this.redundants.Add(symbolWithSection); | ||
| 89 | } | ||
| 90 | } | ||
| 91 | } | ||
diff --git a/src/WixToolset.Core/Linker.cs b/src/WixToolset.Core/Linker.cs index cdefa5c7..1cfd085d 100644 --- a/src/WixToolset.Core/Linker.cs +++ b/src/WixToolset.Core/Linker.cs | |||
| @@ -149,13 +149,12 @@ namespace WixToolset.Core | |||
| 149 | throw new WixException(ErrorMessages.MissingEntrySection(this.Context.ExpectedOutputType.ToString())); | 149 | throw new WixException(ErrorMessages.MissingEntrySection(this.Context.ExpectedOutputType.ToString())); |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | // Add the missing standard action symbols. | 152 | // Add the missing standard action and directory symbols. |
| 153 | this.LoadStandardActions(find.EntrySection, find.SymbolsByName); | 153 | this.LoadStandardSymbols(find.SymbolsByName); |
| 154 | 154 | ||
| 155 | // Resolve the symbol references to find the set of sections we care about for linking. | 155 | // Resolve the symbol references to find the set of sections we care about for linking. |
| 156 | // Of course, we start with the entry section (that's how it got its name after all). | 156 | // Of course, we start with the entry section (that's how it got its name after all). |
| 157 | var resolve = new ResolveReferencesCommand(this.Messaging, find.EntrySection, find.SymbolsByName); | 157 | var resolve = new ResolveReferencesCommand(this.Messaging, find.EntrySection, find.SymbolsByName); |
| 158 | |||
| 159 | resolve.Execute(); | 158 | resolve.Execute(); |
| 160 | 159 | ||
| 161 | if (this.Messaging.EncounteredError) | 160 | if (this.Messaging.EncounteredError) |
| @@ -732,14 +731,14 @@ namespace WixToolset.Core | |||
| 732 | #endif | 731 | #endif |
| 733 | 732 | ||
| 734 | /// <summary> | 733 | /// <summary> |
| 735 | /// Load the standard action symbols. | 734 | /// Load the standard action and directory symbols. |
| 736 | /// </summary> | 735 | /// </summary> |
| 737 | /// <param name="symbolsByName">Collection of symbols.</param> | 736 | /// <param name="symbolsByName">Collection of symbols.</param> |
| 738 | private void LoadStandardActions(IntermediateSection section, IDictionary<string, SymbolWithSection> symbolsByName) | 737 | private void LoadStandardSymbols(IDictionary<string, SymbolWithSection> symbolsByName) |
| 739 | { | 738 | { |
| 740 | foreach (var actionSymbol in WindowsInstallerStandard.StandardActions()) | 739 | foreach (var actionSymbol in WindowsInstallerStandard.StandardActions()) |
| 741 | { | 740 | { |
| 742 | var symbolWithSection = new SymbolWithSection(section, actionSymbol); | 741 | var symbolWithSection = new SymbolWithSection(null, actionSymbol); |
| 743 | 742 | ||
| 744 | // If the action's symbol has not already been defined (i.e. overriden by the user), add it now. | 743 | // If the action's symbol has not already been defined (i.e. overriden by the user), add it now. |
| 745 | if (!symbolsByName.ContainsKey(symbolWithSection.Name)) | 744 | if (!symbolsByName.ContainsKey(symbolWithSection.Name)) |
| @@ -747,6 +746,17 @@ namespace WixToolset.Core | |||
| 747 | symbolsByName.Add(symbolWithSection.Name, symbolWithSection); | 746 | symbolsByName.Add(symbolWithSection.Name, symbolWithSection); |
| 748 | } | 747 | } |
| 749 | } | 748 | } |
| 749 | |||
| 750 | foreach (var directorySymbol in WindowsInstallerStandard.StandardDirectories()) | ||
| 751 | { | ||
| 752 | var symbolWithSection = new SymbolWithSection(null, directorySymbol); | ||
| 753 | |||
| 754 | // If the directory's symbol has not already been defined (i.e. overriden by the user), add it now. | ||
| 755 | if (!symbolsByName.ContainsKey(symbolWithSection.Name)) | ||
| 756 | { | ||
| 757 | symbolsByName.Add(symbolWithSection.Name, symbolWithSection); | ||
| 758 | } | ||
| 759 | } | ||
| 750 | } | 760 | } |
| 751 | 761 | ||
| 752 | /// <summary> | 762 | /// <summary> |
diff --git a/src/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs b/src/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs new file mode 100644 index 00000000..83f2f2bb --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs | |||
| @@ -0,0 +1,89 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | namespace WixToolsetTest.CoreIntegration | ||
| 4 | { | ||
| 5 | using System.IO; | ||
| 6 | using System.Linq; | ||
| 7 | using WixBuildTools.TestSupport; | ||
| 8 | using WixToolset.Core.TestPackage; | ||
| 9 | using WixToolset.Data; | ||
| 10 | using Xunit; | ||
| 11 | |||
| 12 | public class DirectoryFixture | ||
| 13 | { | ||
| 14 | [Fact] | ||
| 15 | public void CanGet32bitProgramFiles6432Folder() | ||
| 16 | { | ||
| 17 | var folder = TestData.Get(@"TestData"); | ||
| 18 | |||
| 19 | using (var fs = new DisposableFileSystem()) | ||
| 20 | { | ||
| 21 | var baseFolder = fs.GetFolder(); | ||
| 22 | var intermediateFolder = Path.Combine(baseFolder, "obj"); | ||
| 23 | var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); | ||
| 24 | |||
| 25 | var result = WixRunner.Execute(new[] | ||
| 26 | { | ||
| 27 | "build", | ||
| 28 | Path.Combine(folder, "Directory", "Empty.wxs"), | ||
| 29 | Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), | ||
| 30 | "-bindpath", Path.Combine(folder, "SingleFile", "data"), | ||
| 31 | "-intermediateFolder", intermediateFolder, | ||
| 32 | "-o", msiPath | ||
| 33 | }); | ||
| 34 | |||
| 35 | result.AssertSuccess(); | ||
| 36 | |||
| 37 | var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); | ||
| 38 | var section = intermediate.Sections.Single(); | ||
| 39 | |||
| 40 | var dirSymbols = section.Symbols.OfType<WixToolset.Data.Symbols.DirectorySymbol>().ToList(); | ||
| 41 | Assert.Equal(new[] | ||
| 42 | { | ||
| 43 | "INSTALLFOLDER", | ||
| 44 | "ProgramFiles6432Folder", | ||
| 45 | "ProgramFilesFolder", | ||
| 46 | "TARGETDIR" | ||
| 47 | }, dirSymbols.Select(d => d.Id.Id).ToArray()); | ||
| 48 | } | ||
| 49 | } | ||
| 50 | |||
| 51 | [Fact] | ||
| 52 | public void CanGet64bitProgramFiles6432Folder() | ||
| 53 | { | ||
| 54 | var folder = TestData.Get(@"TestData"); | ||
| 55 | |||
| 56 | using (var fs = new DisposableFileSystem()) | ||
| 57 | { | ||
| 58 | var baseFolder = fs.GetFolder(); | ||
| 59 | var intermediateFolder = Path.Combine(baseFolder, "obj"); | ||
| 60 | var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); | ||
| 61 | |||
| 62 | var result = WixRunner.Execute(new[] | ||
| 63 | { | ||
| 64 | "build", | ||
| 65 | "-arch", "x64", | ||
| 66 | Path.Combine(folder, "Directory", "Empty.wxs"), | ||
| 67 | Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), | ||
| 68 | "-bindpath", Path.Combine(folder, "SingleFile", "data"), | ||
| 69 | "-intermediateFolder", intermediateFolder, | ||
| 70 | "-o", msiPath | ||
| 71 | }); | ||
| 72 | |||
| 73 | result.AssertSuccess(); | ||
| 74 | |||
| 75 | var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); | ||
| 76 | var section = intermediate.Sections.Single(); | ||
| 77 | |||
| 78 | var dirSymbols = section.Symbols.OfType<WixToolset.Data.Symbols.DirectorySymbol>().ToList(); | ||
| 79 | Assert.Equal(new[] | ||
| 80 | { | ||
| 81 | "INSTALLFOLDER", | ||
| 82 | "ProgramFiles6432Folder", | ||
| 83 | "ProgramFiles64Folder", | ||
| 84 | "TARGETDIR" | ||
| 85 | }, dirSymbols.Select(d => d.Id.Id).ToArray()); | ||
| 86 | } | ||
| 87 | } | ||
| 88 | } | ||
| 89 | } | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs b/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs index 3ab218d1..4ff7f5f6 100644 --- a/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs | |||
| @@ -365,14 +365,15 @@ namespace WixToolsetTest.CoreIntegration | |||
| 365 | 365 | ||
| 366 | Assert.True(File.Exists(msiPath)); | 366 | Assert.True(File.Exists(msiPath)); |
| 367 | var results = Query.QueryDatabase(msiPath, new[] { "Directory" }); | 367 | var results = Query.QueryDatabase(msiPath, new[] { "Directory" }); |
| 368 | Assert.Equal(new[] | 368 | WixAssert.CompareLineByLine(new[] |
| 369 | { | 369 | { |
| 370 | "Directory:DUPLICATENAMEANDSHORTNAME\tINSTALLFOLDER\tduplicat", | 370 | "Directory:DUPLICATENAMEANDSHORTNAME\tINSTALLFOLDER\tduplicat", |
| 371 | "Directory:INSTALLFOLDER\tProgramFilesFolder\toekcr5lq|MsiPackage", | 371 | "Directory:INSTALLFOLDER\tProgramFiles6432Folder\t1egc1laj|MsiPackage", |
| 372 | "Directory:NAMEANDSHORTNAME\tINSTALLFOLDER\tSHORTNAM|NameAndShortName", | 372 | "Directory:NAMEANDSHORTNAME\tINSTALLFOLDER\tSHORTNAM|NameAndShortName", |
| 373 | "Directory:NAMEANDSHORTSOURCENAME\tINSTALLFOLDER\tNAMEASSN|NameAndShortSourceName", | 373 | "Directory:NAMEANDSHORTSOURCENAME\tINSTALLFOLDER\tNAMEASSN|NameAndShortSourceName", |
| 374 | "Directory:NAMEWITHSHORTVALUE\tINSTALLFOLDER\tSHORTVAL", | 374 | "Directory:NAMEWITHSHORTVALUE\tINSTALLFOLDER\tSHORTVAL", |
| 375 | "Directory:ProgramFilesFolder\tTARGETDIR\t.", | 375 | "Directory:ProgramFiles6432Folder\tProgramFilesFolder\t.", |
| 376 | "Directory:ProgramFilesFolder\tTARGETDIR\tPFiles", | ||
| 376 | "Directory:SHORTNAMEANDLONGSOURCENAME\tINSTALLFOLDER\tSHNALSNM:6ukthv5q|ShortNameAndLongSourceName", | 377 | "Directory:SHORTNAMEANDLONGSOURCENAME\tINSTALLFOLDER\tSHNALSNM:6ukthv5q|ShortNameAndLongSourceName", |
| 377 | "Directory:SHORTNAMEONLY\tINSTALLFOLDER\tSHORTONL", | 378 | "Directory:SHORTNAMEONLY\tINSTALLFOLDER\tSHORTONL", |
| 378 | "Directory:SOURCENAME\tINSTALLFOLDER\ts2s5bq-i|NameAndSourceName:dhnqygng|SourceNameWithName", | 379 | "Directory:SOURCENAME\tINSTALLFOLDER\ts2s5bq-i|NameAndSourceName:dhnqygng|SourceNameWithName", |
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/CustomAction/SimpleCustomAction.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/CustomAction/SimpleCustomAction.wxs new file mode 100644 index 00000000..72d5e4a5 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/CustomAction/SimpleCustomAction.wxs | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 3 | <Fragment> | ||
| 4 | <ComponentGroup Id="ProductComponents"> | ||
| 5 | <ComponentGroupRef Id="MinimalComponentGroup" /> | ||
| 6 | </ComponentGroup> | ||
| 7 | |||
| 8 | <Binary Id="Binary1" SourceFile="test.txt" /> | ||
| 9 | <CustomAction Id="Action1" BinaryKey="Binary1" DllEntry="EntryPoint1" /> | ||
| 10 | |||
| 11 | <InstallExecuteSequence> | ||
| 12 | <Custom Action="Action1" After="InstallFiles" /> | ||
| 13 | </InstallExecuteSequence> | ||
| 14 | </Fragment> | ||
| 15 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs index 68386612..c55f4ed0 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/CustomTable/CustomTable-Expected.wxs | |||
| @@ -15,11 +15,13 @@ | |||
| 15 | </Row> | 15 | </Row> |
| 16 | </CustomTable> | 16 | </CustomTable> |
| 17 | <Directory Id="TARGETDIR" Name="SourceDir"> | 17 | <Directory Id="TARGETDIR" Name="SourceDir"> |
| 18 | <Directory Id="ProgramFilesFolder"> | 18 | <Directory Id="ProgramFilesFolder" Name="PFiles"> |
| 19 | <Directory Id="INSTALLFOLDER" Name="MsiPackage" ShortName="oekcr5lq"> | 19 | <Directory Id="ProgramFiles6432Folder"> |
| 20 | <Component Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" Guid="{E597A58A-03CB-50D8-93E3-DABA263F233A}" Win64="no"> | 20 | <Directory Id="INSTALLFOLDER" Name="MsiPackage" ShortName="1egc1laj"> |
| 21 | <File Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" Name="test.txt" KeyPath="yes" Source="SourceDir\\MsiPackage\test.txt" /> | 21 | <Component Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" Guid="{E597A58A-03CB-50D8-93E3-DABA263F233A}" Win64="no"> |
| 22 | </Component> | 22 | <File Id="filcV1yrx0x8wJWj4qMzcH21jwkPko" Name="test.txt" KeyPath="yes" Source="SourceDir\PFiles\\MsiPackage\test.txt" /> |
| 23 | </Component> | ||
| 24 | </Directory> | ||
| 23 | </Directory> | 25 | </Directory> |
| 24 | </Directory> | 26 | </Directory> |
| 25 | </Directory> | 27 | </Directory> |
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/Directory/Empty.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/Directory/Empty.wxs new file mode 100644 index 00000000..50cf6850 --- /dev/null +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/Directory/Empty.wxs | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 3 | <Fragment> | ||
| 4 | <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER" /> | ||
| 5 | </Fragment> | ||
| 6 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs index b2f22b7d..5b26091a 100644 --- a/src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs +++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ProductWithComponentGroupRef/Product.wxs | |||
| @@ -11,10 +11,6 @@ | |||
| 11 | </Product> | 11 | </Product> |
| 12 | 12 | ||
| 13 | <Fragment> | 13 | <Fragment> |
| 14 | <Directory Id="TARGETDIR" Name="SourceDir"> | 14 | <Directory Id="INSTALLFOLDER" Name="ProgramFiles6432Folder:\MsiPackage" /> |
| 15 | <Directory Id="ProgramFilesFolder"> | ||
| 16 | <Directory Id="INSTALLFOLDER" Name="MsiPackage" /> | ||
| 17 | </Directory> | ||
| 18 | </Directory> | ||
| 19 | </Fragment> | 15 | </Fragment> |
| 20 | </Wix> | 16 | </Wix> |
diff --git a/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj b/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj index 15078b8a..601a66e7 100644 --- a/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj +++ b/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | <Content Include="TestData\Class\IconIndex0.wxs" CopyToOutputDirectory="PreserveNewest" /> | 36 | <Content Include="TestData\Class\IconIndex0.wxs" CopyToOutputDirectory="PreserveNewest" /> |
| 37 | <Content Include="TestData\Class\OldClassTableDef.msi" CopyToOutputDirectory="PreserveNewest" /> | 37 | <Content Include="TestData\Class\OldClassTableDef.msi" CopyToOutputDirectory="PreserveNewest" /> |
| 38 | <Content Include="TestData\CopyFile\CopyFile.wxs" CopyToOutputDirectory="PreserveNewest" /> | 38 | <Content Include="TestData\CopyFile\CopyFile.wxs" CopyToOutputDirectory="PreserveNewest" /> |
| 39 | <Content Include="TestData\CustomAction\SimpleCustomAction.wxs" CopyToOutputDirectory="PreserveNewest" /> | ||
| 39 | <Content Include="TestData\CustomAction\CustomActionCycle.wxs" CopyToOutputDirectory="PreserveNewest" /> | 40 | <Content Include="TestData\CustomAction\CustomActionCycle.wxs" CopyToOutputDirectory="PreserveNewest" /> |
| 40 | <Content Include="TestData\CustomAction\UnscheduledCustomAction.wxs" CopyToOutputDirectory="PreserveNewest" /> | 41 | <Content Include="TestData\CustomAction\UnscheduledCustomAction.wxs" CopyToOutputDirectory="PreserveNewest" /> |
| 41 | <Content Include="TestData\CustomTable\CustomTable-Expected.wxs" CopyToOutputDirectory="PreserveNewest" /> | 42 | <Content Include="TestData\CustomTable\CustomTable-Expected.wxs" CopyToOutputDirectory="PreserveNewest" /> |
| @@ -48,6 +49,7 @@ | |||
| 48 | <Content Include="TestData\CustomTable\LocalizedCustomTable.en-us.wxl" CopyToOutputDirectory="PreserveNewest" /> | 49 | <Content Include="TestData\CustomTable\LocalizedCustomTable.en-us.wxl" CopyToOutputDirectory="PreserveNewest" /> |
| 49 | <Content Include="TestData\DefaultDir\DefaultDir.wxs" CopyToOutputDirectory="PreserveNewest" /> | 50 | <Content Include="TestData\DefaultDir\DefaultDir.wxs" CopyToOutputDirectory="PreserveNewest" /> |
| 50 | <Content Include="TestData\DialogsInInstallUISequence\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" /> | 51 | <Content Include="TestData\DialogsInInstallUISequence\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" /> |
| 52 | <Content Include="TestData\Directory\Empty.wxs" CopyToOutputDirectory="PreserveNewest" /> | ||
| 51 | <Content Include="TestData\EnsureTable\EnsureTable.wxs" CopyToOutputDirectory="PreserveNewest" /> | 53 | <Content Include="TestData\EnsureTable\EnsureTable.wxs" CopyToOutputDirectory="PreserveNewest" /> |
| 52 | <Content Include="TestData\Environment\Environment.wxs" CopyToOutputDirectory="PreserveNewest" /> | 54 | <Content Include="TestData\Environment\Environment.wxs" CopyToOutputDirectory="PreserveNewest" /> |
| 53 | <Content Include="TestData\ErrorsInUI\data\test.txt" CopyToOutputDirectory="PreserveNewest" /> | 55 | <Content Include="TestData\ErrorsInUI\data\test.txt" CopyToOutputDirectory="PreserveNewest" /> |
