@joebigelow / wix-1 / commits / abe316b8

Refactor some dependency detection.

* Run DependencyDetect earlier * Do package dependency checking during each package/related bundle

Sean Hall committed Jan 14, 2022 at 20:48 UTC abe316b80fae80eba54b0b79e76b6362105fa098
14 files changed +97 -60
src/burn/engine/core.cpp
+9 -18
@@ -342,21 +342,15 @@ extern "C" HRESULT CoreDetect(
342 hr = SearchesExecute(&pEngineState->searches, &pEngineState->variables);
343 ExitOnFailure(hr, "Failed to execute searches.");
344
345 + hr = DependencyDetectBundle(&pEngineState->dependencies, &pEngineState->registration);
346 + ExitOnFailure(hr, "Failed to detect the dependencies.");
347 +
348 // Load all of the related bundles.
349 hr = RegistrationDetectRelatedBundles(&pEngineState->registration);
350 ExitOnFailure(hr, "Failed to detect related bundles.");
351
349 - hr = DependencyDetectProviderKeyBundleId(&pEngineState->registration);
350 - if (SUCCEEDED(hr))
351 - {
352 - hr = DetectForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->registration);
353 - ExitOnFailure(hr, "Failed to detect forward compatible bundle.");
354 - }
355 - else if (E_NOTFOUND == hr)
356 - {
357 - hr = S_OK;
358 - }
359 - ExitOnFailure(hr, "Failed to detect provider key bundle id.");
352 + hr = DetectForwardCompatibleBundles(&pEngineState->userExperience, &pEngineState->registration);
353 + ExitOnFailure(hr, "Failed to detect forward compatible bundle.");
354
355 // Report the related bundles.
356 hr = DetectReportRelatedBundles(&pEngineState->userExperience, &pEngineState->registration, pEngineState->command.relationType, &pEngineState->registration.fEligibleForCleanup);
@@ -398,9 +392,6 @@ extern "C" HRESULT CoreDetect(
392 }
393 }
394
401 - hr = DependencyDetect(&pEngineState->dependencies, &pEngineState->packages, &pEngineState->registration);
402 - ExitOnFailure(hr, "Failed to detect the dependencies.");
403 -
395 // Log the detected states.
396 for (DWORD iPackage = 0; iPackage < pEngineState->packages.cPackages; ++iPackage)
397 {
@@ -2073,19 +2064,19 @@ static HRESULT DetectPackage(
2064 switch (pPackage->type)
2065 {
2066 case BURN_PACKAGE_TYPE_EXE:
2076 - hr = ExeEngineDetectPackage(pPackage, &pEngineState->variables);
2067 + hr = ExeEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->variables);
2068 break;
2069
2070 case BURN_PACKAGE_TYPE_MSI:
2080 - hr = MsiEngineDetectPackage(pPackage, &pEngineState->userExperience);
2071 + hr = MsiEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->userExperience);
2072 break;
2073
2074 case BURN_PACKAGE_TYPE_MSP:
2084 - hr = MspEngineDetectPackage(pPackage, &pEngineState->userExperience);
2075 + hr = MspEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->userExperience);
2076 break;
2077
2078 case BURN_PACKAGE_TYPE_MSU:
2088 - hr = MsuEngineDetectPackage(pPackage, &pEngineState->variables);
2079 + hr = MsuEngineDetectPackage(pPackage, &pEngineState->registration, &pEngineState->variables);
2080 break;
2081
2082 default:
src/burn/engine/dependency.cpp
+39 -34
@@ -12,7 +12,6 @@ const LPCWSTR vcszIgnoreDependenciesDelim = L";";
12
13 static HRESULT DetectPackageDependents(
14 __in BURN_PACKAGE* pPackage,
15 - __in STRINGDICT_HANDLE sdIgnoredDependents,
15 __in const BURN_REGISTRATION* pRegistration
16 );
17
@@ -232,7 +231,8 @@ extern "C" HRESULT DependencyDetectProviderKeyBundleId(
231 hr = DepGetProviderInformation(pRegistration->hkRoot, pRegistration->sczProviderKey, &pRegistration->sczDetectedProviderKeyBundleId, NULL, NULL);
232 if (E_NOTFOUND == hr)
233 {
235 - ExitFunction();
234 + ReleaseNullStr(pRegistration->sczDetectedProviderKeyBundleId);
235 + ExitFunction1(hr = S_OK);
236 }
237 ExitOnFailure(hr, "Failed to get provider key bundle id.");
238
@@ -247,50 +247,26 @@ LExit:
247 return hr;
248 }
249
250 -extern "C" HRESULT DependencyDetect(
250 +extern "C" HRESULT DependencyDetectBundle(
251 __in BURN_DEPENDENCIES* pDependencies,
252 - __in BURN_PACKAGES* pPackages,
252 __in BURN_REGISTRATION* pRegistration
253 )
254 {
255 HRESULT hr = S_OK;
257 - STRINGDICT_HANDLE sdIgnoredDependents = NULL;
258 - BURN_PACKAGE* pPackage = NULL;
256
260 - // Always leave this empty so that all dependents get detected. Plan will ignore dependents based on its own logic.
261 - hr = DictCreateStringList(&sdIgnoredDependents, INITIAL_STRINGDICT_SIZE, DICT_FLAG_CASEINSENSITIVE);
262 - ExitOnFailure(hr, "Failed to create the string dictionary.");
257 + hr = DependencyDetectProviderKeyBundleId(pRegistration);
258 + ExitOnFailure(hr, "Failed to detect provider key bundle id.");
259
264 - hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, sdIgnoredDependents, &pRegistration->rgDependents, &pRegistration->cDependents);
260 + hr = DepCheckDependents(pRegistration->hkRoot, pRegistration->sczProviderKey, 0, NULL, &pRegistration->rgDependents, &pRegistration->cDependents);
261 if (E_FILENOTFOUND != hr)
262 {
267 - ExitOnFailure(hr, "Failed dependents check on bundle");
263 + ExitOnFailure(hr, "Failed dependents check on bundle.");
264 }
265 else
266 {
267 hr = S_OK;
268 }
269
274 - for (DWORD iPackage = 0; iPackage < pPackages->cPackages; ++iPackage)
275 - {
276 - pPackage = pPackages->rgPackages + iPackage;
277 - hr = DetectPackageDependents(pPackage, sdIgnoredDependents, pRegistration);
278 - ExitOnFailure(hr, "Failed to detect dependents for package '%ls'", pPackage->sczId);
279 - }
280 -
281 - for (DWORD iRelatedBundle = 0; iRelatedBundle < pRegistration->relatedBundles.cRelatedBundles; ++iRelatedBundle)
282 - {
283 - BURN_RELATED_BUNDLE* pRelatedBundle = pRegistration->relatedBundles.rgRelatedBundles + iRelatedBundle;
284 - if (!pRelatedBundle->fPlannable)
285 - {
286 - continue;
287 - }
288 -
289 - pPackage = &pRelatedBundle->package;
290 - hr = DetectPackageDependents(pPackage, sdIgnoredDependents, pRegistration);
291 - ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId);
292 - }
293 -
270 if (pDependencies->fSelfDependent || pDependencies->fActiveParent)
271 {
272 for (DWORD i = 0; i < pRegistration->cDependents; ++i)
@@ -310,8 +286,38 @@ extern "C" HRESULT DependencyDetect(
286 }
287
288 LExit:
313 - ReleaseDict(sdIgnoredDependents);
289 + return hr;
290 +}
291 +
292 +extern "C" HRESULT DependencyDetectChainPackage(
293 + __in BURN_PACKAGE* pPackage,
294 + __in BURN_REGISTRATION* pRegistration
295 + )
296 +{
297 + HRESULT hr = S_OK;
298 +
299 + hr = DetectPackageDependents(pPackage, pRegistration);
300 + ExitOnFailure(hr, "Failed to detect dependents for package '%ls'", pPackage->sczId);
301
302 +LExit:
303 + return hr;
304 +}
305 +
306 +extern "C" HRESULT DependencyDetectRelatedBundle(
307 + __in BURN_RELATED_BUNDLE* pRelatedBundle,
308 + __in BURN_REGISTRATION* pRegistration
309 + )
310 +{
311 + HRESULT hr = S_OK;
312 + BURN_PACKAGE* pPackage = &pRelatedBundle->package;
313 +
314 + if (pRelatedBundle->fPlannable)
315 + {
316 + hr = DetectPackageDependents(pPackage, pRegistration);
317 + ExitOnFailure(hr, "Failed to detect dependents for related bundle '%ls'", pPackage->sczId);
318 + }
319 +
320 +LExit:
321 return hr;
322 }
323
@@ -738,7 +744,6 @@ extern "C" void DependencyUnregisterBundle(
744
745 static HRESULT DetectPackageDependents(
746 __in BURN_PACKAGE* pPackage,
741 - __in STRINGDICT_HANDLE sdIgnoredDependents,
747 __in const BURN_REGISTRATION* pRegistration
748 )
749 {
@@ -759,7 +764,7 @@ static HRESULT DetectPackageDependents(
764 {
765 BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i];
766
762 - hr = DepCheckDependents(hkHive, pProvider->sczKey, 0, sdIgnoredDependents, &pProvider->rgDependents, &pProvider->cDependents);
767 + hr = DepCheckDependents(hkHive, pProvider->sczKey, 0, NULL, &pProvider->rgDependents, &pProvider->cDependents);
768 if (E_FILENOTFOUND != hr)
769 {
770 ExitOnFailure(hr, "Failed dependents check on package provider: %ls", pProvider->sczKey);
src/burn/engine/dependency.h
+11 -2
@@ -68,9 +68,18 @@ HRESULT DependencyDetectProviderKeyBundleId(
68 DependencyDetect - Detects dependency information.
69
70 *********************************************************************/
71 -HRESULT DependencyDetect(
71 +HRESULT DependencyDetectBundle(
72 __in BURN_DEPENDENCIES* pDependencies,
73 - __in BURN_PACKAGES* pPackages,
73 + __in BURN_REGISTRATION* pRegistration
74 + );
75 +
76 +HRESULT DependencyDetectChainPackage(
77 + __in BURN_PACKAGE* pPackage,
78 + __in BURN_REGISTRATION* pRegistration
79 + );
80 +
81 +HRESULT DependencyDetectRelatedBundle(
82 + __in BURN_RELATED_BUNDLE* pRelatedBundle,
83 __in BURN_REGISTRATION* pRegistration
84 );
85
src/burn/engine/exeengine.cpp
+4
@@ -115,6 +115,7 @@ extern "C" void ExeEngineCommandLineArgumentUninitialize(
115
116 extern "C" HRESULT ExeEngineDetectPackage(
117 __in BURN_PACKAGE* pPackage,
118 + __in BURN_REGISTRATION* pRegistration,
119 __in BURN_VARIABLES* pVariables
120 )
121 {
@@ -136,6 +137,9 @@ extern "C" HRESULT ExeEngineDetectPackage(
137 pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
138 }
139
140 + hr = DependencyDetectChainPackage(pPackage, pRegistration);
141 + ExitOnFailure(hr, "Failed to detect dependencies for EXE package.");
142 +
143 LExit:
144 return hr;
145 }
src/burn/engine/exeengine.h
+1
@@ -21,6 +21,7 @@ void ExeEngineCommandLineArgumentUninitialize(
21 );
22 HRESULT ExeEngineDetectPackage(
23 __in BURN_PACKAGE* pPackage,
24 + __in BURN_REGISTRATION* pRegistration,
25 __in BURN_VARIABLES* pVariables
26 );
27 HRESULT ExeEnginePlanCalculatePackage(
src/burn/engine/msiengine.cpp
+4
@@ -432,6 +432,7 @@ LExit:
432
433 extern "C" HRESULT MsiEngineDetectPackage(
434 __in BURN_PACKAGE* pPackage,
435 + __in BURN_REGISTRATION* pRegistration,
436 __in BURN_USER_EXPERIENCE* pUserExperience
437 )
438 {
@@ -704,6 +705,9 @@ extern "C" HRESULT MsiEngineDetectPackage(
705 pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
706 }
707
708 + hr = DependencyDetectChainPackage(pPackage, pRegistration);
709 + ExitOnFailure(hr, "Failed to detect dependencies for MSI package.");
710 +
711 LExit:
712 ReleaseStr(sczInstalledLanguage);
713 ReleaseStr(sczInstalledVersion);
src/burn/engine/msiengine.h
+1
@@ -32,6 +32,7 @@ HRESULT MsiEngineDetectInitialize(
32 );
33 HRESULT MsiEngineDetectPackage(
34 __in BURN_PACKAGE* pPackage,
35 + __in BURN_REGISTRATION* pRegistration,
36 __in BURN_USER_EXPERIENCE* pUserExperience
37 );
38 HRESULT MsiEnginePlanInitializePackage(
src/burn/engine/mspengine.cpp
+4
@@ -250,6 +250,7 @@ LExit:
250
251 extern "C" HRESULT MspEngineDetectPackage(
252 __in BURN_PACKAGE* pPackage,
253 + __in BURN_REGISTRATION* pRegistration,
254 __in BURN_USER_EXPERIENCE* pUserExperience
255 )
256 {
@@ -328,6 +329,9 @@ extern "C" HRESULT MspEngineDetectPackage(
329 }
330 }
331
332 + hr = DependencyDetectChainPackage(pPackage, pRegistration);
333 + ExitOnFailure(hr, "Failed to detect dependencies for MSP package.");
334 +
335 LExit:
336 ReleaseStr(sczState);
337
src/burn/engine/mspengine.h
+1
@@ -41,6 +41,7 @@ HRESULT MspEngineAddMissingSlipstreamTarget(
41 );
42 HRESULT MspEngineDetectPackage(
43 __in BURN_PACKAGE* pPackage,
44 + __in BURN_REGISTRATION* pRegistration,
45 __in BURN_USER_EXPERIENCE* pUserExperience
46 );
47 HRESULT MspEnginePlanInitializePackage(
src/burn/engine/msuengine.cpp
+4
@@ -53,6 +53,7 @@ extern "C" void MsuEnginePackageUninitialize(
53
54 extern "C" HRESULT MsuEngineDetectPackage(
55 __in BURN_PACKAGE* pPackage,
56 + __in BURN_REGISTRATION* pRegistration,
57 __in BURN_VARIABLES* pVariables
58 )
59 {
@@ -74,6 +75,9 @@ extern "C" HRESULT MsuEngineDetectPackage(
75 pPackage->installRegistrationState = BOOTSTRAPPER_PACKAGE_STATE_ABSENT < pPackage->currentState ? BURN_PACKAGE_REGISTRATION_STATE_PRESENT : BURN_PACKAGE_REGISTRATION_STATE_ABSENT;
76 }
77
78 + hr = DependencyDetectChainPackage(pPackage, pRegistration);
79 + ExitOnFailure(hr, "Failed to detect dependencies for MSU package.");
80 +
81 LExit:
82 return hr;
83 }
src/burn/engine/msuengine.h
+1
@@ -18,6 +18,7 @@ void MsuEnginePackageUninitialize(
18 );
19 HRESULT MsuEngineDetectPackage(
20 __in BURN_PACKAGE* pPackage,
21 + __in BURN_REGISTRATION* pRegistration,
22 __in BURN_VARIABLES* pVariables
23 );
24 HRESULT MsuEnginePlanCalculatePackage(
src/burn/engine/relatedbundle.cpp
+3
@@ -244,6 +244,9 @@ static HRESULT LoadIfRelatedBundle(
244 hr = LoadRelatedBundleFromKey(sczRelatedBundleId, hkBundleId, fPerMachine, relationType, pRelatedBundle);
245 ExitOnFailure(hr, "Failed to initialize package from related bundle id: %ls", sczRelatedBundleId);
246
247 + hr = DependencyDetectRelatedBundle(pRelatedBundle, pRegistration);
248 + ExitOnFailure(hr, "Failed to detect dependencies for related bundle.");
249 +
250 ++pRelatedBundles->cRelatedBundles;
251 }
252
src/libs/dutil/WixToolset.DUtil/deputil.cpp
+14 -5
@@ -246,7 +246,7 @@ DAPI_(HRESULT) DepCheckDependents(
246 __in HKEY hkHive,
247 __in_z LPCWSTR wzProviderKey,
248 __reserved int /*iAttributes*/,
249 - __in C_STRINGDICT_HANDLE sdIgnoredDependents,
249 + __in_opt C_STRINGDICT_HANDLE sdIgnoredDependents,
250 __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents,
251 __inout LPUINT pcDependents
252 )
@@ -257,6 +257,7 @@ DAPI_(HRESULT) DepCheckDependents(
257 HKEY hkDependentsKey = NULL;
258 LPWSTR sczDependentKey = NULL;
259 LPWSTR sczDependentName = NULL;
260 + BOOL fIgnore = FALSE;
261
262 // Format the provider dependency registry key.
263 hr = AllocDependencyKeyName(wzProviderKey, &sczKey);
@@ -280,6 +281,8 @@ DAPI_(HRESULT) DepCheckDependents(
281 // Now enumerate the dependent keys. If they are not defined in the ignored list, add them to the array.
282 for (DWORD dwIndex = 0; ; ++dwIndex)
283 {
284 + fIgnore = FALSE;
285 +
286 hr = RegKeyEnum(hkDependentsKey, dwIndex, &sczDependentKey);
287 if (E_NOMOREITEMS != hr)
288 {
@@ -292,12 +295,18 @@ DAPI_(HRESULT) DepCheckDependents(
295 }
296
297 // If the key isn't ignored, add it to the dependent array.
295 - hr = DictKeyExists(sdIgnoredDependents, sczDependentKey);
296 - if (E_NOTFOUND != hr)
298 + if (sdIgnoredDependents)
299 {
298 - DepExitOnFailure(hr, "Failed to check the dictionary of ignored dependents.");
300 + hr = DictKeyExists(sdIgnoredDependents, sczDependentKey);
301 + if (E_NOTFOUND != hr)
302 + {
303 + DepExitOnFailure(hr, "Failed to check the dictionary of ignored dependents.");
304 +
305 + fIgnore = TRUE;
306 + }
307 }
300 - else
308 +
309 + if (!fIgnore)
310 {
311 // Get the name of the dependent from the key.
312 hr = GetDependencyNameFromKey(hkHive, sczDependentKey, &sczDependentName);
src/libs/dutil/WixToolset.DUtil/inc/deputil.h
+1 -1
@@ -56,7 +56,7 @@ DAPI_(HRESULT) DepCheckDependents(
56 __in HKEY hkHive,
57 __in_z LPCWSTR wzProviderKey,
58 __reserved int iAttributes,
59 - __in C_STRINGDICT_HANDLE sdIgnoredDependents,
59 + __in_opt C_STRINGDICT_HANDLE sdIgnoredDependents,
60 __deref_inout_ecount_opt(*pcDependents) DEPENDENCY** prgDependents,
61 __inout LPUINT pcDependents
62 );