mirror of
https://git.yoctoproject.org/meta-zephyr
synced 2026-05-02 21:32:11 +02:00
To simplify the logic to resolve Git tags to SHAs, and so that it works with non-Github repositories, use git ls-remote instead of the Github API. Make the resolve_revision function available as a Jinja filter and move the version resolution to the template. Signed-off-by: Peter Hoyes <Peter.Hoyes@arm.com> Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
80 lines
2.9 KiB
Python
Executable File
80 lines
2.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import pathlib
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
import urllib.parse
|
|
import urllib.request
|
|
|
|
# These non-standard modules must be installed on the host
|
|
import jinja2
|
|
import west.manifest
|
|
|
|
# This script takes one argument - the Zephyr version in the form x.y.z
|
|
version = sys.argv[1]
|
|
if not re.match(r'\d+.\d+.\d+', version):
|
|
raise ValueError("Please provide a valid Zephyr version")
|
|
|
|
# Obtain the West manifest and decode using west as a library
|
|
manifest_url = f'https://raw.githubusercontent.com/zephyrproject-rtos/zephyr/v{version}/west.yml'
|
|
with urllib.request.urlopen(manifest_url) as f:
|
|
source_data = f.read().decode()
|
|
manifest = west.manifest.Manifest(source_data=source_data,
|
|
import_flags=west.manifest.ImportFlag.IGNORE)
|
|
projects = manifest.get_projects([])
|
|
|
|
# projects contains a 'manifest' project for 'self' which we don't want to use
|
|
projects = list(filter(lambda project: project.name != 'manifest', projects))
|
|
template_params = dict(version=version,
|
|
zephyr_url='https://github.com/zephyrproject-rtos/zephyr.git',
|
|
projects=projects)
|
|
|
|
# Convert a revision specifier into the Git commit SHA
|
|
def resolve_revision(revision, repo_url):
|
|
# If revision is a Git SHA, return it
|
|
if re.match(r'[a-f0-9]{40}', revision):
|
|
return revision
|
|
|
|
# Otherwise, resolve using git ls-remote
|
|
try:
|
|
# Prefer a deferenced tag (if annotated)
|
|
output = subprocess.check_output(['git', 'ls-remote', '--exit-code', repo_url, f'{revision}^{{}}'])
|
|
return output.split()[0].decode()
|
|
except subprocess.CalledProcessError:
|
|
# Fall back to tag name (if lightweight)
|
|
output = subprocess.check_output(['git', 'ls-remote', '--exit-code', repo_url, revision])
|
|
return output.split()[0].decode()
|
|
|
|
def git_url_to_bitbake(url):
|
|
"""
|
|
A template helper function which converts an URL for a Git repository into
|
|
a Bitbake-style URL with a 'protocol' suffix
|
|
"""
|
|
parts = urllib.parse.urlparse(url)
|
|
original_sceme = parts.scheme
|
|
parts = parts._replace(scheme='git')
|
|
return parts.geturl() + ';protocol=' + original_sceme
|
|
|
|
def bitbake_var(name):
|
|
"""
|
|
Returns a string suitable for use in a Bitbake variable name
|
|
"""
|
|
return name.upper().replace('-', '_')
|
|
|
|
# Set up the Jinja environment
|
|
template_dir = pathlib.Path(__file__).parent
|
|
env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir))
|
|
env.filters['git_url_to_bitbake'] = git_url_to_bitbake
|
|
env.filters['bitbake_var'] = bitbake_var
|
|
env.filters['resolve_revision'] = resolve_revision
|
|
template = env.get_template('zephyr-kernel-src.inc.jinja')
|
|
|
|
# Output directly to the zephyr-kernel directory
|
|
dest_path = pathlib.Path(__file__).parents[1] / 'recipes-kernel' /\
|
|
'zephyr-kernel' / f'zephyr-kernel-src-{version}.inc'
|
|
|
|
# Generate the Bitbake include file
|
|
with open(dest_path, 'w') as f:
|
|
f.write(template.render(**template_params))
|