diff --git a/CHANGELOG.md b/CHANGELOG.md index ef4a68703ec..0cbd0e19cc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +* `compas_rhino.uninstall` will try to remove compas packages from all possible + install locations. + ### Removed diff --git a/src/compas_rhino/install.py b/src/compas_rhino/install.py index 911a7341bf4..42329f52cce 100644 --- a/src/compas_rhino/install.py +++ b/src/compas_rhino/install.py @@ -43,14 +43,12 @@ def install(version=None, packages=None, clean=False): """ version = compas_rhino._check_rhino_version(version) - # We install COMPAS packages in the scripts folder - # instead of directly as IPy module. - # scripts_path = compas_rhino._get_rhino_scripts_path(version) - - # In Rhino 8 there is no scripts folder if version == "8.0": + # In Rhino 8 there is no scripts folder installation_path = compas_rhino._get_default_rhino_ironpython_sitepackages_path(version) else: + # We install COMPAS packages in the scripts folder + # instead of directly as IPy module. installation_path = compas_rhino._get_rhino_scripts_path(version) # This is for old installs diff --git a/src/compas_rhino/uninstall.py b/src/compas_rhino/uninstall.py index cb4e4a656ef..83faddde6d1 100644 --- a/src/compas_rhino/uninstall.py +++ b/src/compas_rhino/uninstall.py @@ -40,12 +40,22 @@ def uninstall(version=None, packages=None): """ version = compas_rhino._check_rhino_version(version) - # We install COMPAS packages in the scripts folder + installation_paths = [] + + # In Rhino <8 We install COMPAS packages in the scripts folder # instead of directly as IPy module. - scripts_path = compas_rhino._get_rhino_scripts_path(version) + installation_paths.append(compas_rhino._get_rhino_scripts_path(version)) + + # In Rhino 8 there is no scripts folder + try: + installation_paths.append(compas_rhino._get_default_rhino_ironpython_sitepackages_path(version)) + except NotImplementedError: + pass # This is for old installs ipylib_path = compas_rhino._get_rhino_ironpython_lib_path(version) + if ipylib_path: + installation_paths.append(ipylib_path) # Filter the provided list of packages # If no packages are provided @@ -54,31 +64,26 @@ def uninstall(version=None, packages=None): # Also remove all broken symlinks # because ... they're broken! - for name in os.listdir(scripts_path): - path = os.path.join(scripts_path, name) - if os.path.islink(path): - if not os.path.exists(path): - if name not in packages: - packages.append(name) + for installation_path in installation_paths: + for name in os.listdir(installation_path): + path = os.path.join(installation_path, name) + if os.path.islink(path): + if not os.path.exists(path): + if name not in packages: + packages.append(name) # Collect paths for removal based on package names symlinks_to_uninstall = [] for package in packages: - symlink_path = os.path.join(scripts_path, package) - symlinks_to_uninstall.append(dict(name=package, link=symlink_path)) - - # Handle legacy install location - # This does not always work, - # and especially not in cases where it is in any case not necessary :) - if ipylib_path: - legacy_path = os.path.join(ipylib_path, package) - if os.path.exists(legacy_path): - symlinks_to_uninstall.append(dict(name=package, link=legacy_path)) + for installation_path in installation_paths: + symlink_path = os.path.join(installation_path, package) + if os.path.exists(symlink_path): + symlinks_to_uninstall.append(dict(name=package, link=symlink_path)) # There is nothing to uninstall if not symlinks_to_uninstall: - print("\nNo packages to uninstall from Rhino {0} scripts folder: \n{1}.".format(version, scripts_path)) + print("\nNo packages to uninstall from Rhino {0} scripts folders: \n{1}.".format(version, installation_paths)) return # ------------------------- @@ -113,7 +118,12 @@ def uninstall(version=None, packages=None): ) else: - if compas_rhino._try_remove_bootstrapper(scripts_path): + bootstrapper_removed = False + for installation_path in installation_paths: + if compas_rhino._try_remove_bootstrapper(installation_path): + bootstrapper_removed = True + + if bootstrapper_removed: results.append(("compas_bootstrapper", "OK")) else: results.append( @@ -123,22 +133,11 @@ def uninstall(version=None, packages=None): ) ) - # Handle legacy bootstrapper - # Again, only if possible... - if ipylib_path: - if not compas_rhino._try_remove_bootstrapper(ipylib_path): - results.append( - ( - "compas_bootstrapper", - "ERROR: Cannot remove legacy compas_bootstrapper, try to run as administrator.", - ) - ) - # ------------------------- # Output results # ------------------------- - print("Uninstalling COMPAS packages from Rhino {0} scripts folder: \n{1}".format(version, scripts_path)) + print("Uninstalling COMPAS packages from Rhino {0} scripts folders: \n{1}".format(version, installation_paths)) print("\nThe following packages have been detected and will be uninstalled:\n") for package, status in results: