diff options
author | 2021-06-03 07:05:53 -0600 | |
---|---|---|
committer | 2021-06-03 07:09:56 -0600 | |
commit | 87535d4a6f521a3578c039b369639d787c881b7d (patch) | |
tree | f2de7e9543dec0ec3f3f57c03090e686e9cb013f | |
parent | bump version (diff) | |
download | pkgdev-87535d4a6f521a3578c039b369639d787c881b7d.tar.gz pkgdev-87535d4a6f521a3578c039b369639d787c881b7d.tar.bz2 pkgdev-87535d4a6f521a3578c039b369639d787c881b7d.zip |
pkgdev commit: add initial support for generating summaries from bash diffs
For example, automatic summaries are now generated for simple
PYTHON_COMPAT changes.
Note that this does add some additional lag before commit processing due
to bash env dumping.
-rw-r--r-- | src/pkgdev/scripts/pkgdev_commit.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/pkgdev/scripts/pkgdev_commit.py b/src/pkgdev/scripts/pkgdev_commit.py index 8ff0e84..3052b28 100644 --- a/src/pkgdev/scripts/pkgdev_commit.py +++ b/src/pkgdev/scripts/pkgdev_commit.py @@ -1,5 +1,6 @@ import argparse import atexit +import difflib import os import re import shlex @@ -384,6 +385,35 @@ class PkgSummary(ChangeSummary): if len(msg) <= 50: return msg return action + else: + # use sourced bash env diffs to determine summaries + old_env = old_pkg.environment.data.splitlines() + new_env = new_pkg.environment.data.splitlines() + var_drop_re = re.compile(r'^-declare .+ (?P<name>\w+)=(?P<value>.+)$') + var_add_re = re.compile(r'^\+declare .+ (?P<name>\w+)=(?P<value>.+)$') + drop, add = {}, {} + + for x in difflib.unified_diff(old_env, new_env): + if mo := var_drop_re.match(x): + drop[mo.group('name')] = mo.group('value') + elif mo := var_add_re.match(x): + add[mo.group('name')] = mo.group('value') + + watch_vars = {'HOMEPAGE', 'DESCRIPTION', 'LICENSE', 'SRC_URI'} + updated_vars = drop.keys() & add.keys() + if updated := sorted(watch_vars & updated_vars): + return f"update {', '.join(updated)}" + elif 'PYTHON_COMPAT' in updated_vars: + array_re = re.compile(r'\[\d+\]="(?P<val>.+?)"') + py_re = lambda x: re.sub(r'^python(\d+)_(\d+)$', r'py\1.\2', x) + old = {py_re(m.group('val')) for m in re.finditer(array_re, drop['PYTHON_COMPAT'])} + new = {py_re(m.group('val')) for m in re.finditer(array_re, add['PYTHON_COMPAT'])} + msg = [] + if added := sorted(new - old): + msg.append(f"add {', '.join(added)}") + if dropped := sorted(old - new): + msg.append(f"drop {', '.join(dropped)}") + return ' and '.join(msg) class GitChanges(UserDict): |