From 13c095e854da649b56d0a11e0557235be9bea928 Mon Sep 17 00:00:00 2001 From: Tomas Hrnciar Date: Thu, 20 Feb 2020 17:10:59 +0100 Subject: [PATCH] mock: fix dynamic buildrequires unnecesarry loop per discussion here: https://github.com/rpm-software-management/rpm/issues/963 Mock should accept return code 0 from rpm. Relates: #434 --- mock/py/mockbuild/backend.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/mock/py/mockbuild/backend.py b/mock/py/mockbuild/backend.py index 8d1f70d5a..f79801623 100644 --- a/mock/py/mockbuild/backend.py +++ b/mock/py/mockbuild/backend.py @@ -180,17 +180,17 @@ def remove(self, *rpms): self.buildroot.root_log.info(output) @traceLog() - def installSrpmDeps(self, *srpms): + def installSrpmDeps(self, *srpms, ignored_deps = None): """Figure out deps from srpm. Call package manager to install them""" try: self.uid_manager.becomeUser(0, 0) # first, install pre-existing deps and configured additional ones - deps = list(self.buildroot.preexisting_deps) + deps = set(self.buildroot.preexisting_deps) for hdr in util.yieldSrpmHeaders(srpms, plainRpmOk=1): # get text buildreqs - deps.extend(util.getAddtlReqs(hdr, self.more_buildreqs)) - if deps: + deps.update(util.getAddtlReqs(hdr, self.more_buildreqs)) + if deps > ignored_deps: self.buildroot.pkg_manager.install(*deps, check=True) # install actual build dependencies @@ -198,6 +198,8 @@ def installSrpmDeps(self, *srpms): finally: self.uid_manager.restorePrivs() + return deps + @traceLog() def installSpecDeps(self, spec_file): try: @@ -693,13 +695,13 @@ def get_command(mode): bd_out = self.make_chroot_path(self.buildroot.builddir) max_loops = int(self.config.get('dynamic_buildrequires_max_loops')) success = False + deps = set() if dynamic_buildrequires and self.config.get('dynamic_buildrequires'): while not success and max_loops > 0: # run rpmbuild+installSrpmDeps until # * it fails # * installSrpmDeps does nothing # * or we run out of dynamic_buildrequires_max_loops tries - packages_before = self.buildroot.all_chroot_packages() try: self.buildroot.doChroot(get_command(['-br']), shell=False, logger=self.buildroot.build_log, timeout=timeout, @@ -708,18 +710,19 @@ def get_command(mode): nspawn_args=self._get_nspawn_args(), unshare_net=self.private_network, printOutput=self.config['print_main_output']) - success = True except Error as e: if e.resultcode != 11: raise e + finally: max_loops -= 1 self.buildroot.root_log.info("Dynamic buildrequires detected") self.buildroot.root_log.info("Going to install missing buildrequires") buildreqs = glob.glob(bd_out + '/SRPMS/*.buildreqs.nosrc.rpm') - self.installSrpmDeps(*buildreqs) - packages_after = self.buildroot.all_chroot_packages() - if packages_after == packages_before: + new_deps = self.installSrpmDeps(*buildreqs, deps) + if new_deps <= deps: success = True + else: + deps = new_deps for f_buildreqs in buildreqs: os.remove(f_buildreqs) if not sc: