| |
@@ -8,15 +8,17 @@
|
| |
def _categorise_deps(pool, all_rpm_deps):
|
| |
module_deps = set()
|
| |
remaining_rpm_deps = set()
|
| |
- for pkgname in all_rpm_deps:
|
| |
- modname = _depchase.get_module_for_rpm(pkgname)
|
| |
+ for pkg in all_rpm_deps:
|
| |
+ modname = _depchase.get_module_for_rpm(pkg)
|
| |
if modname is not None:
|
| |
module_deps.add(modname)
|
| |
else:
|
| |
- remaining_rpm_deps.add(pkgname)
|
| |
- srpm_deps = {_depchase.get_srpm_for_rpm(pool, dep) for dep in remaining_rpm_deps}
|
| |
- return module_deps, srpm_deps
|
| |
+ remaining_rpm_deps.add(pkg)
|
| |
+ return module_deps, remaining_rpm_deps
|
| |
|
| |
+ def _name_only(rpm_name):
|
| |
+ name, version, release = rpm_name.rsplit("-", 2)
|
| |
+ return name
|
| |
|
| |
class ModuleGenerator(object):
|
| |
|
| |
@@ -24,12 +26,43 @@
|
| |
self.pkgs = pkgs
|
| |
self.pkg = None
|
| |
self.mmd = modulemd.ModuleMetadata()
|
| |
- self._pool = pool = _depchase.make_pool("x86_64")
|
| |
- # Dependency issue with the test build deps, so skip that for now...
|
| |
- all_deps = {s.name for s in _depchase.resolve(pkgs, builddeps=False, pool=pool)}
|
| |
- runtime_deps = {s.name for s in _depchase.resolve(pkgs, pool=pool)}
|
| |
- self.run_deps = runtime_deps
|
| |
- self.build_deps = all_deps - runtime_deps
|
| |
+ self._calculate_dependencies()
|
| |
+
|
| |
+ def _calculate_dependencies(self):
|
| |
+ pkgs = self.pkgs
|
| |
+ pool = _depchase.make_pool("x86_64")
|
| |
+ self.api_srpms = {_name_only(_depchase.get_srpm_for_rpm(pool, dep)) for dep in pkgs}
|
| |
+ run_deps = {s.name:s for s in _depchase.ensure_installable(pkgs, pool=pool)}
|
| |
+ module_run_deps, rpm_run_deps = _categorise_deps(pool, run_deps)
|
| |
+ self.module_run_deps = module_run_deps
|
| |
+ run_srpms, build_deps = _depchase.ensure_buildable(rpm_run_deps)
|
| |
+ module_build_deps = set()
|
| |
+ resolved_build_deps = set()
|
| |
+ build_srpms = set()
|
| |
+ for i in range(10):
|
| |
+ # Arbitrary bound of 10 levels of SRPM bootstrapping
|
| |
+ new_module_build_deps, remaining_build_deps = _categorise_deps(pool, build_deps)
|
| |
+ module_build_deps |= new_module_build_deps
|
| |
+ resolved_build_deps |= (build_deps - remaining_build_deps)
|
| |
+ build_deps -= resolved_build_deps
|
| |
+ if build_deps:
|
| |
+ new_build_srpms, remaining_build_deps = _depchase.ensure_buildable(build_deps)
|
| |
+ build_srpms |= new_build_srpms
|
| |
+ resolved_build_deps |= (build_deps - remaining_build_deps)
|
| |
+ build_deps -= resolved_build_deps
|
| |
+ if not build_deps:
|
| |
+ break
|
| |
+ else:
|
| |
+ logging.warn("Failed to close out build dependencies after 10 iteration")
|
| |
+ self.module_run_deps = module_run_deps
|
| |
+ self.module_build_deps = module_build_deps
|
| |
+ run_srpm_names = {_name_only(s.name) for s in run_srpms}
|
| |
+ build_srpm_names = {_name_only(s.name) for s in build_srpms}
|
| |
+ self.run_srpms = run_srpm_names - build_srpm_names
|
| |
+ self.build_srpms = build_srpm_names - run_srpm_names
|
| |
+ self.build_and_run_srpms = run_srpm_names & build_srpm_names
|
| |
+ self.unresolved_build_rpms = {_name_only(s.name) for s in build_deps}
|
| |
+
|
| |
|
| |
def _get_pkg_info(self):
|
| |
"""Function loads package from dnf"""
|
| |
@@ -78,35 +111,32 @@
|
| |
self.mmd.add_content_license(str(self.pkg.license))
|
| |
|
| |
# Declare the public API
|
| |
- for pkg in self.pkgs:
|
| |
+ for pkg in self.api_srpms:
|
| |
self.mmd.api.add_rpm(pkg)
|
| |
- # TODO: Restore resolution of pkg to the actual provider
|
| |
self.mmd.components.add_rpm(pkg, "Package in api", buildorder=self._get_build_order(pkg))
|
| |
|
| |
- # Resolve dependencies using other modules wherever possible
|
| |
- module_build_deps, srpm_build_deps = _categorise_deps(self._pool, self.build_deps)
|
| |
- module_run_deps, srpm_run_deps = _categorise_deps(self._pool, self.run_deps)
|
| |
-
|
| |
# Declare module level dependencies
|
| |
- for modname in module_build_deps:
|
| |
+ for modname in self.module_build_deps:
|
| |
self.mmd.buildrequires[modname] = "f27"
|
| |
- for modname in module_run_deps:
|
| |
+ for modname in self.module_run_deps:
|
| |
self.mmd.requires[modname] = "f27"
|
| |
|
| |
# Add any other RPMs not available from existing modules as components
|
| |
- for pkg in srpm_build_deps.intersection(srpm_run_deps):
|
| |
+ for pkg in self.build_and_run_srpms:
|
| |
self.mmd.components.add_rpm(pkg, "Build and runtime dependency.", buildorder=self._get_build_order(pkg))
|
| |
|
| |
- for pkg in (srpm_build_deps - srpm_run_deps):
|
| |
- self.mmd.components.add_rpm(pkg, "Build dependency.", buildorder=self._get_build_order(pkg))
|
| |
-
|
| |
- for pkg in (srpm_run_deps - srpm_build_deps):
|
| |
+ for pkg in self.run_srpms:
|
| |
self.mmd.components.add_rpm(pkg, "Runtime dependency.", buildorder=self._get_build_order(pkg))
|
| |
|
| |
- # Filter out any build-only packages
|
| |
- for pkg in (srpm_build_deps - srpm_run_deps - self.mmd.api.rpms):
|
| |
+ for pkg in self.build_srpms:
|
| |
+ self.mmd.components.add_rpm(pkg, "Build dependency.", buildorder=self._get_build_order(pkg))
|
| |
+ # Filter out any build-only packages
|
| |
+ # TODO: This won't filter out all the RPMs, only the one matching the SRPM name
|
| |
+ # See https://pagure.io/modulemd/issue/54 for discussion
|
| |
self.mmd.filter.add_rpm(pkg)
|
| |
|
| |
+ # TODO: Emit something for non-empty self.unresolved_build_rpms
|
| |
+
|
| |
|
| |
def _get_build_order(self, pkg):
|
| |
if pkg in self.mmd.api.rpms:
|
| |
Technically now you can't get builddeps of
A
which buildrequirescompat-openssl10-devel
andB
which buildrequiresopenssl-devel
... That's why that code was there.