#!/usr/bin/python3 # # This lists all new release tags, which need to be built. The list of # previously known tags is kept in a file given as the argument to this script. # If the file doesn't exist, all existing release tags are saved there, and # nothing is printed: this is so that on the first run, nothing is new and # nothing needs to be built. # # A release tag MUST match "vX.Y.Z", where X, Y, and Z are integers. import os import re import subprocess import sys TAG_PATTERN = re.compile(r"^v(\d+)?.(\d+)\.(\d+)$") def release_tags(): p = subprocess.run(["git", "tag", "-l"], check=True, capture_output=True) lines = p.stdout.decode().splitlines() return [line for line in lines if tag_sort_key(line) is not None] def sorted_tags(tags): return list(sorted(tags, key=tag_sort_key)) def tag_sort_key(tag): m = TAG_PATTERN.match(tag) if not m: return None return (m.group(1), m.group(2), m.group(3)) def built_tags(filename): if os.path.exists(filename): return list(line.strip() for line in open(filename).readlines()) return [] def save_built_tags(filename, tags): return open(filename, "w").write("".join(f"{tag}\n" for tag in tags)) tags_filename = sys.argv[1] tags = sorted_tags(release_tags()) if os.path.exists(tags_filename): built = built_tags(tags_filename) for tag in tags: if tag not in built: print(tag) built.append(tag) else: built = tags save_built_tags(tags_filename, built)