blob: 35a1c663efc350817d945d50cd7b16928403153f [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Utility code for generating ChangeLog.html."""
import html
import logging
import os
import sys
from typing import List
import nassh
import libdot
CHANGELOG_FILE = os.path.join(nassh.DIR, 'html', 'changelog.html')
CHANGELOG_TEMPLATE = os.path.join(nassh.DIR, 'html', 'changelog.html.in')
CHANGELOG_ENTRY_TEMPLATE = """\
<div><a href="https://crrev.com/%(commit)s">%(summary)s</a></div>
"""
def generate_html(tag: str, entries: List[List[str]]):
"""Generate the changelog file from |entries|."""
with open(CHANGELOG_TEMPLATE, 'r', encoding='utf-8') as fp:
template = fp.read()
output = ''
for (commit, summary) in entries:
output += CHANGELOG_ENTRY_TEMPLATE % {
'commit': commit,
'summary': html.escape(summary),
}
output = template.replace('%%COMMITS%%', output).replace('%%TAG%%', tag)
with open(CHANGELOG_FILE, 'w', encoding='utf-8') as fp:
fp.write(output)
def get_entries(tag: str) -> List[List[str]]:
"""Find all the commits since |tag|."""
output = libdot.run(
['git', 'log', '--format=%H %s', f'{tag}..HEAD'],
capture_output=True, encoding='utf-8', cwd=nassh.DIR).stdout
return [x.split(' ', 1) for x in output.splitlines()]
def get_previous_tag() -> str:
"""Find the most recent nassh tag."""
return libdot.run(
['git', 'describe', '--tags', '--abbrev=0', '--match', 'nassh-*',
'HEAD'],
capture_output=True, encoding='utf-8', cwd=nassh.DIR).stdout.strip()
def generate_changelog(prev_tag: str = None):
"""Generate the changelog.html file from recent git history."""
# Ebuilds don't currently checkout the entire tree, so stub it.
if 'EAPI' in os.environ:
logging.warning('Generating a stub changelog for ebuild.')
generate_html('', [])
return
if prev_tag is None:
prev_tag = get_previous_tag()
logging.info('Generating history since tag "%s"', prev_tag)
entries = get_entries(prev_tag)
logging.info('Found %i commits', len(entries))
generate_html(prev_tag, entries)
def get_parser():
"""Get a command line parser."""
parser = libdot.ArgumentParser(description=__doc__)
parser.add_argument('--commit',
help='Commit to generate history back to')
return parser
def main(argv: List[str]):
"""The main func!"""
parser = get_parser()
opts = parser.parse_args(argv)
generate_changelog(prev_tag=opts.commit)
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))