aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/core.cpp
diff options
context:
space:
mode:
authorBob Arnson <bob@firegiant.com>2026-02-04 20:47:04 -0500
committerBob Arnson <bob@firegiant.com>2026-02-04 20:47:04 -0500
commitedccb203c421d2bd820062024088c6698424d9ee (patch)
tree6b47c3eb5ca53bd9f79f3d032dc1a596d411bf38 /src/burn/engine/core.cpp
parenta3d3963f806117ce123d95e8b77e73e1c1545b25 (diff)
downloadwix-edccb203c421d2bd820062024088c6698424d9ee.tar.gz
wix-edccb203c421d2bd820062024088c6698424d9ee.tar.bz2
wix-edccb203c421d2bd820062024088c6698424d9ee.zip
Support dual-purpose packages in Burn.bob/ConfigurableScopeBundles
Fixes https://github.com/wixtoolset/issues/issues/8958
Diffstat (limited to 'src/burn/engine/core.cpp')
-rw-r--r--src/burn/engine/core.cpp42
1 files changed, 33 insertions, 9 deletions
diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp
index 2dfa4857..7937bd65 100644
--- a/src/burn/engine/core.cpp
+++ b/src/burn/engine/core.cpp
@@ -379,7 +379,7 @@ extern "C" HRESULT CoreDetect(
379 pEngineState->registration.fEligibleForCleanup = FALSE; 379 pEngineState->registration.fEligibleForCleanup = FALSE;
380 } 380 }
381 381
382 LogId(REPORT_STANDARD, MSG_DETECTED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingBoolToString(pPackage->fCached), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->installRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->cacheRegistrationState)); 382 LogId(REPORT_STANDARD, MSG_DETECTED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingBoolToString(pPackage->fCached), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->installRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->cacheRegistrationState), LoggingPackageScopeToString(pPackage->scope));
383 383
384 if (BURN_PACKAGE_TYPE_MSI == pPackage->type) 384 if (BURN_PACKAGE_TYPE_MSI == pPackage->type)
385 { 385 {
@@ -424,8 +424,9 @@ LExit:
424 424
425extern "C" HRESULT CorePlan( 425extern "C" HRESULT CorePlan(
426 __in BURN_ENGINE_STATE* pEngineState, 426 __in BURN_ENGINE_STATE* pEngineState,
427 __in BOOTSTRAPPER_ACTION action 427 __in BOOTSTRAPPER_ACTION action,
428 ) 428 __in BOOTSTRAPPER_SCOPE plannedScope
429)
429{ 430{
430 HRESULT hr = S_OK; 431 HRESULT hr = S_OK;
431 BOOL fPlanBegan = FALSE; 432 BOOL fPlanBegan = FALSE;
@@ -433,7 +434,7 @@ extern "C" HRESULT CorePlan(
433 BURN_PACKAGE* pForwardCompatibleBundlePackage = NULL; 434 BURN_PACKAGE* pForwardCompatibleBundlePackage = NULL;
434 BOOL fContinuePlanning = TRUE; // assume we won't skip planning due to dependencies. 435 BOOL fContinuePlanning = TRUE; // assume we won't skip planning due to dependencies.
435 436
436 LogId(REPORT_STANDARD, MSG_PLAN_BEGIN, pEngineState->packages.cPackages, LoggingBurnActionToString(action)); 437 LogId(REPORT_STANDARD, MSG_PLAN_BEGIN, pEngineState->packages.cPackages, LoggingBurnActionToString(action), LoggingBundleScopeToString(plannedScope));
437 438
438 fPlanBegan = TRUE; 439 fPlanBegan = TRUE;
439 hr = BACallbackOnPlanBegin(&pEngineState->userExperience, pEngineState->packages.cPackages); 440 hr = BACallbackOnPlanBegin(&pEngineState->userExperience, pEngineState->packages.cPackages);
@@ -452,12 +453,13 @@ extern "C" HRESULT CorePlan(
452 pEngineState->fPlanned = FALSE; 453 pEngineState->fPlanned = FALSE;
453 PlanReset(&pEngineState->plan, &pEngineState->variables, &pEngineState->containers, &pEngineState->packages, &pEngineState->layoutPayloads); 454 PlanReset(&pEngineState->plan, &pEngineState->variables, &pEngineState->containers, &pEngineState->packages, &pEngineState->layoutPayloads);
454 455
455 hr = PlanSetVariables(action, &pEngineState->variables); 456 hr = PlanSetVariables(action, pEngineState->registration.scope, pEngineState->plan.plannedScope, &pEngineState->variables);
456 ExitOnFailure(hr, "Failed to update action."); 457 ExitOnFailure(hr, "Failed to update plan variables.");
457 458
458 // Remember the overall action state in the plan since it shapes the changes 459 // Remember the overall action state in the plan since it shapes the changes
459 // we make everywhere. 460 // we make everywhere.
460 pEngineState->plan.action = action; 461 pEngineState->plan.action = action;
462 pEngineState->plan.plannedScope = plannedScope;
461 pEngineState->plan.pCache = &pEngineState->cache; 463 pEngineState->plan.pCache = &pEngineState->cache;
462 pEngineState->plan.pCommand = &pEngineState->command; 464 pEngineState->plan.pCommand = &pEngineState->command;
463 pEngineState->plan.pInternalCommand = &pEngineState->internalCommand; 465 pEngineState->plan.pInternalCommand = &pEngineState->internalCommand;
@@ -467,6 +469,17 @@ extern "C" HRESULT CorePlan(
467 pEngineState->plan.fDisableRollback = pEngineState->fDisableRollback || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == pEngineState->plan.action; 469 pEngineState->plan.fDisableRollback = pEngineState->fDisableRollback || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == pEngineState->plan.action;
468 pEngineState->plan.fPlanPackageCacheRollback = BOOTSTRAPPER_REGISTRATION_TYPE_NONE == pEngineState->registration.detectedRegistrationType; 470 pEngineState->plan.fPlanPackageCacheRollback = BOOTSTRAPPER_REGISTRATION_TYPE_NONE == pEngineState->registration.detectedRegistrationType;
469 471
472 hr = PlanPackagesAndBundleScope(pEngineState->packages.rgPackages, pEngineState->packages.cPackages, pEngineState->plan.plannedScope, pEngineState->registration.scope, pEngineState->command.commandLineScope, &pEngineState->plan.plannedScope, &pEngineState->registration.fPerMachine);
473 ExitOnFailure(hr, "Failed to determine packages and bundle scope.");
474
475 if (BOOTSTRAPPER_PACKAGE_SCOPE_PER_MACHINE_OR_PER_USER == pEngineState->registration.scope || BOOTSTRAPPER_PACKAGE_SCOPE_PER_USER_OR_PER_MACHINE == pEngineState->registration.scope)
476 {
477 LogId(REPORT_STANDARD, MSG_PLAN_CONFIGURED_SCOPE, LoggingInstallScopeToString(pEngineState->registration.fPerMachine));
478 }
479
480 hr = RegistrationSetPaths(&pEngineState->registration, &pEngineState->cache);
481 ExitOnFailure(hr, "Failed to set registration paths.");
482
470 // Set resume commandline 483 // Set resume commandline
471 hr = PlanSetResumeCommand(&pEngineState->plan, &pEngineState->registration, &pEngineState->log); 484 hr = PlanSetResumeCommand(&pEngineState->plan, &pEngineState->registration, &pEngineState->log);
472 ExitOnFailure(hr, "Failed to set resume command"); 485 ExitOnFailure(hr, "Failed to set resume command");
@@ -475,7 +488,7 @@ extern "C" HRESULT CorePlan(
475 ExitOnFailure(hr, "Failed to initialize the dependencies for the plan."); 488 ExitOnFailure(hr, "Failed to initialize the dependencies for the plan.");
476 489
477 hr = RegistrationPlanInitialize(&pEngineState->registration); 490 hr = RegistrationPlanInitialize(&pEngineState->registration);
478 ExitOnFailure(hr, "Failed to initialize registration for the plan."); 491 ExitOnFailure(hr, "Failed to initialize the plan for registration.");
479 492
480 if (BOOTSTRAPPER_ACTION_LAYOUT == action) 493 if (BOOTSTRAPPER_ACTION_LAYOUT == action)
481 { 494 {
@@ -556,6 +569,9 @@ extern "C" HRESULT CorePlan(
556 LogPackages(pUpgradeBundlePackage, pForwardCompatibleBundlePackage, &pEngineState->packages, &pEngineState->registration.relatedBundles, action); 569 LogPackages(pUpgradeBundlePackage, pForwardCompatibleBundlePackage, &pEngineState->packages, &pEngineState->registration.relatedBundles, action);
557 } 570 }
558 571
572 hr = PlanSetVariables(action, pEngineState->registration.scope, pEngineState->plan.plannedScope, &pEngineState->variables);
573 ExitOnFailure(hr, "Failed to update plan variables after planning.");
574
559 PlanDump(&pEngineState->plan); 575 PlanDump(&pEngineState->plan);
560 576
561LExit: 577LExit:
@@ -1331,7 +1347,7 @@ extern "C" void CoreCleanup(
1331 ExitFunction(); 1347 ExitFunction();
1332 } 1348 }
1333 1349
1334 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL); 1350 hr = CorePlan(pEngineState, BOOTSTRAPPER_ACTION_UNINSTALL, BOOTSTRAPPER_SCOPE_DEFAULT);
1335 ExitOnFailure(hr, "Plan during cleanup failed"); 1351 ExitOnFailure(hr, "Plan during cleanup failed");
1336 1352
1337 hr = CoreApply(pEngineState, pEngineState->hMessageWindow); 1353 hr = CoreApply(pEngineState, pEngineState->hMessageWindow);
@@ -1470,6 +1486,14 @@ extern "C" HRESULT CoreParseCommandLine(
1470 { 1486 {
1471 pInternalCommand->fDisableSystemRestore = TRUE; 1487 pInternalCommand->fDisableSystemRestore = TRUE;
1472 } 1488 }
1489 else if (CSTR_EQUAL == ::CompareStringOrdinal(&argv[i][1], -1, L"peruser", -1, TRUE))
1490 {
1491 pCommand->commandLineScope = BOOTSTRAPPER_SCOPE_PER_USER;
1492 }
1493 else if (CSTR_EQUAL == ::CompareStringOrdinal(&argv[i][1], -1, L"permachine", -1, TRUE))
1494 {
1495 pCommand->commandLineScope = BOOTSTRAPPER_SCOPE_PER_MACHINE;
1496 }
1473 else if (CSTR_EQUAL == ::CompareStringOrdinal(&argv[i][1], -1, L"originalsource", -1, TRUE)) 1497 else if (CSTR_EQUAL == ::CompareStringOrdinal(&argv[i][1], -1, L"originalsource", -1, TRUE))
1474 { 1498 {
1475 if (i + 1 >= argc) 1499 if (i + 1 >= argc)
@@ -2346,7 +2370,7 @@ static void LogPackages(
2346 LogRollbackBoundary(pPackage->pRollbackBoundaryBackward); 2370 LogRollbackBoundary(pPackage->pRollbackBoundaryBackward);
2347 } 2371 }
2348 2372
2349 LogId(REPORT_STANDARD, MSG_PLANNED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingRequestStateToString(pPackage->defaultRequested), LoggingRequestStateToString(pPackage->requested), LoggingActionStateToString(pPackage->execute), LoggingActionStateToString(pPackage->rollback), LoggingCacheTypeToString(pPackage->authoredCacheType), LoggingCacheTypeToString(pPackage->cacheType), LoggingPlannedCacheToString(pPackage), LoggingBoolToString(pPackage->fPlannedUncache), LoggingDependencyActionToString(pPackage->dependencyExecute), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedInstallRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedCacheRegistrationState)); 2373 LogId(REPORT_STANDARD, MSG_PLANNED_PACKAGE, pPackage->sczId, LoggingPackageStateToString(pPackage->currentState), LoggingRequestStateToString(pPackage->defaultRequested), LoggingRequestStateToString(pPackage->requested), LoggingActionStateToString(pPackage->execute), LoggingActionStateToString(pPackage->rollback), LoggingCacheTypeToString(pPackage->authoredCacheType), LoggingCacheTypeToString(pPackage->cacheType), LoggingPlannedCacheToString(pPackage), LoggingBoolToString(pPackage->fPlannedUncache), LoggingDependencyActionToString(pPackage->dependencyExecute), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedInstallRegistrationState), LoggingPackageRegistrationStateToString(pPackage->fCanAffectRegistration, pPackage->expectedCacheRegistrationState), LoggingInstallScopeToString(pPackage->fPerMachine));
2350 2374
2351 if (BURN_PACKAGE_TYPE_MSI == pPackage->type) 2375 if (BURN_PACKAGE_TYPE_MSI == pPackage->type)
2352 { 2376 {