mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 21:21:19 +01:00
Script a list of proposals in proposals/README.md (#92)
Per request from chandlerc, to make it easier to skim proposal titles outside the website. Also fix the title of markdown-toc.
This commit is contained in:
Executable
+71
@@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""Updates the list of proposals in proposals/README.md."""
|
||||
|
||||
__copyright__ = """
|
||||
Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
Exceptions. See /LICENSE for license information.
|
||||
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Read the proposal dir relative to this script.
|
||||
proposal_dir = os.path.realpath(
|
||||
os.path.join(os.path.dirname(sys.argv[0]), "../../proposals/")
|
||||
)
|
||||
print(proposal_dir)
|
||||
|
||||
# Identify proposal titles in the file list.
|
||||
proposals = [
|
||||
"<!-- This list is updated by src/scripts/pre-commit-proposal-list.py. "
|
||||
"-->",
|
||||
"",
|
||||
]
|
||||
error = False
|
||||
for file in sorted(os.listdir(proposal_dir)):
|
||||
file_match = re.match(r"^p([0-9]{4})\.md$", file)
|
||||
if not file_match:
|
||||
continue
|
||||
with open(os.path.join(proposal_dir, file)) as f:
|
||||
content = f.read()
|
||||
title = content.split("\n")[0]
|
||||
title_match = re.match(r"^# (.*)$", title)
|
||||
if not title_match:
|
||||
print("ERROR: %s doesn't have a title on the first line." % file)
|
||||
error = True
|
||||
proposals.append(
|
||||
"- [%s - %s](%s)" % (file_match[1], title_match[1], file)
|
||||
)
|
||||
decision_file = "p%s-decision.md" % file_match[1]
|
||||
if os.path.exists(os.path.join(proposal_dir, decision_file)):
|
||||
proposals.append(" - [Decision](%s)" % decision_file)
|
||||
# We print batched errors for usability, but still need to exit with
|
||||
# failure.
|
||||
if error:
|
||||
sys.exit(1)
|
||||
|
||||
# Replace the README content if needed.
|
||||
readme_path = os.path.join(proposal_dir, "README.md")
|
||||
with open(readme_path) as f:
|
||||
old_content = f.read()
|
||||
proposals_re = re.compile(
|
||||
r"(.*<!-- proposals -->)(?:.*)(<!-- endproposals -->)",
|
||||
re.DOTALL | re.MULTILINE,
|
||||
)
|
||||
if not proposals_re.match(old_content):
|
||||
print(
|
||||
"ERROR: proposals/README.md is missing the <!-- proposals --> ... "
|
||||
"<!-- endproposals --> marker."
|
||||
)
|
||||
sys.exit(1)
|
||||
new_content = proposals_re.sub(
|
||||
r"\1\n%s\n\n\2" % "\n".join(proposals), old_content
|
||||
)
|
||||
if old_content != new_content:
|
||||
print("Updating proposals/README.md")
|
||||
with open(readme_path, "w") as f:
|
||||
f.write(new_content)
|
||||
Reference in New Issue
Block a user