@joebigelow / wix-1 / commits / cd170999

Fix ?foreach? so all loop values get "executed."

Bob Arnson committed Sep 18, 2018 at 17:52 UTC cd1709996876ac1d6ff5750cd573b9be78313a9e
7 files changed +90 -13
src/WixToolset.Core/Preprocessor.cs
+15 -13
@@ -762,25 +762,27 @@ namespace WixToolset.Core
762 }
763
764 using (var fragmentStream = new MemoryStream(Encoding.UTF8.GetBytes(fragmentBuilder.ToString())))
765 - using (var loopReader = XmlReader.Create(fragmentStream, FragmentXmlReaderSettings))
765 {
766 // process each iteration, updating the variable's value each time
767 foreach (string varValue in varValues)
768 {
770 - // Always overwrite foreach variables.
771 - this.Helper.AddVariable(this.Context, varName, varValue, false);
772 -
773 - try
774 - {
775 - this.PreprocessReader(false, loopReader, container, offset);
776 - }
777 - catch (XmlException e)
769 + using (var loopReader = XmlReader.Create(fragmentStream, FragmentXmlReaderSettings))
770 {
779 - this.UpdateCurrentLineNumber(loopReader, offset);
780 - throw new WixException(ErrorMessages.InvalidXml(this.Context.CurrentSourceLineNumber, "source", e.Message));
781 - }
771 + // Always overwrite foreach variables.
772 + this.Helper.AddVariable(this.Context, varName, varValue, false);
773
783 - fragmentStream.Position = 0; // seek back to the beginning for the next loop.
774 + try
775 + {
776 + this.PreprocessReader(false, loopReader, container, offset);
777 + }
778 + catch (XmlException e)
779 + {
780 + this.UpdateCurrentLineNumber(loopReader, offset);
781 + throw new WixException(ErrorMessages.InvalidXml(this.Context.CurrentSourceLineNumber, "source", e.Message));
782 + }
783 +
784 + fragmentStream.Position = 0; // seek back to the beginning for the next loop.
785 + }
786 }
787 }
788 }
src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs
+24
@@ -39,6 +39,30 @@ namespace WixToolsetTest.CoreIntegration
39 Assert.Single(warnings);
40 }
41 }
42 +
43 + [Fact]
44 + public void ForEachLoopsWork()
45 + {
46 + var folder = TestData.Get(@"TestData\ForEach");
47 +
48 + using (var fs = new DisposableFileSystem())
49 + {
50 + var baseFolder = fs.GetFolder();
51 + var intermediateFolder = Path.Combine(baseFolder, "obj");
52 +
53 + var result = WixRunner.Execute(new[]
54 + {
55 + "build",
56 + Path.Combine(folder, "Package.wxs"),
57 + Path.Combine(folder, "PackageComponents.wxs"),
58 + "-loc", Path.Combine(folder, "Package.en-us.wxl"),
59 + "-bindpath", Path.Combine(folder, "data"),
60 + "-intermediateFolder", intermediateFolder,
61 + "-o", Path.Combine(baseFolder, @"bin\test.msi")
62 + }, out var messages);
63 + Assert.Equal(0, result);
64 + }
65 + }
66 }
67 }
68
src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.en-us.wxl new
+11
@@ -0,0 +1,11 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +
3 +<!--
4 +This file contains the declaration of all the localizable strings.
5 +-->
6 +<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7 +
8 + <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 + <String Id="FeatureTitle">MsiPackage</String>
10 +
11 +</WixLocalization>
src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.wxs new
+23
@@ -0,0 +1,23 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Product Id="*" Name="MsiPackage" Language="1033" Version="1.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 + <Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" />
5 +
6 + <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
7 + <MediaTemplate />
8 +
9 + <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
10 + <ComponentGroupRef Id="ProductComponents.x86" />
11 + <ComponentGroupRef Id="ProductComponents.x64" />
12 + <ComponentGroupRef Id="ProductComponents.arm" />
13 + </Feature>
14 + </Product>
15 +
16 + <Fragment>
17 + <Directory Id="TARGETDIR" Name="SourceDir">
18 + <Directory Id="ProgramFilesFolder">
19 + <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
20 + </Directory>
21 + </Directory>
22 + </Fragment>
23 +</Wix>
src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/PackageComponents.wxs new
+12
@@ -0,0 +1,12 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <?foreach ComponentPlatform in x86;x64;arm ?>
4 + <Fragment>
5 + <ComponentGroup Id="ProductComponents.$(var.ComponentPlatform)" Directory="INSTALLFOLDER">
6 + <Component>
7 + <File Name="$(var.ComponentPlatform).dll" Source="test.txt" />
8 + </Component>
9 + </ComponentGroup>
10 + </Fragment>
11 + <?endforeach?>
12 +</Wix>
src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/data/test.txt new
+1
@@ -0,0 +1 @@
1 +This is test.txt.
\ No newline at end of file
src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
+4
@@ -24,6 +24,10 @@
24 <Content Include="TestData\ExampleExtension\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
25 <Content Include="TestData\ExampleExtension\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
26 <Content Include="TestData\ExampleExtension\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
27 + <Content Include="TestData\ForEach\data\test.txt" CopyToOutputDirectory="PreserveNewest" />
28 + <Content Include="TestData\ForEach\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
29 + <Content Include="TestData\ForEach\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
30 + <Content Include="TestData\ForEach\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
31 <Content Include="TestData\SingleFile\data\test.txt" CopyToOutputDirectory="PreserveNewest" />
32 <Content Include="TestData\SingleFile\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
33 <Content Include="TestData\SingleFile\Package.wxs" CopyToOutputDirectory="PreserveNewest" />