[OE-core] [PATCH V2 1/1] bitbake-layers: add a ability to query layer dependencies from layer index

Mario Domenech Goulart mario at ossystems.com.br
Fri Jan 16 18:54:29 UTC 2015


Hi,

On Mon, 12 Jan 2015 14:48:42 +0800 Chong Lu <Chong.Lu at windriver.com> wrote:

> It maybe depends on other layers when one layer is added to BBLAYERS. If define
> LAYERDEPENDS variable in this layer, we will get error from bitbake. But
> sometimes, we don't have defined. Add a mechanism to extend bitbake-layers and
> it will query layer dependencies from layer index
> (http://layers.openembedded.org/layerindex/api/)
> Use `bitbake-layers show-layer-dependencies' to find out dependencies and update
> bblayers.conf as appropriate.
>
> [YOCTO #5348]
>
> Signed-off-by: Chong Lu <Chong.Lu at windriver.com>
> ---
>  bitbake/bin/bitbake-layers | 116 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 116 insertions(+)
>
> diff --git a/bitbake/bin/bitbake-layers b/bitbake/bin/bitbake-layers
> index 9879498..0756095 100755
> --- a/bitbake/bin/bitbake-layers
> +++ b/bitbake/bin/bitbake-layers
> @@ -27,6 +27,7 @@ import sys
>  import fnmatch
>  from collections import defaultdict
>  import re
> +import httplib, urlparse, json
>  
>  bindir = os.path.dirname(__file__)
>  topdir = os.path.dirname(bindir)
> @@ -157,6 +158,121 @@ usage: remove-layer <layerdir>
>                  sys.stderr.write("No layers matching %s found in BBLAYERS\n" % item)
>  
>  
> +    def get_json_data(self, apiurl):
> +        proxy_settings = os.environ.get("http_proxy", None)
> +        conn = None
> +        _parsedurl = urlparse.urlparse(apiurl)
> +        path = _parsedurl.path
> +        query = _parsedurl.query
> +        def parse_url(url):
> +            parsedurl = urlparse.urlparse(url)
> +            try:
> +                (host, port) = parsedurl.netloc.split(":")
> +            except ValueError:
> +                host = parsedurl.netloc
> +                port = None
> +
> +            if port is None:
> +                port = 80
> +            else:
> +                port = int(port)
> +            return (host, port)
> +
> +        if proxy_settings is None:
> +            host, port = parse_url(apiurl)
> +            conn = httplib.HTTPConnection(host, port)
> +            conn.request("GET", path + "?" + query)
> +        else:
> +            host, port = parse_url(proxy_settings)
> +            conn = httplib.HTTPConnection(host, port)
> +            conn.request("GET", apiurl)
> +
> +        r = conn.getresponse()
> +        if r.status != 200:
> +            raise Exception("Failed to read " + path + ": %d %s" % (r.status, r.reason))
> +        return json.loads(r.read())
> +
> +
> +    def get_layer_deps(self, layername, layeritems, layerbranches, layerdependencies):
> +        def layeritems_info_id(items_name, layeritems):
> +            litems_id = ""
> +            for li in layeritems:
> +                if li['name'] == items_name:
> +                    litems_id = li['id']
> +                    break
> +            return litems_id
> +
> +        def layerbranches_info(items_id, layerbranches):
> +            lbranch = {}
> +            for lb in layerbranches:
> +                # branch is master.
> +                if lb['layer'] == items_id and lb['branch'] == 1:
> +                    lbranch['id'] = lb['id']
> +                    lbranch['vcs_subdir'] = lb['vcs_subdir']
> +                    break
> +            if not lbranch['id']:
> +                logger.plain("The id of layerBranches is not found.")
> +                return
> +            else:
> +                return lbranch
> +
> +        def layerdependencies_info(lb_id, layerdependencies):
> +            ld_deps = []
> +            for ld in layerdependencies:
> +                if ld['layerbranch'] == lb_id and not ld['dependency'] in ld_deps:
> +                    ld_deps.append(ld['dependency'])
> +            if not ld_deps:
> +                logger.plain("The dependency of layerDependencies is not found.")
> +                return
> +            else:
> +                return ld_deps
> +
> +        def layeritems_info_name_subdir(items_id, layeritems):
> +            litems = {}
> +            for li in layeritems:
> +                if li['id'] == items_id:
> +                    litems['vcs_url'] = li['vcs_url']
> +                    litems['name'] = li['name']
> +                    break
> +            return litems
> +
> +        itemsid = layeritems_info_id(layername, layeritems)
> +        if not itemsid:
> +            return
> +        lbid = layerbranches_info(itemsid, layerbranches)['id']
> +        ldict = {}
> +        for dependency in layerdependencies_info(lbid, layerdependencies):
> +            lname = layeritems_info_name_subdir(dependency, layeritems)['name']
> +            lurl = layeritems_info_name_subdir(dependency, layeritems)['vcs_url']
> +            lsubdir = layerbranches_info(dependency, layerbranches)['vcs_subdir']
> +            ldict[lname] = lurl, lsubdir
> +        return ldict
> +
> +
> +    def do_show_layer_dependencies(self, args):
> +        """Find layer dependencies from layer index"""
> +        apilinks = self.get_json_data(apiurl = "http://layers.openembedded.org/layerindex/api/")
> +        layeritems = self.get_json_data(apilinks['layerItems'])
> +        layerbranches = self.get_json_data(apilinks['layerBranches'])
> +        layerdependencies = self.get_json_data(apilinks['layerDependencies'])

This is subject to race conditions.  There's no guarantee with regard to
atomicity between requests.


> +        self.init_bbhandler(config_only = True)
> +        bblayers_conf = os.path.join('conf', 'bblayers.conf')
> +        logger.plain("%s  %s  %s  %s" % ("Layer".ljust(20), "Dependencies".ljust(20), "Git repository".ljust(50), "Subdirectory"))
> +        logger.plain('=' * 111)
> +        if not os.path.exists(bblayers_conf):
> +            sys.stderr.write("Unable to find bblayers.conf\n")
> +            return
> +        for layerdir in self.bblayers:
> +            layername = self.get_layer_name(layerdir)
> +            if not layername == "meta":
> +                layerdict = self.get_layer_deps(layername, layeritems, layerbranches, layerdependencies)
> +                if layerdict:
> +                    for layer in layerdict:
> +                        logger.plain("%s  %s  %s  %s" % (layername.ljust(20), layer.ljust(20), layerdict[layer][0].ljust(50), layerdict[layer][1]))
> +                else:
> +                    logger.plain("%s" % layername)
> +
> +
>      def version_str(self, pe, pv, pr = None):
>          verstr = "%s" % pv
>          if pr:
> -- 
> 1.9.1

Best wishes.
Mario
-- 
http://www.ossystems.com.br



More information about the Openembedded-core mailing list