| #!/usr/bin/env python3 | |
| # SPDX-License-Identifier: Apache-2.0 | |
| # Copyright 2019 The Meson development team | |
| ''' | |
| Generates release notes for new releases of Meson build system | |
| ''' | |
| import argparse | |
| import subprocess | |
| import re | |
| import shutil | |
| import datetime | |
| from pathlib import Path | |
| RELNOTE_TEMPLATE = '''--- | |
| title: Release {} | |
| short-description: Release notes for {} | |
| ... | |
| # New features{} | |
| ''' | |
| def add_to_sitemap(sitemap, output_sitemap): | |
| ''' | |
| Adds release note entry to sitemap.txt. | |
| ''' | |
| sitemapfile = Path(sitemap) | |
| with sitemapfile.open(encoding='utf-8') as s_f: | |
| lines = s_f.readlines() | |
| relnotes = None | |
| to_version = None | |
| output = Path(output_sitemap) | |
| output.parent.mkdir(exist_ok=True, parents=True) | |
| with output.open('w', encoding='utf-8') as s_f: | |
| for line in lines: | |
| if relnotes is None: | |
| m = re.match(r'[\s]*Release-notes-for-([0-9]+)\.([0-9]+)\.([0-9]+)\.md', line) | |
| if m: | |
| from_version = f'{m[1]}.{m[2]}.{m[3]}' | |
| if from_version == '0.64.0': | |
| to_version = '1.0.0' | |
| else: | |
| to_version = f'{m[1]}.{int(m[2]) + 1}.{m[3]}' | |
| new_line = line.replace(from_version, to_version) | |
| relnotes = new_line.strip() | |
| s_f.write(new_line) | |
| s_f.write(line) | |
| if sitemapfile == output: | |
| subprocess.check_call(['git', 'add', output]) | |
| return relnotes, to_version | |
| def generate(relnotes, to_version, source_dir, output_dir): | |
| ''' | |
| Generate notes for Meson build next release. | |
| ''' | |
| title_suffix = ' (in development)' if output_dir else '' | |
| title = f'{to_version}{title_suffix}' | |
| output = Path(output_dir, relnotes) if output_dir else Path('markdown', relnotes) | |
| output.parent.mkdir(exist_ok=True, parents=True) | |
| with output.open('w', encoding='utf-8') as ofile: | |
| ofile.write(RELNOTE_TEMPLATE.format(title, to_version, title_suffix)) | |
| if not output_dir: | |
| date = datetime.date.today() | |
| date_str = date.strftime("%d %B %Y") | |
| ofile.write(f'Meson {to_version} was released on {date_str}\n') | |
| for snippetfile in sorted(Path(source_dir, 'markdown/snippets').glob('*.md')): | |
| snippet = snippetfile.read_text(encoding='utf-8') | |
| ofile.write(snippet) | |
| if not snippet.endswith('\n'): | |
| ofile.write('\n') | |
| ofile.write('\n') | |
| if not output_dir: | |
| subprocess.check_call(['git', 'rm', 'markdown/snippets/*.md']) | |
| subprocess.check_call(['git', 'add', output]) | |
| if __name__ == '__main__': | |
| parser = argparse.ArgumentParser(description='Generate meson docs') | |
| parser.add_argument('--input-sitemap', default='sitemap.txt') | |
| parser.add_argument('--output-sitemap', default='sitemap.txt') | |
| parser.add_argument('--source-dir', default='.') | |
| parser.add_argument('--output-dir') | |
| args = parser.parse_args() | |
| if Path(args.source_dir, 'markdown/snippets').glob('*.md'): | |
| relnotes, to_version = add_to_sitemap(args.input_sitemap, args.output_sitemap) | |
| generate(relnotes, to_version, args.source_dir, args.output_dir) | |
| elif args.input_sitemap != args.output_sitemap: | |
| shutil.copyfile(args.input_sitemap, args.output_sitemap) |