From ddc79979ced959d8e1b7bd326950a735b73343e5 Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Wed, 17 May 2023 18:14:59 -0400 Subject: Fix duplicate keys from inline subdirectories. Fixes https://github.com/wixtoolset/issues/issues/7459. --- .../CreateWindowsInstallerDataFromIRCommand.cs | 14 +++++++--- .../DirectoryFixture.cs | 3 ++- .../TestData/DuplicateDir/DuplicateDir.wxs | 30 +++++++++++++++++----- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs index 42493484..f160bff6 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs @@ -1319,6 +1319,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind { var directory = symbol.Name.Trim(PathSeparatorChars); var parentDir = symbol.ParentDirectoryRef ?? (symbol.Id.Id == "TARGETDIR" ? null : "TARGETDIR"); + var directoryRows = this.Data.TryGetTable("Directory", out var table) ? table.Rows.ToDictionary(row => row.FieldAsString(0)) : new Dictionary(); var start = 0; var end = directory.IndexOfAny(PathSeparatorChars); @@ -1335,10 +1336,15 @@ namespace WixToolset.Core.WindowsInstaller.Bind var id = this.BackendHelper.GenerateIdentifier("d", symbol.ParentDirectoryRef, path); var shortnameSubdirectory = this.BackendHelper.IsValidShortFilename(subdirectoryName, false) ? null : this.CreateShortName(subdirectoryName, false, "Directory", symbol.ParentDirectoryRef); - var subdirectoryRow = this.CreateRow(symbol, "Directory"); - subdirectoryRow[0] = id; - subdirectoryRow[1] = parentDir; - subdirectoryRow[2] = CreateMsiFilename(shortnameSubdirectory, subdirectoryName); + if (!directoryRows.ContainsKey(id)) + { + var subdirectoryRow = this.CreateRow(symbol, "Directory"); + subdirectoryRow[0] = id; + subdirectoryRow[1] = parentDir; + subdirectoryRow[2] = CreateMsiFilename(shortnameSubdirectory, subdirectoryName); + + directoryRows.Add(id, subdirectoryRow); + } parentDir = id; } diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs index 8e401c40..cacf72bd 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs @@ -170,7 +170,8 @@ namespace WixToolsetTest.CoreIntegration var dirSymbols = section.Symbols.OfType().ToList(); WixAssert.CompareLineByLine(new[] { - "dZsSsu81KcG46xXTwc4mTSZO5Zx4:INSTALLFOLDER:dupe", + @"d6axmdFGwwNJUBTBpSSKcI7uWXo8:INSTALLFOLDER:path\to\path1", + @"dQ9mCRk.rZXStHc.ILz66dIhE0FI:INSTALLFOLDER:path\to\path2", "INSTALLFOLDER:ProgramFiles6432Folder:MsiPackage", "ProgramFiles6432Folder:ProgramFiles64Folder:.", "ProgramFiles64Folder:TARGETDIR:PFiles64", diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/DuplicateDir/DuplicateDir.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/DuplicateDir/DuplicateDir.wxs index a58b68c8..6d7b6681 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/DuplicateDir/DuplicateDir.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/DuplicateDir/DuplicateDir.wxs @@ -2,23 +2,41 @@ - - + + + + - + - + - + - + + + + + + + + + + + + + + + + + -- cgit v1.2.3-55-g6feb