aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-03-03 15:39:09 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-03-03 19:32:07 +0100
commitcc19c439a64ddc42bc333ee5df7b651a789d6da5 (patch)
treef408ec074e26f96ef661df82598db92f899edb46
parent0b7a1be238c585cea66732c4ed3287f325395865 (diff)
changelog-tool: Add handling of actual changelog entries
Scan the commit messages for entries like [ChangeLog][shiboken2] description... and prepend them to the task list. Change-Id: I4cc8599eefb18c0b2c1892b8f23682b15815d1ec Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r--tools/create_changelog.py82
1 files changed, 61 insertions, 21 deletions
diff --git a/tools/create_changelog.py b/tools/create_changelog.py
index d28af1a7f..7599cc6b9 100644
--- a/tools/create_changelog.py
+++ b/tools/create_changelog.py
@@ -41,9 +41,9 @@ import re
import sys
from argparse import ArgumentParser, Namespace, RawTextHelpFormatter
from subprocess import check_output, Popen, PIPE
-from typing import Dict, List
+from typing import Dict, List, Tuple
-content = """Qt for Python @VERSION is a @TYPE release.
+content_header = """Qt for Python @VERSION is a @TYPE release.
For more details, refer to the online documentation included in this
distribution. The documentation is also available online:
@@ -61,14 +61,11 @@ information about a particular change.
****************************************************************************
* PySide2 *
****************************************************************************
+"""
-@PYSIDE
-
-****************************************************************************
+shiboken_header = """****************************************************************************
* Shiboken2 *
****************************************************************************
-
-@SHIBOKEN
"""
@@ -143,20 +140,22 @@ def get_commit_content(sha: str) -> str:
print(err, file=sys.stderr)
return out.decode("utf-8")
-
-def git_command(versions: List[str], pattern: str):
+def git_get_sha1s(versions: List[str], pattern: str):
+ """Return a list of SHA1s matching a pattern"""
command = "git rev-list --reverse --grep '^{}'".format(pattern)
command += " {}..{}".format(versions[0], versions[1])
command += " | git cat-file --batch"
command += " | grep -o -E \"^[0-9a-f]{40}\""
- task_number_re = re.compile(r'^.*-(\d+)\s*$')
print("{}: {}".format(git_command.__name__, command), file=sys.stderr)
out_sha1, err = Popen(command, stdout=PIPE, shell=True).communicate()
if err:
print(err, file=sys.stderr)
- sha1_list = [s.decode("utf-8") for s in out_sha1.splitlines()]
+ return [s.decode("utf-8") for s in out_sha1.splitlines()]
+
- for sha in sha1_list:
+def git_command(versions: List[str], pattern: str):
+ task_number_re = re.compile(r'^.*-(\d+)\s*$')
+ for sha in git_get_sha1s(versions, pattern):
content = get_commit_content(sha).splitlines()
# First line is title
title = content[0]
@@ -190,11 +189,43 @@ def create_task_log(versions: List[str]) -> None:
git_command(versions, "Task-number: ")
+def extract_change_log(commit_message: List[str]) -> Tuple[str, List[str]]:
+ """Extract a tuple of (component, change log lines) from a commit message
+ of the form [ChangeLog][shiboken2] description..."""
+ result = []
+ component = 'pyside'
+ within_changelog = False
+ for line in commit_message:
+ if within_changelog:
+ if line:
+ result.append(' ' + line.strip())
+ else:
+ break
+ else:
+ if line.startswith('[ChangeLog]'):
+ log_line = line[11:]
+ if log_line.startswith('['):
+ end = log_line.find(']')
+ if end > 0:
+ component = log_line[1:end]
+ log_line = log_line[end + 1:]
+ result.append(' * ' + log_line.strip())
+ within_changelog = True
+ return (component, result)
+
+
+def create_change_log(versions: List[str]) -> None:
+ for sha in git_get_sha1s(versions, r"\[ChangeLog\]"):
+ change_log = extract_change_log(get_commit_content(sha).splitlines())
+ if change_log[0].startswith('shiboken'):
+ shiboken2_changelogs.extend(change_log[1])
+ else:
+ pyside2_changelogs.extend(change_log[1])
+
+
def gen_list(d: Dict[str, Dict[str, str]]) -> str:
- if d:
- return "".join(" - [{}] {}\n".format(v["task"], v["title"])
- for _, v in d.items())
- return " - No changes"
+ return "".join(" - [{}] {}\n".format(v["task"], v["title"])
+ for _, v in d.items())
def sort_dict(d: Dict[str, Dict[str, str]]) -> Dict[str, Dict[str, str]]:
@@ -206,6 +237,8 @@ if __name__ == "__main__":
args = parse_options()
pyside2_commits: Dict[str, Dict[str, str]] = {}
shiboken2_commits: Dict[str, Dict[str, str]] = {}
+ pyside2_changelogs: List[str] = []
+ shiboken2_changelogs: List[str] = []
# Getting commits information
directory = args.directory if args.directory else "."
@@ -214,14 +247,21 @@ if __name__ == "__main__":
if check_tag(versions[0]) and check_tag(versions[1]):
create_fixes_log(versions)
create_task_log(versions)
+ create_change_log(versions)
# Sort commits
pyside2_commits = sort_dict(pyside2_commits)
shiboken2_commits = sort_dict(shiboken2_commits)
# Generate message
- print(content
- .replace("@VERSION", args.release)
- .replace("@TYPE", args.type)
- .replace("@PYSIDE", gen_list(pyside2_commits))
- .replace("@SHIBOKEN", gen_list(shiboken2_commits)))
+ print(content_header.replace("@VERSION", args.release).
+ replace("@TYPE", args.type))
+ print('\n'.join(pyside2_changelogs))
+ print(gen_list(pyside2_commits))
+ if not pyside2_changelogs and not pyside2_commits:
+ print(" - No changes")
+ print(shiboken_header)
+ print('\n'.join(shiboken2_changelogs))
+ print(gen_list(shiboken2_commits))
+ if not shiboken2_changelogs and not shiboken2_commits:
+ print(" - No changes")