diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b02ee6bf..0382a192 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,7 +17,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/asottile/pyupgrade - rev: v3.7.0 + rev: v3.8.0 hooks: - id: pyupgrade args: ["--py37-plus", "--keep-percent-format"] diff --git a/constructor/nsis/main.nsi.tmpl b/constructor/nsis/main.nsi.tmpl index 83baca6e..a49ebfc7 100644 --- a/constructor/nsis/main.nsi.tmpl +++ b/constructor/nsis/main.nsi.tmpl @@ -66,6 +66,8 @@ Unicode "true" \Uninstall\${UNINSTALL_NAME}" var /global INSTDIR_JUSTME +var /global INSTALLER_VERSION +var /global INSTALLER_NAME_FULL # UAC shield overlay !ifndef BCM_SETSHIELD @@ -1199,10 +1201,36 @@ Section "Uninstall" # carefully. More info at https://docs.conda.io/projects/conda/en/latest/user-guide/troubleshooting.html#solution System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_DLL_SEARCH_MODIFICATION_ENABLE", "1").r0' + # Read variables the uninstaller needs from the registry + StrCpy $R0 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" + StrLen $R1 "Uninstall-${NAME}.exe" + IntOp $R1 $R1 + 3 + StrCpy $0 0 + loop_path: + EnumRegKey $1 SHCTX $R0 $0 + StrCmp $1 "" endloop_path + StrCpy $2 "$R0\$1" + ReadRegStr $4 SHCTX $2 "UninstallString" + StrLen $5 $4 + IntOp $5 $5 - $R1 + StrCpy $4 $4 $5 1 + ${If} $4 == $INSTDIR + StrCpy $INSTALLER_NAME_FULL $1 + ReadRegStr $INSTALLER_VERSION SHCTX $2 "DisplayVersion" + goto endloop_path + ${EndIf} + IntOp $0 $0 + 1 + goto loop_path + endloop_path: + # Extra info for pre_uninstall scripts System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PREFIX", "$INSTDIR").r0' System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_NAME", "${NAME}").r0' - System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_VER", "${VERSION}").r0' + StrCpy $0 ${VERSION} + ${If} $INSTALLER_VERSION != "" + StrCpy $0 $INSTALLER_VERSION + ${EndIf} + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_VER", "$0").r0' System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_PLAT", "${PLATFORM}").r0' System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_TYPE", "EXE").r0' @@ -1216,13 +1244,26 @@ Section "Uninstall" # In case the last command fails, run the slow method to remove leftover RMDir /r /REBOOTOK "$INSTDIR" - DeleteRegKey SHCTX "${UNINSTREG}" + ${If} $INSTALLER_NAME_FULL != "" + DeleteRegKey SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTALLER_NAME_FULL" + ${EndIf} + # If Anaconda was registered as the official Python for this version, # remove it from the registry - ReadRegStr $0 SHCTX "Software\Python\PythonCore\${PY_VER}\InstallPath" "" - ${If} $0 == "$INSTDIR" - DeleteRegKey SHCTX "Software\Python\PythonCore\${PY_VER}" - ${EndIf} + StrCpy $R0 "SOFTWARE\Python\PythonCore" + StrCpy $0 0 + loop_py: + EnumRegKey $1 SHCTX $R0 $0 + StrCmp $1 "" endloop_py + ReadRegStr $2 SHCTX "$R0\$1\InstallPath" "" + ${If} $2 == $INSTDIR + StrCpy $R1 $1 + DeleteRegKey SHCTX "$R0\$1" + goto endloop_py + ${EndIf} + IntOp $0 $0 + 1 + goto loop_py + endloop_py: SectionEnd !if '@SIGNTOOL_COMMAND@' != '' diff --git a/constructor/preconda.py b/constructor/preconda.py index a480b8bd..35fef41d 100644 --- a/constructor/preconda.py +++ b/constructor/preconda.py @@ -139,8 +139,11 @@ def write_files(info, dst_dir): with open(join(dst_dir, 'urls'), 'w') as fo: for url, md5 in all_final_urls_md5s: - url = ensure_transmuted_ext(info, url) - fo.write('%s#%s\n' % (url, md5)) + maybe_different_url = ensure_transmuted_ext(info, url) + if maybe_different_url != url: # transmuted, no md5 + fo.write(f"{maybe_different_url}\n") + else: + fo.write(f"{url}#{md5}\n") with open(join(dst_dir, 'urls.txt'), 'w') as fo: for url, _ in all_final_urls_md5s: @@ -247,7 +250,12 @@ def write_env_txt(info, dst_dir, urls): ).lstrip() with open(join(dst_dir, "env.txt"), "w") as envf: envf.write(header) - envf.write('\n'.join([f"{url}#{md5}" for url, md5 in urls])) + for url, md5 in urls: + maybe_different_url = ensure_transmuted_ext(info, url) + if maybe_different_url != url: # transmuted, no md5 + envf.write(f"{maybe_different_url}\n") + else: + envf.write(f"{url}#{md5}\n") def write_channels_txt(info, dst_dir, env_config): diff --git a/news/684-uninstaller-check-registry b/news/684-uninstaller-check-registry new file mode 100644 index 00000000..9b13d7c9 --- /dev/null +++ b/news/684-uninstaller-check-registry @@ -0,0 +1,19 @@ +### Enhancements + +* The Windows uninstaller will check the registry for `$INSTDIR` before deleting hardcoded registry keys (#684) + +### Bug fixes + +* + +### Deprecations + +* + +### Docs + +* + +### Other + +* diff --git a/news/692-micromamba-transmutation b/news/692-micromamba-transmutation new file mode 100644 index 00000000..d560de12 --- /dev/null +++ b/news/692-micromamba-transmutation @@ -0,0 +1,19 @@ +### Enhancements + +* + +### Bug fixes + +* Adjust `@EXPLICIT` input file so that `micromamba` correctly finds the cache entries of transmuted packages. (#674 via #692) + +### Deprecations + +* + +### Docs + +* + +### Other + +*