Skip to content

Commit 23f098c

Browse files
committed
tools/create_release_notes: cleanup
1 parent 0e47f45 commit 23f098c

File tree

1 file changed

+57
-74
lines changed

1 file changed

+57
-74
lines changed

tools/create_release_notes.py

Lines changed: 57 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -9,66 +9,55 @@
99
"""
1010

1111
from pathlib import Path
12-
from os.path import relpath
13-
from glob import glob
1412
from subprocess import check_call, check_output, CalledProcessError
1513
from shutil import which
16-
import datetime
17-
18-
19-
def get_releases(source_path: Path):
20-
"""
21-
Get all releases defined by release note files
22-
"""
23-
release_notes = source_path / "release_notes"
24-
releases = []
25-
for idx, file_name in enumerate(sorted(glob(str(release_notes / "*.rst")), reverse=True)):
26-
releases.append(Release(file_name, is_latest=idx == 0))
27-
return releases
14+
from datetime import datetime
2815

2916

3017
def create_release_notes():
3118
"""
3219
Create monolithic release notes file from several input files
3320
"""
34-
source_path = Path(__file__).parent.parent / "docs"
35-
36-
check_call(["towncrier", "build", "--keep"], cwd=source_path.parent)
37-
38-
releases = get_releases(source_path)
39-
latest_release = releases[0]
40-
41-
with (source_path / "release_notes.inc").open("w", encoding="utf-8") as fptr:
42-
fptr.write(
43-
"`Commits since last release "
44-
f"<https://github.com/VUnit/vunit/compare/{latest_release.tag!s}...master>`__"
21+
root = Path(__file__).parent.parent
22+
docsroot = root / "docs"
23+
24+
check_call(["towncrier", "build", "--keep"], cwd=root)
25+
26+
# Get all releases defined by release note files
27+
releases = [
28+
Release(file_name, is_latest=idx == 0)
29+
for idx, file_name in enumerate(sorted((docsroot / "release_notes").glob("*.rst"), reverse=True))
30+
]
31+
32+
content = (
33+
"`Commits since last release "
34+
f"<https://github.com/VUnit/vunit/compare/v{releases[0].name!s}...master>`__"
35+
"\n\n"
36+
)
37+
38+
for idx, release in enumerate(releases):
39+
title = f":vunit_commit:`{release.name!s} <v{release.name!s}>` - {release.date.strftime('%Y-%m-%d')}"
40+
41+
if idx == 0:
42+
title += " (latest)"
43+
content += ".. _release:latest:\n\n"
44+
45+
content += (
46+
f".. _release:{release.name}:\n\n"
47+
f"{title}\n{'-' * len(title)}\n\n"
48+
f"`Download from PyPI <https://pypi.python.org/pypi/vunit_hdl/{release.name!s}/>`__"
4549
)
4650

47-
fptr.write("\n\n")
48-
49-
for idx, release in enumerate(releases):
50-
is_last = idx == len(releases) - 1
51-
52-
if release.is_latest:
53-
fptr.write(".. _release:latest:\n\n")
54-
55-
fptr.write(f".. _release:{release.name}:\n\n")
51+
if idx != len(releases) - 1:
52+
content += (
53+
f" | `Commits since previous release "
54+
f"<https://github.com/VUnit/vunit/compare/v{releases[idx + 1].name!s}...v{release.name!s}>`__"
55+
)
5656

57-
title = f":vunit_commit:`{release.name!s} <{release.tag!s}>` - {release.date.strftime('%Y-%m-%d')!s}"
58-
if release.is_latest:
59-
title += " (latest)"
60-
fptr.write(title + "\n")
61-
fptr.write("-" * len(title) + "\n\n")
57+
content += f"\n\n.. include:: release_notes/{release.name}{release.suffix}\n\n\n"
6258

63-
fptr.write(f"\n`Download from PyPI <https://pypi.python.org/pypi/vunit_hdl/{release.name!s}/>`__")
64-
65-
if not is_last:
66-
fptr.write(
67-
f" | `Commits since previous release "
68-
f"<https://github.com/VUnit/vunit/compare/{releases[idx + 1].tag!s}...{release.tag!s}>`__"
69-
)
70-
71-
fptr.write(f"\n\n.. include:: {relpath(release.file_name, source_path)!s}\n\n")
59+
with open(str(docsroot / "release_notes.inc"), "w", encoding="utf-8") as fptr:
60+
fptr.write(content)
7261

7362

7463
class Release(object):
@@ -77,33 +66,27 @@ class Release(object):
7766
"""
7867

7968
def __init__(self, file_name, is_latest):
80-
self.file_name = file_name
81-
self.name = str(Path(file_name).with_suffix("").name)
82-
self.tag = "v" + self.name
83-
self.is_latest = is_latest
69+
self.suffix = file_name.suffix
70+
self.name = file_name.stem
71+
tag = "v" + self.name
8472

85-
try:
86-
self.date = _get_date(self.tag)
73+
git = which("git")
74+
if git is None:
75+
raise BaseException("'git' is required!")
8776

77+
try:
78+
self._get_date(git, tag)
8879
except CalledProcessError:
89-
if self.is_latest:
90-
# Release tag for latest release not yet created, assume HEAD will become release
91-
print(f"Release tag {self.tag!s} not created yet, use HEAD for date")
92-
self.date = _get_date("HEAD")
93-
else:
80+
if not is_latest:
9481
raise
95-
96-
with Path(file_name).open("r", encoding="utf-8") as fptr:
97-
self.notes = fptr.read()
98-
99-
100-
def _get_date(commit):
101-
"""
102-
Get date
103-
"""
104-
git = which("git")
105-
if git is None:
106-
raise BaseException("'git' is required!")
107-
date_str = check_output([git, "log", "-1", "--format=%ci", commit]).decode().strip()
108-
date_str = " ".join(date_str.split(" ")[0:2])
109-
return datetime.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
82+
print(f"Release tag {tag} not created yet, use HEAD for date")
83+
self._get_date(git, "HEAD")
84+
85+
def _get_date(self, git, ref):
86+
"""
87+
Get date
88+
"""
89+
self.date = datetime.strptime(
90+
" ".join(check_output([git, "log", "-1", "--format=%ci", ref]).decode().strip().split(" ")[0:2]),
91+
"%Y-%m-%d %H:%M:%S",
92+
)

0 commit comments

Comments
 (0)