@joebigelow / wix-1 / commits / e25b29f5

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]