update_whatsnew.py
81 lines
| 2.4 KiB
| text/x-python
|
PythonLexer
/ tools / update_whatsnew.py
Min RK
|
r20268 | #!/usr/bin/env python | ||
Thomas Kluyver
|
r12901 | """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 | ||||
Matthias Bussonnier
|
r22041 | import sys | ||
dswij
|
r26045 | from pathlib import Path | ||
Thomas Kluyver
|
r12901 | from subprocess import check_call, check_output | ||
dswij
|
r26044 | repo_root = Path(__file__).resolve().parent.parent | ||
dswij
|
r26045 | whatsnew_dir = repo_root / "docs" / "source" / "whatsnew" | ||
pr_dir = whatsnew_dir / "pr" | ||||
target = whatsnew_dir / "development.rst" | ||||
Thomas Kluyver
|
r12901 | |||
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 --------------------------------------- | ||||
dswij
|
r26045 | files = set(pr_dir.glob("*.rst")) | ||
Thomas Kluyver
|
r12901 | # Ignore explanatory and example files | ||
dswij
|
r26045 | files.difference_update( | ||
{pr_dir / f for f in {"incompat-switching-to-perl.rst", "antigravity-feature.rst"}} | ||||
) | ||||
Thomas Kluyver
|
r12901 | |||
Matthias Bussonnier
|
r22041 | if not files: | ||
print("No automatic update available for what's new") | ||||
sys.exit(0) | ||||
Thomas Kluyver
|
r12901 | |||
def getmtime(f): | ||||
dswij
|
r26045 | return check_output(["git", "log", "-1", '--format="%ai"', "--", f]) | ||
Thomas Kluyver
|
r12901 | |||
files = sorted(files, key=getmtime) | ||||
features, incompats = [], [] | ||||
for path in files: | ||||
dswij
|
r26045 | with io.open(path, encoding="utf-8") as f: | ||
Matthias Bussonnier
|
r21970 | try: | ||
content = f.read().rstrip() | ||||
except Exception as e: | ||||
Matthias Bussonnier
|
r21974 | raise Exception('Error reading "{}"'.format(f)) from e | ||
Matthias Bussonnier
|
r21970 | |||
dswij
|
r26045 | if path.name.startswith("incompat-"): | ||
Thomas Kluyver
|
r12901 | incompats.append(content) | ||
else: | ||||
features.append(content) | ||||
# Put the insertion markers back on the end, so they're ready for next time. | ||||
dswij
|
r26045 | feature_block = "\n\n".join(features + [FEATURE_MARK]) | ||
incompat_block = "\n\n".join(incompats + [INCOMPAT_MARK]) | ||||
Thomas Kluyver
|
r12901 | |||
# 2. Update the target file --------------------------------------------------- | ||||
dswij
|
r26045 | with io.open(target, encoding="utf-8") as f: | ||
Thomas Kluyver
|
r12901 | 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 | ||||
dswij
|
r26045 | content = "\n".join(l.rstrip() for l in content.splitlines()) | ||
Thomas Kluyver
|
r12901 | |||
dswij
|
r26045 | with io.open(target, "w", encoding="utf-8") as f: | ||
Thomas Kluyver
|
r12901 | f.write(content) | ||
# 3. Stage the changes in git ------------------------------------------------- | ||||
for file in files: | ||||
dswij
|
r26045 | check_call(["git", "rm", file]) | ||
Thomas Kluyver
|
r12901 | |||
dswij
|
r26045 | check_call(["git", "add", target]) | ||
Thomas Kluyver
|
r12901 | |||
Matthias Bussonnier
|
r21970 | print("Merged what's new changes. Check the diff and commit the change.") | ||