Files
cariflex/tools/EVerest-main/applications/utils/scripts/check_dependency_versions.py
Eric F d398a6ced2 Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter
- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
2026-06-08 00:38:27 -04:00

125 lines
4.4 KiB
Python
Executable File

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# SPDX-License-Identifier: Apache-2.0
# Copyright Pionix GmbH and Contributors to EVerest
#
"""
author: kai-uwe.hermann@pionix.de
Parse snapshot.yaml files check if dependency versions are up2date by checking for newer git tags
"""
import argparse
import os
import re
import yaml
import subprocess
from packaging.version import Version
def get_remote_tags(remote_url: str) -> list:
"""Return the remote tags of the repo at path, or an empty list."""
remote_tags = []
try:
result = subprocess.run(["git", "-c", "versionsort.suffix=-", "ls-remote", "--tags", "--sort=-v:refname", "--refs", "--quiet", remote_url],
stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
result_list = result.stdout.decode("utf-8").split("\n")
for entry in result_list:
ref_and_tag = entry.split("\t")
if len(ref_and_tag) > 1:
remote_tags.append(ref_and_tag[1].replace("refs/tags/", ""))
except subprocess.CalledProcessError:
return remote_tags
return remote_tags
def parse_curl_version(curl_version):
parsed_curl_version = curl_version.removeprefix("tiny-curl-")
parsed_curl_version = parsed_curl_version.removeprefix("curl-")
parsed_curl_version = parsed_curl_version.replace("_", ".")
return parsed_curl_version
def main():
parser = argparse.ArgumentParser(
description='get updated dependency versions from snapshot.yaml')
parser.add_argument('--input',
dest='in_snapshot',
help='Path to the snapshot.yaml file')
args = parser.parse_args()
in_snapshot = os.path.realpath(os.path.expanduser(args.in_snapshot))
snapshot = None
with open(in_snapshot, encoding='utf-8') as snapshot_file:
try:
snapshot = yaml.safe_load(snapshot_file)
except yaml.YAMLError as e:
print(f"Error parsing yaml of {in_snapshot}: {e}")
return
if not snapshot:
print(f"snapshot empty?")
return
output = {}
branch_re = re.compile(r'branch=([^;|^"|\s]*)')
for key, entry in snapshot.items():
branch = entry['branch']
git_rev = entry['git_rev']
git_tag = entry['git_tag']
version = git_tag.removeprefix('wip-release-')
version = version.removeprefix('v')
version_without_rc, _vsep, _rc = version.partition('-rc')
# todo: maybe even strip something like "wip-release-" from git_tag to keep versions sane?
# or just do not modify the version if this cannot be parsed properly?
# print(f"version: {version} without-rc: {version_without_rc}")
git_url = entry['git']
remote_tags = get_remote_tags(git_url)
tags = []
for original_remote_tag in remote_tags:
remote_tag = original_remote_tag.removeprefix("v")
if key == "libcurl":
# special handling for curl
remote_tag = parse_curl_version(remote_tag)
if key == "pugixml":
if remote_tag == "latest":
continue
tags.append((original_remote_tag, remote_tag))
remote_versions = []
version_mapping = {}
for (original_remote_tag, remote_tag) in tags:
try:
ver = Version(remote_tag)
version_mapping[ver] = original_remote_tag
remote_versions.append(ver)
except Exception as e:
pass
remote_versions.sort(reverse=True)
try:
remote_version = remote_versions[0]
parsed_version = ""
if key == "libcurl":
parsed_version = Version(parse_curl_version(version))
else:
parsed_version = Version(version)
if parsed_version != remote_version:
print(f" {key}: remote version is different from version in snapshot! Check if you want to update.")
print(f" snapshot version: {version}")
print(f" remote version: {remote_version}, original tag: {version_mapping[remote_version]}")
except Exception as e:
print(f" {key}: cannot parse remote version, please check manually!")
print(f" snapshot version: {version}")
print(f" thrown exception: {e}")
if __name__ == '__main__':
main()