diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2022-01-14 21:37:24 -0600 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2022-01-16 10:30:28 -0600 |
commit | da1d1376953ef1c9afb32d5eee02b785e52e372e (patch) | |
tree | 0df8550960259d7b13f5cd90f04d21b5576f16b7 /src/burn/engine/plan.cpp | |
parent | abe316b80fae80eba54b0b79e76b6362105fa098 (diff) | |
download | wix-da1d1376953ef1c9afb32d5eee02b785e52e372e.tar.gz wix-da1d1376953ef1c9afb32d5eee02b785e52e372e.tar.bz2 wix-da1d1376953ef1c9afb32d5eee02b785e52e372e.zip |
Remove orphan compatible MSI packages.
Reimplements #3190
Diffstat (limited to 'src/burn/engine/plan.cpp')
-rw-r--r-- | src/burn/engine/plan.cpp | 83 |
1 files changed, 74 insertions, 9 deletions
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp index e0e9a82b..1dd78773 100644 --- a/src/burn/engine/plan.cpp +++ b/src/burn/engine/plan.cpp | |||
@@ -96,6 +96,10 @@ static HRESULT AppendRollbackCacheAction( | |||
96 | __in BURN_PLAN* pPlan, | 96 | __in BURN_PLAN* pPlan, |
97 | __out BURN_CACHE_ACTION** ppCacheAction | 97 | __out BURN_CACHE_ACTION** ppCacheAction |
98 | ); | 98 | ); |
99 | static HRESULT AppendCleanAction( | ||
100 | __in BURN_PLAN* pPlan, | ||
101 | __out BURN_CLEAN_ACTION** ppCleanAction | ||
102 | ); | ||
99 | static HRESULT ProcessPayloadGroup( | 103 | static HRESULT ProcessPayloadGroup( |
100 | __in BURN_PLAN* pPlan, | 104 | __in BURN_PLAN* pPlan, |
101 | __in BURN_PAYLOAD_GROUP* pPayloadGroup | 105 | __in BURN_PAYLOAD_GROUP* pPayloadGroup |
@@ -286,6 +290,10 @@ extern "C" void PlanUninitializeExecuteAction( | |||
286 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY: | 290 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY: |
287 | ReleaseStr(pExecuteAction->packageDependency.sczBundleProviderKey); | 291 | ReleaseStr(pExecuteAction->packageDependency.sczBundleProviderKey); |
288 | break; | 292 | break; |
293 | |||
294 | case BURN_EXECUTE_ACTION_TYPE_UNINSTALL_MSI_COMPATIBLE_PACKAGE: | ||
295 | ReleaseStr(pExecuteAction->uninstallMsiCompatiblePackage.sczLogPath); | ||
296 | break; | ||
289 | } | 297 | } |
290 | } | 298 | } |
291 | 299 | ||
@@ -823,6 +831,11 @@ static HRESULT PlanPackagesHelper( | |||
823 | BURN_PACKAGE* pPackage = rgPackages + iPackage; | 831 | BURN_PACKAGE* pPackage = rgPackages + iPackage; |
824 | 832 | ||
825 | UserExperienceOnPlannedPackage(pUX, pPackage->sczId, pPackage->execute, pPackage->rollback, pPackage->fPlannedCache, pPackage->fPlannedUncache); | 833 | UserExperienceOnPlannedPackage(pUX, pPackage->sczId, pPackage->execute, pPackage->rollback, pPackage->fPlannedCache, pPackage->fPlannedUncache); |
834 | |||
835 | if (pPackage->compatiblePackage.fPlannable) | ||
836 | { | ||
837 | UserExperienceOnPlannedCompatiblePackage(pUX, pPackage->sczId, pPackage->compatiblePackage.compatibleEntry.sczId, pPackage->compatiblePackage.fRemove); | ||
838 | } | ||
826 | } | 839 | } |
827 | 840 | ||
828 | LExit: | 841 | LExit: |
@@ -878,7 +891,7 @@ static HRESULT InitializePackage( | |||
878 | 891 | ||
879 | if (BURN_PACKAGE_TYPE_MSI == pPackage->type) | 892 | if (BURN_PACKAGE_TYPE_MSI == pPackage->type) |
880 | { | 893 | { |
881 | hr = MsiEnginePlanInitializePackage(pPackage, pVariables, pUX); | 894 | hr = MsiEnginePlanInitializePackage(pPackage, pPlan->action, pVariables, pUX); |
882 | ExitOnFailure(hr, "Failed to initialize plan package: %ls", pPackage->sczId); | 895 | ExitOnFailure(hr, "Failed to initialize plan package: %ls", pPackage->sczId); |
883 | } | 896 | } |
884 | 897 | ||
@@ -918,7 +931,7 @@ static HRESULT ProcessPackage( | |||
918 | } | 931 | } |
919 | else | 932 | else |
920 | { | 933 | { |
921 | if (BOOTSTRAPPER_REQUEST_STATE_NONE != pPackage->requested) | 934 | if (BOOTSTRAPPER_REQUEST_STATE_NONE != pPackage->requested || pPackage->compatiblePackage.fRequested) |
922 | { | 935 | { |
923 | // If the package is in a requested state, plan it. | 936 | // If the package is in a requested state, plan it. |
924 | hr = PlanExecutePackage(fBundlePerMachine, pUX, pPlan, pPackage, pLog, pVariables); | 937 | hr = PlanExecutePackage(fBundlePerMachine, pUX, pPlan, pPackage, pLog, pVariables); |
@@ -1151,7 +1164,7 @@ extern "C" HRESULT PlanExecutePackage( | |||
1151 | ExitOnFailure(hr, "Failed to complete plan dependency actions for package: %ls", pPackage->sczId); | 1164 | ExitOnFailure(hr, "Failed to complete plan dependency actions for package: %ls", pPackage->sczId); |
1152 | 1165 | ||
1153 | // If we are going to take any action on this package, add progress for it. | 1166 | // If we are going to take any action on this package, add progress for it. |
1154 | if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->execute || BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->rollback) | 1167 | if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->execute || BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->rollback || pPackage->compatiblePackage.fRemove) |
1155 | { | 1168 | { |
1156 | LoggingIncrementPackageSequence(); | 1169 | LoggingIncrementPackageSequence(); |
1157 | 1170 | ||
@@ -1560,12 +1573,10 @@ extern "C" HRESULT PlanCleanPackage( | |||
1560 | 1573 | ||
1561 | if (fPlanCleanPackage) | 1574 | if (fPlanCleanPackage) |
1562 | { | 1575 | { |
1563 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pPlan->rgCleanActions), pPlan->cCleanActions + 1, sizeof(BURN_CLEAN_ACTION), 5); | 1576 | hr = AppendCleanAction(pPlan, &pCleanAction); |
1564 | ExitOnFailure(hr, "Failed to grow plan's array of clean actions."); | 1577 | ExitOnFailure(hr, "Failed to append clean action to plan."); |
1565 | |||
1566 | pCleanAction = pPlan->rgCleanActions + pPlan->cCleanActions; | ||
1567 | ++pPlan->cCleanActions; | ||
1568 | 1578 | ||
1579 | pCleanAction->type = BURN_CLEAN_ACTION_TYPE_PACKAGE; | ||
1569 | pCleanAction->pPackage = pPackage; | 1580 | pCleanAction->pPackage = pPackage; |
1570 | 1581 | ||
1571 | pPackage->fPlannedUncache = TRUE; | 1582 | pPackage->fPlannedUncache = TRUE; |
@@ -1576,6 +1587,15 @@ extern "C" HRESULT PlanCleanPackage( | |||
1576 | } | 1587 | } |
1577 | } | 1588 | } |
1578 | 1589 | ||
1590 | if (pPackage->compatiblePackage.fRemove) | ||
1591 | { | ||
1592 | hr = AppendCleanAction(pPlan, &pCleanAction); | ||
1593 | ExitOnFailure(hr, "Failed to append clean action to plan."); | ||
1594 | |||
1595 | pCleanAction->type = BURN_CLEAN_ACTION_TYPE_COMPATIBLE_PACKAGE; | ||
1596 | pCleanAction->pPackage = pPackage; | ||
1597 | } | ||
1598 | |||
1579 | LExit: | 1599 | LExit: |
1580 | return hr; | 1600 | return hr; |
1581 | } | 1601 | } |
@@ -2229,6 +2249,24 @@ LExit: | |||
2229 | return hr; | 2249 | return hr; |
2230 | } | 2250 | } |
2231 | 2251 | ||
2252 | static HRESULT AppendCleanAction( | ||
2253 | __in BURN_PLAN* pPlan, | ||
2254 | __out BURN_CLEAN_ACTION** ppCleanAction | ||
2255 | ) | ||
2256 | { | ||
2257 | HRESULT hr = S_OK; | ||
2258 | |||
2259 | hr = MemEnsureArraySizeForNewItems(reinterpret_cast<LPVOID*>(&pPlan->rgCleanActions), pPlan->cCleanActions, 1, sizeof(BURN_CLEAN_ACTION), 5); | ||
2260 | ExitOnFailure(hr, "Failed to grow plan's array of clean actions."); | ||
2261 | |||
2262 | |||
2263 | *ppCleanAction = pPlan->rgCleanActions + pPlan->cCleanActions; | ||
2264 | ++pPlan->cCleanActions; | ||
2265 | |||
2266 | LExit: | ||
2267 | return hr; | ||
2268 | } | ||
2269 | |||
2232 | static HRESULT ProcessPayloadGroup( | 2270 | static HRESULT ProcessPayloadGroup( |
2233 | __in BURN_PLAN* pPlan, | 2271 | __in BURN_PLAN* pPlan, |
2234 | __in BURN_PAYLOAD_GROUP* pPayloadGroup | 2272 | __in BURN_PAYLOAD_GROUP* pPayloadGroup |
@@ -2505,6 +2543,8 @@ static HRESULT CalculateExecuteActions( | |||
2505 | ExitOnFailure(hr, "Invalid package type."); | 2543 | ExitOnFailure(hr, "Invalid package type."); |
2506 | } | 2544 | } |
2507 | 2545 | ||
2546 | pPackage->compatiblePackage.fRemove = pPackage->compatiblePackage.fPlannable && pPackage->compatiblePackage.fRequested; | ||
2547 | |||
2508 | LExit: | 2548 | LExit: |
2509 | return hr; | 2549 | return hr; |
2510 | } | 2550 | } |
@@ -2622,6 +2662,10 @@ static void ExecuteActionLog( | |||
2622 | } | 2662 | } |
2623 | break; | 2663 | break; |
2624 | 2664 | ||
2665 | case BURN_EXECUTE_ACTION_TYPE_UNINSTALL_MSI_COMPATIBLE_PACKAGE: | ||
2666 | LogStringLine(PlanDumpLevel, "%ls action[%u]: UNINSTALL_MSI_COMPATIBLE_PACKAGE package id: %ls, compatible package id: %ls, cache id: %ls, log path: %ls, logging attrib: %u", wzBase, iAction, pAction->uninstallMsiCompatiblePackage.pParentPackage->sczId, pAction->uninstallMsiCompatiblePackage.pParentPackage->compatiblePackage.compatibleEntry.sczId, pAction->uninstallMsiCompatiblePackage.pParentPackage->compatiblePackage.sczCacheId, pAction->uninstallMsiCompatiblePackage.sczLogPath, pAction->uninstallMsiCompatiblePackage.dwLoggingAttributes); | ||
2667 | break; | ||
2668 | |||
2625 | case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET: | 2669 | case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET: |
2626 | LogStringLine(PlanDumpLevel, "%ls action[%u]: MSP_TARGET package id: %ls, action: %hs, target product code: %ls, target per-machine: %hs, action msi property: %ls, ui level: %u, disable externaluihandler: %hs, file versioning: %hs, log path: %ls", wzBase, iAction, pAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pAction->mspTarget.action), pAction->mspTarget.sczTargetProductCode, LoggingBoolToString(pAction->mspTarget.fPerMachineTarget), LoggingBurnMsiPropertyToString(pAction->mspTarget.actionMsiProperty), pAction->mspTarget.uiLevel, LoggingBoolToString(pAction->mspTarget.fDisableExternalUiHandler), LoggingMsiFileVersioningToString(pAction->mspTarget.fileVersioning), pAction->mspTarget.sczLogPath); | 2670 | LogStringLine(PlanDumpLevel, "%ls action[%u]: MSP_TARGET package id: %ls, action: %hs, target product code: %ls, target per-machine: %hs, action msi property: %ls, ui level: %u, disable externaluihandler: %hs, file versioning: %hs, log path: %ls", wzBase, iAction, pAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pAction->mspTarget.action), pAction->mspTarget.sczTargetProductCode, LoggingBoolToString(pAction->mspTarget.fPerMachineTarget), LoggingBurnMsiPropertyToString(pAction->mspTarget.actionMsiProperty), pAction->mspTarget.uiLevel, LoggingBoolToString(pAction->mspTarget.fDisableExternalUiHandler), LoggingMsiFileVersioningToString(pAction->mspTarget.fileVersioning), pAction->mspTarget.sczLogPath); |
2627 | for (DWORD j = 0; j < pAction->mspTarget.cOrderedPatches; ++j) | 2671 | for (DWORD j = 0; j < pAction->mspTarget.cOrderedPatches; ++j) |
@@ -2669,6 +2713,27 @@ static void ExecuteActionLog( | |||
2669 | } | 2713 | } |
2670 | } | 2714 | } |
2671 | 2715 | ||
2716 | static void CleanActionLog( | ||
2717 | __in DWORD iAction, | ||
2718 | __in BURN_CLEAN_ACTION* pAction | ||
2719 | ) | ||
2720 | { | ||
2721 | switch (pAction->type) | ||
2722 | { | ||
2723 | case BURN_CLEAN_ACTION_TYPE_COMPATIBLE_PACKAGE: | ||
2724 | LogStringLine(PlanDumpLevel, " Clean action[%u]: CLEAN_COMPATIBLE_PACKAGE package id: %ls", iAction, pAction->pPackage->sczId); | ||
2725 | break; | ||
2726 | |||
2727 | case BURN_CLEAN_ACTION_TYPE_PACKAGE: | ||
2728 | LogStringLine(PlanDumpLevel, " Clean action[%u]: CLEAN_PACKAGE package id: %ls", iAction, pAction->pPackage->sczId); | ||
2729 | break; | ||
2730 | |||
2731 | default: | ||
2732 | AssertSz(FALSE, "Unknown clean action type."); | ||
2733 | break; | ||
2734 | } | ||
2735 | } | ||
2736 | |||
2672 | extern "C" void PlanDump( | 2737 | extern "C" void PlanDump( |
2673 | __in BURN_PLAN* pPlan | 2738 | __in BURN_PLAN* pPlan |
2674 | ) | 2739 | ) |
@@ -2709,7 +2774,7 @@ extern "C" void PlanDump( | |||
2709 | 2774 | ||
2710 | for (DWORD i = 0; i < pPlan->cCleanActions; ++i) | 2775 | for (DWORD i = 0; i < pPlan->cCleanActions; ++i) |
2711 | { | 2776 | { |
2712 | LogStringLine(PlanDumpLevel, " Clean action[%u]: CLEAN_PACKAGE package id: %ls", i, pPlan->rgCleanActions[i].pPackage->sczId); | 2777 | CleanActionLog(i, pPlan->rgCleanActions + i); |
2713 | } | 2778 | } |
2714 | 2779 | ||
2715 | for (DWORD i = 0; i < pPlan->cPlannedProviders; ++i) | 2780 | for (DWORD i = 0; i < pPlan->cPlannedProviders; ++i) |