#!/usr/bin/env python """Update the What's New doc (development version) This collects the snippets from whatsnew/pr/, moves their content into whatsnew/development.rst (chronologically ordered), and deletes the snippets. """ import io import sys from glob import glob from os.path import dirname, basename, abspath, join as pjoin from subprocess import check_call, check_output repo_root = dirname(dirname(abspath(__file__))) whatsnew_dir = pjoin(repo_root, 'docs', 'source', 'whatsnew') pr_dir = pjoin(whatsnew_dir, 'pr') target = pjoin(whatsnew_dir, 'development.rst') FEATURE_MARK = ".. DO NOT EDIT THIS LINE BEFORE RELEASE. FEATURE INSERTION POINT." INCOMPAT_MARK = ".. DO NOT EDIT THIS LINE BEFORE RELEASE. INCOMPAT INSERTION POINT." # 1. Collect the whatsnew snippet files --------------------------------------- files = set(glob(pjoin(pr_dir, '*.rst'))) # Ignore explanatory and example files files.difference_update({pjoin(pr_dir, f) for f in { 'incompat-switching-to-perl.rst', 'antigravity-feature.rst'} }) if not files: print("No automatic update available for what's new") sys.exit(0) def getmtime(f): return check_output(['git', 'log', '-1', '--format="%ai"', '--', f]) files = sorted(files, key=getmtime) features, incompats = [], [] for path in files: with io.open(path, encoding='utf-8') as f: try: content = f.read().rstrip() except Exception as e: raise Exception('Error reading "{}"'.format(f)) from e if basename(path).startswith('incompat-'): incompats.append(content) else: features.append(content) # Put the insertion markers back on the end, so they're ready for next time. feature_block = '\n\n'.join(features + [FEATURE_MARK]) incompat_block = '\n\n'.join(incompats + [INCOMPAT_MARK]) # 2. Update the target file --------------------------------------------------- with io.open(target, encoding='utf-8') as f: content = f.read() assert content.count(FEATURE_MARK) == 1 assert content.count(INCOMPAT_MARK) == 1 content = content.replace(FEATURE_MARK, feature_block) content = content.replace(INCOMPAT_MARK, incompat_block) # Clean trailing whitespace content = '\n'.join(l.rstrip() for l in content.splitlines()) with io.open(target, 'w', encoding='utf-8') as f: f.write(content) # 3. Stage the changes in git ------------------------------------------------- for file in files: check_call(['git', 'rm', file]) check_call(['git', 'add', target]) print("Merged what's new changes. Check the diff and commit the change.")