#!/usr/bin/env python3 # Copyright (c) 2020-2023 Intel Corp. # SPDX-License-Identifier: Apache-2.0 """ Syntax of file: [ { "version": "", "date": "", "weekly: False, }, ] """ import json import argparse import urllib.request import os import tempfile from git import Git from datetime import datetime VERSIONS_FILE = "versions.json" def parse_args(): parser = argparse.ArgumentParser( description="Manage versions to be tested.", allow_abbrev=False) parser.add_argument('-l', '--list', action="store_true", help="List all published versions") parser.add_argument('-u', '--update', help="Update versions file from tree.") parser.add_argument('-L', '--latest', action="store_true", help="Get latest published version") parser.add_argument('-w', '--weekly', action="store_true", help="Mark as weekly") parser.add_argument('-W', '--list-weekly', action="store_true", help="List weekly commits") parser.add_argument('-v', '--verbose', action="store_true", help="Verbose output") return parser.parse_args() def get_versions(): data = None fo = tempfile.NamedTemporaryFile() if not os.path.exists('versions.json'): url = 'https://testing.zephyrproject.org/daily_tests/versions.json' urllib.request.urlretrieve(url, fo.name) with open(fo.name, "r") as fp: data = json.load(fp) return data def handle_compat(item): item_compat = {} if isinstance(item, str): item_compat['version'] = item item_compat['weekly'] = False item_compat['date'] = None else: item_compat = item return item_compat def show_versions(weekly=False): data = get_versions() for item in data: item_compat = handle_compat(item) is_weekly = item_compat.get('weekly', False) if weekly and not is_weekly: continue wstr = "" datestr = "" if args.verbose: if is_weekly: wstr = "(marked for weekly testing)" if item_compat.get('date'): pdate = datetime.strptime(item_compat['date'], '%Y-%m-%dT%H:%M:%S.%f') date = pdate.strftime("%b %d %Y %H:%M:%S") datestr = f"published on {date}" print(f"- {item_compat['version']} {datestr} {wstr}") else: print(f"{item_compat['version']}") def show_latest(): data = get_versions() latest = data[-1] item_compat = handle_compat(latest) ver = item_compat.get("version") date = item_compat.get("date", False) is_weekly = item_compat.get('weekly') datestr = "" if date: datestr = f"published on {date}" if args.verbose: print(f"Latest version is {ver} {datestr}") if args.verbose and is_weekly: print("This version is marked for weekly testing.") if not args.verbose: print(f"{ver}") def update(git_tree, is_weekly=False): g = Git(git_tree) today = datetime.now().strftime('%Y-%m-%dT%H:%M:%S.%f') version = g.describe("--abbrev=12") published = False data = get_versions() if not is_weekly: wday = datetime.today().strftime('%A') if wday == 'Monday': is_weekly = True found = list(filter(lambda item: (isinstance(item, dict) and item.get('version') == version) or item == version, data)) if found: published = True print("version already published") else: print(f"New version {version}, adding to file...") if data and not published: with open(VERSIONS_FILE, "w") as versions: item = {} item['version'] = version item['date'] = today item['weekly'] = is_weekly data.append(item) json.dump(data, versions) def main(): global args args = parse_args() if args.update: update(args.update, args.weekly) elif args.list or args.list_weekly: show_versions(weekly=args.list_weekly) elif args.latest: show_latest() else: print("You did not specify any options") if __name__ == "__main__": main()