post_version.py: update script to the new rST way of things
authorEric Engestrom <eric@engestrom.ch>
Sun, 3 May 2020 18:55:55 +0000 (20:55 +0200)
committerMarge Bot <eric+marge@anholt.net>
Sat, 13 Jun 2020 10:42:01 +0000 (10:42 +0000)
Signed-off-by: Eric Engestrom <eric@engestrom.ch>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4630>

bin/post_version.py

index c55309d93870380b42ce9ad51538d307e17e31e5..123d762f6aad9db249a62c4d73eecc9a89438f15 100755 (executable)
 """Update the main page, release notes, and calendar."""
 
 import argparse
-import calendar
-import datetime
 import pathlib
 import subprocess
 
-from lxml import (
-    etree,
-    html,
-)
 
+def update_homepage(version: str) -> None:
+    p = pathlib.Path(__file__).parent.parent / 'docs' / 'conf.py'
 
-def is_first_release(version: str) -> bool:
-    return version.endswith('.0')
+    # Don't post release candidates to the homepage
+    if 'rc' in version:
+        return
 
+    with open(p, 'r') as f:
+        conf = f.readlines()
 
-def is_release_candidate(version: str) -> bool:
-    return '-rc' in version
+    new_conf = []
+    for line in conf:
+        if line.startswith("version = '") and line.endswith("'\n"):
+            old_version = line.split("'")[1]
+            # Avoid overwriting 20.1.0 when releasing 20.0.8
+            # TODO: we might need more than that to handle 20.0.10
+            if old_version < version:
+                line = f"version = '{version}'\n"
+        new_conf.append(line)
 
+    with open(p, 'w') as f:
+        for line in new_conf:
+            f.write(line)
 
-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(version: str) -> None:
-    p = pathlib.Path(__file__).parent.parent / 'docs' / 'index.html'
-    with p.open('rt') as f:
-        tree = html.parse(f)
-
-    news = tree.xpath('.//h1')[0]
-
-    date = datetime.date.today()
-    month = calendar.month_name[date.month]
-    header = etree.Element('h2')
-    header.text = f"{month} {date.day}, {date.year}"
-
-    body = etree.Element('p')
-    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 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', pretty_print=True)
     subprocess.run(['git', 'add', p])
 
 
 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)
+    p = pathlib.Path(__file__).parent.parent / 'docs' / 'relnotes.rst'
 
-    li = etree.Element('li')
-    a = etree.SubElement(li, 'a', href=f'relnotes/{version}.html')
-    a.text = f'{version} release notes'
+    with open(p, 'r') as f:
+        relnotes = f.readlines()
 
-    ul = tree.xpath('.//ul')[0]
-    ul.insert(0, li)
+    new_relnotes = []
+    first_list = True
+    for line in relnotes:
+        if first_list and line.startswith('-'):
+            first_list = False
+            new_relnotes.append(f'- `{version} release notes <relnotes/{version}.rst>`__\n')
+        new_relnotes.append(line)
+
+    with open(p, 'w') as f:
+        for line in new_relnotes:
+            f.write(line)
 
-    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)
+    p = pathlib.Path(__file__).parent.parent / 'docs' / 'release-calendar.rst'
+
+    with open(p, 'r') as f:
+        calendar = f.readlines()
+
+    branch = ''
+    skip_line = False
+    new_calendar = []
+    for line in calendar:
+        if version in line:
+            branch = line.split('|')[1].strip()
+            skip_line = True
+        elif skip_line:
+            skip_line = False
+        elif branch:
+            # Put the branch number back on the next line
+            new_calendar.append(line[:2] + branch + line[len(branch) + 2:])
+            branch = ''
+        else:
+            new_calendar.append(line)
+
+    with open(p, 'w') as f:
+        for line in new_calendar:
+            f.write(line)
 
-    tree.write(p.as_posix(), method='html', pretty_print=True)
     subprocess.run(['git', 'add', p])
 
 
@@ -134,6 +108,8 @@ def main() -> None:
     parser.add_argument('version', help="The released version.")
     args = parser.parse_args()
 
+    update_homepage(args.version)
+    update_release_notes(args.version)
     update_calendar(args.version)
     done = 'update calendar'