Update to use python-multilib

We also rename the old multilib module used by dnf code to multilib_yum
to make it clear what is imported where.

Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
This commit is contained in:
Lubomír Sedlář 2017-03-01 10:10:10 +01:00
parent 7bdaa3bd5b
commit 76cf4a7540
7 changed files with 33 additions and 52 deletions

View File

@ -536,9 +536,9 @@ Options
changes the entire codebase doing dependency solving, so it can change the changes the entire codebase doing dependency solving, so it can change the
result in unpredictable ways. result in unpredictable ways.
Particularly the multilib testing is performed differently with much less Particularly the multilib work is performed differently by using
magic. Please refer to ``multilib`` option to see the differences. ``python-multilib`` library. Please refer to ``multilib`` option to see the
differences.
**multilib_methods** [deprecated] **multilib_methods** [deprecated]
([*str*]) -- use ``multilib`` instead to configure this per-variant ([*str*]) -- use ``multilib`` instead to configure this per-variant
@ -555,13 +555,12 @@ Options
Available methods are: Available methods are:
* ``none`` -- no package matches this method * ``none`` -- no package matches this method
* ``all`` -- all packages match this method * ``all`` -- all packages match this method
* ``runtime`` -- packages that provide something matching * ``runtime`` -- packages that install some shared object file
``*.so.[0-9]+.*`` will match. With ``yum`` backend installed files are (``*.so.*``) will match.
also looked at for a match with a hardcoded list of patterns.
* ``devel`` -- packages whose name ends with ``-devel`` or ``--static`` * ``devel`` -- packages whose name ends with ``-devel`` or ``--static``
suffix will be matched or packages that provide something with such suffix will be matched. When ``dnf`` is used, this method automatically
suffix. With ``yum`` backend this method also uses a hardcoded blacklist enables ``runtime`` method as well. With ``yum`` backend this method
and whitelist. also uses a hardcoded blacklist and whitelist.
* ``kernel`` -- packages providing ``kernel`` or ``kernel-devel`` match * ``kernel`` -- packages providing ``kernel`` or ``kernel-devel`` match
this method (only in ``yum`` backend) this method (only in ``yum`` backend)
* ``yaboot`` -- only ``yaboot`` package on ``ppc`` arch matches this (only * ``yaboot`` -- only ``yaboot`` package on ``ppc`` arch matches this (only

View File

@ -6,8 +6,8 @@ Contributing to Pungi
Set up development environment Set up development environment
============================== ==============================
In order to work on *Pungi*, you should install *Fedora 23*. These packages In order to work on *Pungi*, you should install recent version of *Fedora*.
will have to installed: These packages will have to installed:
* createrepo * createrepo
* createrepo_c * createrepo_c
@ -26,6 +26,7 @@ will have to installed:
* python-kickstart * python-kickstart
* python-lockfile * python-lockfile
* python-lxml * python-lxml
* python2-multilib
* python-productmd * python-productmd
* repoview * repoview
* syslinux * syslinux
@ -49,7 +50,7 @@ packages above as they are used by calling an executable. ::
$ for pkg in _selinux deltarpm _deltarpm krbV sqlitecachec _sqlitecache; do ln -vs "$(deactivate && python -c 'import os, '$pkg'; print '$pkg'.__file__')" "$(virtualenvwrapper_get_site_packages_dir)"; done $ for pkg in _selinux deltarpm _deltarpm krbV sqlitecachec _sqlitecache; do ln -vs "$(deactivate && python -c 'import os, '$pkg'; print '$pkg'.__file__')" "$(virtualenvwrapper_get_site_packages_dir)"; done
$ PYCURL_SSL_LIBRARY=nss pip install pycurl --no-binary :all: $ PYCURL_SSL_LIBRARY=nss pip install pycurl --no-binary :all:
$ pip install https://github.com/release-engineering/kobo/archive/0.5.2.tar.gz $ pip install https://github.com/release-engineering/kobo/archive/0.5.2.tar.gz
$ pip install lxml pyopenssl mock sphinx setuptools nose nose-cov productmd jsonschema requests lockfile $ pip install lxml pyopenssl mock sphinx setuptools nose nose-cov productmd jsonschema requests lockfile python-multilib
Now you should be able to run all existing tests. Now you should be able to run all existing tests.

View File

@ -16,6 +16,7 @@ BuildRequires: gettext, git-core, cvs
BuildRequires: python-jsonschema BuildRequires: python-jsonschema
BuildRequires: python-enum34 BuildRequires: python-enum34
BuildRequires: python2-dnf BuildRequires: python2-dnf
BuildRequires: python2-multilib
Requires: createrepo >= 0.4.11 Requires: createrepo >= 0.4.11
Requires: yum => 3.4.3-28 Requires: yum => 3.4.3-28
@ -42,6 +43,7 @@ Requires: python-jsonschema
Requires: libguestfs-tools-c Requires: libguestfs-tools-c
Requires: python-enum34 Requires: python-enum34
Requires: python2-dnf Requires: python2-dnf
Requires: python2-multilib
BuildArch: noarch BuildArch: noarch

View File

@ -29,7 +29,7 @@ import ConfigParser
from fnmatch import fnmatch from fnmatch import fnmatch
import arch as arch_module import arch as arch_module
import multilib import multilib_yum as multilib
class ReentrantYumLock(object): class ReentrantYumLock(object):

View File

@ -13,11 +13,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, see <https://gnu.org/licenses/>. # along with this program; if not, see <https://gnu.org/licenses/>.
from multilib import multilib
import re
RE_SONAME = re.compile(r"^.*\.so\.\d+.*$")
class Multilib(object): class Multilib(object):
@ -35,8 +31,15 @@ class Multilib(object):
self.blacklist = blacklist self.blacklist = blacklist
self.whitelist = whitelist self.whitelist = whitelist
self.all_methods = {
'none': multilib.NoMultilibMethod(None),
'all': multilib.AllMultilibMethod(None),
'devel': multilib.DevelMultilibMethod(None),
'runtime': multilib.RuntimeMultilibMethod(None),
}
for method in methods: for method in methods:
self.methods[method] = getattr(self, "method_%s" % method) self.methods[method] = self.all_methods[method]
@classmethod @classmethod
def from_globs(cls, sack, methods, blacklist=None, whitelist=None): def from_globs(cls, sack, methods, blacklist=None, whitelist=None):
@ -45,40 +48,13 @@ class Multilib(object):
_expand_list(sack, blacklist or []), _expand_list(sack, blacklist or []),
_expand_list(sack, whitelist or [])) _expand_list(sack, whitelist or []))
def method_none(self, pkg):
return False
def method_all(self, pkg):
return True
def method_devel(self, pkg):
if pkg.name.endswith("-devel"):
return True
if pkg.name.endswith("-static"):
return True
for prov in pkg.provides:
# TODO: split reldep to name/flag/value
prov = str(prov).split(" ")[0]
if prov.endswith("-devel"):
return True
if prov.endswith("-static"):
return True
return False
def method_runtime(self, pkg):
for prov in pkg.provides:
prov = str(prov)
if RE_SONAME.match(prov):
return True
return False
def is_multilib(self, pkg): def is_multilib(self, pkg):
if pkg.name in self.blacklist: if pkg.name in self.blacklist:
return False return False
if pkg.name in self.whitelist: if pkg.name in self.whitelist:
return 'whitelist' return 'whitelist'
for method, func in self.methods.iteritems(): for method, cls in self.methods.iteritems():
if func(pkg): if cls.select(pkg):
return method return method
return False return False

