diff --git a/tools/rosdep/src/rosdep/installers.py b/tools/rosdep/src/rosdep/installers.py index c6c661a1..d8c89461 100644 --- a/tools/rosdep/src/rosdep/installers.py +++ b/tools/rosdep/src/rosdep/installers.py @@ -282,6 +282,63 @@ class AptInstaller(InstallerAPI): return [version_lock_map[r] for r in ret_list] +class YumInstaller(InstallerAPI): + """ + An implementation of the InstallerAPI for use on yum/fedora style + systems. + """ + def __init__(self, arg_dict): + packages = arg_dict.get("packages", "") + if type(packages) == type("string"): + packages = packages.split() + + self.packages = packages + + + def get_packages_to_install(self): + return list(set(self.packages) - set(self.dpkg_detect(self.packages))) + + + def check_presence(self): + return len(self.get_packages_to_install()) == 0 + + + def generate_package_install_command(self, default_yes = False, execute = True, display = True): + script = '!#/bin/bash\n#no script' + packages_to_install = self.get_packages_to_install() + if not packages_to_install: + script = "#!/bin/bash\n#No Packages to install" + elif default_yes: + script = "#!/bin/bash\n#Packages %s\nsudo yum install -y "%packages_to_install + ' '.join(packages_to_install) + else: + script = "#!/bin/bash\n#Packages %s\nsudo yum install "%packages_to_install + ' '.join(packages_to_install) + + if execute: + return rosdep.core.create_tempfile_from_string_and_execute(script) + elif display: + print "To install packages: %s would have executed script\n{{{\n%s\n}}}"%(packages_to_install, script) + return False + + + def dpkg_detect(self, pkgs): + """ + Given a list of packages, return the list of installed packages. + """ + ret_list = [] + #cmd = ['rpm', '-q', '--qf ""'] # suppress output for installed packages + cmd = ['rpm', '-q', '--qf', '%{NAME}\n'] # output: "pkg_name" for installed, error text for not installed packages + cmd.extend(pkgs) + + pop = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (std_out, std_err) = pop.communicate() + out_lines = std_out.split('\n') + for line in out_lines: + # if there is no space, it's not an error text -> it's installed + if line and ' ' not in line: + ret_list.append(line) + return ret_list + + class PipInstaller(InstallerAPI): """ An implementation of the InstallerAPI for use on debian style diff --git a/tools/rosdep/src/rosdep/redhat.py b/tools/rosdep/src/rosdep/redhat.py index 64c27bab..eb47c1ab 100644 --- a/tools/rosdep/src/rosdep/redhat.py +++ b/tools/rosdep/src/rosdep/redhat.py @@ -34,40 +34,36 @@ import subprocess import rosdep.base_rosdep -class YumInstall: - """This class provides the functions for installing using yum - it's methods partially implement the Rosdep OS api to complement - the roslib.OSDetect API. """ - def rpm_detect(self, p): - return subprocess.call(['rpm', '-q', p], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - def strip_detected_packages(self, packages): - return [p for p in packages if self.rpm_detect(p)] - - def generate_package_install_command(self, packages, default_yes): - if not packages: - return "#No Packages to install" - - if default_yes: - return "#Packages\nsudo yum -y install " + ' '.join(packages) - else: - return "#Packages\nsudo yum install " + ' '.join(packages) - - ###### Fedora SPECIALIZATION ######################### -class Fedora(roslib.os_detect.Fedora, YumInstall, rosdep.base_rosdep.RosdepBaseOS): - """This class provides the Rosdep OS API for by combining the Fedora - OSDetect API and the YumInstall API - """ +class Fedora(roslib.os_detect.Fedora, rosdep.base_rosdep.RosdepBaseOS): + """ This is an implementation of a standard interface for + interacting with rosdep. This defines all Fedora sepecific + methods, including detecting the OS/Version number. As well as + how to check for and install packages.""" + + def __init__(self): + self.installers = {} + self.installers['yum'] = rosdep.installers.YumInstaller + self.installers['pip'] = rosdep.installers.PipInstaller + self.installers['source'] = rosdep.installers.SourceInstaller + self.installers['default'] = rosdep.installers.YumInstaller pass ###### END Fedora SPECIALIZATION ######################## ###### Rhel SPECIALIZATION ######################### -class Rhel(roslib.os_detect.Rhel, YumInstall, rosdep.base_rosdep.RosdepBaseOS): - """This class provides the Red Hat Enterprise Linux Rosdep OS API - for by combining the RHEL OSDetect API and the YumInstall API - """ +class Rhel(roslib.os_detect.Rhel, rosdep.base_rosdep.RosdepBaseOS): + """ This is an implementation of a standard interface for + interacting with rosdep. This defines all Fedora sepecific + methods, including detecting the OS/Version number. As well as + how to check for and install packages.""" + + def __init__(self): + self.installers = {} + self.installers['yum'] = rosdep.installers.YumInstaller + self.installers['pip'] = rosdep.installers.PipInstaller + self.installers['source'] = rosdep.installers.SourceInstaller + self.installers['default'] = rosdep.installers.YumInstaller pass ###### END Rhel SPECIALIZATION ########################