From ebb33b2c0aa7392f4c252f8789b8b0830215d40d Mon Sep 17 00:00:00 2001 From: Eric Engestrom Date: Sun, 3 May 2020 20:55:55 +0200 Subject: [PATCH] post_version.py: update script to the new rST way of things Signed-off-by: Eric Engestrom Part-of: --- bin/post_version.py | 142 ++++++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 83 deletions(-) diff --git a/bin/post_version.py b/bin/post_version.py index c55309d9387..123d762f6aa 100755 --- a/bin/post_version.py +++ b/bin/post_version.py @@ -22,110 +22,84 @@ """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 `__\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' -- 2.30.2