From dd9528d826b98ac90e76ac0ebfc2c53bc9a3a65d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 3 May 2021 16:51:11 +1000 Subject: [PATCH 1/5] Add robostack installer --- src/rosdep2/__init__.py | 3 +- src/rosdep2/gbpdistro_support.py | 6 ++ src/rosdep2/platforms/robostack.py | 109 +++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src/rosdep2/platforms/robostack.py diff --git a/src/rosdep2/__init__.py b/src/rosdep2/__init__.py index 9bb29b63f..2188fb37d 100644 --- a/src/rosdep2/__init__.py +++ b/src/rosdep2/__init__.py @@ -68,11 +68,12 @@ def create_default_installer_context(verbose=False): from .platforms import npm from .platforms import gem from .platforms import redhat + from .platforms import robostack from .platforms import freebsd from .platforms import slackware from .platforms import source - platform_mods = [alpine, arch, cygwin, debian, gentoo, nix, openembedded, opensuse, osx, redhat, slackware, freebsd] + platform_mods = [alpine, arch, cygwin, debian, gentoo, nix, openembedded, opensuse, osx, redhat, robostack, slackware, freebsd] installer_mods = [source, pip, gem, npm] + platform_mods context = InstallerContext() diff --git a/src/rosdep2/gbpdistro_support.py b/src/rosdep2/gbpdistro_support.py index fd90ae096..9dd76a76a 100644 --- a/src/rosdep2/gbpdistro_support.py +++ b/src/rosdep2/gbpdistro_support.py @@ -13,10 +13,12 @@ from rospkg.os_detect import OS_FEDORA from rospkg.os_detect import OS_OSX from rospkg.os_detect import OS_UBUNTU +from rospkg.os_detect import OS_ROBOSTACK from .core import InvalidData, DownloadFailure from .platforms.debian import APT_INSTALLER from .platforms.osx import BREW_INSTALLER +from .platforms.robostack import ROBOSTACK_INSTALLER from .platforms.redhat import YUM_INSTALLER from .rosdistrohelper import get_targets, get_release_file, PreRep137Warning @@ -169,6 +171,10 @@ def get_gbprepo_as_rosdep_data(gbpdistro): package_name = 'ros-%s-%s' % (release_name, pkg) package_name = package_name.replace('_', '-') + rosdep_data[pkg][OS_ROBOSTACK] = { + ROBOSTACK_INSTALLER: {'packages': [package_name]} + } + for os_name in distro_file.platforms: if os_name not in rosdep_data[pkg]: rosdep_data[pkg][os_name] = {} diff --git a/src/rosdep2/platforms/robostack.py b/src/rosdep2/platforms/robostack.py new file mode 100644 index 000000000..da007270b --- /dev/null +++ b/src/rosdep2/platforms/robostack.py @@ -0,0 +1,109 @@ +# Copyright (c) 2021, Tobias Fischer +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# Author Tobias Fischer/info@tobiasfischer.info +import subprocess +import json + +from rospkg.os_detect import OS_ROBOSTACK + +from ..installers import PackageManagerInstaller + +ROBOSTACK_INSTALLER = 'robostack' + + +def get_conda_mamba_cmd(): + candidate_list = ['micromamba', 'mamba', 'conda'] + for candidate in candidate_list: + try: + subprocess.Popen([candidate], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + return candidate + except OSError: + continue + raise Exception('None of ' + ', '.join(candidate_list) + ' was found.') + + +def register_installers(context): + context.set_installer(ROBOSTACK_INSTALLER, RoboStackInstaller()) + + +def register_platforms(context): + context.add_os_installer_key(OS_ROBOSTACK, ROBOSTACK_INSTALLER) + context.set_default_os_installer_key(OS_ROBOSTACK, lambda self: ROBOSTACK_INSTALLER) + + +def conda_detect(packages): + conda_ret = json.loads(subprocess.check_output([get_conda_mamba_cmd(), 'list', '--json'])) + installed_package_names = [installed_package['name'] for installed_package in conda_ret] + installed_package_versions = [installed_package['version'] for installed_package in conda_ret] + ret_list = [] + for requested_package in packages: + if requested_package == 'REQUIRE_OPENGL' or requested_package == 'REQUIRE_GL': + ret_list.append(requested_package) + continue + + if ' ' in requested_package: + pkg_name = requested_package.split(' ')[0] + pkg_version = requested_package.split(' ')[1] + try: + installed_package_idx = installed_package_names.index(pkg_name) + if installed_package_versions[installed_package_idx] == pkg_version or installed_package_versions[installed_package_idx].startswith(pkg_version + '.'): + ret_list.append(requested_package) + except ValueError: + continue + else: + try: + installed_package_idx = installed_package_names.index(requested_package) + ret_list.append(requested_package) + except ValueError: + continue + return ret_list + + +class RoboStackInstaller(PackageManagerInstaller): + def __init__(self): + super(RoboStackInstaller, self).__init__(conda_detect) + + def get_install_command(self, resolved, interactive=True, reinstall=False, quiet=False): + packages = self.get_packages_to_install(resolved, reinstall=reinstall) + packages = [p if ' ' not in p else p.replace(' ', '=') for p in packages] + + if not packages: + return [] + + base_cmd = [get_conda_mamba_cmd(), 'install'] + if not interactive: + base_cmd.append('-y') + if quiet: + base_cmd.append('-q') + if reinstall: + base_cmd.append('--force-reinstall') + + return [base_cmd + packages] + + def get_version_strings(self): + return subprocess.check_output((get_conda_mamba_cmd(), '--version')) From f263385116a4a378f7f040386ded6251fa503015 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sat, 8 May 2021 09:32:05 +0200 Subject: [PATCH 2/5] explicitly add channels to command line --- src/rosdep2/platforms/robostack.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/rosdep2/platforms/robostack.py b/src/rosdep2/platforms/robostack.py index da007270b..eba0b4a4c 100644 --- a/src/rosdep2/platforms/robostack.py +++ b/src/rosdep2/platforms/robostack.py @@ -96,6 +96,11 @@ def get_install_command(self, resolved, interactive=True, reinstall=False, quiet return [] base_cmd = [get_conda_mamba_cmd(), 'install'] + + channels = ['robostack', 'conda-forge'] + for channel in channels: + base_cmd += ['-c', channel] + if not interactive: base_cmd.append('-y') if quiet: From e9d40156e066bfc5faa49e6dc2916ecddf4ce918 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 25 Jul 2021 13:35:31 +1000 Subject: [PATCH 3/5] robostack -> conda --- src/rosdep2/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rosdep2/__init__.py b/src/rosdep2/__init__.py index 2188fb37d..6c6381b51 100644 --- a/src/rosdep2/__init__.py +++ b/src/rosdep2/__init__.py @@ -68,12 +68,12 @@ def create_default_installer_context(verbose=False): from .platforms import npm from .platforms import gem from .platforms import redhat - from .platforms import robostack + from .platforms import conda from .platforms import freebsd from .platforms import slackware from .platforms import source - platform_mods = [alpine, arch, cygwin, debian, gentoo, nix, openembedded, opensuse, osx, redhat, robostack, slackware, freebsd] + platform_mods = [alpine, arch, cygwin, debian, gentoo, nix, openembedded, opensuse, osx, redhat, conda, slackware, freebsd] installer_mods = [source, pip, gem, npm] + platform_mods context = InstallerContext() From ac87d6d24947f046bcd406a25112986ff008a576 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 25 Jul 2021 13:36:21 +1000 Subject: [PATCH 4/5] Robostack -> Conda --- src/rosdep2/gbpdistro_support.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rosdep2/gbpdistro_support.py b/src/rosdep2/gbpdistro_support.py index 9dd76a76a..9606e9c7d 100644 --- a/src/rosdep2/gbpdistro_support.py +++ b/src/rosdep2/gbpdistro_support.py @@ -13,12 +13,12 @@ from rospkg.os_detect import OS_FEDORA from rospkg.os_detect import OS_OSX from rospkg.os_detect import OS_UBUNTU -from rospkg.os_detect import OS_ROBOSTACK +from rospkg.os_detect import OS_CONDA from .core import InvalidData, DownloadFailure from .platforms.debian import APT_INSTALLER from .platforms.osx import BREW_INSTALLER -from .platforms.robostack import ROBOSTACK_INSTALLER +from .platforms.conda import CONDA_INSTALLER from .platforms.redhat import YUM_INSTALLER from .rosdistrohelper import get_targets, get_release_file, PreRep137Warning @@ -171,8 +171,8 @@ def get_gbprepo_as_rosdep_data(gbpdistro): package_name = 'ros-%s-%s' % (release_name, pkg) package_name = package_name.replace('_', '-') - rosdep_data[pkg][OS_ROBOSTACK] = { - ROBOSTACK_INSTALLER: {'packages': [package_name]} + rosdep_data[pkg][OS_CONDA] = { + CONDA_INSTALLER: {'packages': [package_name]} } for os_name in distro_file.platforms: From 3a01aecc41e37b86bd32fc5e662c42d7d1225407 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 25 Jul 2021 13:37:44 +1000 Subject: [PATCH 5/5] Robostack -> Conda --- src/rosdep2/platforms/{robostack.py => conda.py} | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename src/rosdep2/platforms/{robostack.py => conda.py} (91%) diff --git a/src/rosdep2/platforms/robostack.py b/src/rosdep2/platforms/conda.py similarity index 91% rename from src/rosdep2/platforms/robostack.py rename to src/rosdep2/platforms/conda.py index eba0b4a4c..8332d3a09 100644 --- a/src/rosdep2/platforms/robostack.py +++ b/src/rosdep2/platforms/conda.py @@ -29,11 +29,11 @@ import subprocess import json -from rospkg.os_detect import OS_ROBOSTACK +from rospkg.os_detect import OS_CONDA from ..installers import PackageManagerInstaller -ROBOSTACK_INSTALLER = 'robostack' +CONDA_INSTALLER = 'conda' def get_conda_mamba_cmd(): @@ -48,12 +48,12 @@ def get_conda_mamba_cmd(): def register_installers(context): - context.set_installer(ROBOSTACK_INSTALLER, RoboStackInstaller()) + context.set_installer(CONDA_INSTALLER, CondaInstaller()) def register_platforms(context): - context.add_os_installer_key(OS_ROBOSTACK, ROBOSTACK_INSTALLER) - context.set_default_os_installer_key(OS_ROBOSTACK, lambda self: ROBOSTACK_INSTALLER) + context.add_os_installer_key(OS_CONDA, CONDA_INSTALLER) + context.set_default_os_installer_key(OS_CONDA, lambda self: CONDA_INSTALLER) def conda_detect(packages): @@ -84,9 +84,9 @@ def conda_detect(packages): return ret_list -class RoboStackInstaller(PackageManagerInstaller): +class CondaInstaller(PackageManagerInstaller): def __init__(self): - super(RoboStackInstaller, self).__init__(conda_detect) + super(CondaInstaller, self).__init__(conda_detect) def get_install_command(self, resolved, interactive=True, reinstall=False, quiet=False): packages = self.get_packages_to_install(resolved, reinstall=reinstall)