Handle updating entries in a WixOutput.
Bob Arnson committed
May 21, 2020 at 18:42 UTC
e25b29f5ded38e281f3a686bc5ce7cbe1d872d3b
2 files changed
+86
-10
src/WixToolset.Data/WixOutput.cs
+13
@@ -183,6 +183,8 @@ namespace WixToolset.Data
183
/// <returns>Stream to the data of the file.</returns>
184
public Stream CreateDataStream(string name)
185
{
186
+ this.DeleteExistingEntry(name);
187
+
188
var entry = this.archive.CreateEntry(name);
189
190
return entry.Open();
@@ -195,6 +197,8 @@ namespace WixToolset.Data
197
/// <param name="path">Path to file on disk to include in the output.</param>
198
public void ImportDataStream(string name, string path)
199
{
200
+ this.DeleteExistingEntry(name);
201
+
202
this.archive.CreateEntryFromFile(path, name, System.IO.Compression.CompressionLevel.Optimal);
203
}
204
@@ -256,5 +260,14 @@ namespace WixToolset.Data
260
261
this.disposed = true;
262
}
263
+
264
+ private void DeleteExistingEntry(string name)
265
+ {
266
+ var entry = this.archive.GetEntry(name);
267
+ if (entry != null)
268
+ {
269
+ entry.Delete();
270
+ }
271
+ }
272
}
273
}
src/test/WixToolsetTest.Data/SerializeFixture.cs
+73
-10
@@ -32,20 +32,83 @@ namespace WixToolsetTest.Data
32
intermediate.UpdateLevel(IntermediateLevels.Resolved);
33
34
var path = Path.GetTempFileName();
35
- intermediate.Save(path);
35
+ try
36
+ {
37
+ intermediate.Save(path);
38
+
39
+ var loaded = Intermediate.Load(path);
40
+
41
+ Assert.True(loaded.HasLevel(IntermediateLevels.Compiled));
42
+ Assert.True(loaded.HasLevel(IntermediateLevels.Linked));
43
+ Assert.True(loaded.HasLevel(IntermediateLevels.Resolved));
44
+
45
+ var tuple = (ComponentTuple)loaded.Sections.Single().Tuples.Single();
46
+
47
+ Assert.Equal("TestComponent", tuple.Id.Id);
48
+ Assert.Equal(AccessModifier.Public, tuple.Id.Access);
49
+ Assert.Equal("TestFolder", tuple.DirectoryRef);
50
+ Assert.Equal(ComponentLocation.Either, tuple.Location);
51
+ }
52
+ finally
53
+ {
54
+ File.Delete(path);
55
+ }
56
+ }
57
+
58
+ [Fact]
59
+ public void CanUpdateIntermediate()
60
+ {
61
+ var sln = new SourceLineNumber("test.wxs", 1);
62
+ var section = new IntermediateSection("test", SectionType.Product, 65001);
63
+
64
+ section.Tuples.Add(new ComponentTuple(sln, new Identifier(AccessModifier.Public, "TestComponent"))
65
+ {
66
+ ComponentId = new Guid(1, 0, 0, new byte[8]).ToString("B"),
67
+ DirectoryRef = "TestFolder",
68
+ Location = ComponentLocation.Either,
69
+ });
70
+
71
+ var intermediate = new Intermediate("TestIntermediate", IntermediateLevels.Compiled, new[] { section }, null);
72
+
73
+ var path = Path.GetTempFileName();
74
+ try
75
+ {
76
+ intermediate.Save(path);
77
37
- var loaded = Intermediate.Load(path);
78
+ var uri = new Uri(Path.GetFullPath(path));
79
+ var stream = File.Open(path, FileMode.Open, FileAccess.ReadWrite);
80
39
- Assert.True(loaded.HasLevel(IntermediateLevels.Compiled));
40
- Assert.True(loaded.HasLevel(IntermediateLevels.Linked));
41
- Assert.True(loaded.HasLevel(IntermediateLevels.Resolved));
81
+ using (var wixout = WixOutput.Read(uri, stream))
82
+ {
83
+ var loaded = Intermediate.Load(wixout);
84
+ var tuple = (ComponentTuple)loaded.Sections.Single().Tuples.Single();
85
+
86
+ Assert.Equal("TestComponent", tuple.Id.Id);
87
+ Assert.Equal(AccessModifier.Public, tuple.Id.Access);
88
+
89
+ wixout.Reopen(writable: true);
90
+
91
+ section.Tuples.Add(new ComponentTuple(sln, new Identifier(AccessModifier.Public, "NewComponent"))
92
+ {
93
+ ComponentId = new Guid(1, 0, 0, new byte[8]).ToString("B"),
94
+ });
95
+
96
+ intermediate.Save(wixout);
97
+ loaded = Intermediate.Load(wixout);
98
+
99
+ var newTuple = loaded.Sections.Single().Tuples.Where(t => t.Id.Id == "NewComponent");
100
+ Assert.Single(newTuple);
101
+ }
102
43
- var tuple = (ComponentTuple)loaded.Sections.Single().Tuples.Single();
103
+ var loadedAfterDispose = Intermediate.Load(path);
104
+ var newTupleStillThere = loadedAfterDispose.Sections.Single().Tuples.Where(t => t.Id.Id == "NewComponent");
105
+ Assert.Single(newTupleStillThere);
106
45
- Assert.Equal("TestComponent", tuple.Id.Id);
46
- Assert.Equal(AccessModifier.Public, tuple.Id.Access);
47
- Assert.Equal("TestFolder", tuple.DirectoryRef);
48
- Assert.Equal(ComponentLocation.Either, tuple.Location);
107
+ }
108
+ finally
109
+ {
110
+ File.Delete(path);
111
+ }
112
}
113
114
[Fact]