gh-95587: Fixes some upgrade detection issues in the Windows installer (GH-95631)

This commit is contained in:
Steve Dower 2022-08-04 17:12:08 +01:00 committed by GitHub
parent 7b370b7305
commit 5b6acbaa20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 9 deletions

View File

@ -0,0 +1,2 @@
Fixes some issues where the Windows installer would incorrectly detect
certain features of an existing install when upgrading.

View File

@ -724,6 +724,8 @@ public: // IBootstrapperApplication
auto hr = LoadAssociateFilesStateFromKey(_engine, fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER); auto hr = LoadAssociateFilesStateFromKey(_engine, fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER);
if (hr == S_OK) { if (hr == S_OK) {
_engine->SetVariableNumeric(L"AssociateFiles", 1); _engine->SetVariableNumeric(L"AssociateFiles", 1);
} else if (hr == S_FALSE) {
_engine->SetVariableNumeric(L"AssociateFiles", 0);
} else if (FAILED(hr)) { } else if (FAILED(hr)) {
BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Failed to load AssociateFiles state: error code 0x%08X", hr); BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Failed to load AssociateFiles state: error code 0x%08X", hr);
} }
@ -817,6 +819,8 @@ public: // IBootstrapperApplication
auto hr = LoadAssociateFilesStateFromKey(_engine, hkey); auto hr = LoadAssociateFilesStateFromKey(_engine, hkey);
if (hr == S_OK) { if (hr == S_OK) {
_engine->SetVariableNumeric(L"AssociateFiles", 1); _engine->SetVariableNumeric(L"AssociateFiles", 1);
} else if (hr == S_FALSE) {
_engine->SetVariableNumeric(L"AssociateFiles", 0);
} else if (FAILED(hr)) { } else if (FAILED(hr)) {
BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Failed to load AssociateFiles state: error code 0x%08X", hr); BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Failed to load AssociateFiles state: error code 0x%08X", hr);
} }
@ -834,7 +838,17 @@ public: // IBootstrapperApplication
LONGLONG includeLauncher; LONGLONG includeLauncher;
if (SUCCEEDED(BalGetNumericVariable(L"Include_launcher", &includeLauncher)) if (SUCCEEDED(BalGetNumericVariable(L"Include_launcher", &includeLauncher))
&& includeLauncher == -1) { && includeLauncher == -1) {
_engine->SetVariableNumeric(L"Include_launcher", 1); if (BOOTSTRAPPER_ACTION_LAYOUT == _command.action ||
(BOOTSTRAPPER_ACTION_INSTALL == _command.action && !_upgrading)) {
// When installing/downloading, we want to include the launcher
// by default.
_engine->SetVariableNumeric(L"Include_launcher", 1);
} else {
// Any other action, if we didn't detect the MSI then we want to
// keep it excluded
_engine->SetVariableNumeric(L"Include_launcher", 0);
_engine->SetVariableNumeric(L"AssociateFiles", 0);
}
} }
} }
@ -2812,6 +2826,17 @@ private:
return ::CompareStringW(LOCALE_NEUTRAL, 0, platform, -1, L"x64", -1) == CSTR_EQUAL; return ::CompareStringW(LOCALE_NEUTRAL, 0, platform, -1, L"x64", -1) == CSTR_EQUAL;
} }
static bool IsTargetPlatformARM64(__in IBootstrapperEngine* pEngine) {
WCHAR platform[8];
DWORD platformLen = 8;
if (FAILED(pEngine->GetVariableString(L"TargetPlatform", platform, &platformLen))) {
return S_FALSE;
}
return ::CompareStringW(LOCALE_NEUTRAL, 0, platform, -1, L"ARM64", -1) == CSTR_EQUAL;
}
static HRESULT LoadOptionalFeatureStatesFromKey( static HRESULT LoadOptionalFeatureStatesFromKey(
__in IBootstrapperEngine* pEngine, __in IBootstrapperEngine* pEngine,
__in HKEY hkHive, __in HKEY hkHive,
@ -2820,7 +2845,7 @@ private:
HKEY hKey; HKEY hKey;
LRESULT res; LRESULT res;
if (IsTargetPlatformx64(pEngine)) { if (IsTargetPlatformx64(pEngine) || IsTargetPlatformARM64(pEngine)) {
res = RegOpenKeyExW(hkHive, subkey, 0, KEY_READ | KEY_WOW64_64KEY, &hKey); res = RegOpenKeyExW(hkHive, subkey, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
} else { } else {
res = RegOpenKeyExW(hkHive, subkey, 0, KEY_READ | KEY_WOW64_32KEY, &hKey); res = RegOpenKeyExW(hkHive, subkey, 0, KEY_READ | KEY_WOW64_32KEY, &hKey);
@ -2859,7 +2884,7 @@ private:
BYTE buffer[1024]; BYTE buffer[1024];
DWORD bufferLen = sizeof(buffer); DWORD bufferLen = sizeof(buffer);
if (IsTargetPlatformx64(pEngine)) { if (IsTargetPlatformx64(pEngine) || IsTargetPlatformARM64(pEngine)) {
res = RegOpenKeyExW(hkHive, subkey, 0, KEY_READ | KEY_WOW64_64KEY, &hKey); res = RegOpenKeyExW(hkHive, subkey, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
} else { } else {
res = RegOpenKeyExW(hkHive, subkey, 0, KEY_READ | KEY_WOW64_32KEY, &hKey); res = RegOpenKeyExW(hkHive, subkey, 0, KEY_READ | KEY_WOW64_32KEY, &hKey);
@ -2917,12 +2942,7 @@ private:
HRESULT hr; HRESULT hr;
HKEY hkHive; HKEY hkHive;
// The launcher installation is separate from the Python install, so we BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading state of optional features");
// check its state later. For now, assume we don't want the launcher or
// file associations, and if they have already been installed then
// loading the state will reactivate these settings.
pEngine->SetVariableNumeric(L"Include_launcher", 0);
pEngine->SetVariableNumeric(L"AssociateFiles", 0);
// Get the registry key from the bundle, to save having to duplicate it // Get the registry key from the bundle, to save having to duplicate it
// in multiple places. // in multiple places.