diff --git a/Misc/NEWS.d/next/Windows/2019-09-09-12-22-23.bpo-37283.8NvOkU.rst b/Misc/NEWS.d/next/Windows/2019-09-09-12-22-23.bpo-37283.8NvOkU.rst new file mode 100644 index 00000000000000..973047839301e7 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-09-09-12-22-23.bpo-37283.8NvOkU.rst @@ -0,0 +1,2 @@ +Ensure command-line and unattend.xml setting override previously detected +states in Windows installer. diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp index 2e468b7e57b265..cd4a1f8feb1d4b 100644 --- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp +++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp @@ -727,9 +727,13 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Failed to load AssociateFiles state: error code 0x%08X", hr); } - _engine->SetVariableNumeric(L"Include_launcher", 1); + LONGLONG includeLauncher; + if (FAILED(BalGetNumericVariable(L"Include_launcher", &includeLauncher)) + || includeLauncher == -1) { + _engine->SetVariableNumeric(L"Include_launcher", 1); + _engine->SetVariableNumeric(L"InstallLauncherAllUsers", fPerMachine ? 1 : 0); + } _engine->SetVariableNumeric(L"DetectedOldLauncher", 1); - _engine->SetVariableNumeric(L"InstallLauncherAllUsers", fPerMachine ? 1 : 0); } return CheckCanceled() ? IDCANCEL : IDNOACTION; } @@ -796,6 +800,12 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { } } + LONGLONG includeLauncher; + if (SUCCEEDED(BalGetNumericVariable(L"Include_launcher", &includeLauncher)) + && includeLauncher != -1) { + detectedLauncher = FALSE; + } + if (detectedLauncher) { /* When we detect the current version of the launcher. */ _engine->SetVariableNumeric(L"Include_launcher", 1); @@ -819,6 +829,14 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { _baFunction->OnDetectComplete(); } + if (SUCCEEDED(hrStatus)) { + LONGLONG includeLauncher; + if (SUCCEEDED(BalGetNumericVariable(L"Include_launcher", &includeLauncher)) + && includeLauncher == -1) { + _engine->SetVariableNumeric(L"Include_launcher", 1); + } + } + if (SUCCEEDED(hrStatus)) { hrStatus = EvaluateConditions(); } @@ -1451,6 +1469,10 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { hr = ParseOverridableVariablesFromXml(pixdManifest); BalExitOnFailure(hr, "Failed to read overridable variables."); + if (_command.action == BOOTSTRAPPER_ACTION_MODIFY) { + LoadOptionalFeatureStates(_engine); + } + hr = ParseVariablesFromUnattendXml(); ExitOnFailure(hr, "Failed to read unattend.ini file."); @@ -1478,10 +1500,6 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { hr = UpdateUIStrings(_command.action); BalExitOnFailure(hr, "Failed to load UI strings."); - if (_command.action == BOOTSTRAPPER_ACTION_MODIFY) { - LoadOptionalFeatureStates(_engine); - } - GetBundleFileVersion(); // don't fail if we couldn't get the version info; best-effort only LExit: diff --git a/Tools/msi/bundle/bundle.wxs b/Tools/msi/bundle/bundle.wxs index f6cff6fc351dc1..ddd6870f625526 100644 --- a/Tools/msi/bundle/bundle.wxs +++ b/Tools/msi/bundle/bundle.wxs @@ -71,11 +71,10 @@ + - -