mirror of https://github.com/python/cpython
gh-95587: Fixes some upgrade detection issues in the Windows installer (GH-95631)
This commit is contained in:
parent
7b370b7305
commit
5b6acbaa20
|
@ -0,0 +1,2 @@
|
||||||
|
Fixes some issues where the Windows installer would incorrectly detect
|
||||||
|
certain features of an existing install when upgrading.
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue