105 lines · python
1import github2import re3import sys4 5_SPECIAL_CASE_BINARIES = {6 "keith": {"clang+llvm-18.1.8-arm64-apple-macos11.tar.xz"},7}8 9 10def _is_valid(uploader_name, valid_uploaders, asset_name):11 if uploader_name in valid_uploaders:12 return True13 14 if uploader_name in _SPECIAL_CASE_BINARIES:15 return asset_name in _SPECIAL_CASE_BINARIES[uploader_name]16 17 return False18 19 20def _get_uploaders(release_version):21 # Until llvm 18, assets were uploaded by community members, the release managers22 # and the GitHub Actions bot.23 if release_version <= 18:24 return set(25 [26 "DimitryAndric",27 "stefanp-synopsys",28 "lei137",29 "omjavaid",30 "nicolerabjohn",31 "amy-kwan",32 "mandlebug",33 "zmodem",34 "androm3da",35 "tru",36 "rovka",37 "rorth",38 "quinnlp",39 "kamaub",40 "abrisco",41 "jakeegan",42 "maryammo",43 "tstellar",44 "github-actions[bot]",45 ]46 )47 # llvm 19 and beyond, only the release managers, bot and a much smaller48 # number of community members.49 elif release_version >= 19:50 return set(51 [52 "zmodem",53 "omjavaid",54 "tru",55 "tstellar",56 "github-actions[bot]",57 "c-rhodes",58 "dyung",59 ]60 )61 62 63def _get_major_release_version(release_title):64 # All release titles are of the form "LLVM X.Y.Z(-rcN)".65 match = re.match("LLVM ([0-9]+)\.", release_title)66 if match is None:67 _write_comment_and_exit_with_error(68 f'Could not parse release version from release title "{release_title}".'69 )70 else:71 return int(match.groups()[0])72 73 74def _write_comment_and_exit_with_error(comment):75 with open("comment", "w") as file:76 file.write(comment)77 sys.exit(1)78 79 80def main():81 token = sys.argv[1]82 83 gh = github.Github(login_or_token=token)84 repo = gh.get_repo("llvm/llvm-project")85 86 for release in repo.get_releases():87 print("Release:", release.title)88 uploaders = _get_uploaders(_get_major_release_version(release.title))89 for asset in release.get_assets():90 created_at = asset.created_at91 updated_at = (92 "" if asset.created_at == asset.updated_at else asset.updated_at93 )94 print(95 f"{asset.name} : {asset.uploader.login} [{created_at} {updated_at}] ( {asset.download_count} )"96 )97 if not _is_valid(asset.uploader.login, uploaders, asset.name):98 _write_comment_and_exit_with_error(99 f"@{asset.uploader.login} is not a valid uploader."100 )101 102 103if __name__ == "__main__":104 main()105