Anvil not creating RPM 'Conflicts' terms in spec files

Use RPM 'Conflicts' dependencies to express Python version constraints in
which versions are excluded using '!=' syntax.

Change-Id: I2f7cc87e6c3ba449d15cc37baa350f3db235f1c2
Co-Authored-By: Sam Gasper <sgasper@cray.com>
Closes-bug: #1422442
This commit is contained in:
Stig Telfer 2015-02-16 16:15:39 +00:00
parent 8582b9b090
commit 7a6b074e27
13 changed files with 69 additions and 12 deletions

View File

@ -93,9 +93,10 @@ class Helper(object):
def _convert_names_to_rpm(self, python_names, only_name):
if not python_names:
return {}
return {}, {}
cmdline = self._start_cmdline() + ["--convert"] + python_names
result = collections.defaultdict(set)
conflicts = collections.defaultdict(set)
current_source = None
for line in sh.execute(cmdline)[0].splitlines():
# NOTE(harlowja): format is "Requires: rpm-name <=> X" or when
@ -109,6 +110,9 @@ class Helper(object):
if positions:
line = line[0:positions[0]]
result[current_source].add(line.strip())
elif line.startswith("Conflicts:"):
line = line[len("Conflicts:"):]
conflicts[current_source].add(line.strip())
elif line.startswith("# Source:"):
current_source = line[len("# Source:"):].strip()
@ -120,10 +124,10 @@ class Helper(object):
if extra_names:
raise AssertionError("Extra python names were found during conversion: %s"
% ', '.join(sorted(extra_names)))
return result
return result, conflicts
def names_to_rpm_names(self, python_names):
mapping = self._convert_names_to_rpm(python_names, only_name=True)
mapping = self._convert_names_to_rpm(python_names, only_name=True)[0]
result = {}
for k, v in six.iteritems(mapping):
assert len(v) == 1, ('There should be exactly one RPM name for '
@ -132,11 +136,13 @@ class Helper(object):
result[k] = v.pop()
return result
def names_to_rpm_requires(self, python_names):
mapping = self._convert_names_to_rpm(python_names, only_name=False)
return [req
for value in six.itervalues(mapping)
for req in value]
def names_to_rpm_deps(self, python_names):
# Given a set of packages in Python namespace, return the equivalent
# Requires and Conflicts in RPM namespace.
requires, conflicts = self._convert_names_to_rpm(python_names, only_name=False)
requires_list = [req for value in six.itervalues(requires) for req in value]
conflicts_list = [req for value in six.itervalues(conflicts) for req in value]
return requires_list, conflicts_list
def build_all_srpms(self, package_files, tracewriter, jobs):
(_fn, content) = utils.load_template(sh.joinpths("packaging", "makefiles"), "source.mk")

View File

@ -632,7 +632,9 @@ class YumDependencyHandler(base.DependencyHandler):
def _write_spec_file(self, instance, rpm_name, template_name, params):
requires_what = params.get('requires', [])
conflicts_what = params.get('conflicts', [])
test_requires_what = params.get('test_requires', [])
test_conflicts_what = params.get('test_conflicts', [])
egg_info = getattr(instance, 'egg_info', None)
if egg_info:
@ -640,15 +642,21 @@ class YumDependencyHandler(base.DependencyHandler):
try:
requires_python = [str(req) for req in egg_info[key]]
except KeyError:
return []
return [], []
else:
return self.py2rpm_helper.names_to_rpm_requires(requires_python)
return self.py2rpm_helper.names_to_rpm_deps(requires_python)
requires_what.extend(ei_names('dependencies'))
test_requires_what.extend(ei_names('test_dependencies'))
rpm_requires, rpm_conflicts = ei_names('dependencies')
requires_what.extend(rpm_requires)
conflicts_what.extend(rpm_conflicts)
rpm_test_requires, rpm_test_conflicts = ei_names('test_dependencies')
test_requires_what.extend(rpm_test_requires)
test_conflicts_what.extend(rpm_test_conflicts)
params["requires"] = requires_what
params["conflicts"] = conflicts_what
params["test_requires"] = test_requires_what
params["test_conflicts"] = test_conflicts_what
params["epoch"] = self.OPENSTACK_EPOCH
params["part_fn"] = lambda filename: sh.joinpths(
settings.TEMPLATE_DIR,

View File

@ -96,6 +96,10 @@ Group: Applications/System
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description -n python-ceilometer
OpenStack ceilometer provides services to measure and
collect metrics from OpenStack components.

View File

@ -77,6 +77,10 @@ Requires: sudo
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description -n python-cinder
OpenStack Volume (codename Cinder) provides services to manage and

View File

@ -75,6 +75,10 @@ Group: Applications/System
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description -n python-glance
OpenStack Image Service (code-named Glance) provides discovery,
registration, and delivery services for virtual disk images.

View File

@ -128,6 +128,10 @@ Requires: ${i}
Requires(pre): shadow-utils
%endif
#for $i in $conflicts
Conflicts: ${i}
#end for
%description common
Components common to all OpenStack Heat services

View File

@ -95,6 +95,10 @@ Group: Applications/System
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description -n python-%{python_name}
This package contains the %{name} Python library.

View File

@ -105,6 +105,10 @@ Group: Development/Languages/Python
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description -n python-keystone
Keystone is a Python implementation of the OpenStack
(http://www.openstack.org) identity service API.

View File

@ -134,6 +134,9 @@ Requires: sudo
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description -n python-neutron
Neutron provides an API to dynamically request and configure virtual

View File

@ -348,6 +348,10 @@ Requires: sudo
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description -n python-nova
OpenStack Compute (codename Nova) is open source software designed to
provision and manage large networks of virtual machines, creating a

View File

@ -87,6 +87,10 @@ Group: Development/Languages/Python
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description -n python-trove
Trove is Database as a Service for Openstack. It's designed to run
entirely on OpenStack, with the goal of allowing users to quickly and

View File

@ -55,6 +55,10 @@ BuildRequires: make
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description
This is a client for the OpenStack $apiname API. There's a Python API
(the ${clientname}client module), and a command-line script (${clientname}).

View File

@ -72,6 +72,10 @@ BuildRequires: python-scss
Requires: ${i}
#end for
#for $i in $conflicts
Conflicts: ${i}
#end for
%description
Horizon is a Django application for providing Openstack UI components.
It allows performing site administrator (viewing account resource usage,