summaryrefslogtreecommitdiff
path: root/src/burn/engine/plan.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/plan.cpp')
-rw-r--r--src/burn/engine/plan.cpp161
1 files changed, 124 insertions, 37 deletions
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp
index c9337df5..d3cc60f1 100644
--- a/src/burn/engine/plan.cpp
+++ b/src/burn/engine/plan.cpp
@@ -511,7 +511,7 @@ extern "C" HRESULT PlanForwardCompatibleBundles(
511 511
512 fIgnoreBundle = fRecommendIgnore; 512 fIgnoreBundle = fRecommendIgnore;
513 513
514 hr = UserExperienceOnPlanForwardCompatibleBundle(pUX, pRelatedBundle->package.sczId, pRelatedBundle->relationType, pRelatedBundle->sczTag, pRelatedBundle->package.fPerMachine, pRelatedBundle->pVersion, &fIgnoreBundle); 514 hr = UserExperienceOnPlanForwardCompatibleBundle(pUX, pRelatedBundle->package.sczId, pRelatedBundle->detectRelationType, pRelatedBundle->sczTag, pRelatedBundle->package.fPerMachine, pRelatedBundle->pVersion, &fIgnoreBundle);
515 ExitOnRootFailure(hr, "BA aborted plan forward compatible bundle."); 515 ExitOnRootFailure(hr, "BA aborted plan forward compatible bundle.");
516 516
517 if (!fIgnoreBundle) 517 if (!fIgnoreBundle)
@@ -621,7 +621,8 @@ extern "C" HRESULT PlanRegistration(
621 { 621 {
622 const BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + i; 622 const BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + i;
623 623
624 if (BOOTSTRAPPER_RELATION_DEPENDENT == pRelatedBundle->relationType) 624 if (BOOTSTRAPPER_RELATION_DEPENDENT_ADDON == pRelatedBundle->planRelationType ||
625 BOOTSTRAPPER_RELATION_DEPENDENT_PATCH == pRelatedBundle->planRelationType)
625 { 626 {
626 for (DWORD j = 0; j < pRelatedBundle->package.cDependencyProviders; ++j) 627 for (DWORD j = 0; j < pRelatedBundle->package.cDependencyProviders; ++j)
627 { 628 {
@@ -703,7 +704,8 @@ extern "C" HRESULT PlanRegistration(
703 { 704 {
704 const BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + i; 705 const BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + i;
705 706
706 if (BOOTSTRAPPER_RELATION_DEPENDENT == pRelatedBundle->relationType) 707 if (BOOTSTRAPPER_RELATION_DEPENDENT_ADDON == pRelatedBundle->planRelationType ||
708 BOOTSTRAPPER_RELATION_DEPENDENT_PATCH == pRelatedBundle->planRelationType)
707 { 709 {
708 for (DWORD j = 0; j < pRelatedBundle->package.cDependencyProviders; ++j) 710 for (DWORD j = 0; j < pRelatedBundle->package.cDependencyProviders; ++j)
709 { 711 {
@@ -1212,17 +1214,63 @@ LExit:
1212 return hr; 1214 return hr;
1213} 1215}
1214 1216
1215extern "C" HRESULT PlanDefaultRelatedBundleRequestState( 1217extern "C" HRESULT PlanDefaultRelatedBundlePlanType(
1216 __in BOOTSTRAPPER_RELATION_TYPE commandRelationType,
1217 __in BOOTSTRAPPER_RELATION_TYPE relatedBundleRelationType, 1218 __in BOOTSTRAPPER_RELATION_TYPE relatedBundleRelationType,
1218 __in BOOTSTRAPPER_ACTION action,
1219 __in VERUTIL_VERSION* pRegistrationVersion, 1219 __in VERUTIL_VERSION* pRegistrationVersion,
1220 __in VERUTIL_VERSION* pRelatedBundleVersion, 1220 __in VERUTIL_VERSION* pRelatedBundleVersion,
1221 __inout BOOTSTRAPPER_REQUEST_STATE* pRequestState 1221 __inout BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE* pPlanRelationType
1222 ) 1222 )
1223{ 1223{
1224 HRESULT hr = S_OK; 1224 HRESULT hr = S_OK;
1225 int nCompareResult = 0; 1225 int nCompareResult = 0;
1226
1227 switch (relatedBundleRelationType)
1228 {
1229 case BOOTSTRAPPER_RELATION_UPGRADE:
1230 hr = VerCompareParsedVersions(pRegistrationVersion, pRelatedBundleVersion, &nCompareResult);
1231 ExitOnFailure(hr, "Failed to compare bundle version '%ls' to related bundle version '%ls'", pRegistrationVersion->sczVersion, pRelatedBundleVersion->sczVersion);
1232
1233 if (nCompareResult < 0)
1234 {
1235 *pPlanRelationType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DOWNGRADE;
1236 }
1237 else
1238 {
1239 *pPlanRelationType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_UPGRADE;
1240 }
1241 break;
1242 case BOOTSTRAPPER_RELATION_ADDON:
1243 *pPlanRelationType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_ADDON;
1244 break;
1245 case BOOTSTRAPPER_RELATION_PATCH:
1246 *pPlanRelationType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_PATCH;
1247 break;
1248 case BOOTSTRAPPER_RELATION_DEPENDENT_ADDON:
1249 *pPlanRelationType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_ADDON;
1250 break;
1251 case BOOTSTRAPPER_RELATION_DEPENDENT_PATCH:
1252 *pPlanRelationType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_PATCH;
1253 break;
1254 case BOOTSTRAPPER_RELATION_DETECT:
1255 break;
1256 default:
1257 hr = E_UNEXPECTED;
1258 ExitOnFailure(hr, "Unexpected relation type encountered during plan: %d", relatedBundleRelationType);
1259 break;
1260 }
1261
1262LExit:
1263 return hr;
1264}
1265
1266extern "C" HRESULT PlanDefaultRelatedBundleRequestState(
1267 __in BOOTSTRAPPER_RELATION_TYPE commandRelationType,
1268 __in BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE relatedBundleRelationType,
1269 __in BOOTSTRAPPER_ACTION action,
1270 __inout BOOTSTRAPPER_REQUEST_STATE* pRequestState
1271 )
1272{
1273 HRESULT hr = S_OK;
1226 BOOL fUninstalling = BOOTSTRAPPER_ACTION_UNINSTALL == action || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == action; 1274 BOOL fUninstalling = BOOTSTRAPPER_ACTION_UNINSTALL == action || BOOTSTRAPPER_ACTION_UNSAFE_UNINSTALL == action;
1227 1275
1228 // Never touch related bundles during Cache. 1276 // Never touch related bundles during Cache.
@@ -1233,17 +1281,14 @@ extern "C" HRESULT PlanDefaultRelatedBundleRequestState(
1233 1281
1234 switch (relatedBundleRelationType) 1282 switch (relatedBundleRelationType)
1235 { 1283 {
1236 case BOOTSTRAPPER_RELATION_UPGRADE: 1284 case BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_UPGRADE:
1237 if (BOOTSTRAPPER_RELATION_UPGRADE != commandRelationType && !fUninstalling) 1285 if (BOOTSTRAPPER_RELATION_UPGRADE != commandRelationType && !fUninstalling)
1238 { 1286 {
1239 hr = VerCompareParsedVersions(pRegistrationVersion, pRelatedBundleVersion, &nCompareResult); 1287 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_ABSENT;
1240 ExitOnFailure(hr, "Failed to compare bundle version '%ls' to related bundle version '%ls'", pRegistrationVersion ? pRegistrationVersion->sczVersion : NULL, pRelatedBundleVersion ? pRelatedBundleVersion->sczVersion : NULL);
1241
1242 *pRequestState = (nCompareResult < 0) ? BOOTSTRAPPER_REQUEST_STATE_NONE : BOOTSTRAPPER_REQUEST_STATE_ABSENT;
1243 } 1288 }
1244 break; 1289 break;
1245 case BOOTSTRAPPER_RELATION_PATCH: __fallthrough; 1290 case BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_PATCH: __fallthrough;
1246 case BOOTSTRAPPER_RELATION_ADDON: 1291 case BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_ADDON:
1247 if (fUninstalling) 1292 if (fUninstalling)
1248 { 1293 {
1249 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_ABSENT; 1294 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_ABSENT;
@@ -1257,7 +1302,8 @@ extern "C" HRESULT PlanDefaultRelatedBundleRequestState(
1257 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_REPAIR; 1302 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_REPAIR;
1258 } 1303 }
1259 break; 1304 break;
1260 case BOOTSTRAPPER_RELATION_DEPENDENT: 1305 case BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_ADDON: __fallthrough;
1306 case BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_PATCH:
1261 // Automatically repair dependent bundles to restore missing 1307 // Automatically repair dependent bundles to restore missing
1262 // packages after uninstall unless we're being upgraded with the 1308 // packages after uninstall unless we're being upgraded with the
1263 // assumption that upgrades are cumulative (as intended). 1309 // assumption that upgrades are cumulative (as intended).
@@ -1266,11 +1312,12 @@ extern "C" HRESULT PlanDefaultRelatedBundleRequestState(
1266 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_REPAIR; 1312 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_REPAIR;
1267 } 1313 }
1268 break; 1314 break;
1269 case BOOTSTRAPPER_RELATION_DETECT: 1315 case BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DOWNGRADE: __fallthrough;
1316 case BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_NONE:
1270 break; 1317 break;
1271 default: 1318 default:
1272 hr = E_UNEXPECTED; 1319 hr = E_UNEXPECTED;
1273 ExitOnFailure(hr, "Unexpected relation type encountered during plan: %d", relatedBundleRelationType); 1320 ExitOnFailure(hr, "Unexpected plan relation type encountered during plan: %d", relatedBundleRelationType);
1274 break; 1321 break;
1275 } 1322 }
1276 1323
@@ -1278,6 +1325,45 @@ LExit:
1278 return hr; 1325 return hr;
1279} 1326}
1280 1327
1328extern "C" HRESULT PlanRelatedBundlesInitialize(
1329 __in BURN_USER_EXPERIENCE* pUserExperience,
1330 __in BURN_REGISTRATION* pRegistration,
1331 __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/,
1332 __in BURN_PLAN* /*pPlan*/
1333 )
1334{
1335 HRESULT hr = S_OK;
1336
1337 for (DWORD i = 0; i < pRegistration->relatedBundles.cRelatedBundles; ++i)
1338 {
1339 BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + i;
1340
1341 pRelatedBundle->defaultRequestedRestore = BOOTSTRAPPER_REQUEST_STATE_NONE;
1342 pRelatedBundle->requestedRestore = BOOTSTRAPPER_REQUEST_STATE_NONE;
1343 pRelatedBundle->restore = BOOTSTRAPPER_ACTION_STATE_NONE;
1344 pRelatedBundle->package.defaultRequested = BOOTSTRAPPER_REQUEST_STATE_NONE;
1345 pRelatedBundle->package.requested = BOOTSTRAPPER_REQUEST_STATE_NONE;
1346 pRelatedBundle->defaultPlanRelationType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_NONE;
1347 pRelatedBundle->planRelationType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_NONE;
1348
1349 // Determine the plan relation type even if later it is ignored due to the planned action, the command relation type, or the related bundle not being plannable.
1350 // This gives more information to the BA in case it wants to override default behavior.
1351 // Doing it during plan instead of Detect allows the BA to change its mind without having to go all the way through Detect again.
1352 hr = PlanDefaultRelatedBundlePlanType(pRelatedBundle->detectRelationType, pRegistration->pVersion, pRelatedBundle->pVersion, &pRelatedBundle->defaultPlanRelationType);
1353 ExitOnFailure(hr, "Failed to get default plan type for related bundle.");
1354
1355 pRelatedBundle->planRelationType = pRelatedBundle->defaultPlanRelationType;
1356
1357 hr = UserExperienceOnPlanRelatedBundleType(pUserExperience, pRelatedBundle->package.sczId, &pRelatedBundle->planRelationType);
1358 ExitOnRootFailure(hr, "BA aborted plan related bundle type.");
1359 }
1360
1361 RelatedBundlesSortPlan(&pRegistration->relatedBundles);
1362
1363LExit:
1364 return hr;
1365}
1366
1281extern "C" HRESULT PlanRelatedBundlesBegin( 1367extern "C" HRESULT PlanRelatedBundlesBegin(
1282 __in BURN_USER_EXPERIENCE* pUserExperience, 1368 __in BURN_USER_EXPERIENCE* pUserExperience,
1283 __in BURN_REGISTRATION* pRegistration, 1369 __in BURN_REGISTRATION* pRegistration,
@@ -1302,18 +1388,15 @@ extern "C" HRESULT PlanRelatedBundlesBegin(
1302 1388
1303 for (DWORD i = 0; i < pRegistration->relatedBundles.cRelatedBundles; ++i) 1389 for (DWORD i = 0; i < pRegistration->relatedBundles.cRelatedBundles; ++i)
1304 { 1390 {
1305 BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + i; 1391 BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgpPlanSortedRelatedBundles[i];
1306 1392
1307 if (!pRelatedBundle->fPlannable) 1393 if (!pRelatedBundle->fPlannable)
1308 { 1394 {
1309 continue; 1395 continue;
1310 } 1396 }
1311 1397
1312 pRelatedBundle->defaultRequestedRestore = BOOTSTRAPPER_REQUEST_STATE_NONE; 1398 BOOL fDependent = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_ADDON == pRelatedBundle->planRelationType ||
1313 pRelatedBundle->requestedRestore = BOOTSTRAPPER_REQUEST_STATE_NONE; 1399 BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_PATCH == pRelatedBundle->planRelationType;
1314 pRelatedBundle->restore = BOOTSTRAPPER_ACTION_STATE_NONE;
1315 pRelatedBundle->package.defaultRequested = BOOTSTRAPPER_REQUEST_STATE_NONE;
1316 pRelatedBundle->package.requested = BOOTSTRAPPER_REQUEST_STATE_NONE;
1317 1400
1318 // Do not execute the same bundle twice. 1401 // Do not execute the same bundle twice.
1319 if (sdAncestors) 1402 if (sdAncestors)
@@ -1321,7 +1404,7 @@ extern "C" HRESULT PlanRelatedBundlesBegin(
1321 hr = DictKeyExists(sdAncestors, pRelatedBundle->package.sczId); 1404 hr = DictKeyExists(sdAncestors, pRelatedBundle->package.sczId);
1322 if (SUCCEEDED(hr)) 1405 if (SUCCEEDED(hr))
1323 { 1406 {
1324 LogId(REPORT_STANDARD, MSG_PLAN_SKIPPED_RELATED_BUNDLE_SCHEDULED, pRelatedBundle->package.sczId, LoggingRelationTypeToString(pRelatedBundle->relationType)); 1407 LogId(REPORT_STANDARD, MSG_PLAN_SKIPPED_RELATED_BUNDLE_SCHEDULED, pRelatedBundle->package.sczId);
1325 continue; 1408 continue;
1326 } 1409 }
1327 else if (E_NOTFOUND != hr) 1410 else if (E_NOTFOUND != hr)
@@ -1329,10 +1412,10 @@ extern "C" HRESULT PlanRelatedBundlesBegin(
1329 ExitOnFailure(hr, "Failed to lookup the bundle ID in the ancestors dictionary."); 1412 ExitOnFailure(hr, "Failed to lookup the bundle ID in the ancestors dictionary.");
1330 } 1413 }
1331 } 1414 }
1332 else if (BOOTSTRAPPER_RELATION_DEPENDENT == pRelatedBundle->relationType && BOOTSTRAPPER_RELATION_NONE != relationType) 1415 else if (fDependent && BOOTSTRAPPER_RELATION_NONE != relationType)
1333 { 1416 {
1334 // Avoid repair loops for older bundles that do not handle ancestors. 1417 // Avoid repair loops for older bundles that do not handle ancestors.
1335 LogId(REPORT_STANDARD, MSG_PLAN_SKIPPED_RELATED_BUNDLE_DEPENDENT, pRelatedBundle->package.sczId, LoggingRelationTypeToString(pRelatedBundle->relationType), LoggingRelationTypeToString(relationType)); 1418 LogId(REPORT_STANDARD, MSG_PLAN_SKIPPED_RELATED_BUNDLE_DEPENDENT, pRelatedBundle->package.sczId, LoggingRelationTypeToString(relationType));
1336 continue; 1419 continue;
1337 } 1420 }
1338 1421
@@ -1340,7 +1423,7 @@ extern "C" HRESULT PlanRelatedBundlesBegin(
1340 pRelatedBundle->package.Bundle.wzAncestors = pRegistration->sczBundlePackageAncestors; 1423 pRelatedBundle->package.Bundle.wzAncestors = pRegistration->sczBundlePackageAncestors;
1341 pRelatedBundle->package.Bundle.wzEngineWorkingDirectory = pPlan->pInternalCommand->sczEngineWorkingDirectory; 1424 pRelatedBundle->package.Bundle.wzEngineWorkingDirectory = pPlan->pInternalCommand->sczEngineWorkingDirectory;
1342 1425
1343 hr = PlanDefaultRelatedBundleRequestState(relationType, pRelatedBundle->relationType, pPlan->action, pRegistration->pVersion, pRelatedBundle->pVersion, &pRelatedBundle->package.requested); 1426 hr = PlanDefaultRelatedBundleRequestState(relationType, pRelatedBundle->planRelationType, pPlan->action, &pRelatedBundle->package.requested);
1344 ExitOnFailure(hr, "Failed to get default request state for related bundle."); 1427 ExitOnFailure(hr, "Failed to get default request state for related bundle.");
1345 1428
1346 pRelatedBundle->package.defaultRequested = pRelatedBundle->package.requested; 1429 pRelatedBundle->package.defaultRequested = pRelatedBundle->package.requested;
@@ -1349,7 +1432,7 @@ extern "C" HRESULT PlanRelatedBundlesBegin(
1349 ExitOnRootFailure(hr, "BA aborted plan related bundle."); 1432 ExitOnRootFailure(hr, "BA aborted plan related bundle.");
1350 1433
1351 // If uninstalling and the dependent related bundle may be executed, ignore its provider key to allow for downgrades with ref-counting. 1434 // If uninstalling and the dependent related bundle may be executed, ignore its provider key to allow for downgrades with ref-counting.
1352 if (fUninstalling && BOOTSTRAPPER_RELATION_DEPENDENT == pRelatedBundle->relationType && BOOTSTRAPPER_REQUEST_STATE_NONE != pRelatedBundle->package.requested) 1435 if (fUninstalling && fDependent && BOOTSTRAPPER_REQUEST_STATE_NONE != pRelatedBundle->package.requested)
1353 { 1436 {
1354 if (0 < pRelatedBundle->package.cDependencyProviders) 1437 if (0 < pRelatedBundle->package.cDependencyProviders)
1355 { 1438 {
@@ -1437,7 +1520,11 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1437 for (DWORD i = 0; i < pRegistration->relatedBundles.cRelatedBundles; ++i) 1520 for (DWORD i = 0; i < pRegistration->relatedBundles.cRelatedBundles; ++i)
1438 { 1521 {
1439 DWORD *pdwInsertIndex = NULL; 1522 DWORD *pdwInsertIndex = NULL;
1440 BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + i; 1523 BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgpPlanSortedRelatedBundles[i];
1524 BOOL fDependent = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_ADDON == pRelatedBundle->planRelationType ||
1525 BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_DEPENDENT_PATCH == pRelatedBundle->planRelationType;
1526 BOOL fAddonOrPatch = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_ADDON == pRelatedBundle->planRelationType ||
1527 BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_PATCH == pRelatedBundle->planRelationType;
1441 1528
1442 if (!pRelatedBundle->fPlannable) 1529 if (!pRelatedBundle->fPlannable)
1443 { 1530 {
@@ -1454,7 +1541,7 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1454 { 1541 {
1455 ExitOnFailure(hr, "Failed to check the dictionary for a related bundle provider key: \"%ls\".", pProvider->sczKey); 1542 ExitOnFailure(hr, "Failed to check the dictionary for a related bundle provider key: \"%ls\".", pProvider->sczKey);
1456 // Key found, so there is an embedded bundle with the same provider key that will be executed. So this related bundle should not be added to the plan 1543 // Key found, so there is an embedded bundle with the same provider key that will be executed. So this related bundle should not be added to the plan
1457 LogId(REPORT_STANDARD, MSG_PLAN_SKIPPED_RELATED_BUNDLE_EMBEDDED_BUNDLE_NEWER, pRelatedBundle->package.sczId, LoggingRelationTypeToString(pRelatedBundle->relationType), pProvider->sczKey); 1544 LogId(REPORT_STANDARD, MSG_PLAN_SKIPPED_RELATED_BUNDLE_EMBEDDED_BUNDLE_NEWER, pRelatedBundle->package.sczId, pProvider->sczKey);
1458 continue; 1545 continue;
1459 } 1546 }
1460 else 1547 else
@@ -1464,13 +1551,13 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1464 } 1551 }
1465 1552
1466 // For an uninstall, there is no need to repair dependent bundles if no packages are executing. 1553 // For an uninstall, there is no need to repair dependent bundles if no packages are executing.
1467 if (!fExecutingAnyPackage && BOOTSTRAPPER_RELATION_DEPENDENT == pRelatedBundle->relationType && BOOTSTRAPPER_REQUEST_STATE_REPAIR == pRelatedBundle->package.requested && fUninstalling) 1554 if (!fExecutingAnyPackage && fDependent && BOOTSTRAPPER_REQUEST_STATE_REPAIR == pRelatedBundle->package.requested && fUninstalling)
1468 { 1555 {
1469 pRelatedBundle->package.requested = BOOTSTRAPPER_REQUEST_STATE_NONE; 1556 pRelatedBundle->package.requested = BOOTSTRAPPER_REQUEST_STATE_NONE;
1470 LogId(REPORT_STANDARD, MSG_PLAN_SKIPPED_DEPENDENT_BUNDLE_REPAIR, pRelatedBundle->package.sczId, LoggingRelationTypeToString(pRelatedBundle->relationType)); 1557 LogId(REPORT_STANDARD, MSG_PLAN_SKIPPED_DEPENDENT_BUNDLE_REPAIR, pRelatedBundle->package.sczId);
1471 } 1558 }
1472 1559
1473 if (BOOTSTRAPPER_RELATION_ADDON == pRelatedBundle->relationType || BOOTSTRAPPER_RELATION_PATCH == pRelatedBundle->relationType) 1560 if (fAddonOrPatch)
1474 { 1561 {
1475 // Addon and patch bundles will be passed a list of dependencies to ignore for planning. 1562 // Addon and patch bundles will be passed a list of dependencies to ignore for planning.
1476 hr = StrAllocString(&pRelatedBundle->package.Bundle.sczIgnoreDependencies, sczIgnoreDependencies, 0); 1563 hr = StrAllocString(&pRelatedBundle->package.Bundle.sczIgnoreDependencies, sczIgnoreDependencies, 0);
@@ -1489,7 +1576,7 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1489 ExitOnFailure(hr, "Failed to calculate plan for related bundle: %ls", pRelatedBundle->package.sczId); 1576 ExitOnFailure(hr, "Failed to calculate plan for related bundle: %ls", pRelatedBundle->package.sczId);
1490 1577
1491 // Calculate package states based on reference count for addon and patch related bundles. 1578 // Calculate package states based on reference count for addon and patch related bundles.
1492 if (BOOTSTRAPPER_RELATION_ADDON == pRelatedBundle->relationType || BOOTSTRAPPER_RELATION_PATCH == pRelatedBundle->relationType) 1579 if (fAddonOrPatch)
1493 { 1580 {
1494 hr = DependencyPlanPackageBegin(pRegistration->fPerMachine, &pRelatedBundle->package, pPlan); 1581 hr = DependencyPlanPackageBegin(pRegistration->fPerMachine, &pRelatedBundle->package, pPlan);
1495 ExitOnFailure(hr, "Failed to begin plan dependency actions to package: %ls", pRelatedBundle->package.sczId); 1582 ExitOnFailure(hr, "Failed to begin plan dependency actions to package: %ls", pRelatedBundle->package.sczId);
@@ -1505,7 +1592,7 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1505 ExitOnFailure(hr, "Failed to add to plan related bundle: %ls", pRelatedBundle->package.sczId); 1592 ExitOnFailure(hr, "Failed to add to plan related bundle: %ls", pRelatedBundle->package.sczId);
1506 1593
1507 // Calculate package states based on reference count for addon and patch related bundles. 1594 // Calculate package states based on reference count for addon and patch related bundles.
1508 if (BOOTSTRAPPER_RELATION_ADDON == pRelatedBundle->relationType || BOOTSTRAPPER_RELATION_PATCH == pRelatedBundle->relationType) 1595 if (fAddonOrPatch)
1509 { 1596 {
1510 hr = DependencyPlanPackageComplete(&pRelatedBundle->package, pPlan); 1597 hr = DependencyPlanPackageComplete(&pRelatedBundle->package, pPlan);
1511 ExitOnFailure(hr, "Failed to complete plan dependency actions for related bundle package: %ls", pRelatedBundle->package.sczId); 1598 ExitOnFailure(hr, "Failed to complete plan dependency actions for related bundle package: %ls", pRelatedBundle->package.sczId);
@@ -1517,7 +1604,7 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1517 PlannedExecutePackage(pPlan, &pRelatedBundle->package); 1604 PlannedExecutePackage(pPlan, &pRelatedBundle->package);
1518 } 1605 }
1519 } 1606 }
1520 else if (BOOTSTRAPPER_RELATION_ADDON == pRelatedBundle->relationType || BOOTSTRAPPER_RELATION_PATCH == pRelatedBundle->relationType) 1607 else if (fAddonOrPatch)
1521 { 1608 {
1522 // Make sure the package is properly ref-counted even if no plan is requested. 1609 // Make sure the package is properly ref-counted even if no plan is requested.
1523 hr = DependencyPlanPackageBegin(pRegistration->fPerMachine, &pRelatedBundle->package, pPlan); 1610 hr = DependencyPlanPackageBegin(pRegistration->fPerMachine, &pRelatedBundle->package, pPlan);
@@ -1530,7 +1617,7 @@ extern "C" HRESULT PlanRelatedBundlesComplete(
1530 ExitOnFailure(hr, "Failed to complete plan dependency actions for related bundle package: %ls", pRelatedBundle->package.sczId); 1617 ExitOnFailure(hr, "Failed to complete plan dependency actions for related bundle package: %ls", pRelatedBundle->package.sczId);
1531 } 1618 }
1532 1619
1533 if (fInstallingAnyPackage && BOOTSTRAPPER_RELATION_UPGRADE == pRelatedBundle->relationType) 1620 if (fInstallingAnyPackage && BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_UPGRADE == pRelatedBundle->planRelationType)
1534 { 1621 {
1535 BURN_EXECUTE_ACTION* pAction = NULL; 1622 BURN_EXECUTE_ACTION* pAction = NULL;
1536 1623