View File

@ -1009,17 +1009,18 @@ class DepsolvingBase(object):
"dummy-ipw3945-kmod-debuginfo-1.2.0-4.20.x86_64.rpm", "dummy-ipw3945-kmod-debuginfo-1.2.0-4.20.x86_64.rpm",
]) ])
def test_multilib_method_devel(self): def test_multilib_method_devel_runtime(self):
packages = [ packages = [
"dummy-lvm2-devel", "dummy-lvm2-devel",
] ]
pkg_map = self.go(packages, None, greedy="none", fulltree=False, pkg_map = self.go(packages, None, greedy="none", fulltree=False,
multilib_methods=["devel"]) multilib_methods=["devel", "runtime"])
self.assertItemsEqual(pkg_map["rpm"], [ self.assertItemsEqual(pkg_map["rpm"], [
"dummy-basesystem-10.0-6.noarch.rpm", "dummy-basesystem-10.0-6.noarch.rpm",
"dummy-filesystem-4.2.37-6.x86_64.rpm", "dummy-filesystem-4.2.37-6.x86_64.rpm",
"dummy-glibc-2.14-5.x86_64.rpm", "dummy-glibc-2.14-5.x86_64.rpm",
"dummy-glibc-2.14-5.i686.rpm",
"dummy-glibc-common-2.14-5.x86_64.rpm", "dummy-glibc-common-2.14-5.x86_64.rpm",
"dummy-lvm2-2.02.84-4.x86_64.rpm", "dummy-lvm2-2.02.84-4.x86_64.rpm",
"dummy-lvm2-devel-2.02.84-4.i686.rpm", # Important "dummy-lvm2-devel-2.02.84-4.i686.rpm", # Important
@ -1035,6 +1036,8 @@ class DepsolvingBase(object):
self.assertItemsEqual(pkg_map["debuginfo"], [ self.assertItemsEqual(pkg_map["debuginfo"], [
"dummy-glibc-debuginfo-2.14-5.x86_64.rpm", "dummy-glibc-debuginfo-2.14-5.x86_64.rpm",
"dummy-glibc-debuginfo-common-2.14-5.x86_64.rpm", "dummy-glibc-debuginfo-common-2.14-5.x86_64.rpm",
"dummy-glibc-debuginfo-2.14-5.i686.rpm",
"dummy-glibc-debuginfo-common-2.14-5.i686.rpm",
"dummy-lvm2-debuginfo-2.02.84-4.i686.rpm", "dummy-lvm2-debuginfo-2.02.84-4.i686.rpm",
"dummy-lvm2-debuginfo-2.02.84-4.x86_64.rpm", "dummy-lvm2-debuginfo-2.02.84-4.x86_64.rpm",
]) ])
@ -1327,7 +1330,7 @@ class DepsolvingBase(object):
packages = [ packages = [
"dummy-atlas-devel", "dummy-atlas-devel",
] ]
pkg_map = self.go(packages, None, greedy="build", multilib_methods=["devel"], pkg_map = self.go(packages, None, greedy="build", multilib_methods=["devel", "runtime"],
fulltree=False, arch="x86_64") fulltree=False, arch="x86_64")
self.assertItemsEqual(pkg_map["rpm"], [ self.assertItemsEqual(pkg_map["rpm"], [
@ -1345,7 +1348,7 @@ class DepsolvingBase(object):
packages = [ packages = [
"dummy-atlas-devel.+", "dummy-atlas-devel.+",
] ]
pkg_map = self.go(packages, None, greedy="build", multilib_methods=["devel"], pkg_map = self.go(packages, None, greedy="build", multilib_methods=["devel", "runtime"],
fulltree=False, arch="x86_64") fulltree=False, arch="x86_64")
self.assertItemsEqual(pkg_map["rpm"], [ self.assertItemsEqual(pkg_map["rpm"], [