post_version.py: stop adding release candidates to the index and relnotes
[mesa.git] / bin / post_version.py
index 9afb37b18a3162bd1f842c5908d4f8e6fc15ce69..c55309d93870380b42ce9ad51538d307e17e31e5 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-# Copyright © 2019 Intel Corporation
+# Copyright © 2019-2020 Intel Corporation
 
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
 
 """Update the main page, release notes, and calendar."""
 
+import argparse
 import calendar
 import datetime
 import pathlib
+import subprocess
+
 from lxml import (
     etree,
     html,
 )
 
 
-def calculate_previous_version(version: str, is_point: bool) -> str:
-    """Calculate the previous version to compare to.
-
-    In the case of -rc to final that verison is the previous .0 release,
-    (19.3.0 in the case of 20.0.0, for example). for point releases that is
-    the last point release. This value will be the same as the input value
-    for a poiont release, but different for a major release.
-    """
-    if '-' in version:
-        version = version.split('-')[0]
-    if is_point:
-        return version
-    base = version.split('.')
-    if base[1] == '0':
-        base[0] = str(int(base[0]) - 1)
-        base[1] = '3'
-    else:
-        base[1] = str(int(base[1]) - 1)
-    return '.'.join(base)
+def is_first_release(version: str) -> bool:
+    return version.endswith('.0')
 
 
-def get_version() -> str:
-    v = pathlib.Path(__file__).parent.parent / 'VERSION'
-    with v.open('rt') as f:
-        raw_version = f.read().strip()
-    return raw_version.split('-')[0]
+def is_release_candidate(version: str) -> bool:
+    return '-rc' in version
 
 
-def is_point_release() -> bool:
-    v = pathlib.Path(__file__).parent.parent / 'VERSION'
-    with v.open('rt') as f:
-        raw_version = f.read().strip()
-    return '-rc' not in raw_version
+def branch_name(version: str) -> str:
+    if is_release_candidate(version):
+        version = version.split('-')[0]
+    (major, minor, _) = version.split('.')
+    return f'{major}.{minor}'
 
 
-def update_index(is_point: bool, version: str, previous_version: str) -> None:
+def update_index(version: str) -> None:
     p = pathlib.Path(__file__).parent.parent / 'docs' / 'index.html'
     with p.open('rt') as f:
         tree = html.parse(f)
@@ -75,47 +58,92 @@ def update_index(is_point: bool, version: str, previous_version: str) -> None:
     date = datetime.date.today()
     month = calendar.month_name[date.month]
     header = etree.Element('h2')
-    header.text=f"{month} {date.day}, {date.year}"
+    header.text = f"{month} {date.day}, {date.year}"
 
     body = etree.Element('p')
-    a = etree.SubElement(body, 'a', attrib={'href': f'relnotes/{previous_version}'})
-    a.text = f"Mesa {previous_version}"
-    if is_point:
-        a.tail = " is released. This is a bug fix release."
-    else:
+    a = etree.SubElement(
+        body, 'a', attrib={'href': f'relnotes/{version}.html'})
+    a.text = f"Mesa {version}"
+    if is_first_release(version):
         a.tail = (" is released. This is a new development release. "
-                  "See the release notes for mor information about this release.")
+                  "See the release notes for more information about this release.")
+    else:
+        a.tail = " is released. This is a bug fix release."
 
     root = news.getparent()
     index = root.index(news) + 1
     root.insert(index, body)
     root.insert(index, header)
 
-    tree.write(p.as_posix(), method='html')
+    tree.write(p.as_posix(), method='html', pretty_print=True)
+    subprocess.run(['git', 'add', p])
 
 
-def update_release_notes(previous_version: str) -> None:
+def update_release_notes(version: str) -> None:
     p = pathlib.Path(__file__).parent.parent / 'docs' / 'relnotes.html'
     with p.open('rt') as f:
         tree = html.parse(f)
 
     li = etree.Element('li')
-    a = etree.SubElement(li, 'a', href=f'relnotes/{previous_version}')
-    a.text = f'{previous_version} release notes'
+    a = etree.SubElement(li, 'a', href=f'relnotes/{version}.html')
+    a.text = f'{version} release notes'
 
     ul = tree.xpath('.//ul')[0]
     ul.insert(0, li)
 
-    tree.write(p.as_posix(), method='html')
+    tree.write(p.as_posix(), method='html', pretty_print=True)
+    subprocess.run(['git', 'add', p])
+
+
+def update_calendar(version: str) -> None:
+    p = pathlib.Path(__file__).parent.parent / 'docs' / 'release-calendar.html'
+    with p.open('rt') as f:
+        tree = html.parse(f)
+
+    branch = branch_name(version)
+
+    old = None
+    new = None
+
+    for tr in tree.xpath('.//tr'):
+        if old is not None:
+            new = tr
+            break
+
+        for td in tr.xpath('./td'):
+            if td.text == branch:
+                old = tr
+                break
+
+    assert old is not None
+    assert new is not None
+    old.getparent().remove(old)
+
+    # rowspan is 1 based in html, but 0 based in lxml
+    rowspan = int(td.get("rowspan")) - 1
+    if rowspan:
+        td.set("rowspan", str(rowspan))
+        new.insert(0, td)
+
+    tree.write(p.as_posix(), method='html', pretty_print=True)
+    subprocess.run(['git', 'add', p])
 
 
 def main() -> None:
-    is_point = is_point_release()
-    version = get_version()
-    previous_version = calculate_previous_version(version, is_point)
+    parser = argparse.ArgumentParser()
+    parser.add_argument('version', help="The released version.")
+    args = parser.parse_args()
+
+    update_calendar(args.version)
+    done = 'update calendar'
+
+    if not is_release_candidate(args.version):
+        update_index(args.version)
+        update_release_notes(args.version)
+        done += ', add news item, and link releases notes'
 
-    update_index(is_point, version, previous_version)
-    update_release_notes(previous_version)
+    subprocess.run(['git', 'commit', '-m',
+                    f'docs: {done} for {args.version}'])
 
 
 if __name__ == "__main__":