diff options
| author | Bob Arnson <bob@firegiant.com> | 2024-08-25 19:13:37 -0400 |
|---|---|---|
| committer | Bob Arnson <bob@firegiant.com> | 2024-08-25 19:13:37 -0400 |
| commit | 5f7fbcf6b75ee617357e6fd3de7cd824e5f187c7 (patch) | |
| tree | 618a85ae0d52ad1828d9f70313aa57002985d621 | |
| parent | 1011c5609bc12ded5188dc76484fc5075d24617c (diff) | |
| download | wix-bob/EnsureTableStandardActions.tar.gz wix-bob/EnsureTableStandardActions.tar.bz2 wix-bob/EnsureTableStandardActions.zip | |
Also use EnsureTable to schedule standard actions.bob/EnsureTableStandardActions
Fixes https://github.com/wixtoolset/issues/issues/8632
Fixes https://github.com/wixtoolset/issues/issues/8199
3 files changed, 244 insertions, 156 deletions
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs index 3cda47ae..4f739420 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs | |||
| @@ -4,7 +4,6 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 4 | { | 4 | { |
| 5 | using System; | 5 | using System; |
| 6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
| 7 | using System.Globalization; | ||
| 8 | using System.Linq; | 7 | using System.Linq; |
| 9 | using WixToolset.Data; | 8 | using WixToolset.Data; |
| 10 | using WixToolset.Data.Symbols; | 9 | using WixToolset.Data.Symbols; |
| @@ -30,6 +29,42 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 30 | 29 | ||
| 31 | private Dictionary<string, RelativeActions> RelativeActionsForActions { get; } | 30 | private Dictionary<string, RelativeActions> RelativeActionsForActions { get; } |
| 32 | 31 | ||
| 32 | public Dictionary<string, SymbolDefinitionType> SymbolTypeForTable { get; } = new Dictionary<string, SymbolDefinitionType> | ||
| 33 | { | ||
| 34 | { "AppSearch", SymbolDefinitionType.AppSearch }, | ||
| 35 | { "CCPSearch", SymbolDefinitionType.CCPSearch }, | ||
| 36 | { "Class", SymbolDefinitionType.Class }, | ||
| 37 | { "Complus", SymbolDefinitionType.Complus}, | ||
| 38 | { "CreateFolder", SymbolDefinitionType.CreateFolder }, | ||
| 39 | { "DuplicateFile", SymbolDefinitionType.DuplicateFile }, | ||
| 40 | { "Environment", SymbolDefinitionType.Environment }, | ||
| 41 | { "Extension", SymbolDefinitionType.Extension }, | ||
| 42 | { "File", SymbolDefinitionType.File }, | ||
| 43 | { "IniFile", SymbolDefinitionType.IniFile }, | ||
| 44 | { "IsolatedComponent", SymbolDefinitionType.IsolatedComponent }, | ||
| 45 | { "LaunchCondition", SymbolDefinitionType.LaunchCondition }, | ||
| 46 | { "MIME", SymbolDefinitionType.MIME }, | ||
| 47 | { "MoveFile", SymbolDefinitionType.MoveFile }, | ||
| 48 | { "MsiAssembly", SymbolDefinitionType.Assembly }, | ||
| 49 | { "MsiAssemblyName", SymbolDefinitionType.Assembly }, | ||
| 50 | { "MsiServiceConfig", SymbolDefinitionType.LaunchCondition }, | ||
| 51 | { "MsiServiceConfigFailureActions", SymbolDefinitionType.MsiServiceConfigFailureActions }, | ||
| 52 | { "ODBCAttribute", SymbolDefinitionType.ODBCAttribute }, | ||
| 53 | { "ODBCDataSource", SymbolDefinitionType.ODBCDataSource }, | ||
| 54 | { "ODBCDriver", SymbolDefinitionType.ODBCDriver }, | ||
| 55 | { "ODBCTranslator", SymbolDefinitionType.ODBCTranslator }, | ||
| 56 | { "ODBCSourceAttribute", SymbolDefinitionType.ODBCSourceAttribute }, | ||
| 57 | { "PublishComponent", SymbolDefinitionType.PublishComponent }, | ||
| 58 | { "Registry", SymbolDefinitionType.Registry }, | ||
| 59 | { "RemoveRegistry", SymbolDefinitionType.RemoveRegistry }, | ||
| 60 | { "RemoveFile", SymbolDefinitionType.RemoveFile }, | ||
| 61 | { "ServiceControl", SymbolDefinitionType.ServiceControl }, | ||
| 62 | { "ServiceInstall", SymbolDefinitionType.ServiceInstall }, | ||
| 63 | { "Shortcut", SymbolDefinitionType.Shortcut }, | ||
| 64 | { "TypeLib", SymbolDefinitionType.TypeLib }, | ||
| 65 | { "Upgrade", SymbolDefinitionType.Upgrade }, | ||
| 66 | }; | ||
| 67 | |||
| 33 | public void Execute() | 68 | public void Execute() |
| 34 | { | 69 | { |
| 35 | var requiredActionSymbols = new Dictionary<string, WixActionSymbol>(); | 70 | var requiredActionSymbols = new Dictionary<string, WixActionSymbol>(); |
| @@ -131,7 +166,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 131 | 166 | ||
| 132 | // A dictionary used for detecting cyclic references among action symbols. | 167 | // A dictionary used for detecting cyclic references among action symbols. |
| 133 | var firstReference = new Dictionary<WixActionSymbol, WixActionSymbol>(); | 168 | var firstReference = new Dictionary<WixActionSymbol, WixActionSymbol>(); |
| 134 | 169 | ||
| 135 | // Build up dependency trees of the relatively scheduled actions. | 170 | // Build up dependency trees of the relatively scheduled actions. |
| 136 | // Use ToList() to create a copy of the required action symbols so that new symbols can | 171 | // Use ToList() to create a copy of the required action symbols so that new symbols can |
| 137 | // be added while enumerating. | 172 | // be added while enumerating. |
| @@ -396,165 +431,179 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 396 | // Gather the required actions for each symbol type. | 431 | // Gather the required actions for each symbol type. |
| 397 | foreach (var symbolType in this.Section.Symbols.Select(t => t.Definition.Type).Distinct()) | 432 | foreach (var symbolType in this.Section.Symbols.Select(t => t.Definition.Type).Distinct()) |
| 398 | { | 433 | { |
| 399 | switch (symbolType) | 434 | this.GetActionsForSymbolType(symbolType, set); |
| 435 | } | ||
| 436 | |||
| 437 | // Gather the required actions for each ensured table. | ||
| 438 | foreach (var ensureTable in this.Section.Symbols.OfType<WixEnsureTableSymbol>()) | ||
| 439 | { | ||
| 440 | if (this.SymbolTypeForTable.TryGetValue(ensureTable.Table, out var symbolType)) | ||
| 400 | { | 441 | { |
| 401 | case SymbolDefinitionType.AppSearch: | 442 | this.GetActionsForSymbolType(symbolType, set); |
| 402 | set.Add("InstallExecuteSequence/AppSearch"); | 443 | } |
| 403 | set.Add("InstallUISequence/AppSearch"); | 444 | } |
| 404 | break; | ||
| 405 | case SymbolDefinitionType.CCPSearch: | ||
| 406 | set.Add("InstallExecuteSequence/AppSearch"); | ||
| 407 | set.Add("InstallExecuteSequence/CCPSearch"); | ||
| 408 | set.Add("InstallExecuteSequence/RMCCPSearch"); | ||
| 409 | set.Add("InstallUISequence/AppSearch"); | ||
| 410 | set.Add("InstallUISequence/CCPSearch"); | ||
| 411 | set.Add("InstallUISequence/RMCCPSearch"); | ||
| 412 | break; | ||
| 413 | case SymbolDefinitionType.Class: | ||
| 414 | set.Add("AdvertiseExecuteSequence/RegisterClassInfo"); | ||
| 415 | set.Add("InstallExecuteSequence/RegisterClassInfo"); | ||
| 416 | set.Add("InstallExecuteSequence/UnregisterClassInfo"); | ||
| 417 | break; | ||
| 418 | case SymbolDefinitionType.Complus: | ||
| 419 | set.Add("InstallExecuteSequence/RegisterComPlus"); | ||
| 420 | set.Add("InstallExecuteSequence/UnregisterComPlus"); | ||
| 421 | break; | ||
| 422 | case SymbolDefinitionType.Component: | ||
| 423 | case SymbolDefinitionType.CreateFolder: | ||
| 424 | set.Add("InstallExecuteSequence/CreateFolders"); | ||
| 425 | set.Add("InstallExecuteSequence/RemoveFolders"); | ||
| 426 | break; | ||
| 427 | case SymbolDefinitionType.DuplicateFile: | ||
| 428 | set.Add("InstallExecuteSequence/DuplicateFiles"); | ||
| 429 | set.Add("InstallExecuteSequence/RemoveDuplicateFiles"); | ||
| 430 | break; | ||
| 431 | case SymbolDefinitionType.Environment: | ||
| 432 | set.Add("InstallExecuteSequence/WriteEnvironmentStrings"); | ||
| 433 | set.Add("InstallExecuteSequence/RemoveEnvironmentStrings"); | ||
| 434 | break; | ||
| 435 | case SymbolDefinitionType.Extension: | ||
| 436 | set.Add("AdvertiseExecuteSequence/RegisterExtensionInfo"); | ||
| 437 | set.Add("InstallExecuteSequence/RegisterExtensionInfo"); | ||
| 438 | set.Add("InstallExecuteSequence/UnregisterExtensionInfo"); | ||
| 439 | break; | ||
| 440 | case SymbolDefinitionType.File: | ||
| 441 | set.Add("InstallExecuteSequence/InstallFiles"); | ||
| 442 | set.Add("InstallExecuteSequence/RemoveFiles"); | ||
| 443 | |||
| 444 | var foundFont = false; | ||
| 445 | var foundSelfReg = false; | ||
| 446 | var foundBindPath = false; | ||
| 447 | foreach (var file in this.Section.Symbols.OfType<FileSymbol>()) | ||
| 448 | { | ||
| 449 | // Note that TrueType fonts are denoted by the empty string in the FontTitle | ||
| 450 | // field. So, non-null means a font is present. | ||
| 451 | if (!foundFont && file.FontTitle != null) | ||
| 452 | { | ||
| 453 | set.Add("InstallExecuteSequence/RegisterFonts"); | ||
| 454 | set.Add("InstallExecuteSequence/UnregisterFonts"); | ||
| 455 | foundFont = true; | ||
| 456 | } | ||
| 457 | 445 | ||
| 458 | if (!foundSelfReg && file.SelfRegCost.HasValue) | 446 | return set; |
| 459 | { | 447 | } |
| 460 | set.Add("InstallExecuteSequence/SelfRegModules"); | ||
| 461 | set.Add("InstallExecuteSequence/SelfUnregModules"); | ||
| 462 | foundSelfReg = true; | ||
| 463 | } | ||
| 464 | 448 | ||
| 465 | if (!foundBindPath && !String.IsNullOrEmpty(file.BindPath)) | 449 | private void GetActionsForSymbolType(SymbolDefinitionType symbolType, HashSet<string> set) |
| 466 | { | 450 | { |
| 467 | set.Add("InstallExecuteSequence/BindImage"); | 451 | switch (symbolType) |
| 468 | foundBindPath = true; | 452 | { |
| 469 | } | 453 | case SymbolDefinitionType.AppSearch: |
| 454 | set.Add("InstallExecuteSequence/AppSearch"); | ||
| 455 | set.Add("InstallUISequence/AppSearch"); | ||
| 456 | break; | ||
| 457 | case SymbolDefinitionType.CCPSearch: | ||
| 458 | set.Add("InstallExecuteSequence/AppSearch"); | ||
| 459 | set.Add("InstallExecuteSequence/CCPSearch"); | ||
| 460 | set.Add("InstallExecuteSequence/RMCCPSearch"); | ||
| 461 | set.Add("InstallUISequence/AppSearch"); | ||
| 462 | set.Add("InstallUISequence/CCPSearch"); | ||
| 463 | set.Add("InstallUISequence/RMCCPSearch"); | ||
| 464 | break; | ||
| 465 | case SymbolDefinitionType.Class: | ||
| 466 | set.Add("AdvertiseExecuteSequence/RegisterClassInfo"); | ||
| 467 | set.Add("InstallExecuteSequence/RegisterClassInfo"); | ||
| 468 | set.Add("InstallExecuteSequence/UnregisterClassInfo"); | ||
| 469 | break; | ||
| 470 | case SymbolDefinitionType.Complus: | ||
| 471 | set.Add("InstallExecuteSequence/RegisterComPlus"); | ||
| 472 | set.Add("InstallExecuteSequence/UnregisterComPlus"); | ||
| 473 | break; | ||
| 474 | case SymbolDefinitionType.Component: | ||
| 475 | case SymbolDefinitionType.CreateFolder: | ||
| 476 | set.Add("InstallExecuteSequence/CreateFolders"); | ||
| 477 | set.Add("InstallExecuteSequence/RemoveFolders"); | ||
| 478 | break; | ||
| 479 | case SymbolDefinitionType.DuplicateFile: | ||
| 480 | set.Add("InstallExecuteSequence/DuplicateFiles"); | ||
| 481 | set.Add("InstallExecuteSequence/RemoveDuplicateFiles"); | ||
| 482 | break; | ||
| 483 | case SymbolDefinitionType.Environment: | ||
| 484 | set.Add("InstallExecuteSequence/WriteEnvironmentStrings"); | ||
| 485 | set.Add("InstallExecuteSequence/RemoveEnvironmentStrings"); | ||
| 486 | break; | ||
| 487 | case SymbolDefinitionType.Extension: | ||
| 488 | set.Add("AdvertiseExecuteSequence/RegisterExtensionInfo"); | ||
| 489 | set.Add("InstallExecuteSequence/RegisterExtensionInfo"); | ||
| 490 | set.Add("InstallExecuteSequence/UnregisterExtensionInfo"); | ||
| 491 | break; | ||
| 492 | case SymbolDefinitionType.File: | ||
| 493 | set.Add("InstallExecuteSequence/InstallFiles"); | ||
| 494 | set.Add("InstallExecuteSequence/RemoveFiles"); | ||
| 495 | |||
| 496 | var foundFont = false; | ||
| 497 | var foundSelfReg = false; | ||
| 498 | var foundBindPath = false; | ||
| 499 | foreach (var file in this.Section.Symbols.OfType<FileSymbol>()) | ||
| 500 | { | ||
| 501 | // Note that TrueType fonts are denoted by the empty string in the FontTitle | ||
| 502 | // field. So, non-null means a font is present. | ||
| 503 | if (!foundFont && file.FontTitle != null) | ||
| 504 | { | ||
| 505 | set.Add("InstallExecuteSequence/RegisterFonts"); | ||
| 506 | set.Add("InstallExecuteSequence/UnregisterFonts"); | ||
| 507 | foundFont = true; | ||
| 470 | } | 508 | } |
| 471 | break; | 509 | |
| 472 | case SymbolDefinitionType.IniFile: | 510 | if (!foundSelfReg && file.SelfRegCost.HasValue) |
| 473 | set.Add("InstallExecuteSequence/WriteIniValues"); | ||
| 474 | set.Add("InstallExecuteSequence/RemoveIniValues"); | ||
| 475 | break; | ||
| 476 | case SymbolDefinitionType.IsolatedComponent: | ||
| 477 | set.Add("InstallExecuteSequence/IsolateComponents"); | ||
| 478 | break; | ||
| 479 | case SymbolDefinitionType.LaunchCondition: | ||
| 480 | set.Add("InstallExecuteSequence/LaunchConditions"); | ||
| 481 | set.Add("InstallUISequence/LaunchConditions"); | ||
| 482 | break; | ||
| 483 | case SymbolDefinitionType.MIME: | ||
| 484 | set.Add("AdvertiseExecuteSequence/RegisterMIMEInfo"); | ||
| 485 | set.Add("InstallExecuteSequence/RegisterMIMEInfo"); | ||
| 486 | set.Add("InstallExecuteSequence/UnregisterMIMEInfo"); | ||
| 487 | break; | ||
| 488 | case SymbolDefinitionType.MoveFile: | ||
| 489 | set.Add("InstallExecuteSequence/MoveFiles"); | ||
| 490 | break; | ||
| 491 | case SymbolDefinitionType.Assembly: | ||
| 492 | set.Add("AdvertiseExecuteSequence/MsiPublishAssemblies"); | ||
| 493 | set.Add("InstallExecuteSequence/MsiPublishAssemblies"); | ||
| 494 | set.Add("InstallExecuteSequence/MsiUnpublishAssemblies"); | ||
| 495 | break; | ||
| 496 | case SymbolDefinitionType.MsiServiceConfig: | ||
| 497 | case SymbolDefinitionType.MsiServiceConfigFailureActions: | ||
| 498 | set.Add("InstallExecuteSequence/MsiConfigureServices"); | ||
| 499 | break; | ||
| 500 | case SymbolDefinitionType.ODBCDataSource: | ||
| 501 | case SymbolDefinitionType.ODBCTranslator: | ||
| 502 | case SymbolDefinitionType.ODBCDriver: | ||
| 503 | set.Add("InstallExecuteSequence/SetODBCFolders"); | ||
| 504 | set.Add("InstallExecuteSequence/InstallODBC"); | ||
| 505 | set.Add("InstallExecuteSequence/RemoveODBC"); | ||
| 506 | break; | ||
| 507 | case SymbolDefinitionType.ProgId: | ||
| 508 | set.Add("AdvertiseExecuteSequence/RegisterProgIdInfo"); | ||
| 509 | set.Add("InstallExecuteSequence/RegisterProgIdInfo"); | ||
| 510 | set.Add("InstallExecuteSequence/UnregisterProgIdInfo"); | ||
| 511 | break; | ||
| 512 | case SymbolDefinitionType.PublishComponent: | ||
| 513 | set.Add("AdvertiseExecuteSequence/PublishComponents"); | ||
| 514 | set.Add("InstallExecuteSequence/PublishComponents"); | ||
| 515 | set.Add("InstallExecuteSequence/UnpublishComponents"); | ||
| 516 | break; | ||
| 517 | case SymbolDefinitionType.Registry: | ||
| 518 | case SymbolDefinitionType.RemoveRegistry: | ||
| 519 | set.Add("InstallExecuteSequence/WriteRegistryValues"); | ||
| 520 | set.Add("InstallExecuteSequence/RemoveRegistryValues"); | ||
| 521 | break; | ||
| 522 | case SymbolDefinitionType.RemoveFile: | ||
| 523 | set.Add("InstallExecuteSequence/RemoveFiles"); | ||
| 524 | break; | ||
| 525 | case SymbolDefinitionType.ServiceControl: | ||
| 526 | set.Add("InstallExecuteSequence/StartServices"); | ||
| 527 | set.Add("InstallExecuteSequence/StopServices"); | ||
| 528 | set.Add("InstallExecuteSequence/DeleteServices"); | ||
| 529 | break; | ||
| 530 | case SymbolDefinitionType.ServiceInstall: | ||
| 531 | set.Add("InstallExecuteSequence/InstallServices"); | ||
| 532 | break; | ||
| 533 | case SymbolDefinitionType.Shortcut: | ||
| 534 | set.Add("AdvertiseExecuteSequence/CreateShortcuts"); | ||
| 535 | set.Add("InstallExecuteSequence/CreateShortcuts"); | ||
| 536 | set.Add("InstallExecuteSequence/RemoveShortcuts"); | ||
| 537 | break; | ||
| 538 | case SymbolDefinitionType.TypeLib: | ||
| 539 | set.Add("InstallExecuteSequence/RegisterTypeLibraries"); | ||
| 540 | set.Add("InstallExecuteSequence/UnregisterTypeLibraries"); | ||
| 541 | break; | ||
| 542 | case SymbolDefinitionType.Upgrade: | ||
| 543 | set.Add("InstallExecuteSequence/FindRelatedProducts"); | ||
| 544 | set.Add("InstallUISequence/FindRelatedProducts"); | ||
| 545 | |||
| 546 | // Only add the MigrateFeatureStates action if MigrateFeature attribute is set on | ||
| 547 | // at least one UpgradeVersion element. | ||
| 548 | if (this.Section.Symbols.OfType<UpgradeSymbol>().Any(t => t.MigrateFeatures)) | ||
| 549 | { | 511 | { |
| 550 | set.Add("InstallExecuteSequence/MigrateFeatureStates"); | 512 | set.Add("InstallExecuteSequence/SelfRegModules"); |
| 551 | set.Add("InstallUISequence/MigrateFeatureStates"); | 513 | set.Add("InstallExecuteSequence/SelfUnregModules"); |
| 514 | foundSelfReg = true; | ||
| 552 | } | 515 | } |
| 553 | break; | ||
| 554 | } | ||
| 555 | } | ||
| 556 | 516 | ||
| 557 | return set; | 517 | if (!foundBindPath && !String.IsNullOrEmpty(file.BindPath)) |
| 518 | { | ||
| 519 | set.Add("InstallExecuteSequence/BindImage"); | ||
| 520 | foundBindPath = true; | ||
| 521 | } | ||
| 522 | } | ||
| 523 | break; | ||
| 524 | case SymbolDefinitionType.IniFile: | ||
| 525 | set.Add("InstallExecuteSequence/WriteIniValues"); | ||
| 526 | set.Add("InstallExecuteSequence/RemoveIniValues"); | ||
| 527 | break; | ||
| 528 | case SymbolDefinitionType.IsolatedComponent: | ||
| 529 | set.Add("InstallExecuteSequence/IsolateComponents"); | ||
| 530 | break; | ||
| 531 | case SymbolDefinitionType.LaunchCondition: | ||
| 532 | set.Add("InstallExecuteSequence/LaunchConditions"); | ||
| 533 | set.Add("InstallUISequence/LaunchConditions"); | ||
| 534 | break; | ||
| 535 | case SymbolDefinitionType.MIME: | ||
| 536 | set.Add("AdvertiseExecuteSequence/RegisterMIMEInfo"); | ||
| 537 | set.Add("InstallExecuteSequence/RegisterMIMEInfo"); | ||
| 538 | set.Add("InstallExecuteSequence/UnregisterMIMEInfo"); | ||
| 539 | break; | ||
| 540 | case SymbolDefinitionType.MoveFile: | ||
| 541 | set.Add("InstallExecuteSequence/MoveFiles"); | ||
| 542 | break; | ||
| 543 | case SymbolDefinitionType.Assembly: | ||
| 544 | set.Add("AdvertiseExecuteSequence/MsiPublishAssemblies"); | ||
| 545 | set.Add("InstallExecuteSequence/MsiPublishAssemblies"); | ||
| 546 | set.Add("InstallExecuteSequence/MsiUnpublishAssemblies"); | ||
| 547 | break; | ||
| 548 | case SymbolDefinitionType.MsiServiceConfig: | ||
| 549 | case SymbolDefinitionType.MsiServiceConfigFailureActions: | ||
| 550 | set.Add("InstallExecuteSequence/MsiConfigureServices"); | ||
| 551 | break; | ||
| 552 | case SymbolDefinitionType.ODBCDataSource: | ||
| 553 | case SymbolDefinitionType.ODBCTranslator: | ||
| 554 | case SymbolDefinitionType.ODBCDriver: | ||
| 555 | set.Add("InstallExecuteSequence/SetODBCFolders"); | ||
| 556 | set.Add("InstallExecuteSequence/InstallODBC"); | ||
| 557 | set.Add("InstallExecuteSequence/RemoveODBC"); | ||
| 558 | break; | ||
| 559 | case SymbolDefinitionType.ProgId: | ||
| 560 | set.Add("AdvertiseExecuteSequence/RegisterProgIdInfo"); | ||
| 561 | set.Add("InstallExecuteSequence/RegisterProgIdInfo"); | ||
| 562 | set.Add("InstallExecuteSequence/UnregisterProgIdInfo"); | ||
| 563 | break; | ||
| 564 | case SymbolDefinitionType.PublishComponent: | ||
| 565 | set.Add("AdvertiseExecuteSequence/PublishComponents"); | ||
| 566 | set.Add("InstallExecuteSequence/PublishComponents"); | ||
| 567 | set.Add("InstallExecuteSequence/UnpublishComponents"); | ||
| 568 | break; | ||
| 569 | case SymbolDefinitionType.Registry: | ||
| 570 | case SymbolDefinitionType.RemoveRegistry: | ||
| 571 | set.Add("InstallExecuteSequence/WriteRegistryValues"); | ||
| 572 | set.Add("InstallExecuteSequence/RemoveRegistryValues"); | ||
| 573 | break; | ||
| 574 | case SymbolDefinitionType.RemoveFile: | ||
| 575 | set.Add("InstallExecuteSequence/RemoveFiles"); | ||
| 576 | break; | ||
| 577 | case SymbolDefinitionType.ServiceControl: | ||
| 578 | set.Add("InstallExecuteSequence/StartServices"); | ||
| 579 | set.Add("InstallExecuteSequence/StopServices"); | ||
| 580 | set.Add("InstallExecuteSequence/DeleteServices"); | ||
| 581 | break; | ||
| 582 | case SymbolDefinitionType.ServiceInstall: | ||
| 583 | set.Add("InstallExecuteSequence/InstallServices"); | ||
| 584 | break; | ||
| 585 | case SymbolDefinitionType.Shortcut: | ||
| 586 | set.Add("AdvertiseExecuteSequence/CreateShortcuts"); | ||
| 587 | set.Add("InstallExecuteSequence/CreateShortcuts"); | ||
| 588 | set.Add("InstallExecuteSequence/RemoveShortcuts"); | ||
| 589 | break; | ||
| 590 | case SymbolDefinitionType.TypeLib: | ||
| 591 | set.Add("InstallExecuteSequence/RegisterTypeLibraries"); | ||
| 592 | set.Add("InstallExecuteSequence/UnregisterTypeLibraries"); | ||
| 593 | break; | ||
| 594 | case SymbolDefinitionType.Upgrade: | ||
| 595 | set.Add("InstallExecuteSequence/FindRelatedProducts"); | ||
| 596 | set.Add("InstallUISequence/FindRelatedProducts"); | ||
| 597 | |||
| 598 | // Only add the MigrateFeatureStates action if MigrateFeature attribute is set on | ||
| 599 | // at least one UpgradeVersion element. | ||
| 600 | if (this.Section.Symbols.OfType<UpgradeSymbol>().Any(t => t.MigrateFeatures)) | ||
| 601 | { | ||
| 602 | set.Add("InstallExecuteSequence/MigrateFeatureStates"); | ||
| 603 | set.Add("InstallUISequence/MigrateFeatureStates"); | ||
| 604 | } | ||
| 605 | break; | ||
| 606 | } | ||
| 558 | } | 607 | } |
| 559 | 608 | ||
| 560 | /// <summary> | 609 | /// <summary> |
| @@ -661,8 +710,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
| 661 | 710 | ||
| 662 | return parentActionSymbol; | 711 | return parentActionSymbol; |
| 663 | } | 712 | } |
| 664 | 713 | ||
| 665 | |||
| 666 | private RelativeActions GetRelativeActions(WixActionSymbol action) | 714 | private RelativeActions GetRelativeActions(WixActionSymbol action) |
| 667 | { | 715 | { |
| 668 | if (!this.RelativeActionsForActions.TryGetValue(action.Id.Id, out var relativeActions)) | 716 | if (!this.RelativeActionsForActions.TryGetValue(action.Id.Id, out var relativeActions)) |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs index a8b9c3e8..3b49ea25 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs | |||
| @@ -947,5 +947,38 @@ namespace WixToolsetTest.CoreIntegration | |||
| 947 | }, results); | 947 | }, results); |
| 948 | } | 948 | } |
| 949 | } | 949 | } |
| 950 | |||
| 951 | [Fact] | ||
| 952 | public void EnsureTableSchedulesAppropriateStandardActions() | ||
| 953 | { | ||
| 954 | var folder = TestData.Get(@"TestData\EnsureTable"); | ||
| 955 | |||
| 956 | using (var fs = new DisposableFileSystem()) | ||
| 957 | { | ||
| 958 | var baseFolder = fs.GetFolder(); | ||
| 959 | var intermediateFolder = Path.Combine(baseFolder, "obj"); | ||
| 960 | var msiPath = Path.Combine(baseFolder, @"bin\test.msi"); | ||
| 961 | |||
| 962 | var result = WixRunner.Execute(new[] | ||
| 963 | { | ||
| 964 | "build", | ||
| 965 | Path.Combine(folder, "StandardActions.wxs"), | ||
| 966 | "-intermediateFolder", intermediateFolder, | ||
| 967 | "-o", msiPath | ||
| 968 | }); | ||
| 969 | |||
| 970 | result.AssertSuccess(); | ||
| 971 | |||
| 972 | var results = Query.QueryDatabase(msiPath, new[] { "InstallExecuteSequence" }); | ||
| 973 | WixAssert.CompareLineByLine(new[] | ||
| 974 | { | ||
| 975 | "InstallExecuteSequence:AppSearch\t\t50", | ||
| 976 | "InstallExecuteSequence:CCPSearch\tNOT Installed\t500", | ||
| 977 | "InstallExecuteSequence:FileCost\t\t900", | ||
| 978 | "InstallExecuteSequence:RemoveFiles\t\t3500", | ||
| 979 | "InstallExecuteSequence:RMCCPSearch\tNOT Installed\t600", | ||
| 980 | }, results.Where(l => l.Contains("Search") || l.Contains("File")).ToArray()); | ||
| 981 | } | ||
| 982 | } | ||
| 950 | } | 983 | } |
| 951 | } | 984 | } |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/EnsureTable/StandardActions.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/EnsureTable/StandardActions.wxs new file mode 100644 index 00000000..e37330e8 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/EnsureTable/StandardActions.wxs | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 3 | <Package Name="EnsureTable_StandardActions" Manufacturer="WiX Toolset Worldwide" Version="1.0" UpgradeCode="{EB227D6E-1559-47E4-BE0A-B5E921D68B9C}"> | ||
| 4 | <EnsureTable Id="CCPSearch" /> | ||
| 5 | <EnsureTable Id="RemoveFile" /> | ||
| 6 | </Package> | ||
| 7 | </Wix> | ||
