aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/WixToolset.Core/Preprocessor.cs28
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs24
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.en-us.wxl11
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.wxs23
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/PackageComponents.wxs12
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/data/test.txt1
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj4
7 files changed, 90 insertions, 13 deletions
diff --git a/src/WixToolset.Core/Preprocessor.cs b/src/WixToolset.Core/Preprocessor.cs
index acba0b5f..9f0ab1bb 100644
--- a/src/WixToolset.Core/Preprocessor.cs
+++ b/src/WixToolset.Core/Preprocessor.cs
@@ -762,25 +762,27 @@ namespace WixToolset.Core
762 } 762 }
763 763
764 using (var fragmentStream = new MemoryStream(Encoding.UTF8.GetBytes(fragmentBuilder.ToString()))) 764 using (var fragmentStream = new MemoryStream(Encoding.UTF8.GetBytes(fragmentBuilder.ToString())))
765 using (var loopReader = XmlReader.Create(fragmentStream, FragmentXmlReaderSettings))
766 { 765 {
767 // process each iteration, updating the variable's value each time 766 // process each iteration, updating the variable's value each time
768 foreach (string varValue in varValues) 767 foreach (string varValue in varValues)
769 { 768 {
770 // Always overwrite foreach variables. 769 using (var loopReader = XmlReader.Create(fragmentStream, FragmentXmlReaderSettings))
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)
778 { 770 {
779 this.UpdateCurrentLineNumber(loopReader, offset); 771 // Always overwrite foreach variables.
780 throw new WixException(ErrorMessages.InvalidXml(this.Context.CurrentSourceLineNumber, "source", e.Message)); 772 this.Helper.AddVariable(this.Context, varName, varValue, false);
781 }
782 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 }
784 } 786 }
785 } 787 }
786 } 788 }
diff --git a/src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs b/src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs
index 1193b685..9c60c902 100644
--- a/src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs
+++ b/src/test/WixToolsetTest.CoreIntegration/PreprocessorFixture.cs
@@ -39,6 +39,30 @@ namespace WixToolsetTest.CoreIntegration
39 Assert.Single(warnings); 39 Assert.Single(warnings);
40 } 40 }
41 } 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 }
42 } 66 }
43} 67}
44 68
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.en-us.wxl b/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This 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>
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.wxs
new file mode 100644
index 00000000..4bc7e2a4
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/Package.wxs
@@ -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>
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/PackageComponents.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/PackageComponents.wxs
new file mode 100644
index 00000000..2a75e3d7
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/PackageComponents.wxs
@@ -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>
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/data/test.txt b/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/data/test.txt
new file mode 100644
index 00000000..cd0db0e1
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ForEach/data/test.txt
@@ -0,0 +1 @@
This is test.txt. \ No newline at end of file
diff --git a/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj b/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
index f52d368b..7c4578d9 100644
--- a/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
+++ b/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
@@ -24,6 +24,10 @@
24 <Content Include="TestData\ExampleExtension\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" /> 24 <Content Include="TestData\ExampleExtension\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
25 <Content Include="TestData\ExampleExtension\Package.wxs" CopyToOutputDirectory="PreserveNewest" /> 25 <Content Include="TestData\ExampleExtension\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
26 <Content Include="TestData\ExampleExtension\PackageComponents.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" />
27 <Content Include="TestData\SingleFile\data\test.txt" CopyToOutputDirectory="PreserveNewest" /> 31 <Content Include="TestData\SingleFile\data\test.txt" CopyToOutputDirectory="PreserveNewest" />
28 <Content Include="TestData\SingleFile\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" /> 32 <Content Include="TestData\SingleFile\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
29 <Content Include="TestData\SingleFile\Package.wxs" CopyToOutputDirectory="PreserveNewest" /> 33 <Content Include="TestData\SingleFile\Package.wxs" CopyToOutputDirectory="PreserveNewest" />