Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | # Copyright (c) 2020 Intel Corp. |
| 3 | # SPDX-License-Identifier: Apache-2.0 |
| 4 | |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 5 | """ |
| 6 | Syntax of file: |
| 7 | [ |
| 8 | { |
| 9 | "version": "<commit>", |
| 10 | "date": "<date>", |
| 11 | "weekly: False, |
| 12 | }, |
| 13 | ] |
| 14 | """ |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 15 | import json |
| 16 | import argparse |
| 17 | import urllib.request |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 18 | import os |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 19 | |
| 20 | from git import Git |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 21 | from datetime import datetime |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 22 | |
| 23 | VERSIONS_FILE = "versions.json" |
| 24 | |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 25 | |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 26 | def parse_args(): |
| 27 | parser = argparse.ArgumentParser( |
| 28 | description="Manage versions to be tested.") |
| 29 | parser.add_argument('-l', '--list', action="store_true", |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 30 | help="List all published versions") |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 31 | parser.add_argument('-u', '--update', |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 32 | help="Update versions file from tree.") |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 33 | parser.add_argument('-L', '--latest', action="store_true", |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 34 | help="Get latest published version") |
| 35 | parser.add_argument('-w', '--weekly', action="store_true", |
| 36 | help="Mark as weekly") |
Anas Nashif | 5be8afc | 2020-12-17 10:05:12 -0500 | [diff] [blame] | 37 | parser.add_argument('-v', '--verbose', action="store_true", |
| 38 | help="Verbose output") |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 39 | return parser.parse_args() |
| 40 | |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 41 | |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 42 | def get_versions(): |
| 43 | data = None |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 44 | if not os.path.exists('versions.json'): |
| 45 | url = 'https://testing.zephyrproject.org/daily_tests/versions.json' |
| 46 | urllib.request.urlretrieve(url, 'versions.json') |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 47 | with open("versions.json", "r") as fp: |
| 48 | data = json.load(fp) |
| 49 | |
| 50 | return data |
| 51 | |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 52 | def handle_compat(item): |
| 53 | item_compat = {} |
| 54 | if isinstance(item, str): |
| 55 | item_compat['version'] = item |
| 56 | item_compat['weekly'] = False |
| 57 | item_compat['date'] = None |
| 58 | else: |
| 59 | item_compat = item |
| 60 | |
| 61 | return item_compat |
| 62 | |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 63 | def show_versions(): |
| 64 | data = get_versions() |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 65 | for item in data: |
| 66 | item_compat = handle_compat(item) |
| 67 | is_weekly = item_compat.get('weekly', False) |
| 68 | wstr = "" |
| 69 | datestr = "" |
Anas Nashif | 5be8afc | 2020-12-17 10:05:12 -0500 | [diff] [blame] | 70 | if args.verbose: |
| 71 | if is_weekly: |
| 72 | wstr = "(marked for weekly testing)" |
| 73 | if item_compat.get('date'): |
| 74 | pdate = datetime.strptime(item_compat['date'], '%Y-%m-%dT%H:%M:%S.%f') |
| 75 | date = pdate.strftime("%b %d %Y %H:%M:%S") |
| 76 | datestr = f"published on {date}" |
| 77 | print(f"- {item_compat['version']} {datestr} {wstr}") |
| 78 | else: |
| 79 | print(f"{item_compat['version']}") |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 80 | |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 81 | |
| 82 | def show_latest(): |
| 83 | data = get_versions() |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 84 | latest = data[-1] |
| 85 | item_compat = handle_compat(latest) |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 86 | |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 87 | ver = item_compat.get("version") |
| 88 | date = item_compat.get("date", False) |
| 89 | is_weekly = item_compat.get('weekly') |
| 90 | datestr = "" |
| 91 | if date: |
| 92 | datestr = f"published on {date}" |
Anas Nashif | 5be8afc | 2020-12-17 10:05:12 -0500 | [diff] [blame] | 93 | if args.verbose: |
| 94 | print(f"Latest version is {ver} {datestr}") |
| 95 | if args.verbose and is_weekly: |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 96 | print("This version is marked for weekly testing.") |
| 97 | |
Anas Nashif | 5be8afc | 2020-12-17 10:05:12 -0500 | [diff] [blame] | 98 | if not args.verbose: |
| 99 | print(f"{ver}") |
| 100 | |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 101 | |
| 102 | def update(git_tree, is_weekly=False): |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 103 | g = Git(git_tree) |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 104 | today = datetime.now().strftime('%Y-%m-%dT%H:%M:%S.%f') |
Hake Huang | d5c60ff | 2021-01-07 16:31:16 +0800 | [diff] [blame] | 105 | version = g.describe("--abbrev=12") |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 106 | published = False |
| 107 | data = get_versions() |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 108 | |
Anas Nashif | 5be8afc | 2020-12-17 10:05:12 -0500 | [diff] [blame] | 109 | if not is_weekly: |
| 110 | wday = datetime.today().strftime('%A') |
| 111 | if wday == 'Monday': |
| 112 | is_weekly = True |
| 113 | |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 114 | found = list(filter(lambda item: (isinstance(item, dict) and |
| 115 | item.get('version') == version) or item == version, data)) |
| 116 | if found: |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 117 | published = True |
| 118 | print("version already published") |
| 119 | else: |
| 120 | print(f"New version {version}, adding to file...") |
| 121 | |
| 122 | if data and not published: |
| 123 | with open(VERSIONS_FILE, "w") as versions: |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 124 | item = {} |
| 125 | item['version'] = version |
| 126 | item['date'] = today |
| 127 | item['weekly'] = is_weekly |
| 128 | data.append(item) |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 129 | json.dump(data, versions) |
| 130 | |
| 131 | def main(): |
Anas Nashif | 5be8afc | 2020-12-17 10:05:12 -0500 | [diff] [blame] | 132 | global args |
| 133 | |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 134 | args = parse_args() |
| 135 | if args.update: |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 136 | update(args.update, args.weekly) |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 137 | elif args.list: |
| 138 | show_versions() |
| 139 | elif args.latest: |
| 140 | show_latest() |
Anas Nashif | 4cd63ab | 2020-10-27 10:01:00 -0400 | [diff] [blame] | 141 | else: |
| 142 | print("You did not specify any options") |
Anas Nashif | b8c7de6 | 2020-07-08 12:06:12 -0400 | [diff] [blame] | 143 | |
| 144 | if __name__ == "__main__": |
| 145 | main() |