diff options
Diffstat (limited to '')
12 files changed, 99 insertions, 22 deletions
diff --git a/src/wix/WixToolset.Core/Compiler.cs b/src/wix/WixToolset.Core/Compiler.cs index 3b3c62d4..069743aa 100644 --- a/src/wix/WixToolset.Core/Compiler.cs +++ b/src/wix/WixToolset.Core/Compiler.cs | |||
| @@ -5348,7 +5348,7 @@ namespace WixToolset.Core | |||
| 5348 | } | 5348 | } |
| 5349 | } | 5349 | } |
| 5350 | 5350 | ||
| 5351 | if (null == id) | 5351 | if (null == id && !isNakedFile) |
| 5352 | { | 5352 | { |
| 5353 | id = this.Core.CreateIdentifier("fil", directoryId, name); | 5353 | id = this.Core.CreateIdentifier("fil", directoryId, name); |
| 5354 | } | 5354 | } |
| @@ -5610,8 +5610,6 @@ namespace WixToolset.Core | |||
| 5610 | string condition = null; | 5610 | string condition = null; |
| 5611 | string subdirectory = null; | 5611 | string subdirectory = null; |
| 5612 | 5612 | ||
| 5613 | var keyPath = this.ParseFileElementAttributes(node, "@WixTemporaryComponentId", directoryId, diskId: CompilerConstants.IntegerNotSet, sourcePath, out var _, componentGuid: "*", isNakedFile: true, out var fileSymbol, out var assemblySymbol); | ||
| 5614 | |||
| 5615 | if (!this.Core.EncounteredError) | 5613 | if (!this.Core.EncounteredError) |
| 5616 | { | 5614 | { |
| 5617 | // Naked files have additional attributes to handle common component attributes. | 5615 | // Naked files have additional attributes to handle common component attributes. |
| @@ -5661,13 +5659,43 @@ namespace WixToolset.Core | |||
| 5661 | 5659 | ||
| 5662 | directoryId = this.HandleSubdirectory(sourceLineNumbers, node, directoryId, subdirectory, "Directory", "Subdirectory"); | 5660 | directoryId = this.HandleSubdirectory(sourceLineNumbers, node, directoryId, subdirectory, "Directory", "Subdirectory"); |
| 5663 | 5661 | ||
| 5664 | this.Core.AddSymbol(new ComponentSymbol(sourceLineNumbers, fileSymbol.Id) | 5662 | var keyPath = this.ParseFileElementAttributes(node, "@WixTemporaryComponentId", directoryId, diskId: CompilerConstants.IntegerNotSet, sourcePath, out var _, componentGuid: "*", isNakedFile: true, out var fileSymbol, out var assemblySymbol); |
| 5663 | |||
| 5664 | // Now that we have all the data we need to generate a good id, do | ||
| 5665 | // so and create a file and component symbol with the right data. | ||
| 5666 | var id = fileSymbol.Id ?? this.Core.CreateIdentifier("nkf", directoryId, fileSymbol.Name, condition, win64.ToString()); | ||
| 5667 | |||
| 5668 | this.Core.AddSymbol(new FileSymbol(sourceLineNumbers, id) | ||
| 5669 | { | ||
| 5670 | ComponentRef = id.Id, | ||
| 5671 | Name = fileSymbol.Name, | ||
| 5672 | ShortName = fileSymbol.ShortName, | ||
| 5673 | FileSize = fileSymbol.FileSize, | ||
| 5674 | Version = fileSymbol.Version, | ||
| 5675 | Language = fileSymbol.Language, | ||
| 5676 | Attributes = fileSymbol.Attributes, | ||
| 5677 | DirectoryRef = fileSymbol.DirectoryRef, | ||
| 5678 | DiskId = fileSymbol.DiskId, | ||
| 5679 | Source = fileSymbol.Source, | ||
| 5680 | FontTitle = fileSymbol.FontTitle, | ||
| 5681 | SelfRegCost = fileSymbol.SelfRegCost, | ||
| 5682 | BindPath = fileSymbol.BindPath, | ||
| 5683 | PatchGroup = fileSymbol.PatchGroup, | ||
| 5684 | PatchAttributes = fileSymbol.PatchAttributes, | ||
| 5685 | RetainLengths = fileSymbol.RetainLengths, | ||
| 5686 | IgnoreOffsets = fileSymbol.IgnoreOffsets, | ||
| 5687 | IgnoreLengths = fileSymbol.IgnoreLengths, | ||
| 5688 | RetainOffsets = fileSymbol.RetainOffsets, | ||
| 5689 | SymbolPaths = fileSymbol.SymbolPaths, | ||
| 5690 | }); | ||
| 5691 | |||
| 5692 | this.Core.AddSymbol(new ComponentSymbol(sourceLineNumbers, id) | ||
| 5665 | { | 5693 | { |
| 5666 | ComponentId = "*", | 5694 | ComponentId = "*", |
| 5667 | DirectoryRef = directoryId, | 5695 | DirectoryRef = directoryId, |
| 5668 | Location = ComponentLocation.LocalOnly, | 5696 | Location = ComponentLocation.LocalOnly, |
| 5669 | Condition = condition, | 5697 | Condition = condition, |
| 5670 | KeyPath = fileSymbol.Id.Id, | 5698 | KeyPath = id.Id, |
| 5671 | KeyPathType = ComponentKeyPathType.File, | 5699 | KeyPathType = ComponentKeyPathType.File, |
| 5672 | DisableRegistryReflection = false, | 5700 | DisableRegistryReflection = false, |
| 5673 | NeverOverwrite = false, | 5701 | NeverOverwrite = false, |
| @@ -5679,9 +5707,6 @@ namespace WixToolset.Core | |||
| 5679 | Win64 = win64, | 5707 | Win64 = win64, |
| 5680 | }); | 5708 | }); |
| 5681 | 5709 | ||
| 5682 | fileSymbol.ComponentRef = fileSymbol.Id.Id; | ||
| 5683 | this.Core.AddSymbol(fileSymbol); | ||
| 5684 | |||
| 5685 | if (assemblySymbol != null) | 5710 | if (assemblySymbol != null) |
| 5686 | { | 5711 | { |
| 5687 | this.Core.AddSymbol(assemblySymbol); | 5712 | this.Core.AddSymbol(assemblySymbol); |
| @@ -5697,7 +5722,7 @@ namespace WixToolset.Core | |||
| 5697 | else if (ComplexReferenceParentType.Unknown != parentType && null != parentId) // if parent was provided, add a complex reference to that. | 5722 | else if (ComplexReferenceParentType.Unknown != parentType && null != parentId) // if parent was provided, add a complex reference to that. |
| 5698 | { | 5723 | { |
| 5699 | // If the naked file's component is defined directly under a feature, then mark the complex reference primary. | 5724 | // If the naked file's component is defined directly under a feature, then mark the complex reference primary. |
| 5700 | this.Core.CreateComplexReference(sourceLineNumbers, parentType, parentId, null, ComplexReferenceChildType.Component, fileSymbol.Id.Id, ComplexReferenceParentType.Feature == parentType); | 5725 | this.Core.CreateComplexReference(sourceLineNumbers, parentType, parentId, null, ComplexReferenceChildType.Component, id.Id, ComplexReferenceParentType.Feature == parentType); |
| 5701 | } | 5726 | } |
| 5702 | } | 5727 | } |
| 5703 | } | 5728 | } |
diff --git a/src/wix/WixToolset.Core/Linker.cs b/src/wix/WixToolset.Core/Linker.cs index 43a41eac..b10a12d8 100644 --- a/src/wix/WixToolset.Core/Linker.cs +++ b/src/wix/WixToolset.Core/Linker.cs | |||
| @@ -716,7 +716,7 @@ namespace WixToolset.Core | |||
| 716 | var childTypeAndId = this.CombineTypeAndId(wixComplexReferenceRow.ChildType, wixComplexReferenceRow.Child); | 716 | var childTypeAndId = this.CombineTypeAndId(wixComplexReferenceRow.ChildType, wixComplexReferenceRow.Child); |
| 717 | if (loopDetector.Contains(childTypeAndId)) | 717 | if (loopDetector.Contains(childTypeAndId)) |
| 718 | { | 718 | { |
| 719 | // Create a comma delimited list of the references that participate in the | 719 | // Create an arrow-delimited list of the references that participate in the |
| 720 | // loop for the error message. Start at the bottom of the stack and work the | 720 | // loop for the error message. Start at the bottom of the stack and work the |
| 721 | // way up to present the loop as a directed graph. | 721 | // way up to present the loop as a directed graph. |
| 722 | var loop = String.Join(" -> ", loopDetector); | 722 | var loop = String.Join(" -> ", loopDetector); |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs index 8e4964de..a8af2b4d 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs | |||
| @@ -355,6 +355,41 @@ namespace WixToolsetTest.CoreIntegration | |||
| 355 | }, additionalCommandLineArguments: "-v"); | 355 | }, additionalCommandLineArguments: "-v"); |
| 356 | } | 356 | } |
| 357 | 357 | ||
| 358 | [Fact] | ||
| 359 | public void CanHarvestFilesWithDuplicateNames() | ||
| 360 | { | ||
| 361 | var expectedFiles = new[] | ||
| 362 | { | ||
| 363 | "File:fls47G631z.20kTPzBwIPjGuWifsVo\tfls47G631z.20kTPzBwIPjGuWifsVo\tfile.x\t0\t\t\t512\t2", | ||
| 364 | "File:flshOXYGoD0VHcQhrkIILRPNOVbYuM\tflshOXYGoD0VHcQhrkIILRPNOVbYuM\tfile.x\t0\t\t\t512\t1", | ||
| 365 | "File:flsp2QdFvBeSwll1i5tN0jM72w3Hu4\tflsp2QdFvBeSwll1i5tN0jM72w3Hu4\tfile.x\t0\t\t\t512\t3", | ||
| 366 | "File:flsqopW5ihQpwCTF7t_51GkHd4Hf6s\tflsqopW5ihQpwCTF7t_51GkHd4Hf6s\tfile.x\t0\t\t\t512\t4", | ||
| 367 | }; | ||
| 368 | |||
| 369 | var expectedFilesAndDirectories = new[] | ||
| 370 | { | ||
| 371 | @"fls47G631z.20kTPzBwIPjGuWifsVo=PFiles\Example Corporation MsiPackage\b\file.x", | ||
| 372 | @"flshOXYGoD0VHcQhrkIILRPNOVbYuM=PFiles\Example Corporation MsiPackage\a\file.x", | ||
| 373 | @"flsp2QdFvBeSwll1i5tN0jM72w3Hu4=PFiles\Example Corporation MsiPackage\c\file.x", | ||
| 374 | @"flsqopW5ihQpwCTF7t_51GkHd4Hf6s=PFiles\Example Corporation MsiPackage\d\file.x", | ||
| 375 | }; | ||
| 376 | |||
| 377 | Build("DuplicateNames.wxs", (msiPath, result) => AssertFileAndComponentIdsAndTargetPaths(msiPath, result, expectedFiles, expectedFilesAndDirectories)); | ||
| 378 | } | ||
| 379 | |||
| 380 | private static void AssertFileAndComponentIdsAndTargetPaths(string msiPath, WixRunnerResult result, string[] expectedFiles, string[] expectedFilesAndDirectories) | ||
| 381 | { | ||
| 382 | result.AssertSuccess(); | ||
| 383 | |||
| 384 | var files = Query.QueryDatabase(msiPath, new[] { "File" }) | ||
| 385 | .OrderBy(s => s) | ||
| 386 | .ToArray(); | ||
| 387 | |||
| 388 | Assert.Equal(expectedFiles, files); | ||
| 389 | |||
| 390 | AssertFileIdsAndTargetPaths(msiPath, expectedFilesAndDirectories); | ||
| 391 | } | ||
| 392 | |||
| 358 | private static void AssertFileIdsAndTargetPaths(string msiPath, string[] expected) | 393 | private static void AssertFileIdsAndTargetPaths(string msiPath, string[] expected) |
| 359 | { | 394 | { |
| 360 | var pkg = new WixToolset.Dtf.WindowsInstaller.Package.InstallPackage(msiPath, | 395 | var pkg = new WixToolset.Dtf.WindowsInstaller.Package.InstallPackage(msiPath, |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/NakedFileFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/NakedFileFixture.cs index ae13421d..3142b9da 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/NakedFileFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/NakedFileFixture.cs | |||
| @@ -115,6 +115,13 @@ namespace WixToolsetTest.CoreIntegration | |||
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | [Fact] | 117 | [Fact] |
| 118 | public void CanBuildNakedFilesUnderPackageWithDuplicateNames() | ||
| 119 | { | ||
| 120 | var rows = BuildAndQueryComponentAndFileTables("DuplicateNames.wxs"); | ||
| 121 | AssertFileComponentIds(5, rows); | ||
| 122 | } | ||
| 123 | |||
| 124 | [Fact] | ||
| 118 | public void CanBuildNakedFilesUnderPackageWithDefaultInstallFolder() | 125 | public void CanBuildNakedFilesUnderPackageWithDefaultInstallFolder() |
| 119 | { | 126 | { |
| 120 | var rows = BuildAndQueryComponentAndFileTables("PackageWithDefaultInstallFolder.wxs"); | 127 | var rows = BuildAndQueryComponentAndFileTables("PackageWithDefaultInstallFolder.wxs"); |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/DuplicateNames.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/DuplicateNames.wxs new file mode 100644 index 00000000..c3b08b69 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/DuplicateNames.wxs | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 2 | <Package Name="MsiPackage" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> | ||
| 3 | <Files Include="dupes\**" /> | ||
| 4 | </Package> | ||
| 5 | </Wix> | ||
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/a/file.x b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/a/file.x new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/a/file.x | |||
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/b/file.x b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/b/file.x new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/b/file.x | |||
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/c/file.x b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/c/file.x new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/c/file.x | |||
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/d/file.x b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/d/file.x new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/dupes/d/file.x | |||
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/DuplicateNames.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/DuplicateNames.wxs new file mode 100644 index 00000000..edccc504 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/DuplicateNames.wxs | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 2 | <Package Name="GenManyComponents 5x1" Manufacturer="FireGiant" Version="1.0.0.0" UpgradeCode="b146c9a9-7184-413c-8ab2-b65ed869feb9"> | ||
| 3 | <File Subdirectory='0000' Name='0000.x' Source='$(sys.SOURCEFILEPATH)' /> | ||
| 4 | <File Subdirectory='0001' Name='0000.x' Source='$(sys.SOURCEFILEPATH)' /> | ||
| 5 | <File Subdirectory='0002' Name='0000.x' Source='$(sys.SOURCEFILEPATH)' /> | ||
| 6 | <File Subdirectory='0003' Name='0000.x' Source='$(sys.SOURCEFILEPATH)' /> | ||
| 7 | <File Subdirectory='0004' Name='0000.x' Source='$(sys.SOURCEFILEPATH)' /> | ||
| 8 | </Package> | ||
| 9 | </Wix> | ||
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/Package.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/Package.wxs index e5dd94e0..9ddd4787 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/Package.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/Package.wxs | |||
| @@ -1,10 +1,8 @@ | |||
| 1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | 1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> |
| 2 | <Package Name="MsiPackage" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> | 2 | <Package Name="MsiPackage" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> |
| 3 | <MajorUpgrade DowngradeErrorMessage="Downgrade error message." /> | 3 | <File Directory="INSTALLFOLDER" Subdirectory="X" Source="test.txt" /> |
| 4 | 4 | <File Directory="INSTALLFOLDER" Subdirectory="X" Source="test.txt" Name="test2.txt" /> | |
| 5 | <File Directory="INSTALLFOLDER" Source="test.txt" /> | 5 | <File Directory="INSTALLFOLDER" Subdirectory="X3" Source="test.txt" Name="test3.txt" /> |
| 6 | <File Directory="INSTALLFOLDER" Source="test.txt" Name="test2.txt" /> | 6 | <File Directory="INSTALLFOLDER" Subdirectory="X4" Source="test.txt" Name="test4.txt" /> |
| 7 | <File Directory="INSTALLFOLDER" Source="test.txt" Name="test3.txt" /> | ||
| 8 | <File Directory="INSTALLFOLDER" Source="test.txt" Name="test4.txt" /> | ||
| 9 | </Package> | 7 | </Package> |
| 10 | </Wix> | 8 | </Wix> |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/PackageWithDefaultInstallFolder.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/PackageWithDefaultInstallFolder.wxs index 824f3501..01ca7735 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/PackageWithDefaultInstallFolder.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/NakedFile/PackageWithDefaultInstallFolder.wxs | |||
| @@ -1,10 +1,8 @@ | |||
| 1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | 1 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> |
| 2 | <Package Name="MsiPackage" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> | 2 | <Package Name="MsiPackage" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> |
| 3 | <MajorUpgrade DowngradeErrorMessage="Downgrade error message." /> | 3 | <File Subdirectory="X" Name="test.txt" Source="test.txt" /> |
| 4 | 4 | <File Subdirectory="X" Name="test2.txt" Source="test.txt" /> | |
| 5 | <File Source="test.txt" /> | 5 | <File Subdirectory="X3" Name="test3.txt" Source="test.txt" /> |
| 6 | <File Source="test.txt" Name="test2.txt" /> | 6 | <File Subdirectory="X4" Name="test4.txt" Source="test.txt" /> |
| 7 | <File Source="test.txt" Name="test3.txt" /> | ||
| 8 | <File Source="test.txt" Name="test4.txt" /> | ||
| 9 | </Package> | 7 | </Package> |
| 10 | </Wix> | 8 | </Wix> |
