aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Harder <radhermit@gmail.com>2021-06-03 07:05:53 -0600
committerTim Harder <radhermit@gmail.com>2021-06-03 07:09:56 -0600
commit87535d4a6f521a3578c039b369639d787c881b7d (patch)
treef2de7e9543dec0ec3f3f57c03090e686e9cb013f
parentbump version (diff)
downloadpkgdev-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.py30
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):