diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-03-10 15:47:59 -0600 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-03-11 20:24:18 -0600 |
commit | 10ef9d5bfbf81f454113a1c2716009831a916222 (patch) | |
tree | 9e2fd8c917787ceba5e4c7f873d715eafbda6920 /src/engine/core.cpp | |
parent | 778b65643f19df94947d390a5a17023043d840b4 (diff) | |
download | wix-10ef9d5bfbf81f454113a1c2716009831a916222.tar.gz wix-10ef9d5bfbf81f454113a1c2716009831a916222.tar.bz2 wix-10ef9d5bfbf81f454113a1c2716009831a916222.zip |
Determine whether to ignore forward compatible bundles during Plan.
Diffstat (limited to 'src/engine/core.cpp')
-rw-r--r-- | src/engine/core.cpp | 65 |
1 files changed, 32 insertions, 33 deletions
diff --git a/src/engine/core.cpp b/src/engine/core.cpp index 2f18e4d2..eb8a84fe 100644 --- a/src/engine/core.cpp +++ b/src/engine/core.cpp | |||
@@ -319,15 +319,8 @@ extern "C" HRESULT CoreDetect( | |||
319 | hr = DependencyDetectProviderKeyBundleId(&pEngineState->registration); | 319 | hr = DependencyDetectProviderKeyBundleId(&pEngineState->registration); |
320 | if (SUCCEEDED(hr)) | 320 | if (SUCCEEDED(hr)) |
321 | { | 321 | { |
322 | hr = DetectForwardCompatibleBundle(&pEngineState->userExperience, &pEngineState->command, &pEngineState->registration); | 322 | hr = DetectForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->registration); |
323 | ExitOnFailure(hr, "Failed to detect forward compatible bundle."); | 323 | ExitOnFailure(hr, "Failed to detect forward compatible bundle."); |
324 | |||
325 | // If a forward compatible bundle was detected, skip rest of bundle detection | ||
326 | // since we will passthrough. | ||
327 | if (pEngineState->registration.fEnabledForwardCompatibleBundle) | ||
328 | { | ||
329 | ExitFunction(); | ||
330 | } | ||
331 | } | 324 | } |
332 | else if (E_NOTFOUND == hr) | 325 | else if (E_NOTFOUND == hr) |
333 | { | 326 | { |
@@ -504,39 +497,45 @@ extern "C" HRESULT CorePlan( | |||
504 | hr = PlanUpdateBundle(&pEngineState->userExperience, pUpgradeBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent); | 497 | hr = PlanUpdateBundle(&pEngineState->userExperience, pUpgradeBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent); |
505 | ExitOnFailure(hr, "Failed to plan update."); | 498 | ExitOnFailure(hr, "Failed to plan update."); |
506 | } | 499 | } |
507 | else if (pEngineState->registration.fEnabledForwardCompatibleBundle) | 500 | else |
508 | { | 501 | { |
509 | Assert(!pEngineState->plan.fPerMachine); | 502 | hr = PlanForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->command, &pEngineState->plan, &pEngineState->registration, action); |
503 | ExitOnFailure(hr, "Failed to plan forward compatible bundles."); | ||
510 | 504 | ||
511 | pForwardCompatibleBundlePackage = &pEngineState->registration.forwardCompatibleBundle; | 505 | if (pEngineState->plan.fEnabledForwardCompatibleBundle) |
512 | 506 | { | |
513 | hr = PlanPassThroughBundle(&pEngineState->userExperience, pForwardCompatibleBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent); | 507 | Assert(!pEngineState->plan.fPerMachine); |
514 | ExitOnFailure(hr, "Failed to plan passthrough."); | ||
515 | } | ||
516 | else // doing an action that modifies the machine state. | ||
517 | { | ||
518 | pEngineState->plan.fPerMachine = pEngineState->registration.fPerMachine; // default the scope of the plan to the per-machine state of the bundle. | ||
519 | 508 | ||
520 | hr = PlanRegistration(&pEngineState->plan, &pEngineState->registration, pEngineState->command.resumeType, pEngineState->command.relationType, &fContinuePlanning); | 509 | pForwardCompatibleBundlePackage = &pEngineState->plan.forwardCompatibleBundle; |
521 | ExitOnFailure(hr, "Failed to plan registration."); | ||
522 | 510 | ||
523 | if (fContinuePlanning) | 511 | hr = PlanPassThroughBundle(&pEngineState->userExperience, pForwardCompatibleBundlePackage, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, &hSyncpointEvent); |
512 | ExitOnFailure(hr, "Failed to plan passthrough."); | ||
513 | } | ||
514 | else // doing an action that modifies the machine state. | ||
524 | { | 515 | { |
525 | // Remember the early index, because we want to be able to insert some related bundles | 516 | pEngineState->plan.fPerMachine = pEngineState->registration.fPerMachine; // default the scope of the plan to the per-machine state of the bundle. |
526 | // into the plan before other executed packages. This particularly occurs for uninstallation | ||
527 | // of addons and patches, which should be uninstalled before the main product. | ||
528 | DWORD dwExecuteActionEarlyIndex = pEngineState->plan.cExecuteActions; | ||
529 | 517 | ||
530 | // Plan the related bundles first to support downgrades with ref-counting. | 518 | hr = PlanRegistration(&pEngineState->plan, &pEngineState->registration, pEngineState->command.resumeType, pEngineState->command.relationType, &fContinuePlanning); |
531 | hr = PlanRelatedBundlesBegin(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->plan); | 519 | ExitOnFailure(hr, "Failed to plan registration."); |
532 | ExitOnFailure(hr, "Failed to plan related bundles."); | ||
533 | 520 | ||
534 | hr = PlanPackages(&pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, NULL, &hSyncpointEvent); | 521 | if (fContinuePlanning) |
535 | ExitOnFailure(hr, "Failed to plan packages."); | 522 | { |
523 | // Remember the early index, because we want to be able to insert some related bundles | ||
524 | // into the plan before other executed packages. This particularly occurs for uninstallation | ||
525 | // of addons and patches, which should be uninstalled before the main product. | ||
526 | DWORD dwExecuteActionEarlyIndex = pEngineState->plan.cExecuteActions; | ||
536 | 527 | ||
537 | // Schedule the update of related bundles last. | 528 | // Plan the related bundles first to support downgrades with ref-counting. |
538 | hr = PlanRelatedBundlesComplete(&pEngineState->registration, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, &hSyncpointEvent, dwExecuteActionEarlyIndex); | 529 | hr = PlanRelatedBundlesBegin(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->plan); |
539 | ExitOnFailure(hr, "Failed to schedule related bundles."); | 530 | ExitOnFailure(hr, "Failed to plan related bundles."); |
531 | |||
532 | hr = PlanPackages(&pEngineState->userExperience, &pEngineState->packages, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->command.relationType, NULL, &hSyncpointEvent); | ||
533 | ExitOnFailure(hr, "Failed to plan packages."); | ||
534 | |||
535 | // Schedule the update of related bundles last. | ||
536 | hr = PlanRelatedBundlesComplete(&pEngineState->registration, &pEngineState->plan, &pEngineState->log, &pEngineState->variables, &hSyncpointEvent, dwExecuteActionEarlyIndex); | ||
537 | ExitOnFailure(hr, "Failed to schedule related bundles."); | ||
538 | } | ||
540 | } | 539 | } |
541 | } | 540 | } |
542 | 541 | ||