[yocto] [layerindex-web][PATCH 07/10] layerindex: Detect dependencies from layer.conf files
Paul Eggleton
paul.eggleton at linux.intel.com
Mon Oct 3 15:54:11 PDT 2016
On Mon, 26 Sep 2016 14:25:35 Liam R. Howlett wrote:
> Read dependencies from layer.conf and try to create the LayerDependency
> entry by looking up the correct database object. Dependencies are found
> by layer name only - no collection support. layer.conf parsing is
> handled by the bitbake code.
I see you did some refactoring here to move some of the code needed to parse
the layer conf to the utils module. Generally I do that kind of thing in a
separate patch, although I won't insist upon it - however if you do do it as
part of this patch then it needs to at least be mentioned as part of the
commit message.
> diff --git a/layerindex/models.py b/layerindex/models.py
> index 6aec030..2db8818 100644
> --- a/layerindex/models.py
> +++ b/layerindex/models.py
> @@ -209,6 +209,9 @@ class LayerBranch(models.Model):
> return "%s: %s" % (self.layer.name, self.branch.name)
>
>
> + def get_required(self):
> + return self.dependencies_set.filter(required=True)
> +
> class LayerMaintainer(models.Model):
> MAINTAINER_STATUS_CHOICES = (
> ('A', 'Active'),
> @@ -230,6 +233,7 @@ class LayerMaintainer(models.Model):
> class LayerDependency(models.Model):
> layerbranch = models.ForeignKey(LayerBranch,
> related_name='dependencies_set') dependency = models.ForeignKey(LayerItem,
> related_name='dependents_set')
> + required = models.BooleanField(default=True)
>
> class Meta:
> verbose_name_plural = "Layer dependencies"
This "required" field doesn't seem to be used in this commit - can you move
these two changes to be part of the "recommends" support patch where they are
used?
> --- a/layerindex/tools/import_layer.py
> +++ b/layerindex/tools/import_layer.py
> @@ -19,6 +19,7 @@ import glob
> import utils
> import logging
> import subprocess
> +from layerconfparse import LayerConfParse
>
> class DryRunRollbackException(Exception):
> pass
> @@ -375,11 +376,18 @@ def main():
> if layer.name != settings.CORE_LAYER_NAME:
> if not core_layer:
> core_layer =
> utils.get_layer(settings.CORE_LAYER_NAME)
> +
> if core_layer:
> + logger.debug('Adding dep %s to %s' %
> (core_layer.name, layer.name)) layerdep = LayerDependency()
> layerdep.layerbranch = layerbranch
> layerdep.dependency = core_layer
> layerdep.save()
> + layerconfparser = LayerConfParse(logger=logger)
> + config_data = layerconfparser.parse_layer(layerdir)
> + layerconfparser.shutdown()
> + utils.add_dependencies(layerbranch, config_data,
> logger=logger)
> +
Use try..finally here to ensure shutdown() gets run.
> # Get some extra meta-information
> readme_files = glob.glob(os.path.join(layerdir, 'README*'))
> diff --git a/layerindex/update.py b/layerindex/update.py
> index 423eb53..ecd2380 100755
> --- a/layerindex/update.py
> +++ b/layerindex/update.py
> @@ -16,6 +16,8 @@ import subprocess
> import signal
> from distutils.version import LooseVersion
> import utils
> +from layerconfparse import LayerConfParse
> +
>
> import warnings
> warnings.filterwarnings("ignore", category=DeprecationWarning)
> @@ -92,7 +94,7 @@ def main():
>
> utils.setup_django()
> import settings
> - from layerindex.models import Branch, LayerItem
> + from layerindex.models import Branch, LayerItem, LayerDependency
>
> logger.setLevel(options.loglevel)
>
> @@ -201,6 +203,22 @@ def main():
> # Interrupted by user, break out of loop
> break
>
> + # Once indexed, then conf/layer.conf dependencies should be
> reevaluated.
Shouldn't this be triggered solely when layer.conf changes rather than every
time?
> + layerconfparser = LayerConfParse(logger=logger,
> bitbakepath=bitbakepath)
> + for branch in branches:
> + for layer in layerquery:
> + urldir = layer.get_fetch_dir()
> + repodir = os.path.join(fetchdir, urldir)
> +
> + layerbranch = layer.get_layerbranch(branch)
> + if layerbranch.vcs_subdir:
> + repodir = os.path.join(repodir, layerbranch.vcs_subdir)
> + config_data = layerconfparser.parse_layer(repodir)
> + utils.add_dependencies(layerbranch, config_data,
> logger=logger)
> +
> + layerconfparser.shutdown()
Use try..finally here as well.
> diff --git a/layerindex/utils.py b/layerindex/utils.py
> index 23b81f5..f82f8c7 100644
> --- a/layerindex/utils.py
> +++ b/layerindex/utils.py
> @@ -27,6 +27,114 @@ def get_layer(layername):
> return res[0]
> return None
>
> +def get_dependency_layer(depname, version_str=None, logger=None):
> + from layerindex.models import LayerItem, LayerBranch
> +
> + # Get any LayerBranch with a layer that has a name that matches the
> depname
> + res = list(LayerBranch.objects.filter(layer__name=depname))
> +
> + # Nothing found, return.
> + if len(res) == 0:
> + return None
This is more simply written as:
if res:
return None
> +
> + # If there is no version constraint, return the first one found.
> + if not version_str:
> + return res[0].layer
> +
> + (operator, dep_version) = version_str.split()
> + for layerbranch in res:
> + layer_ver = layerbranch.version
> +
> + # If there is no version in the found layer, then don't use this
> layer.
> + if not layer_ver:
> + continue
> +
> + try:
> + success = bb.utils.vercmp_string_op(layer_ver, version_str,
> operator)
> + except bb.utils.VersionStringException as vse:
> + raise vse
> +
> + if success:
> + return layerbranch.layer
> +
> + return None
> +
> +def add_dependencies(layerbranch, config_data, logger=None):
> + _add_dependency("LAYERDEPENDS", 'dependency', layerbranch, config_data,
> logger)
> +
> +def _add_dependency(var, name, layerbranch, config_data, logger=None):
> + from layerindex.models import LayerBranch, LayerDependency
> +
> + layer_name = layerbranch.layer.name
> + var_name = layer_name
> +
> + dep_list = config_data.getVar("%s_%s" % (var, var_name), True)
> +
> + if not dep_list:
> + return
Indenting is out here.
Cheers,
Paul
--
Paul Eggleton
Intel Open Source Technology Centre
More information about the yocto
mailing list