diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs | 451 | ||||
| -rw-r--r-- | src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs | 44 |
2 files changed, 219 insertions, 276 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs index 2ced48ea..5d1e89ac 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs | |||
| @@ -22,7 +22,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 22 | // As outlined in RFC 4122, this is our namespace for generating name-based (version 3) UUIDs. | 22 | // As outlined in RFC 4122, this is our namespace for generating name-based (version 3) UUIDs. |
| 23 | internal static readonly Guid WixComponentGuidNamespace = new Guid("{3064E5C6-FB63-4FE9-AC49-E446A792EFA5}"); | 23 | internal static readonly Guid WixComponentGuidNamespace = new Guid("{3064E5C6-FB63-4FE9-AC49-E446A792EFA5}"); |
| 24 | 24 | ||
| 25 | public BindDatabaseCommand(IBindContext context, IEnumerable<IWindowsInstallerBackendBinderExtension> backendExtension, Validator validator):this(context, backendExtension, null, validator) | 25 | public BindDatabaseCommand(IBindContext context, IEnumerable<IWindowsInstallerBackendBinderExtension> backendExtension, Validator validator) : this(context, backendExtension, null, validator) |
| 26 | { | 26 | { |
| 27 | } | 27 | } |
| 28 | 28 | ||
| @@ -225,167 +225,155 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 225 | } | 225 | } |
| 226 | 226 | ||
| 227 | WindowsInstallerData output; | 227 | WindowsInstallerData output; |
| 228 | if (this.PdbType == PdbType.Partial) | 228 | this.Intermediate.UpdateLevel(Data.WindowsInstaller.IntermediateLevels.FullyBound); |
| 229 | this.Messaging.Write(VerboseMessages.UpdatingFileInformation()); | ||
| 230 | |||
| 231 | // Extract files that come from binary .wixlibs and WixExtensions (this does not extract files from merge modules). | ||
| 229 | { | 232 | { |
| 230 | // Time to create the output object, since we're bypassing everything that touches files. | 233 | var command = new ExtractEmbeddedFilesCommand(this.ExpectedEmbeddedFiles); |
| 231 | this.Intermediate.UpdateLevel(Data.WindowsInstaller.IntermediateLevels.PartiallyBound); | 234 | command.Execute(); |
| 235 | } | ||
| 232 | 236 | ||
| 233 | var command = new CreateOutputFromIRCommand(this.Messaging, section, tableDefinitions, this.BackendExtensions); | 237 | // This must occur after all variables and source paths have been resolved. |
| 238 | List<FileFacade> fileFacades; | ||
| 239 | { | ||
| 240 | var command = new GetFileFacadesCommand(section); | ||
| 234 | command.Execute(); | 241 | command.Execute(); |
| 235 | 242 | ||
| 236 | output = command.Output; | 243 | fileFacades = command.FileFacades; |
| 237 | } | 244 | } |
| 238 | else | 245 | |
| 246 | // Retrieve file information from merge modules. | ||
| 247 | if (SectionType.Product == section.Type) | ||
| 239 | { | 248 | { |
| 240 | this.Intermediate.UpdateLevel(Data.WindowsInstaller.IntermediateLevels.FullyBound); | 249 | var wixMergeTuples = section.Tuples.OfType<WixMergeTuple>().ToList(); |
| 241 | this.Messaging.Write(VerboseMessages.UpdatingFileInformation()); | ||
| 242 | 250 | ||
| 243 | // Extract files that come from binary .wixlibs and WixExtensions (this does not extract files from merge modules). | 251 | if (wixMergeTuples.Any()) |
| 244 | { | 252 | { |
| 245 | var command = new ExtractEmbeddedFilesCommand(this.ExpectedEmbeddedFiles); | 253 | containsMergeModules = true; |
| 246 | command.Execute(); | ||
| 247 | } | ||
| 248 | 254 | ||
| 249 | // This must occur after all variables and source paths have been resolved. | 255 | var command = new ExtractMergeModuleFilesCommand(this.Messaging, section, wixMergeTuples); |
| 250 | List<FileFacade> fileFacades; | 256 | command.FileFacades = fileFacades; |
| 251 | { | 257 | command.OutputInstallerVersion = installerVersion; |
| 252 | var command = new GetFileFacadesCommand(section); | 258 | command.SuppressLayout = this.SuppressLayout; |
| 259 | command.IntermediateFolder = this.IntermediateFolder; | ||
| 253 | command.Execute(); | 260 | command.Execute(); |
| 254 | 261 | ||
| 255 | fileFacades = command.FileFacades; | 262 | fileFacades.AddRange(command.MergeModulesFileFacades); |
| 256 | } | 263 | } |
| 264 | } | ||
| 265 | else if (SectionType.Patch == section.Type) | ||
| 266 | { | ||
| 267 | // Merge transform data into the output object. | ||
| 268 | //IEnumerable<FileFacade> filesFromTransform = this.CopyFromTransformData(this.Output); | ||
| 269 | |||
| 270 | //var command = new CopyTransformDataCommand(this.Messaging, /*output*/this.SubStorages, tableDefinitions, copyOutFileRows: true); | ||
| 271 | //command.Output = output; | ||
| 272 | //command.TableDefinitions = this.TableDefinitions; | ||
| 273 | //command.CopyOutFileRows = true; | ||
| 274 | var command = new GetFileFacadesFromTransforms(this.Messaging, this.SubStorages, tableDefinitions); | ||
| 275 | command.Execute(); | ||
| 276 | var filesFromTransforms = command.FileFacades; | ||
| 257 | 277 | ||
| 258 | // Retrieve file information from merge modules. | 278 | fileFacades.AddRange(filesFromTransforms); |
| 259 | if (SectionType.Product == section.Type) | 279 | } |
| 260 | { | ||
| 261 | var wixMergeTuples = section.Tuples.OfType<WixMergeTuple>().ToList(); | ||
| 262 | |||
| 263 | if (wixMergeTuples.Any()) | ||
| 264 | { | ||
| 265 | containsMergeModules = true; | ||
| 266 | |||
| 267 | var command = new ExtractMergeModuleFilesCommand(this.Messaging, section, wixMergeTuples); | ||
| 268 | command.FileFacades = fileFacades; | ||
| 269 | command.OutputInstallerVersion = installerVersion; | ||
| 270 | command.SuppressLayout = this.SuppressLayout; | ||
| 271 | command.IntermediateFolder = this.IntermediateFolder; | ||
| 272 | command.Execute(); | ||
| 273 | |||
| 274 | fileFacades.AddRange(command.MergeModulesFileFacades); | ||
| 275 | } | ||
| 276 | } | ||
| 277 | else if (SectionType.Patch == section.Type) | ||
| 278 | { | ||
| 279 | // Merge transform data into the output object. | ||
| 280 | //IEnumerable<FileFacade> filesFromTransform = this.CopyFromTransformData(this.Output); | ||
| 281 | |||
| 282 | //var command = new CopyTransformDataCommand(this.Messaging, /*output*/this.SubStorages, tableDefinitions, copyOutFileRows: true); | ||
| 283 | //command.Output = output; | ||
| 284 | //command.TableDefinitions = this.TableDefinitions; | ||
| 285 | //command.CopyOutFileRows = true; | ||
| 286 | var command = new GetFileFacadesFromTransforms(this.Messaging, this.SubStorages, tableDefinitions); | ||
| 287 | command.Execute(); | ||
| 288 | var filesFromTransforms = command.FileFacades; | ||
| 289 | |||
| 290 | fileFacades.AddRange(filesFromTransforms); | ||
| 291 | } | ||
| 292 | 280 | ||
| 293 | // stop processing if an error previously occurred | 281 | // stop processing if an error previously occurred |
| 294 | if (this.Messaging.EncounteredError) | 282 | if (this.Messaging.EncounteredError) |
| 295 | { | 283 | { |
| 296 | return null; | 284 | return null; |
| 297 | } | 285 | } |
| 298 | 286 | ||
| 299 | // Gather information about files that do not come from merge modules. | 287 | // Gather information about files that do not come from merge modules. |
| 300 | { | 288 | { |
| 301 | var command = new UpdateFileFacadesCommand(this.Messaging, section); | 289 | var command = new UpdateFileFacadesCommand(this.Messaging, section); |
| 302 | command.FileFacades = fileFacades; | 290 | command.FileFacades = fileFacades; |
| 303 | command.UpdateFileFacades = fileFacades.Where(f => !f.FromModule); | 291 | command.UpdateFileFacades = fileFacades.Where(f => !f.FromModule); |
| 304 | command.OverwriteHash = true; | 292 | command.OverwriteHash = true; |
| 305 | command.TableDefinitions = tableDefinitions; | 293 | command.TableDefinitions = tableDefinitions; |
| 306 | command.VariableCache = variableCache; | 294 | command.VariableCache = variableCache; |
| 307 | command.Execute(); | 295 | command.Execute(); |
| 308 | } | 296 | } |
| 309 | 297 | ||
| 310 | // Assign files to media. | 298 | // Assign files to media. |
| 311 | Dictionary<int, MediaTuple> assignedMediaRows; | 299 | Dictionary<int, MediaTuple> assignedMediaRows; |
| 312 | Dictionary<MediaTuple, IEnumerable<FileFacade>> filesByCabinetMedia; | 300 | Dictionary<MediaTuple, IEnumerable<FileFacade>> filesByCabinetMedia; |
| 313 | IEnumerable<FileFacade> uncompressedFiles; | 301 | IEnumerable<FileFacade> uncompressedFiles; |
| 314 | { | 302 | { |
| 315 | var command = new AssignMediaCommand(section, this.Messaging); | 303 | var command = new AssignMediaCommand(section, this.Messaging); |
| 316 | command.FileFacades = fileFacades; | 304 | command.FileFacades = fileFacades; |
| 317 | command.FilesCompressed = compressed; | 305 | command.FilesCompressed = compressed; |
| 318 | command.Execute(); | 306 | command.Execute(); |
| 319 | 307 | ||
| 320 | assignedMediaRows = command.MediaRows; | 308 | assignedMediaRows = command.MediaRows; |
| 321 | filesByCabinetMedia = command.FileFacadesByCabinetMedia; | 309 | filesByCabinetMedia = command.FileFacadesByCabinetMedia; |
| 322 | uncompressedFiles = command.UncompressedFileFacades; | 310 | uncompressedFiles = command.UncompressedFileFacades; |
| 323 | } | 311 | } |
| 324 | 312 | ||
| 325 | // stop processing if an error previously occurred | 313 | // stop processing if an error previously occurred |
| 326 | if (this.Messaging.EncounteredError) | 314 | if (this.Messaging.EncounteredError) |
| 327 | { | 315 | { |
| 328 | return null; | 316 | return null; |
| 329 | } | 317 | } |
| 330 | 318 | ||
| 331 | // Now that the variable cache is populated, resolve any delayed fields. | 319 | // Now that the variable cache is populated, resolve any delayed fields. |
| 332 | if (this.DelayedFields.Any()) | 320 | if (this.DelayedFields.Any()) |
| 333 | { | 321 | { |
| 334 | var command = new ResolveDelayedFieldsCommand(this.Messaging, this.DelayedFields, variableCache); | 322 | var command = new ResolveDelayedFieldsCommand(this.Messaging, this.DelayedFields, variableCache); |
| 335 | command.Execute(); | 323 | command.Execute(); |
| 336 | } | 324 | } |
| 337 | 325 | ||
| 338 | // Set generated component guids. | 326 | // Set generated component guids. |
| 339 | { | 327 | { |
| 340 | var command = new CalculateComponentGuids(this.Messaging, this.BackendHelper, this.PathResolver, section); | 328 | var command = new CalculateComponentGuids(this.Messaging, this.BackendHelper, this.PathResolver, section); |
| 341 | command.Execute(); | 329 | command.Execute(); |
| 342 | } | 330 | } |
| 343 | 331 | ||
| 344 | // Add missing CreateFolder tuples to null-keypath components. | 332 | // Add missing CreateFolder tuples to null-keypath components. |
| 345 | { | 333 | { |
| 346 | var command = new AddCreateFoldersCommand(section); | 334 | var command = new AddCreateFoldersCommand(section); |
| 347 | command.Execute(); | 335 | command.Execute(); |
| 348 | } | 336 | } |
| 349 | 337 | ||
| 350 | // stop processing if an error previously occurred | 338 | // stop processing if an error previously occurred |
| 351 | if (this.Messaging.EncounteredError) | 339 | if (this.Messaging.EncounteredError) |
| 352 | { | 340 | { |
| 353 | return null; | 341 | return null; |
| 354 | } | 342 | } |
| 355 | 343 | ||
| 356 | // Time to create the output object. Try to put as much above here as possible, updating the IR is better. | 344 | // Time to create the output object. Try to put as much above here as possible, updating the IR is better. |
| 357 | { | 345 | { |
| 358 | var command = new CreateOutputFromIRCommand(this.Messaging, section, tableDefinitions, this.BackendExtensions); | 346 | var command = new CreateOutputFromIRCommand(this.Messaging, section, tableDefinitions, this.BackendExtensions); |
| 359 | command.Execute(); | 347 | command.Execute(); |
| 360 | 348 | ||
| 361 | output = command.Output; | 349 | output = command.Output; |
| 362 | } | 350 | } |
| 363 | 351 | ||
| 364 | // Update file sequence. | 352 | // Update file sequence. |
| 365 | { | 353 | { |
| 366 | var command = new UpdateMediaSequencesCommand(output, fileFacades); | 354 | var command = new UpdateMediaSequencesCommand(output, fileFacades); |
| 367 | command.Execute(); | 355 | command.Execute(); |
| 368 | } | 356 | } |
| 369 | 357 | ||
| 370 | // Modularize identifiers. | 358 | // Modularize identifiers. |
| 371 | if (OutputType.Module == output.Type) | 359 | if (OutputType.Module == output.Type) |
| 372 | { | 360 | { |
| 373 | var command = new ModularizeCommand(output, modularizationGuid, section.Tuples.OfType<WixSuppressModularizationTuple>()); | 361 | var command = new ModularizeCommand(output, modularizationGuid, section.Tuples.OfType<WixSuppressModularizationTuple>()); |
| 374 | command.Execute(); | 362 | command.Execute(); |
| 375 | } | 363 | } |
| 376 | else if (output.Type == OutputType.Patch) | 364 | else if (output.Type == OutputType.Patch) |
| 365 | { | ||
| 366 | foreach (var storage in this.SubStorages) | ||
| 377 | { | 367 | { |
| 378 | foreach (var storage in this.SubStorages) | 368 | output.SubStorages.Add(storage); |
| 379 | { | ||
| 380 | output.SubStorages.Add(storage); | ||
| 381 | } | ||
| 382 | } | 369 | } |
| 383 | else // we can create instance transforms since Component Guids are set. | 370 | } |
| 384 | { | 371 | else // we can create instance transforms since Component Guids are set. |
| 372 | { | ||
| 385 | #if TODO_FIX_INSTANCE_TRANSFORM | 373 | #if TODO_FIX_INSTANCE_TRANSFORM |
| 386 | this.CreateInstanceTransforms(this.Output); | 374 | this.CreateInstanceTransforms(this.Output); |
| 387 | #endif | 375 | #endif |
| 388 | } | 376 | } |
| 389 | 377 | ||
| 390 | #if TODO_FINISH_UPDATE | 378 | #if TODO_FINISH_UPDATE |
| 391 | // Extended binder extensions can be called now that fields are resolved. | 379 | // Extended binder extensions can be called now that fields are resolved. |
| @@ -423,48 +411,48 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 423 | } | 411 | } |
| 424 | #endif | 412 | #endif |
| 425 | 413 | ||
| 426 | this.ValidateComponentGuids(output); | 414 | this.ValidateComponentGuids(output); |
| 427 | 415 | ||
| 428 | // Stop processing if an error previously occurred. | 416 | // Stop processing if an error previously occurred. |
| 429 | if (this.Messaging.EncounteredError) | 417 | if (this.Messaging.EncounteredError) |
| 430 | { | 418 | { |
| 431 | return null; | 419 | return null; |
| 432 | } | 420 | } |
| 433 | 421 | ||
| 434 | // Ensure the intermediate folder is created since delta patches will be | 422 | // Ensure the intermediate folder is created since delta patches will be |
| 435 | // created there. | 423 | // created there. |
| 436 | Directory.CreateDirectory(this.IntermediateFolder); | 424 | Directory.CreateDirectory(this.IntermediateFolder); |
| 437 | 425 | ||
| 438 | if (SectionType.Patch == section.Type && this.DeltaBinaryPatch) | 426 | if (SectionType.Patch == section.Type && this.DeltaBinaryPatch) |
| 439 | { | 427 | { |
| 440 | var command = new CreateDeltaPatchesCommand(fileFacades, this.IntermediateFolder, section.Tuples.OfType<WixPatchIdTuple>().FirstOrDefault()); | 428 | var command = new CreateDeltaPatchesCommand(fileFacades, this.IntermediateFolder, section.Tuples.OfType<WixPatchIdTuple>().FirstOrDefault()); |
| 441 | command.Execute(); | 429 | command.Execute(); |
| 442 | } | 430 | } |
| 443 | 431 | ||
| 444 | // create cabinet files and process uncompressed files | 432 | // create cabinet files and process uncompressed files |
| 445 | var layoutDirectory = Path.GetDirectoryName(this.OutputPath); | 433 | var layoutDirectory = Path.GetDirectoryName(this.OutputPath); |
| 446 | if (!this.SuppressLayout || OutputType.Module == output.Type) | 434 | if (!this.SuppressLayout || OutputType.Module == output.Type) |
| 447 | { | 435 | { |
| 448 | this.Messaging.Write(VerboseMessages.CreatingCabinetFiles()); | 436 | this.Messaging.Write(VerboseMessages.CreatingCabinetFiles()); |
| 449 | 437 | ||
| 450 | var command = new CreateCabinetsCommand(this.ServiceProvider, this.BackendHelper); | 438 | var command = new CreateCabinetsCommand(this.ServiceProvider, this.BackendHelper); |
| 451 | command.CabbingThreadCount = this.CabbingThreadCount; | 439 | command.CabbingThreadCount = this.CabbingThreadCount; |
| 452 | command.CabCachePath = this.CabCachePath; | 440 | command.CabCachePath = this.CabCachePath; |
| 453 | command.DefaultCompressionLevel = this.DefaultCompressionLevel; | 441 | command.DefaultCompressionLevel = this.DefaultCompressionLevel; |
| 454 | command.Output = output; | 442 | command.Output = output; |
| 455 | command.Messaging = this.Messaging; | 443 | command.Messaging = this.Messaging; |
| 456 | command.BackendExtensions = this.BackendExtensions; | 444 | command.BackendExtensions = this.BackendExtensions; |
| 457 | command.LayoutDirectory = layoutDirectory; | 445 | command.LayoutDirectory = layoutDirectory; |
| 458 | command.Compressed = compressed; | 446 | command.Compressed = compressed; |
| 459 | command.FileRowsByCabinet = filesByCabinetMedia; | 447 | command.FileRowsByCabinet = filesByCabinetMedia; |
| 460 | command.ResolveMedia = this.ResolveMedia; | 448 | command.ResolveMedia = this.ResolveMedia; |
| 461 | command.TableDefinitions = tableDefinitions; | 449 | command.TableDefinitions = tableDefinitions; |
| 462 | command.TempFilesLocation = this.IntermediateFolder; | 450 | command.TempFilesLocation = this.IntermediateFolder; |
| 463 | command.Execute(); | 451 | command.Execute(); |
| 464 | 452 | ||
| 465 | fileTransfers.AddRange(command.FileTransfers); | 453 | fileTransfers.AddRange(command.FileTransfers); |
| 466 | trackedFiles.AddRange(command.TrackedFiles); | 454 | trackedFiles.AddRange(command.TrackedFiles); |
| 467 | } | 455 | } |
| 468 | 456 | ||
| 469 | #if DELETE | 457 | #if DELETE |
| 470 | if (OutputType.Patch == output.Type) | 458 | if (OutputType.Patch == output.Type) |
| @@ -479,65 +467,65 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 479 | } | 467 | } |
| 480 | #endif | 468 | #endif |
| 481 | 469 | ||
| 482 | // stop processing if an error previously occurred | 470 | // stop processing if an error previously occurred |
| 483 | if (this.Messaging.EncounteredError) | 471 | if (this.Messaging.EncounteredError) |
| 484 | { | 472 | { |
| 485 | return null; | 473 | return null; |
| 486 | } | 474 | } |
| 487 | 475 | ||
| 488 | // Generate database file. | 476 | // Generate database file. |
| 489 | this.Messaging.Write(VerboseMessages.GeneratingDatabase()); | 477 | this.Messaging.Write(VerboseMessages.GeneratingDatabase()); |
| 490 | 478 | ||
| 491 | { | 479 | { |
| 492 | var trackMsi = this.BackendHelper.TrackFile(this.OutputPath, TrackedFileType.Final); | 480 | var trackMsi = this.BackendHelper.TrackFile(this.OutputPath, TrackedFileType.Final); |
| 493 | trackedFiles.Add(trackMsi); | 481 | trackedFiles.Add(trackMsi); |
| 494 | 482 | ||
| 495 | var temporaryFiles = this.GenerateDatabase(output, tableDefinitions, trackMsi.Path, false, false); | 483 | var temporaryFiles = this.GenerateDatabase(output, tableDefinitions, trackMsi.Path, false, false); |
| 496 | trackedFiles.AddRange(temporaryFiles); | 484 | trackedFiles.AddRange(temporaryFiles); |
| 497 | } | 485 | } |
| 498 | 486 | ||
| 499 | // Stop processing if an error previously occurred. | 487 | // Stop processing if an error previously occurred. |
| 500 | if (this.Messaging.EncounteredError) | 488 | if (this.Messaging.EncounteredError) |
| 501 | { | 489 | { |
| 502 | return null; | 490 | return null; |
| 503 | } | 491 | } |
| 492 | |||
| 493 | // Merge modules. | ||
| 494 | if (containsMergeModules) | ||
| 495 | { | ||
| 496 | this.Messaging.Write(VerboseMessages.MergingModules()); | ||
| 504 | 497 | ||
| 505 | // Merge modules. | 498 | // Add back possibly suppressed sequence tables since all sequence tables must be present |
| 506 | if (containsMergeModules) | 499 | // for the merge process to work. We'll drop the suppressed sequence tables again as |
| 500 | // necessary. | ||
| 501 | foreach (SequenceTable sequence in Enum.GetValues(typeof(SequenceTable))) | ||
| 507 | { | 502 | { |
| 508 | this.Messaging.Write(VerboseMessages.MergingModules()); | 503 | var sequenceTableName = sequence.ToString(); |
| 504 | var sequenceTable = output.Tables[sequenceTableName]; | ||
| 509 | 505 | ||
| 510 | // Add back possibly suppressed sequence tables since all sequence tables must be present | 506 | if (null == sequenceTable) |
| 511 | // for the merge process to work. We'll drop the suppressed sequence tables again as | ||
| 512 | // necessary. | ||
| 513 | foreach (SequenceTable sequence in Enum.GetValues(typeof(SequenceTable))) | ||
| 514 | { | 507 | { |
| 515 | var sequenceTableName = sequence.ToString(); | 508 | sequenceTable = output.EnsureTable(tableDefinitions[sequenceTableName]); |
| 516 | var sequenceTable = output.Tables[sequenceTableName]; | ||
| 517 | |||
| 518 | if (null == sequenceTable) | ||
| 519 | { | ||
| 520 | sequenceTable = output.EnsureTable(tableDefinitions[sequenceTableName]); | ||
| 521 | } | ||
| 522 | |||
| 523 | if (0 == sequenceTable.Rows.Count) | ||
| 524 | { | ||
| 525 | suppressedTableNames.Add(sequenceTableName); | ||
| 526 | } | ||
| 527 | } | 509 | } |
| 528 | 510 | ||
| 529 | var command = new MergeModulesCommand(); | 511 | if (0 == sequenceTable.Rows.Count) |
| 530 | command.FileFacades = fileFacades; | 512 | { |
| 531 | command.Output = output; | 513 | suppressedTableNames.Add(sequenceTableName); |
| 532 | command.OutputPath = this.OutputPath; | 514 | } |
| 533 | command.SuppressedTableNames = suppressedTableNames; | ||
| 534 | command.Execute(); | ||
| 535 | } | 515 | } |
| 536 | 516 | ||
| 537 | if (this.Messaging.EncounteredError) | 517 | var command = new MergeModulesCommand(); |
| 538 | { | 518 | command.FileFacades = fileFacades; |
| 539 | return null; | 519 | command.Output = output; |
| 540 | } | 520 | command.OutputPath = this.OutputPath; |
| 521 | command.SuppressedTableNames = suppressedTableNames; | ||
| 522 | command.Execute(); | ||
| 523 | } | ||
| 524 | |||
| 525 | if (this.Messaging.EncounteredError) | ||
| 526 | { | ||
| 527 | return null; | ||
| 528 | } | ||
| 541 | 529 | ||
| 542 | #if TODO_FINISH_VALIDATION | 530 | #if TODO_FINISH_VALIDATION |
| 543 | // Validate the output if there is an MSI validator. | 531 | // Validate the output if there is an MSI validator. |
| @@ -563,26 +551,25 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 563 | } | 551 | } |
| 564 | #endif | 552 | #endif |
| 565 | 553 | ||
| 566 | // Process uncompressed files. | 554 | // Process uncompressed files. |
| 567 | if (!this.Messaging.EncounteredError && !this.SuppressLayout && uncompressedFiles.Any()) | 555 | if (!this.Messaging.EncounteredError && !this.SuppressLayout && uncompressedFiles.Any()) |
| 568 | { | 556 | { |
| 569 | var command = new ProcessUncompressedFilesCommand(section, this.BackendHelper, this.PathResolver); | 557 | var command = new ProcessUncompressedFilesCommand(section, this.BackendHelper, this.PathResolver); |
| 570 | command.Compressed = compressed; | 558 | command.Compressed = compressed; |
| 571 | command.FileFacades = uncompressedFiles; | 559 | command.FileFacades = uncompressedFiles; |
| 572 | command.LayoutDirectory = layoutDirectory; | 560 | command.LayoutDirectory = layoutDirectory; |
| 573 | command.LongNamesInImage = longNames; | 561 | command.LongNamesInImage = longNames; |
| 574 | command.ResolveMedia = this.ResolveMedia; | 562 | command.ResolveMedia = this.ResolveMedia; |
| 575 | command.DatabasePath = this.OutputPath; | 563 | command.DatabasePath = this.OutputPath; |
| 576 | command.Execute(); | 564 | command.Execute(); |
| 577 | |||
| 578 | fileTransfers.AddRange(command.FileTransfers); | ||
| 579 | trackedFiles.AddRange(command.TrackedFiles); | ||
| 580 | } | ||
| 581 | 565 | ||
| 582 | // TODO: this is not sufficient to collect all Input files (for example, it misses Binary and Icon tables). | 566 | fileTransfers.AddRange(command.FileTransfers); |
| 583 | trackedFiles.AddRange(fileFacades.Select(f => this.BackendHelper.TrackFile(f.SourcePath, TrackedFileType.Input, f.SourceLineNumber))); | 567 | trackedFiles.AddRange(command.TrackedFiles); |
| 584 | } | 568 | } |
| 585 | 569 | ||
| 570 | // TODO: this is not sufficient to collect all Input files (for example, it misses Binary and Icon tables). | ||
| 571 | trackedFiles.AddRange(fileFacades.Select(f => this.BackendHelper.TrackFile(f.SourcePath, TrackedFileType.Input, f.SourceLineNumber))); | ||
| 572 | |||
| 586 | var result = this.ServiceProvider.GetService<IBindResult>(); | 573 | var result = this.ServiceProvider.GetService<IBindResult>(); |
| 587 | result.FileTransfers = fileTransfers; | 574 | result.FileTransfers = fileTransfers; |
| 588 | result.TrackedFiles = trackedFiles; | 575 | result.TrackedFiles = trackedFiles; |
diff --git a/src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs b/src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs index 64b3fa93..44488a8a 100644 --- a/src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs | |||
| @@ -436,50 +436,6 @@ namespace WixToolsetTest.CoreIntegration | |||
| 436 | } | 436 | } |
| 437 | 437 | ||
| 438 | [Fact] | 438 | [Fact] |
| 439 | public void CanBuildWithPartialWixpdbInput() | ||
| 440 | { | ||
| 441 | var folder = TestData.Get(@"TestData\SingleFile"); | ||
| 442 | |||
| 443 | using (var fs = new DisposableFileSystem()) | ||
| 444 | { | ||
| 445 | var baseFolder = fs.GetFolder(); | ||
| 446 | var intermediateFolder = Path.Combine(baseFolder, "obj"); | ||
| 447 | var wixpdbPath = Path.Combine(baseFolder, @"partial\test.wixpdb"); | ||
| 448 | |||
| 449 | var result = WixRunner.Execute(new[] | ||
| 450 | { | ||
| 451 | "build", | ||
| 452 | Path.Combine(folder, "Package.wxs"), | ||
| 453 | Path.Combine(folder, "PackageComponents.wxs"), | ||
| 454 | "-loc", Path.Combine(folder, "Package.en-us.wxl"), | ||
| 455 | "-bindpath", Path.Combine(folder, "data"), | ||
| 456 | "-intermediateFolder", intermediateFolder, | ||
| 457 | //"-o", Path.Combine(baseFolder, @"partial\test.msi"), | ||
| 458 | "-pdb", wixpdbPath, | ||
| 459 | "-pdbtype", "Partial", | ||
| 460 | }, out var messages); | ||
| 461 | Assert.Equal(0, result); | ||
| 462 | |||
| 463 | result = WixRunner.Execute(new[] | ||
| 464 | { | ||
| 465 | "build", | ||
| 466 | wixpdbPath, | ||
| 467 | "-loc", Path.Combine(folder, "Package.en-us.wxl"), | ||
| 468 | "-bindpath", Path.Combine(folder, "data"), | ||
| 469 | "-intermediateFolder", intermediateFolder, | ||
| 470 | "-o", Path.Combine(baseFolder, @"bin\test.msi"), | ||
| 471 | }, out messages); | ||
| 472 | Assert.Equal(0, result); | ||
| 473 | |||
| 474 | var builtFiles = Directory.GetFiles(Path.Combine(baseFolder, @"bin")); | ||
| 475 | Assert.Equal(new[]{ | ||
| 476 | "test.msi", | ||
| 477 | "test.wixpdb", | ||
| 478 | }, builtFiles.Select(Path.GetFileName).ToArray()); | ||
| 479 | } | ||
| 480 | } | ||
| 481 | |||
| 482 | [Fact] | ||
| 483 | public void CanBuildWixlib() | 439 | public void CanBuildWixlib() |
| 484 | { | 440 | { |
| 485 | var folder = TestData.Get(@"TestData\SingleFile"); | 441 | var folder = TestData.Get(@"TestData\SingleFile"); |
