[PATCH 1/3] Install build deps with yum-builddep.

Ville Skyttä ville.skytta at iki.fi
Wed Oct 20 20:04:18 UTC 2010


No longer need to screen-scrape resolvedep and feed that to yum
install, and we have a chance to get BuildConflicts handing "for free"
(when RHBZ #614191 is done in yum(-builddep)).
---
 mock.spec.in       |    2 +-
 py/mock/backend.py |   33 ++++++++++++++++++++++-----------
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/mock.spec.in b/mock.spec.in
index e2580ca..0949975 100644
--- a/mock.spec.in
+++ b/mock.spec.in
@@ -18,7 +18,7 @@ Source: https://fedorahosted.org/mock/attachment/wiki/MockTarballs/%{name}-%{ver
 URL: http://fedoraproject.org/wiki/Projects/Mock
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildArch: noarch
-Requires: python >= 2.4, yum >= 2.4, tar, pigz, python-ctypes, python-decoratortools, usermode
+Requires: python >= 2.4, yum >= 2.4, yum-utils >= 1.1.9, tar, pigz, python-ctypes, python-decoratortools, usermode
 Requires: createrepo
 Requires(pre): shadow-utils
 BuildRequires: python-devel
diff --git a/py/mock/backend.py b/py/mock/backend.py
index ba0ad14..81a98d0 100644
--- a/py/mock/backend.py
+++ b/py/mock/backend.py
@@ -69,6 +69,7 @@ class Root(object):
         self.chroot_file_contents = config['files']
         self.chroot_setup_cmd = config['chroot_setup_cmd']
         self.yum_path = '/usr/bin/yum'
+        self.yum_builddep_path = '/usr/bin/yum-builddep'
         self.macros = config['macros']
         self.more_buildreqs = config['more_buildreqs']
         self.cache_topdir = config['cache_topdir']
@@ -444,23 +445,28 @@ class Root(object):
         """figure out deps from srpm. call yum to install them"""
         try:
             self.uidManager.becomeUser(0, 0)
+
+            def _yum_and_check(cmd):
+                output = self._yum(cmd, returnOutput=1)
+                for line in output.split('\n'):
+                    if line.lower().find('No Package found for'.lower()) != -1:
+                        raise mock.exception.BuildError, "Bad build req: %s. Exiting." % line
+
+            # first, install pre-existing deps and configured additional ones
             arg_string = self.preExistingDeps
             for hdr in mock.util.yieldSrpmHeaders(srpms, plainRpmOk=1):
                 # get text buildreqs
-                a = mock.util.requiresTextFromHdr(hdr)
-                b = mock.util.getAddtlReqs(hdr, self.more_buildreqs)
-                for item in mock.util.uniqReqs(a, b):
+                for item in mock.util.getAddtlReqs(hdr, self.more_buildreqs):
                     arg_string = arg_string + " '%s'" % item
-
-            # everything exists, okay, install them all.
-            # pass build reqs (as strings) to installer
             if arg_string != "":
-                output = self._yum('resolvedep %s' % arg_string, returnOutput=1)
-                for line in output.split('\n'):
-                    if line.lower().find('No Package found for'.lower()) != -1:
-                        raise mock.exception.BuildError, "Bad build req: %s. Exiting." % line
+                # everything exists, okay, install them all.
+                # pass build reqs (as strings) to installer
+                _yum_and_check('resolvedep %s' % arg_string)
                 # nothing made us exit, so we continue
                 self._yum('install %s' % arg_string, returnOutput=1)
+
+            # install actual build dependencies
+            _yum_and_check("builddep '%s'" % "' '".join(srpms))
         finally:
             self.uidManager.restorePrivs()
 
@@ -676,7 +682,12 @@ class Root(object):
         if not self.online:
             cmdOpts = "-C"
 
-        cmd = '%s --installroot %s %s %s' % (self.yum_path, self.makeChrootPath(), cmdOpts, cmd)
+        # invoke yum-builddep instead of yum if cmd is builddep
+        exepath = self.yum_path
+        if cmd.startswith("builddep "):
+            exepath = self.yum_builddep_path
+            cmd = cmd[len("builddep "):]
+        cmd = '%s --installroot %s %s %s' % (exepath, self.makeChrootPath(), cmdOpts, cmd)
         self.root_log.debug(cmd)
         output = ""
         try:
-- 
1.7.2.3



More information about the buildsys mailing list