@joebigelow / wix-1 / commits / f3a228ea

Discards source directory name when identical to target name

Fixes wixtoolset/issues#6418

Rob Mensching committed Apr 6, 2021 at 15:56 UTC f3a228eaf7d40bcd46b64c3d49aa23df23e79aec
3 files changed +59 -1
src/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs
+1 -1
@@ -513,7 +513,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
513 targetName = ".";
514 }
515
516 - var defaultDir = String.IsNullOrEmpty(sourceName) ? targetName : targetName + ":" + sourceName;
516 + var defaultDir = String.IsNullOrEmpty(sourceName) || sourceName == targetName ? targetName : targetName + ":" + sourceName;
517
518 var row = this.CreateRow(symbol, "Directory");
519 row[0] = symbol.Id.Id;
src/test/WixToolsetTest.CoreIntegration/DirectoryFixture.cs
+47
@@ -2,6 +2,7 @@
2
3 namespace WixToolsetTest.CoreIntegration
4 {
5 + using System;
6 using System.IO;
7 using System.Linq;
8 using WixBuildTools.TestSupport;
@@ -173,5 +174,51 @@ namespace WixToolsetTest.CoreIntegration
174 }, directoryRows.Select(r => r.FieldAsString(0) + ":" + r.FieldAsString(1) + ":" + r.FieldAsString(2)).ToArray());
175 }
176 }
177 +
178 + [Fact]
179 + public void CanGetDuplicateTargetSourceName()
180 + {
181 + var folder = TestData.Get(@"TestData");
182 +
183 + using (var fs = new DisposableFileSystem())
184 + {
185 + var baseFolder = fs.GetFolder();
186 + var intermediateFolder = Path.Combine(baseFolder, "obj");
187 + var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
188 +
189 + var result = WixRunner.Execute(new[]
190 + {
191 + "build",
192 + "-arch", "x64",
193 + Path.Combine(folder, "Directory", "DuplicateTargetSourceName.wxs"),
194 + Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
195 + "-bindpath", Path.Combine(folder, "SingleFile", "data"),
196 + "-intermediateFolder", intermediateFolder,
197 + "-o", msiPath
198 + });
199 +
200 + result.AssertSuccess();
201 +
202 + var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
203 + var section = intermediate.Sections.Single();
204 +
205 + var dirSymbols = section.Symbols.OfType<WixToolset.Data.Symbols.DirectorySymbol>().ToList();
206 + Assert.Equal(new[]
207 + {
208 + "BinFolder\tProgramFilesFolder\tbin",
209 + "ProgramFilesFolder\tTARGETDIR\tPFiles",
210 + "TARGETDIR\t\tSourceDir"
211 + }, dirSymbols.OrderBy(d => d.Id.Id).Select(d => String.Join('\t', d.Id.Id, d.ParentDirectoryRef, d.Name)).ToArray());
212 +
213 + var data = WindowsInstallerData.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
214 + var directoryRows = data.Tables["Directory"].Rows;
215 + Assert.Equal(new[]
216 + {
217 + "BinFolder\tProgramFilesFolder\tbin",
218 + "ProgramFilesFolder\tTARGETDIR\tPFiles",
219 + "TARGETDIR\t\tSourceDir"
220 + }, directoryRows.Select(r => String.Join('\t', r.FieldAsString(0), r.FieldAsString(1), r.FieldAsString(2))).ToArray());
221 + }
222 + }
223 }
224 }
src/test/WixToolsetTest.CoreIntegration/TestData/Directory/DuplicateTargetSourceName.wxs new
+11
@@ -0,0 +1,11 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <ComponentGroup Id="ProductComponents" Directory="BinFolder" />
5 + </Fragment>
6 + <Fragment>
7 + <StandardDirectory Id="ProgramFilesFolder">
8 + <Directory Id="BinFolder" Name="bin" SourceName="bin" />
9 + </StandardDirectory>
10 + </Fragment>
11 +</Wix>