| |
@@ -20,6 +20,7 @@
|
| |
# SOFTWARE.
|
| |
#
|
| |
|
| |
+ import re
|
| |
import requests
|
| |
from collections import defaultdict
|
| |
|
| |
@@ -153,13 +154,15 @@
|
| |
ret.append(module)
|
| |
return ret
|
| |
|
| |
- def _add_new_dependencies(self, module_map, modules):
|
| |
+ def _add_new_dependencies(self, module_map, modules, base_modules=None):
|
| |
"""
|
| |
Helper for ``validate_module_list()`` - scans ``modules`` and adds any missing
|
| |
requirements to ``module_map``.
|
| |
|
| |
:param module_map: dict mapping module name:stream to module.
|
| |
:param modules: the list of modules to scan for dependencies.
|
| |
+ :param base_modules: a list of names for base modules; their
|
| |
+ dependencies should not be analyzed
|
| |
:return: a list of any modules that were added to ``module_map``.
|
| |
"""
|
| |
|
| |
@@ -170,22 +173,45 @@
|
| |
)
|
| |
mmd = mmd.upgrade(2)
|
| |
|
| |
+ min_bound = 0
|
| |
+ base_module_stream_version = None
|
| |
+ for base_module in module["base_module_buildrequires"]:
|
| |
+ base_module_stream_version = base_module["stream_version"]
|
| |
+ # Let's extract the major version from the stream.
|
| |
+ match = re.search("^[^0-9]*([0-9]+)", base_module["stream"])
|
| |
+ if match:
|
| |
+ major_version = match.group(1)
|
| |
+ # The lower bound is based on major version extract from
|
| |
+ # the stream name, and padded with zeros to be the same
|
| |
+ # size as the integer part of the original stream version.
|
| |
+ min_bound = major_version + "0" * (
|
| |
+ len(str(int(base_module_stream_version))) - len(major_version)
|
| |
+ )
|
| |
+
|
| |
# Check runtime dependency (name:stream) of a module and if this
|
| |
# dependency is already in module_map/new_modules, do nothing.
|
| |
# But otherwise get the latest module in this name:stream from MBS
|
| |
# and add it to new_modules/module_map.
|
| |
for deps in mmd.get_dependencies():
|
| |
for name in deps.get_runtime_modules():
|
| |
+ if base_modules and name in base_modules:
|
| |
+ continue
|
| |
for stream in deps.get_runtime_streams(name):
|
| |
key = "%s:%s" % (name, stream)
|
| |
if key not in module_map:
|
| |
- new_module = self.get_latest_modules(key)
|
| |
+ new_module = self.get_latest_modules(
|
| |
+ key,
|
| |
+ base_module_br_stream_version_lte=str(
|
| |
+ base_module_stream_version
|
| |
+ ),
|
| |
+ base_module_br_stream_version_gte=min_bound,
|
| |
+ )
|
| |
new_modules += new_module
|
| |
module_map[key] = [new_modules]
|
| |
|
| |
return new_modules
|
| |
|
| |
- def validate_module_list(self, modules, expand=True):
|
| |
+ def validate_module_list(self, modules, expand=True, base_modules=None):
|
| |
"""
|
| |
Given a list of modules as returned by `get_modules()`, checks that
|
| |
there are no conflicting duplicates, removes any exact duplicates,
|
| |
@@ -196,6 +222,8 @@
|
| |
``get_latest_module()``
|
| |
:param expand: if required modules should be included in the returned
|
| |
list.
|
| |
+ :param base_modules: a list of base module names, their dependencies
|
| |
+ should not be resolved.
|
| |
:return: the list of modules with deduplication and expansion.
|
| |
:raises ModuleLookupError: if a required module couldn't be found, or a
|
| |
conflict occurred when resolving dependencies.
|
| |
@@ -248,7 +276,7 @@
|
| |
added_module_list = new_modules
|
| |
while True:
|
| |
added_module_list = self._add_new_dependencies(
|
| |
- module_map, added_module_list
|
| |
+ module_map, added_module_list, base_modules
|
| |
)
|
| |
if len(added_module_list) == 0:
|
| |
break
|
| |
When dependencies are resolved for modules, originally ODCS would just take whatever is the latest build of the module. This is not great if there are multiple release going on at the same time.
Example situation: user requests mod:master:1:00000000 built against release 1.2.3. It depends on module foo:bar. If there happens to be a build of foo:bar built against release 1.3.0 (or even 2.0.0), it will be included in the compose.
To fix that, this patch looks at stream version of platform module for the initial module (
10203
), and will require all dependencies to have platform stream version equal or less than that (<10203
). It will also construct lower bound based on major release version (>10000
).