From patchwork Sat Mar 12 06:38:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Reyna, David" X-Patchwork-Id: 5129 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7159FC433EF for ; Sat, 12 Mar 2022 06:38:40 +0000 (UTC) Received: from mail1.wrs.com (mail1.wrs.com [147.11.3.146]) by mx.groups.io with SMTP id smtpd.web10.2570.1647067116339931543 for ; Fri, 11 Mar 2022 22:38:37 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=permerror, err=parse error for token &{10 18 %{ir}.%{v}.%{d}.spf.has.pphosted.com}: invalid domain name (domain: windriver.com, ip: 147.11.3.146, mailfrom: david.reyna@windriver.com) Received: from ala-exchng01.corp.ad.wrs.com (ala-exchng01.corp.ad.wrs.com [147.11.82.252]) by mail1.wrs.com (8.15.2/8.15.2) with ESMTPS id 22C6cZZs022823 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 11 Mar 2022 22:38:35 -0800 Received: from ALA-EXCHNG02.corp.ad.wrs.com (147.11.82.254) by ala-exchng01.corp.ad.wrs.com (147.11.82.252) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12; Fri, 11 Mar 2022 22:38:34 -0800 Received: from ala-exchng01.corp.ad.wrs.com (147.11.82.252) by ALA-EXCHNG02.corp.ad.wrs.com (147.11.82.254) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Fri, 11 Mar 2022 22:38:34 -0800 Received: from ala-lpggp2.wrs.com (147.11.105.123) by ala-exchng01.corp.ad.wrs.com (147.11.82.252) with Microsoft SMTP Server id 15.1.2242.12 via Frontend Transport; Fri, 11 Mar 2022 22:38:34 -0800 From: David Reyna To: Subject: [PATCH] toaster: automation to generate fixture files Date: Fri, 11 Mar 2022 22:38:34 -0800 Message-ID: <20220312063834.4157-1-david.reyna@windriver.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sat, 12 Mar 2022 06:38:40 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/toaster/message/5770 From: David Reyna Add script to safely generate the fixture files from a table [YOCTO #14759] Signed-off-by: David Reyna --- .../lib/toaster/orm/fixtures/gen_fixtures.py | 445 ++++++++++++++++++ 1 file changed, 445 insertions(+) create mode 100755 bitbake/lib/toaster/orm/fixtures/gen_fixtures.py diff --git a/bitbake/lib/toaster/orm/fixtures/gen_fixtures.py b/bitbake/lib/toaster/orm/fixtures/gen_fixtures.py new file mode 100755 index 0000000000..0d5f4533bf --- /dev/null +++ b/bitbake/lib/toaster/orm/fixtures/gen_fixtures.py @@ -0,0 +1,445 @@ +#!/usr/bin/env python3 +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# Generate Toaster Fixtures for 'poky.xml' and 'oe-core.xml' +# +# Copyright (C) 2022 Wind River Systems +# SPDX-License-Identifier: GPL-2.0-only +# +# Edit the 'current_releases' table for each new release cycle +# +# Usage: ./get_fixtures all +# + +import os +import sys +import argparse + +verbose = False + +#################################### +# Releases +# +# https://wiki.yoctoproject.org/wiki/Releases +# +# NOTE: for the current releases table, it helps to keep continuing releases +# in the same table positions since this minimizes the patch diff for review. +# The order of the table does not matter since Toaster presents them sorted. +# +# Traditionally, the two most current releases are included in addition to the +# 'master' branch and the local installation's 'HEAD'. +# It is also policy to include all active LTS releases. +# + +# [Codename, Yocto Project Version, Release Date, Current Version, Support Level, Poky Version, BitBake branch] +current_releases = [ + # Release slot #1 + ['Kirkstone','3.5','April 2022','','Future - Long Term Support (until Apr. 2024)','27.0','1.54'], +# ['Dunfell','3.1','April 2021','3.1.5 (March 2022)','Stable - Support for 13 months (until Apr. 2022)','23.0','1.46'], + # Release slot #2 'local' + ['HEAD','HEAD','','Local Yocto Project','HEAD','','HEAD'], + # Release slot #3 'master' + ['Master','master','','Yocto Project master','master','','master'], + # Release slot #4 + ['Honister','3.4','October 2021','3.4.2 (February 2022)','Support for 7 months (until May 2022)','26.0','1.52'], +# ['Gatesgarth','3.2','Oct 2020','3.2.4 (May 2021)','EOL','24.0','1.48'], + # Optional Release slot #4 + ['Hardknott','3.3','April 2021','3.3.5 (March 2022)','Stable - Support for 13 months (until Apr. 2022)','25.0','1.50'], +] + +default_poky_layers = [ + 'openembedded-core', + 'meta-poky', + 'meta-yocto-bsp', +] + +default_oe_core_layers = [ + 'openembedded-core', +] + +#################################### +# Templates + +prolog_template = '''\ + + + + + DEFCONF_DISTRO + {{distro}} + +''' + +#') +bitbakeversion_poky_template = '''\ + + {{name}} + git://git.yoctoproject.org/poky + {{branch}} + bitbake + +''' +bitbakeversion_oecore_template = '''\ + + {{name}} + git://git.openembedded.org/bitbake + {{bitbakeversion}} + +''' + +# +releases_available_template = '''\ + + {{name}} + {{description}} + {{ra_count}} + {{release}} + Toaster will run your builds {{help_source}}. + +''' + +# +default_layers_template = '''\ + + {{release_id}} + {{layer}} + +''' + +default_layers_preface = '''\ + +''' + +layer_poky_template = '''\ + + {{layer}} + + {{vcs_url}} + {{vcs_web_url}} + {{vcs_web_tree_base_url}} + {{vcs_web_file_base_url}} + +''' + +layer_oe_core_template = '''\ + + {{layer}} + {{vcs_url}} + {{vcs_web_url}} + {{vcs_web_tree_base_url}} + {{vcs_web_file_base_url}} + +''' + +layer_version_template = '''\ + + {{layer_id}} + 0 + {{release_id}} + {{branch}} + {{dirpath}} + +''' + +layer_version_HEAD_template = '''\ + + {{layer_id}} + 0 + {{release_id}} + {{branch}} + {{commit}} + {{dirpath}} + +''' + +layer_version_oe_core_template = '''\ + + 1 + 2 + OE-CORE-LAYER-DIR + HEAD + meta + 0 + +''' + +epilog_template = '''\ + +''' + +################################# +# Helper Routines +# + +def print_str(str,fd): + # Avoid extra newline at end + if str and (str[-1] == '\n'): + str = str[0:-1] + print(str,file=fd) + +def print_template(template,params,fd): + for line in template.split('\n'): + p = line.find('{{') + while p > 0: + q = line.find('}}') + key = line[p+2:q] + if key in params: + line = line[0:p] + params[key] + line[q+2:] + else: + line = line[0:p] + '?' + key + '?' + line[q+2:] + p = line.find('{{') + if line: + print(line,file=fd) + +################################# +# Generate poky.xml +# + +def generate_poky(): + fd = open('poky.xml','w') + + params = {} + params['distro'] = 'poky' + print_template(prolog_template,params,fd) + print_str('',fd) + + print_str(' ',fd) + for i,release in enumerate(current_releases): + params = {} + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('HEAD')): # 'master', + params['release'] = params['release'][0].lower() + params['release'][1:] + params['name'] = params['release'] + params['bitbake_id'] = str(i+1) + params['branch'] = params['release'] + print_template(bitbakeversion_poky_template,params,fd) + print_str('',fd) + + print_str('',fd) + print_str(' ',fd) + for i,release in enumerate(current_releases): + params = {} + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('HEAD')): #'master', + params['release'] = params['release'][0].lower() + params['release'][1:] + params['h_release'] = '?h={{release}}' + params['name'] = params['release'] + params['ra_count'] = str(i+1) + params['branch'] = params['release'] + + if 'HEAD' == params['release']: + params['help_source'] = 'with the version of the Yocto Project you have cloned or downloaded to your computer' + params['description'] = 'Local Yocto Project' + params['name'] = 'local' + else: + params['help_source'] = 'using the tip of the <a href="https://git.yoctoproject.org/cgit/cgit.cgi/poky/log/{{h_release}}">Yocto Project {{Release}} branch</a>' + params['description'] = 'Yocto Project {{release_version}} "{{Release}}"' + if 'master' == params['release']: + params['h_release'] = '' + params['description'] = 'Yocto Project master' + + print_template(releases_available_template,params,fd) + print_str('',fd) + + print_str(' ',fd) + rdl_count = 1 + for i,release in enumerate(current_releases): + for j,layer in enumerate(default_poky_layers): + params = {} + params['layer'] = layer + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('master','HEAD')): + params['release'] = params['release'][0].lower() + params['release'][1:] + params['release_id'] = str(i+1) + params['rdl_count'] = str(rdl_count) + params['branch'] = params['release'] + print_template(default_layers_template,params,fd) + rdl_count += 1 + print_str('',fd) + + print_str(default_layers_preface,fd) + lv_count = 1 + for i,layer in enumerate(default_poky_layers): + params = {} + params['layer'] = layer + params['layer_id'] = str(i+1) + params['vcs_url'] = 'git://git.yoctoproject.org/poky' + params['vcs_web_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky' + params['vcs_web_tree_base_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%' + params['vcs_web_file_base_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%' + + if i: + print_str('',fd) + print_template(layer_poky_template,params,fd) + for j,release in enumerate(current_releases): + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('master','HEAD')): + params['release'] = params['release'][0].lower() + params['release'][1:] + params['release_id'] = str(j+1) + params['lv_count'] = str(lv_count) + params['branch'] = params['release'] + params['commit'] = params['release'] + + params['dirpath'] = params['layer'] + if params['layer'] in ('openembedded-core'): #'openembedded-core', + params['dirpath'] = 'meta' + + if 'HEAD' == params['release']: + print_template(layer_version_HEAD_template,params,fd) + else: + print_template(layer_version_template,params,fd) + lv_count += 1 + + print_str(epilog_template,fd) + fd.close() + +################################# +# Generate oe-core.xml +# + +def generate_oe_core(): + fd = open('oe-core.xml','w') + + params = {} + params['distro'] = 'nodistro' + print_template(prolog_template,params,fd) + print_str('',fd) + + print_str(' ',fd) + for i,release in enumerate(current_releases): + params = {} + params['release'] = release[0] + params['Release'] = release[0] + params['bitbakeversion'] = release[6] + params['release_version'] = release[1] + if not (params['release'] in ('HEAD')): # 'master', + params['release'] = params['release'][0].lower() + params['release'][1:] + params['name'] = params['release'] + params['bitbake_id'] = str(i+1) + params['branch'] = params['release'] + print_template(bitbakeversion_oecore_template,params,fd) + print_str('',fd) + + print_str(' ',fd) + for i,release in enumerate(current_releases): + params = {} + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('HEAD')): #'master', + params['release'] = params['release'][0].lower() + params['release'][1:] + params['h_release'] = '?h={{release}}' + params['name'] = params['release'] + params['ra_count'] = str(i+1) + params['branch'] = params['release'] + + if 'HEAD' == params['release']: + params['help_source'] = 'with the version of OpenEmbedded that you have cloned or downloaded to your computer' + params['description'] = 'Local Openembedded' + params['name'] = 'local' + else: + params['help_source'] = 'using the tip of the <a href=\\"https://cgit.openembedded.org/openembedded-core/log/{{h_release}}\\">OpenEmbedded {{Release}}</a> branch' + params['description'] = 'Openembedded {{Release}}' + if 'master' == params['release']: + params['h_release'] = '' + params['description'] = 'OpenEmbedded core master' + params['Release'] = params['release'] + + print_template(releases_available_template,params,fd) + print_str('',fd) + + print_str(' ',fd) + rdl_count = 1 + for i,release in enumerate(current_releases): + for j,layer in enumerate(default_oe_core_layers): + params = {} + params['layer'] = layer + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('master','HEAD')): + params['release'] = params['release'][0].lower() + params['release'][1:] + params['release_id'] = str(i+1) + params['rdl_count'] = str(rdl_count) + params['branch'] = params['release'] + print_template(default_layers_template,params,fd) + rdl_count += 1 + print_str('',fd) + + print_str('',fd) + print_str(' ',fd) + lv_count = 1 + for i,layer in enumerate(default_oe_core_layers): + params = {} + params['layer'] = layer + params['layer_id'] = str(i+1) + params['vcs_url'] = 'git://git.openembedded.org/openembedded-core' + params['vcs_web_url'] = 'https://cgit.openembedded.org/openembedded-core' + params['vcs_web_tree_base_url'] = 'https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%' + params['vcs_web_file_base_url'] = 'https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%' + if i: + print_str('',fd) + print_template(layer_oe_core_template,params,fd) + + print_template(layer_version_oe_core_template,params,fd) + print_str('',fd) + + print_str(epilog_template,fd) + fd.close() + +################################# +# Help +# + +def list_releases(): + print("Release ReleaseVer BitbakeVer Support Level") + print("========== =========== ========== ==============================================") + for release in current_releases: + print("%10s %10s %11s %s" % (release[0],release[1],release[6],release[4])) + +################################# +# main +# + +def main(argv): + global verbose + + parser = argparse.ArgumentParser(description='gen_fixtures.py: table generate the fixture files') + parser.add_argument('--poky', '-p', action='store_const', const='poky', dest='command', help='Generate the poky.xml file') + parser.add_argument('--oe-core', '-o', action='store_const', const='oe_core', dest='command', help='Generate the oe-core.xml file') + parser.add_argument('--all', '-a', action='store_const', const='all', dest='command', help='Generate all fixture files') + parser.add_argument('--list', '-l', action='store_const', const='list', dest='command', help='List the release table') + parser.add_argument('--verbose', '-v', action='store_true', dest='verbose', help='Enable verbose debugging output') + args = parser.parse_args() + + verbose = args.verbose + if 'poky' == args.command: + generate_poky() + elif 'oe_core' == args.command: + generate_oe_core() + elif 'all' == args.command: + generate_poky() + generate_oe_core() + elif 'all' == args.command: + list_releases() + elif 'list' == args.command: + list_releases() + + else: + print("No command for 'gen_fixtures.py' selected") + +if __name__ == '__main__': + main(sys.argv[1:])