|
@@ -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()
|