Skip to content

Commit

Permalink
πŸ”§ Add update_changelog.py script
Browse files Browse the repository at this point in the history
  • Loading branch information
mbercx committed Nov 21, 2024
1 parent 0896242 commit ee22bfc
Showing 1 changed file with 94 additions and 0 deletions.
94 changes: 94 additions & 0 deletions .github/workflows/update_changelog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#!/bin/bash
# -*- coding: utf-8 -*-
"""Script for automatically updating the `CHANGELOG.md` based on the commits since the latest release tag."""

from pathlib import Path
import re
import subprocess
from datetime import date

from qe_tools import __version__

DEFAULT_CHANGELOG_SECTIONS = """
### ‼️ Breaking changes
### ✨ New features
### πŸ—‘οΈ Deprecations
### πŸ‘Œ Improvements
### πŸ› Bug fixes
### πŸ“š Documentation
### πŸ”§ Maintenance
### ⬆️ Update dependencies
### πŸ§ͺ Tests
### ♻️ Refactor
"""


def update_changelog():
"""Update the `CHANGELOG.md` for a first draft of the release."""

print('πŸ” Checking the current version number')
current_changelog = Path('CHANGELOG.md').read_text(encoding='utf-8')

print(__version__)

if str(__version__) in current_changelog:
print('πŸ›‘ Current version already in `CHANGELOG.md`. Skipping...')
return

print('⬆️ Found updated version number, adapting `CHANGELOG.md`.')
tags = subprocess.run(['git', 'tag', '--sort=v:refname'], capture_output=True, check=True, encoding='utf-8').stdout
latest_tag = re.findall(r'(v\d\.\d\.\d)\n', tags)[-1]

print(f'πŸ”„ Comparing with latest tag `{latest_tag}`.')
commits = subprocess.run(
['git', 'log', "--pretty=format:'%h|%H|%s'", f'{latest_tag}..origin/main'],
capture_output=True,
check=True,
encoding='utf-8',
).stdout

pr_pattern = re.compile(r'\(\S(?P<pr_number>\d+)\)')

changelog_message = f'## `v{__version__}` - {date.today()}\n' + DEFAULT_CHANGELOG_SECTIONS

for commit in commits.splitlines():
# Remove the PR number from the commit message
pr_match = pr_pattern.search(commit)

if pr_match is not None:
pr_number = pr_match.groupdict()['pr_number']
commit = commit.replace(rf'(#{pr_number})', '')

# Add the commit hash (short) to link to the changelog
commit = commit.strip("'")
hash_short, hash_long, message = commit.split('|', maxsplit=2)
message += f' [[{hash_short}](https://github.com/aiidateam/qe-tools/commit/{hash_long})]'
changelog_message += f'\n* {message}'

with Path('CHANGELOG.md').open('w', encoding='utf8') as handle:
handle.write(changelog_message + '\n\n' + current_changelog)

print("πŸš€ Success! Finalise the `CHANGELOG.md` and let's get this baby released.")


if __name__ == '__main__':
update_changelog()

0 comments on commit ee22bfc

Please sign in to comment.