def test_with_no_units(self):
        """
        Call with no units, which shouldn't return any dependencies.
        """
        units = []

        dependent_rpms = depsolve.find_dependent_rpms(units, self._get_units)

        expected_rpms = set([])
        self.assertEqual(dependent_rpms, expected_rpms)
    def test_with_no_dependencies(self):
        """
        Call with glib2, which doesn't list any dependencies.
        """
        units = [self.unit_5]

        dependent_rpms = depsolve.find_dependent_rpms(units, self._get_units)

        # The glib2 unit doesn't list any dependencies
        expected_rpms = set([])
        self.assertEqual(dependent_rpms, expected_rpms)
    def test_one_unit_with_dependencies(self):
        """
        Call find_dependent_rpms with the Firefox unit. It should return a dependency on xulrunner.
        """
        units = [self.unit_1]

        dependent_rpms = depsolve.find_dependent_rpms(units, self._get_units)

        # Firefox only depends directly on xulrunner
        expected_rpms = set([self.rpm_2.as_named_tuple])
        self.assertEqual(dependent_rpms, expected_rpms)
    def test_two_units_with_dependencies(self):
        """
        Call find_dependent_rpms() with firefox and gnome-calcualtor. It should return xulrunner and
        glib2.
        """
        units = [self.unit_1, self.unit_4]

        dependent_rpms = depsolve.find_dependent_rpms(units, self._get_units)

        # Firefox only depends directly on xulrunner, and gnome-calculator needs glib2
        expected_rpms = set([self.rpm_2.as_named_tuple, self.rpm_5.as_named_tuple])
        self.assertEqual(dependent_rpms, expected_rpms)
Esempio n. 5
0
def copy_rpms(units, import_conduit, copy_deps):
    """
    Copy RPMs from the source repo to the destination repo, and optionally copy
    dependencies as well. Dependencies are resolved recursively.

    :param units:           iterable of Units
    :type  units:           iterable of pulp.plugins.models.Unit
    :param import_conduit:  import conduit passed to the Importer
    :type  import_conduit:  pulp.plugins.conduits.unit_import.ImportUnitConduit
    :param copy_deps:       if True, copies dependencies as specified in "Requires"
                            lines in the RPM metadata. Matches against NEVRAs
                            and Provides declarations that are found in the
                            source repository. Silently skips any dependencies
                            that cannot be resolved within the source repo.

    :return:    set of pulp.plugins.models.Unit that were copied
    :rtype:     set
    """
    unit_set = set()

    for unit in units:
        import_conduit.associate_unit(unit)
        unit_set.add(unit)

    if copy_deps and unit_set:
        deps = depsolve.find_dependent_rpms(unit_set, import_conduit.get_source_units)
        # only consider deps that exist in the source repo
        available_deps = set(filter_available_rpms(deps, import_conduit))
        # remove rpms already in the destination repo
        existing_units = set(existing.get_existing_units([dep.unit_key for dep in available_deps],
                                                         models.RPM.UNIT_KEY_NAMES, models.RPM.TYPE,
                                                         import_conduit.get_destination_units))
        to_copy = available_deps - existing_units
        _LOGGER.debug('Copying deps: %s' % str(sorted([x.unit_key['name'] for x in to_copy])))
        if to_copy:
            unit_set |= copy_rpms(to_copy, import_conduit, copy_deps)

    return unit_set