summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-01-24 11:15:42 +0200
committerLars Wirzenius <liw@liw.fi>2021-01-24 11:15:42 +0200
commit735307797875900ddaf5caaf22d660657c1b174d (patch)
tree3477d99c7f7013853dc15e2ca3a44891a6623190
parent9f9f605f2a0c0c366d09e3ea63409014dcd929cd (diff)
downloadobnam2-735307797875900ddaf5caaf22d660657c1b174d.tar.gz
release: add script list new, unbuilt release tags
-rw-r--r--list_new_release_tags60
1 files changed, 60 insertions, 0 deletions
diff --git a/list_new_release_tags b/list_new_release_tags
new file mode 100644
index 0000000..90994ac
--- /dev/null
+++ b/list_new_release_tags
@@ -0,0 +1,60 @@
+#!/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)