diff options
| author | Rob Mensching <rob@firegiant.com> | 2021-03-25 22:03:40 -0700 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2021-03-25 22:08:36 -0700 |
| commit | f4242573301899109186cdff6694a289ee27d794 (patch) | |
| tree | 826cf3f244efad344d9bd0202f38fd826ed8701a /src | |
| parent | 3dc92067f57e3803d4e1bac6d055e2a23f797414 (diff) | |
| download | wix-f4242573301899109186cdff6694a289ee27d794.tar.gz wix-f4242573301899109186cdff6694a289ee27d794.tar.bz2 wix-f4242573301899109186cdff6694a289ee27d794.zip | |
Re-resolve binary .wixlibs with defaulted embedded files
Fixes wixtoolset/issues#6376
Diffstat (limited to 'src')
| -rw-r--r-- | src/WixToolset.Core/Bind/ResolveFieldsCommand.cs | 165 | ||||
| -rw-r--r-- | src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs | 2 |
2 files changed, 92 insertions, 75 deletions
diff --git a/src/WixToolset.Core/Bind/ResolveFieldsCommand.cs b/src/WixToolset.Core/Bind/ResolveFieldsCommand.cs index 629e5f28..2738ac6c 100644 --- a/src/WixToolset.Core/Bind/ResolveFieldsCommand.cs +++ b/src/WixToolset.Core/Bind/ResolveFieldsCommand.cs | |||
| @@ -82,8 +82,6 @@ namespace WixToolset.Core.Bind | |||
| 82 | } | 82 | } |
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | var isDefault = true; | ||
| 86 | |||
| 87 | // Check to make sure we're in a scenario where we can handle variable resolution. | 85 | // Check to make sure we're in a scenario where we can handle variable resolution. |
| 88 | if (null != delayedFields) | 86 | if (null != delayedFields) |
| 89 | { | 87 | { |
| @@ -103,8 +101,6 @@ namespace WixToolset.Core.Bind | |||
| 103 | { | 101 | { |
| 104 | delayedFields.Add(new DelayedField(symbol, field)); | 102 | delayedFields.Add(new DelayedField(symbol, field)); |
| 105 | } | 103 | } |
| 106 | |||
| 107 | isDefault = resolution.IsDefault; | ||
| 108 | } | 104 | } |
| 109 | } | 105 | } |
| 110 | } | 106 | } |
| @@ -118,76 +114,7 @@ namespace WixToolset.Core.Bind | |||
| 118 | // Resolve file paths | 114 | // Resolve file paths |
| 119 | if (fieldType == IntermediateFieldType.Path) | 115 | if (fieldType == IntermediateFieldType.Path) |
| 120 | { | 116 | { |
| 121 | var objectField = field.AsPath(); | 117 | this.ResolvePathField(fileResolver, symbol, field); |
| 122 | |||
| 123 | #if TODO_PATCHING | ||
| 124 | // Skip file resolution if the file is to be deleted. | ||
| 125 | if (RowOperation.Delete == symbol.Operation) | ||
| 126 | { | ||
| 127 | continue; | ||
| 128 | } | ||
| 129 | #endif | ||
| 130 | |||
| 131 | // File is embedded and path to it was not modified above. | ||
| 132 | if (isDefault && objectField.Embed) | ||
| 133 | { | ||
| 134 | var extractPath = this.FilesWithEmbeddedFiles.AddEmbeddedFileToExtract(objectField.BaseUri, objectField.Path, this.IntermediateFolder); | ||
| 135 | |||
| 136 | // Set the path to the embedded file once where it will be extracted. | ||
| 137 | field.Set(extractPath); | ||
| 138 | } | ||
| 139 | else if (null != objectField.Path) // non-compressed file (or localized value) | ||
| 140 | { | ||
| 141 | try | ||
| 142 | { | ||
| 143 | if (!this.BuildingPatch) // Normal binding for non-Patch scenario such as link (light.exe) | ||
| 144 | { | ||
| 145 | #if TODO_PATCHING | ||
| 146 | // keep a copy of the un-resolved data for future replay. This will be saved into wixpdb file | ||
| 147 | if (null == objectField.UnresolvedData) | ||
| 148 | { | ||
| 149 | objectField.UnresolvedData = (string)objectField.Data; | ||
| 150 | } | ||
| 151 | #endif | ||
| 152 | |||
| 153 | // resolve the path to the file | ||
| 154 | var value = fileResolver.ResolveFile(objectField.Path, symbol.Definition, symbol.SourceLineNumbers, BindStage.Normal); | ||
| 155 | field.Set(value); | ||
| 156 | } | ||
| 157 | else if (!fileResolver.RebaseTarget && !fileResolver.RebaseUpdated) // Normal binding for Patch Scenario (normal patch, no re-basing logic) | ||
| 158 | { | ||
| 159 | // resolve the path to the file | ||
| 160 | var value = fileResolver.ResolveFile(objectField.Path, symbol.Definition, symbol.SourceLineNumbers, BindStage.Normal); | ||
| 161 | field.Set(value); | ||
| 162 | } | ||
| 163 | #if TODO_PATCHING | ||
| 164 | else // Re-base binding path scenario caused by pyro.exe -bt -bu | ||
| 165 | { | ||
| 166 | // by default, use the resolved Data for file lookup | ||
| 167 | string filePathToResolve = (string)objectField.Data; | ||
| 168 | |||
| 169 | // if -bu is used in pyro command, this condition holds true and the tool | ||
| 170 | // will use pre-resolved source for new wixpdb file | ||
| 171 | if (fileResolver.RebaseUpdated) | ||
| 172 | { | ||
| 173 | // try to use the unResolved Source if it exists. | ||
| 174 | // New version of wixpdb file keeps a copy of pre-resolved Source. i.e. !(bindpath.test)\foo.dll | ||
| 175 | // Old version of winpdb file does not contain this attribute and the value is null. | ||
| 176 | if (null != objectField.UnresolvedData) | ||
| 177 | { | ||
| 178 | filePathToResolve = objectField.UnresolvedData; | ||
| 179 | } | ||
| 180 | } | ||
| 181 | |||
| 182 | objectField.Data = fileResolver.ResolveFile(filePathToResolve, symbol.Definition.Name, symbol.SourceLineNumbers, BindStage.Updated); | ||
| 183 | } | ||
| 184 | #endif | ||
| 185 | } | ||
| 186 | catch (WixException e) | ||
| 187 | { | ||
| 188 | this.Messaging.Write(e.Error); | ||
| 189 | } | ||
| 190 | } | ||
| 191 | 118 | ||
| 192 | #if TODO_PATCHING | 119 | #if TODO_PATCHING |
| 193 | if (null != objectField.PreviousData) | 120 | if (null != objectField.PreviousData) |
| @@ -255,5 +182,95 @@ namespace WixToolset.Core.Bind | |||
| 255 | 182 | ||
| 256 | this.DelayedFields = delayedFields; | 183 | this.DelayedFields = delayedFields; |
| 257 | } | 184 | } |
| 185 | |||
| 186 | private void ResolvePathField(FileResolver fileResolver, IntermediateSymbol symbol, IntermediateField field) | ||
| 187 | { | ||
| 188 | var fieldValue = field.AsPath(); | ||
| 189 | var originalFieldPath = fieldValue.Path; | ||
| 190 | |||
| 191 | #if TODO_PATCHING | ||
| 192 | // Skip file resolution if the file is to be deleted. | ||
| 193 | if (RowOperation.Delete == symbol.Operation) | ||
| 194 | { | ||
| 195 | continue; | ||
| 196 | } | ||
| 197 | #endif | ||
| 198 | |||
| 199 | // If the file is embedded and if the previous value has a bind variable in the path | ||
| 200 | // which gets modified by resolving the previous value again then switch to that newly | ||
| 201 | // resolved path instead of using the embedded file. | ||
| 202 | if (fieldValue.Embed && field.PreviousValue != null) | ||
| 203 | { | ||
| 204 | var resolution = this.VariableResolver.ResolveVariables(symbol.SourceLineNumbers, field.PreviousValue.AsString(), errorOnUnknown: false); | ||
| 205 | |||
| 206 | if (resolution.UpdatedValue && !resolution.IsDefault) | ||
| 207 | { | ||
| 208 | fieldValue = new IntermediateFieldPathValue { Path = resolution.Value }; | ||
| 209 | } | ||
| 210 | } | ||
| 211 | |||
| 212 | // If we're still using the embedded file. | ||
| 213 | if (fieldValue.Embed) | ||
| 214 | { | ||
| 215 | // Set the path to the embedded file once where it will be extracted. | ||
| 216 | var extractPath = this.FilesWithEmbeddedFiles.AddEmbeddedFileToExtract(fieldValue.BaseUri, fieldValue.Path, this.IntermediateFolder); | ||
| 217 | |||
| 218 | field.Set(extractPath); | ||
| 219 | } | ||
| 220 | else if (fieldValue.Path != null) | ||
| 221 | { | ||
| 222 | try | ||
| 223 | { | ||
| 224 | var resolvedPath = fieldValue.Path; | ||
| 225 | |||
| 226 | if (!this.BuildingPatch) // Normal binding for non-Patch scenario such as link (light.exe) | ||
| 227 | { | ||
| 228 | #if TODO_PATCHING | ||
| 229 | // keep a copy of the un-resolved data for future replay. This will be saved into wixpdb file | ||
| 230 | if (null == objectField.UnresolvedData) | ||
| 231 | { | ||
| 232 | objectField.UnresolvedData = (string)objectField.Data; | ||
| 233 | } | ||
| 234 | #endif | ||
| 235 | resolvedPath = fileResolver.ResolveFile(fieldValue.Path, symbol.Definition, symbol.SourceLineNumbers, BindStage.Normal); | ||
| 236 | } | ||
| 237 | else if (!fileResolver.RebaseTarget && !fileResolver.RebaseUpdated) // Normal binding for Patch Scenario (normal patch, no re-basing logic) | ||
| 238 | { | ||
| 239 | resolvedPath = fileResolver.ResolveFile(fieldValue.Path, symbol.Definition, symbol.SourceLineNumbers, BindStage.Normal); | ||
| 240 | } | ||
| 241 | #if TODO_PATCHING | ||
| 242 | else // Re-base binding path scenario caused by pyro.exe -bt -bu | ||
| 243 | { | ||
| 244 | // by default, use the resolved Data for file lookup | ||
| 245 | string filePathToResolve = (string)objectField.Data; | ||
| 246 | |||
| 247 | // if -bu is used in pyro command, this condition holds true and the tool | ||
| 248 | // will use pre-resolved source for new wixpdb file | ||
| 249 | if (fileResolver.RebaseUpdated) | ||
| 250 | { | ||
| 251 | // try to use the unResolved Source if it exists. | ||
| 252 | // New version of wixpdb file keeps a copy of pre-resolved Source. i.e. !(bindpath.test)\foo.dll | ||
| 253 | // Old version of winpdb file does not contain this attribute and the value is null. | ||
| 254 | if (null != objectField.UnresolvedData) | ||
| 255 | { | ||
| 256 | filePathToResolve = objectField.UnresolvedData; | ||
| 257 | } | ||
| 258 | } | ||
| 259 | |||
| 260 | objectField.Data = fileResolver.ResolveFile(filePathToResolve, symbol.Definition.Name, symbol.SourceLineNumbers, BindStage.Updated); | ||
| 261 | } | ||
| 262 | #endif | ||
| 263 | |||
| 264 | if (!String.Equals(originalFieldPath, resolvedPath, StringComparison.OrdinalIgnoreCase)) | ||
| 265 | { | ||
| 266 | field.Set(resolvedPath); | ||
| 267 | } | ||
| 268 | } | ||
| 269 | catch (WixException e) | ||
| 270 | { | ||
| 271 | this.Messaging.Write(e.Error); | ||
| 272 | } | ||
| 273 | } | ||
| 274 | } | ||
| 258 | } | 275 | } |
| 259 | } | 276 | } |
diff --git a/src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs b/src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs index 52460843..d7296cfe 100644 --- a/src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs | |||
| @@ -144,7 +144,7 @@ namespace WixToolsetTest.CoreIntegration | |||
| 144 | } | 144 | } |
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6376")] | 147 | [Fact] |
| 148 | public void CanOverridePathWixVariable() | 148 | public void CanOverridePathWixVariable() |
| 149 | { | 149 | { |
| 150 | var folder = TestData.Get(@"TestData\WixVariableOverride"); | 150 | var folder = TestData.Get(@"TestData\WixVariableOverride"); |
