lfs-ru/gen-changelog.py
Poltern 627d1976d6 gen-changelog: Handles holding tickets
systemd: Fix CVE-2023-7008
Package updates:

- Update to meson-1.3.1 (#5402)
- Update to vim-9.0.2189 (#4500)
- Update to inetutils-2.5 (#5404)
- Update to xml-parser-2.47 (#5403)
- Update to linux-6.6.8 (#5397)
- Update to tzdata-2023d (#5399)
- Update to setuptools-69.0.3 (#5400)
- Update to iana-etc-20231205 (#5006)
- Update to autoconf-2.72 (#5398)
- Update to grub-2.12 (#5396)
2024-01-02 21:11:20 +05:00

121 lines
3.2 KiB
Python

#!/usr/bin/env python3
# LFS ChangeLog generator for trivial package addition, removal, and update
from subprocess import Popen, PIPE
from urllib.request import urlopen
from os import getenv
def get_entity(line):
line = line[1:]
if not line.startswith("<!ENTITY "):
return None
quote_pos = line.find(' "')
key = line[len("<!ENTITY "):quote_pos]
value = line[quote_pos + 2:]
value = value[:value.find('"')]
return (key, value)
def expand_entity(ent, key):
value = ent[key]
out = ""
sub_ent = ""
for c in value:
if c == '&':
sub_ent = c
elif sub_ent:
sub_ent += c
if c == ';':
out += expand_entity(ent, sub_ent[1:-1])
sub_ent = ""
else:
out += c
return out
git_diff = Popen(["git", "diff", "-U999999", "packages.ent"],
stdout = PIPE,
text = True)
stdout, _ = git_diff.communicate()
lines = stdout.rstrip().split("\n")
ent = [get_entity(i) for i in lines if i[0] != '-']
ent = dict(i for i in ent if i)
add = set()
rem = set()
for l in lines:
if l[0] in '+-':
pair = get_entity(l)
if pair:
key, _ = pair
if key.endswith('-md5'):
pkg = key[:-len('-md5')]
if l[0] == '+':
add.add(pkg)
else:
rem.add(pkg)
upd = add.intersection(rem)
add = add.symmetric_difference(upd)
rem = rem.symmetric_difference(upd)
ticket = {}
security = set()
url = 'https://wiki.linuxfromscratch.org/lfs/report/1?format=tab'
tsv = urlopen(url)
for i in tsv:
fields = i.decode().split('\t')
if len(fields) >= 2:
pkg = fields[1].lower()
pos = pkg.find(' ')
if pos > 0:
pkg = pkg[:pos]
tic = fields[0]
if len(fields) >= 3 and fields[2].startswith("high"):
security.add(pkg)
ticket[pkg] = tic
hold_ticket = {'vim': '4500', 'iana-etc': '5006'}
print("Plain Text:")
for (s, act) in [(upd, "Update to "), (add, "Add ")]:
for i in s:
pkgver = i + "-" + expand_entity(ent, i + "-version")
out = act + pkgver
if pkgver in ticket:
out += ' (#' + ticket[pkgver] + ')'
elif i in hold_ticket:
out += ' (#' + hold_ticket[i] + ')'
print("-", out)
for i in rem:
print("-", "Remove", i)
print("---------------------")
print("XML")
name = getenv("USER")
for (s, act) in [(upd, "Update to "), (add, "Add ")]:
for i in s:
print(' <listitem>')
pkgver = i + "-" + expand_entity(ent, i + "-version")
out = ' <para>[' + name + '] - ' + act + pkgver
if pkgver in security:
out += " (security fix)"
out += "."
pkg_ticket = None
if pkgver in ticket:
out += " Fixes\n "
pkg_ticket = ticket[pkgver]
elif i in hold_ticket:
out += " Addresses\n "
pkg_ticket = hold_ticket[i]
if pkg_ticket:
out += "<ulink url='&lfs-ticket-root;" + pkg_ticket + "'>#"
out += pkg_ticket + "</ulink>."
out += "</para>"
print(out)
print(' </listitem>')