From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qc0-f182.google.com (mail-qc0-f182.google.com [209.85.216.182]) by mail.openembedded.org (Postfix) with ESMTP id 7110C722C3 for ; Fri, 16 Jan 2015 18:54:33 +0000 (UTC) Received: by mail-qc0-f182.google.com with SMTP id l6so14411520qcy.13 for ; Fri, 16 Jan 2015 10:54:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-type; bh=NNG/1XxB8OuJ2hexCSV3RskySPTXXxmv/hAYw+hA6Sw=; b=ZXRoz+lGKls7ivFyYX/jsxQVXd3UTv8Lje6GYpXg0vDY4Woqbl2rTxVjLi886h+f6q dLWAp7BVu7VsRO01IdzC78CcoVs8huQBEZ3Fu2Owl7XyrD5OwXse0zWp0aN2PBZkcte9 Bc5mYzDa5oThx/VmuYYYPLgJkeuD3khNU6cc6JOgY+ouypuYLzpoeEjWX73GCWWPBjNj vAVyReNlweW4cvKOS0LBL1SsCDgrl/YKsokAk67Pc7m4va2zi8K3Vc/g5xpd6aIaEbvE 3LONCrx9jPg0jIGhiiWCw1MbW9GTSOzeBt3mIXe1VLKLpO9oGOY2e5kq/2afw9Sit/O9 CkgA== X-Received: by 10.224.95.71 with SMTP id c7mr3434138qan.70.1421434474076; Fri, 16 Jan 2015 10:54:34 -0800 (PST) Received: from email.parenteses.org.gmail.com (email.parenteses.org. [198.199.72.94]) by mx.google.com with ESMTPSA id c7sm4868329qar.33.2015.01.16.10.54.32 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Jan 2015 10:54:32 -0800 (PST) Sender: Mario Domenech Goulart From: Mario Domenech Goulart To: Chong Lu References: Date: Fri, 16 Jan 2015 18:54:29 +0000 In-Reply-To: (Chong Lu's message of "Mon, 12 Jan 2015 14:48:42 +0800") Message-ID: <87k30mo8t6.fsf@email.parenteses.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Cc: paul.eggleton@linux.intel.com, openembedded-core@lists.openembedded.org Subject: Re: [PATCH V2 1/1] bitbake-layers: add a ability to query layer dependencies from layer index X-BeenThere: openembedded-core@lists.openembedded.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Patches and discussions about the oe-core layer List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Jan 2015 18:54:35 -0000 Content-Type: text/plain Hi, On Mon, 12 Jan 2015 14:48:42 +0800 Chong Lu 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 > --- > 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 > 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