From fe787a452e94d9fbd6630f47ad8d96de0053d9f1 Mon Sep 17 00:00:00 2001 From: Scott K Logan Date: Sep 14 2015 01:59:27 +0000 Subject: Add upstream patches for DNF --- diff --git a/python-rosdep-0.11.2-fedora-dnf-fixes.patch b/python-rosdep-0.11.2-fedora-dnf-fixes.patch new file mode 100644 index 0000000..19f3213 --- /dev/null +++ b/python-rosdep-0.11.2-fedora-dnf-fixes.patch @@ -0,0 +1,376 @@ +From e649917b5fb346f3a7b3017524f099068303e08a Mon Sep 17 00:00:00 2001 +From: Scott K Logan +Date: Thu, 27 Aug 2015 17:03:14 -0700 +Subject: [PATCH 1/4] Use functions for storing OS default installer + +This allows the OS to be more flexible in determining the installer that should be used. +--- + src/rosdep2/installers.py | 18 +++++++++++------- + src/rosdep2/platforms/arch.py | 2 +- + src/rosdep2/platforms/cygwin.py | 2 +- + src/rosdep2/platforms/debian.py | 4 ++-- + src/rosdep2/platforms/freebsd.py | 2 +- + src/rosdep2/platforms/gentoo.py | 2 +- + src/rosdep2/platforms/opensuse.py | 2 +- + src/rosdep2/platforms/osx.py | 2 +- + src/rosdep2/platforms/redhat.py | 4 ++-- + test/test_rosdep_installers.py | 14 +++++++++----- + 10 files changed, 30 insertions(+), 22 deletions(-) + +diff --git a/src/rosdep2/installers.py b/src/rosdep2/installers.py +index 2eec7f9..0a7973f 100644 +--- a/src/rosdep2/installers.py ++++ b/src/rosdep2/installers.py +@@ -211,13 +211,12 @@ def set_default_os_installer_key(self, os_key, installer_key): + """ + if not os_key in self.os_installers: + raise KeyError("unknown OS: %s"%(os_key)) +- if not installer_key in self.os_installers[os_key]: +- raise KeyError("installer [%s] is not associated with OS [%s]. call add_os_installer_key() first"%(installer_key, os_key)) +- +- # validate, will throw KeyError +- self.get_installer(installer_key) ++ if not hasattr(installer_key, '__call__'): ++ raise ValueError("version type should be a method") ++ if not installer_key(self.os_detect) in self.os_installers[os_key]: ++ raise KeyError("installer [%s] is not associated with OS [%s]. call add_os_installer_key() first"%(installer_key(self.os_detect), os_key)) + if self.verbose: +- print("set default installer [%s] for OS [%s]"%(installer_key, os_key)) ++ print("set default installer for OS [%s]"%(os_key,)) + self.default_os_installer[os_key] = installer_key + + def get_default_os_installer_key(self, os_key): +@@ -232,7 +231,12 @@ def get_default_os_installer_key(self, os_key): + if not os_key in self.os_installers: + raise KeyError("unknown OS: %s"%(os_key)) + try: +- return self.default_os_installer[os_key] ++ installer_key = self.default_os_installer[os_key](self.os_detect) ++ if not installer_key in self.os_installers[os_key]: ++ raise KeyError("installer [%s] is not associated with OS [%s]. call add_os_installer_key() first"%(installer_key, os_key)) ++ # validate, will throw KeyError ++ self.get_installer(installer_key) ++ return installer_key + except KeyError: + return None + +diff --git a/src/rosdep2/platforms/arch.py b/src/rosdep2/platforms/arch.py +index e1b4df8..8fad48b 100644 +--- a/src/rosdep2/platforms/arch.py ++++ b/src/rosdep2/platforms/arch.py +@@ -42,7 +42,7 @@ def register_installers(context): + def register_platforms(context): + context.add_os_installer_key(ARCH_OS_NAME, SOURCE_INSTALLER) + context.add_os_installer_key(ARCH_OS_NAME, PACMAN_INSTALLER) +- context.set_default_os_installer_key(ARCH_OS_NAME, PACMAN_INSTALLER) ++ context.set_default_os_installer_key(ARCH_OS_NAME, lambda self: PACMAN_INSTALLER) + + def pacman_detect_single(p): + return not subprocess.call(['pacman', '-Q', p], stdout=subprocess.PIPE, stderr=subprocess.PIPE) +diff --git a/src/rosdep2/platforms/cygwin.py b/src/rosdep2/platforms/cygwin.py +index f68a3a5..adbd446 100644 +--- a/src/rosdep2/platforms/cygwin.py ++++ b/src/rosdep2/platforms/cygwin.py +@@ -45,7 +45,7 @@ def register_installers(context): + def register_platforms(context): + context.add_os_installer_key(OS_CYGWIN, SOURCE_INSTALLER) + context.add_os_installer_key(OS_CYGWIN, APT_CYG_INSTALLER) +- context.set_default_os_installer_key(OS_CYGWIN, APT_CYG_INSTALLER) ++ context.set_default_os_installer_key(OS_CYGWIN, lambda self: APT_CYG_INSTALLER) + + def cygcheck_detect_single(p): + std_out = read_stdout(['cygcheck', '-c', p]) +diff --git a/src/rosdep2/platforms/debian.py b/src/rosdep2/platforms/debian.py +index 52f9945..8456912 100644 +--- a/src/rosdep2/platforms/debian.py ++++ b/src/rosdep2/platforms/debian.py +@@ -55,7 +55,7 @@ def register_debian(context): + context.add_os_installer_key(OS_DEBIAN, PIP_INSTALLER) + context.add_os_installer_key(OS_DEBIAN, GEM_INSTALLER) + context.add_os_installer_key(OS_DEBIAN, SOURCE_INSTALLER) +- context.set_default_os_installer_key(OS_DEBIAN, APT_INSTALLER) ++ context.set_default_os_installer_key(OS_DEBIAN, lambda self: APT_INSTALLER) + context.set_os_version_type(OS_DEBIAN, OsDetect.get_codename) + + def register_linaro(context): +@@ -70,7 +70,7 @@ def register_ubuntu(context): + context.add_os_installer_key(OS_UBUNTU, PIP_INSTALLER) + context.add_os_installer_key(OS_UBUNTU, GEM_INSTALLER) + context.add_os_installer_key(OS_UBUNTU, SOURCE_INSTALLER) +- context.set_default_os_installer_key(OS_UBUNTU, APT_INSTALLER) ++ context.set_default_os_installer_key(OS_UBUNTU, lambda self: APT_INSTALLER) + context.set_os_version_type(OS_UBUNTU, OsDetect.get_codename) + + def dpkg_detect(pkgs, exec_fn=None): +diff --git a/src/rosdep2/platforms/freebsd.py b/src/rosdep2/platforms/freebsd.py +index d9ff8c3..d6d4f57 100644 +--- a/src/rosdep2/platforms/freebsd.py ++++ b/src/rosdep2/platforms/freebsd.py +@@ -45,7 +45,7 @@ def register_installers(context): + def register_platforms(context): + context.add_os_installer_key(OS_FREEBSD, SOURCE_INSTALLER) + context.add_os_installer_key(OS_FREEBSD, PKG_ADD_INSTALLER) +- context.set_default_os_installer_key(OS_FREEBSD, PKG_ADD_INSTALLER) ++ context.set_default_os_installer_key(OS_FREEBSD, lambda self: PKG_ADD_INSTALLER) + + def pkg_info_detect_single(p): + if p == "builtin": +diff --git a/src/rosdep2/platforms/gentoo.py b/src/rosdep2/platforms/gentoo.py +index 83212cd..d617fad 100644 +--- a/src/rosdep2/platforms/gentoo.py ++++ b/src/rosdep2/platforms/gentoo.py +@@ -56,7 +56,7 @@ def register_installers(context): + def register_platforms(context): + context.add_os_installer_key(OS_GENTOO, PORTAGE_INSTALLER) + context.add_os_installer_key(OS_GENTOO, SOURCE_INSTALLER) +- context.set_default_os_installer_key(OS_GENTOO, PORTAGE_INSTALLER) ++ context.set_default_os_installer_key(OS_GENTOO, lambda self: PORTAGE_INSTALLER) + + # Determine whether an atom is already satisfied + def portage_detect_single(atom, exec_fn = read_stdout ): +diff --git a/src/rosdep2/platforms/opensuse.py b/src/rosdep2/platforms/opensuse.py +index 1dc6c0c..5a8fa56 100644 +--- a/src/rosdep2/platforms/opensuse.py ++++ b/src/rosdep2/platforms/opensuse.py +@@ -43,7 +43,7 @@ def register_installers(context): + def register_platforms(context): + context.add_os_installer_key(OS_OPENSUSE, SOURCE_INSTALLER) + context.add_os_installer_key(OS_OPENSUSE, ZYPPER_INSTALLER) +- context.set_default_os_installer_key(OS_OPENSUSE, ZYPPER_INSTALLER) ++ context.set_default_os_installer_key(OS_OPENSUSE, lambda self: ZYPPER_INSTALLER) + + def rpm_detect(packages): + installed = [] +diff --git a/src/rosdep2/platforms/osx.py b/src/rosdep2/platforms/osx.py +index c0fdc11..a88dced 100644 +--- a/src/rosdep2/platforms/osx.py ++++ b/src/rosdep2/platforms/osx.py +@@ -62,7 +62,7 @@ def register_platforms(context): + context.add_os_installer_key(OS_OSX, MACPORTS_INSTALLER) + context.add_os_installer_key(OS_OSX, PIP_INSTALLER) + context.add_os_installer_key(OS_OSX, SOURCE_INSTALLER) +- context.set_default_os_installer_key(OS_OSX, BREW_INSTALLER) ++ context.set_default_os_installer_key(OS_OSX, lambda self: BREW_INSTALLER) + context.set_os_version_type(OS_OSX, OsDetect.get_codename) + + def is_port_installed(): +diff --git a/src/rosdep2/platforms/redhat.py b/src/rosdep2/platforms/redhat.py +index 8268de9..b1950e7 100644 +--- a/src/rosdep2/platforms/redhat.py ++++ b/src/rosdep2/platforms/redhat.py +@@ -57,14 +57,14 @@ def register_fedora(context): + context.add_os_installer_key(OS_FEDORA, DNF_INSTALLER) + context.add_os_installer_key(OS_FEDORA, YUM_INSTALLER) + context.add_os_installer_key(OS_FEDORA, SOURCE_INSTALLER) +- context.set_default_os_installer_key(OS_FEDORA, YUM_INSTALLER) ++ context.set_default_os_installer_key(OS_FEDORA, lambda self: YUM_INSTALLER) + context.set_os_version_type(OS_FEDORA, lambda self: self.get_version() if int(self.get_version()) > 20 else self.get_codename()) + + def register_rhel(context): + context.add_os_installer_key(OS_RHEL, PIP_INSTALLER) + context.add_os_installer_key(OS_RHEL, YUM_INSTALLER) + context.add_os_installer_key(OS_RHEL, SOURCE_INSTALLER) +- context.set_default_os_installer_key(OS_RHEL, YUM_INSTALLER) ++ context.set_default_os_installer_key(OS_RHEL, lambda self: YUM_INSTALLER) + + def rpm_detect_py(packages): + ret_list = [] +diff --git a/test/test_rosdep_installers.py b/test/test_rosdep_installers.py +index 3bbabf9..5f6df65 100644 +--- a/test/test_rosdep_installers.py ++++ b/test/test_rosdep_installers.py +@@ -216,7 +216,11 @@ def test_InstallerContext_os_installers(): + assert False, "should have raised" + except KeyError: pass + try: +- context.set_default_os_installer_key(os_key, 'fake-key') ++ context.set_default_os_installer_key(os_key, 'non-method') ++ assert False, "should have raised" ++ except KeyError: pass ++ try: ++ context.set_default_os_installer_key(os_key, lambda self: 'fake-key') + assert False, "should have raised" + except KeyError: pass + try: +@@ -241,7 +245,7 @@ class FakeInstaller2(Installer): + + # retest set_default_os_installer_key, now with installer_key not configured on os + try: +- context.set_default_os_installer_key(os_key, installer_key2) ++ context.set_default_os_installer_key(os_key, lambda self: installer_key2) + assert False, "should have raised" + except KeyError as e: + assert 'add_os_installer' in str(e), e +@@ -252,14 +256,14 @@ class FakeInstaller2(Installer): + + # test default + assert None == context.get_default_os_installer_key(os_key) +- context.set_default_os_installer_key(os_key, installer_key1) ++ context.set_default_os_installer_key(os_key, lambda self: installer_key1) + assert installer_key1 == context.get_default_os_installer_key(os_key) +- context.set_default_os_installer_key(os_key, installer_key2) ++ context.set_default_os_installer_key(os_key, lambda self: installer_key2) + assert installer_key2 == context.get_default_os_installer_key(os_key) + + # retest set_default_os_installer_key, now with invalid os + try: +- context.set_default_os_installer_key('bad-os', installer_key1) ++ context.set_default_os_installer_key('bad-os', lambda self: installer_key1) + assert False, "should have raised" + except KeyError: pass + + +From e5dd8dd7063a1b78cb79491729795cd49bb50531 Mon Sep 17 00:00:00 2001 +From: Scott K Logan +Date: Thu, 27 Aug 2015 18:36:17 -0700 +Subject: [PATCH 2/4] Use DNF instead of YUM as default OS installer for f22+ + +--- + src/rosdep2/platforms/redhat.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/rosdep2/platforms/redhat.py b/src/rosdep2/platforms/redhat.py +index b1950e7..c00c8cf 100644 +--- a/src/rosdep2/platforms/redhat.py ++++ b/src/rosdep2/platforms/redhat.py +@@ -57,8 +57,8 @@ def register_fedora(context): + context.add_os_installer_key(OS_FEDORA, DNF_INSTALLER) + context.add_os_installer_key(OS_FEDORA, YUM_INSTALLER) + context.add_os_installer_key(OS_FEDORA, SOURCE_INSTALLER) +- context.set_default_os_installer_key(OS_FEDORA, lambda self: YUM_INSTALLER) +- context.set_os_version_type(OS_FEDORA, lambda self: self.get_version() if int(self.get_version()) > 20 else self.get_codename()) ++ context.set_default_os_installer_key(OS_FEDORA, lambda self: DNF_INSTALLER if self.get_version().isdigit() and int(self.get_version()) > 21 else YUM_INSTALLER) ++ context.set_os_version_type(OS_FEDORA, lambda self: self.get_version() if self.get_version().isdigit() and int(self.get_version()) > 20 else self.get_codename()) + + def register_rhel(context): + context.add_os_installer_key(OS_RHEL, PIP_INSTALLER) + +From 4e5f65ef668bcf106cfb2f022bc108b5e0c08094 Mon Sep 17 00:00:00 2001 +From: Scott K Logan +Date: Thu, 27 Aug 2015 19:09:27 -0700 +Subject: [PATCH 3/4] Add unit tests for variable lookup and installer keys + +--- + test/test_rosdep_redhat.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 53 insertions(+) + +diff --git a/test/test_rosdep_redhat.py b/test/test_rosdep_redhat.py +index ac13aa0..e2c7863 100644 +--- a/test/test_rosdep_redhat.py ++++ b/test/test_rosdep_redhat.py +@@ -104,3 +104,56 @@ def test(mock_method): + except AssertionError: + traceback.print_exc() + raise ++ ++def test_Fedora_variable_installer_key(): ++ from rosdep2 import InstallerContext ++ from rosdep2.platforms import pip, redhat, source ++ from rosdep2.platforms.redhat import DNF_INSTALLER, YUM_INSTALLER ++ ++ from rospkg.os_detect import OsDetect, OS_FEDORA ++ os_detect_mock = Mock(spec=OsDetect) ++ os_detect_mock.get_name.return_value = 'fedora' ++ os_detect_mock.get_codename.return_value = 'twenty' ++ os_detect_mock.get_version.return_value = '21' ++ ++ # create our test fixture. use most of the default toolchain, but ++ # replace the apt installer with one that we can have more fun ++ # with. we will do all tests with ubuntu lucid keys -- other ++ # tests should cover different resolution cases. ++ context = InstallerContext(os_detect_mock) ++ pip.register_installers(context) ++ redhat.register_installers(context) ++ source.register_installers(context) ++ redhat.register_platforms(context) ++ ++ assert YUM_INSTALLER == context.get_default_os_installer_key(OS_FEDORA) ++ ++ os_detect_mock.get_version.return_value = '22' ++ assert DNF_INSTALLER == context.get_default_os_installer_key(OS_FEDORA) ++ ++def test_Fedora_variable_lookup_key(): ++ from rosdep2 import InstallerContext ++ from rosdep2.platforms import pip, redhat, source ++ from rosdep2.platforms.redhat import DNF_INSTALLER, YUM_INSTALLER ++ ++ from rospkg.os_detect import OsDetect, OS_FEDORA ++ os_detect_mock = Mock(spec=OsDetect) ++ os_detect_mock.get_name.return_value = 'fedora' ++ os_detect_mock.get_codename.return_value = 'heisenbug' ++ os_detect_mock.get_version.return_value = '20' ++ ++ # create our test fixture. use most of the default toolchain, but ++ # replace the apt installer with one that we can have more fun ++ # with. we will do all tests with ubuntu lucid keys -- other ++ # tests should cover different resolution cases. ++ context = InstallerContext(os_detect_mock) ++ pip.register_installers(context) ++ redhat.register_installers(context) ++ source.register_installers(context) ++ redhat.register_platforms(context) ++ ++ assert ('fedora', 'heisenbug') == context.get_os_name_and_version() ++ ++ os_detect_mock.get_codename.return_value = 'twenty' ++ os_detect_mock.get_version.return_value = '21' ++ assert (OS_FEDORA, '21') == context.get_os_name_and_version() + +From b3c61be7f415a569d4c08f76a52a569e4198adbd Mon Sep 17 00:00:00 2001 +From: Scott K Logan +Date: Thu, 27 Aug 2015 19:46:23 -0700 +Subject: [PATCH 4/4] Use elevate_priv for DNF as well + +DnfInstaller was missed by 13fbd892598f7996646af54dfe169bce7dc4b0c7 +--- + src/rosdep2/platforms/redhat.py | 8 ++++---- + test/test_rosdep_redhat.py | 8 ++++---- + 2 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/src/rosdep2/platforms/redhat.py b/src/rosdep2/platforms/redhat.py +index c00c8cf..8ca4536 100644 +--- a/src/rosdep2/platforms/redhat.py ++++ b/src/rosdep2/platforms/redhat.py +@@ -142,13 +142,13 @@ def get_install_command(self, resolved, interactive=True, reinstall=False, quiet + if not packages: + return [] + elif not interactive and quiet: +- return [['sudo', 'dnf', '--assumeyes', '--quiet', 'install'] + packages] ++ return [self.elevate_priv(['dnf', '--assumeyes', '--quiet', 'install']) + packages] + elif quiet: +- return [['sudo', 'dnf', '--quiet', 'install'] + packages] ++ return [self.elevate_priv(['dnf', '--quiet', 'install']) + packages] + elif not interactive: +- return [['sudo', 'dnf', '--assumeyes', 'install'] + packages] ++ return [self.elevate_priv(['dnf', '--assumeyes', 'install']) + packages] + else: +- return [['sudo', 'dnf', 'install'] + packages] ++ return [self.elevate_priv(['dnf', 'install']) + packages] + + + class YumInstaller(PackageManagerInstaller): +diff --git a/test/test_rosdep_redhat.py b/test/test_rosdep_redhat.py +index e2c7863..f77e016 100644 +--- a/test/test_rosdep_redhat.py ++++ b/test/test_rosdep_redhat.py +@@ -58,16 +58,16 @@ def test(mock_method): + + # no interactive option with YUM + mock_method.return_value = ['a', 'b'] +- expected = [['sudo', 'dnf', '--assumeyes', '--quiet', 'install', 'a', 'b']] ++ expected = [['sudo', '-H', 'dnf', '--assumeyes', '--quiet', 'install', 'a', 'b']] + val = installer.get_install_command(['whatever'], interactive=False, quiet=True) + assert val == expected, val + expected +- expected = [['sudo', 'dnf', '--quiet', 'install', 'a', 'b']] ++ expected = [['sudo', '-H', 'dnf', '--quiet', 'install', 'a', 'b']] + val = installer.get_install_command(['whatever'], interactive=True, quiet=True) + assert val == expected, val + expected +- expected = [['sudo', 'dnf', '--assumeyes', 'install', 'a', 'b']] ++ expected = [['sudo', '-H', 'dnf', '--assumeyes', 'install', 'a', 'b']] + val = installer.get_install_command(['whatever'], interactive=False, quiet=False) + assert val == expected, val + expected +- expected = [['sudo', 'dnf', 'install', 'a', 'b']] ++ expected = [['sudo', '-H', 'dnf', 'install', 'a', 'b']] + val = installer.get_install_command(['whatever'], interactive=True, quiet=False) + assert val == expected, val + expected + try: diff --git a/python-rosdep.spec b/python-rosdep.spec index e051b4b..454c15c 100644 --- a/python-rosdep.spec +++ b/python-rosdep.spec @@ -11,12 +11,14 @@ Name: python-%{realname} Version: 0.11.2 -Release: 3%{?dist} +Release: 4%{?dist} Summary: ROS System Dependency Installer License: BSD URL: http://ros.org/wiki/%{realname} Source0: https://github.com/ros-infrastructure/%{realname}/archive/%{commit}/%{realname}-%{commit}.tar.gz +# Pulled from upstream +Patch0: %{name}-0.11.2-fedora-dnf-fixes.patch BuildArch: noarch # Documentation @@ -72,6 +74,7 @@ specify a dependency on 'boost'. %prep %setup -qn %{realname}-%{commit} +%patch0 -p1 %if 0%{?with_python3} rm -rf %{py3dir} @@ -144,6 +147,9 @@ rm -f doc/_build/.buildinfo %endif %changelog +* Sun Sep 13 2015 Scott K Logan - 0.11.2-4 +- Add upstream patches for DNF + * Thu Jun 18 2015 Fedora Release Engineering - 0.11.2-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild