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" />