diff --git a/scripts-dev/release.py b/scripts-dev/release.py
index ec92a59bb8..257d1e9ebd 100755
--- a/scripts-dev/release.py
+++ b/scripts-dev/release.py
@@ -27,7 +27,7 @@ import time
import urllib.request
from os import path
from tempfile import TemporaryDirectory
-from typing import Any, List, Optional
+from typing import Any, List, Match, Optional, Union
import attr
import click
@@ -233,7 +233,7 @@ def _prepare() -> None:
subprocess.check_output(["poetry", "version", new_version])
# Generate changelogs.
- generate_and_write_changelog(current_version, new_version)
+ generate_and_write_changelog(synapse_repo, current_version, new_version)
# Generate debian changelogs
if parsed_new_version.pre is not None:
@@ -814,7 +814,7 @@ def get_changes_for_version(wanted_version: version.Version) -> str:
def generate_and_write_changelog(
- current_version: version.Version, new_version: str
+ repo: Repo, current_version: version.Version, new_version: str
) -> None:
# We do this by getting a draft so that we can edit it before writing to the
# changelog.
@@ -827,6 +827,10 @@ def generate_and_write_changelog(
new_changes = new_changes.replace(
"No significant changes.", f"No significant changes since {current_version}."
)
+ new_changes += build_dependabot_changelog(
+ repo,
+ current_version,
+ )
# Prepend changes to changelog
with open("CHANGES.md", "r+") as f:
@@ -841,5 +845,47 @@ def generate_and_write_changelog(
os.remove(filename)
+def build_dependabot_changelog(repo: Repo, current_version: version.Version) -> str:
+ """Summarise dependabot commits between `current_version` and `release_branch`.
+
+ Returns an empty string if there have been no such commits; otherwise outputs a
+ third-level markdown header followed by an unordered list."""
+ last_release_commit = repo.tag("v" + str(current_version)).commit
+ rev_spec = f"{last_release_commit.hexsha}.."
+ commits = list(git.objects.Commit.iter_items(repo, rev_spec))
+ messages = []
+ for commit in reversed(commits):
+ if commit.author.name == "dependabot[bot]":
+ message: Union[str, bytes] = commit.message
+ if isinstance(message, bytes):
+ message = message.decode("utf-8")
+ messages.append(message.split("\n", maxsplit=1)[0])
+
+ if not messages:
+ print(f"No dependabot commits in range {rev_spec}", file=sys.stderr)
+ return ""
+
+ messages.sort()
+
+ def replacer(match: Match[str]) -> str:
+ desc = match.group(1)
+ number = match.group(2)
+ return f"* {desc}. ([\\#{number}](https://github.com/matrix-org/synapse/issues/{number}))"
+
+ for i, message in enumerate(messages):
+ messages[i] = re.sub(r"(.*) \(#(\d+)\)$", replacer, message)
+ messages.insert(0, "### Updates to locked dependencies\n")
+ return "\n".join(messages)
+
+
+@cli.command()
+@click.argument("since")
+def test_dependabot_changelog(since: str) -> None:
+ """Test building the dependabot changelog.
+
+ Summarises all dependabot commits between the SINCE tag and the current git HEAD."""
+ print(build_dependabot_changelog(git.Repo("."), version.Version(since)))
+
+
if __name__ == "__main__":
cli()
|