source: gen-changelog.py

trunk
Last change on this file was 462ef6d, checked in by Xi Ruoyao <xry111@…>, 4 months ago

gen-changelog: Handles holding tickets

  • Property mode set to 100755
File size: 3.2 KB
Line 
1#!/usr/bin/env python3
2
3# LFS ChangeLog generator for trivial package addition, removal, and update
4
5from subprocess import Popen, PIPE
6from urllib.request import urlopen
7from os import getenv
8
9def get_entity(line):
10 line = line[1:]
11 if not line.startswith("<!ENTITY "):
12 return None
13 quote_pos = line.find(' "')
14 key = line[len("<!ENTITY "):quote_pos]
15 value = line[quote_pos + 2:]
16 value = value[:value.find('"')]
17 return (key, value)
18
19def expand_entity(ent, key):
20 value = ent[key]
21 out = ""
22 sub_ent = ""
23 for c in value:
24 if c == '&':
25 sub_ent = c
26 elif sub_ent:
27 sub_ent += c
28 if c == ';':
29 out += expand_entity(ent, sub_ent[1:-1])
30 sub_ent = ""
31 else:
32 out += c
33 return out
34
35git_diff = Popen(["git", "diff", "-U999999", "packages.ent"],
36 stdout = PIPE,
37 text = True)
38stdout, _ = git_diff.communicate()
39
40lines = stdout.rstrip().split("\n")
41ent = [get_entity(i) for i in lines if i[0] != '-']
42ent = dict(i for i in ent if i)
43
44add = set()
45rem = set()
46
47for l in lines:
48 if l[0] in '+-':
49 pair = get_entity(l)
50 if pair:
51 key, _ = pair
52 if key.endswith('-md5'):
53 pkg = key[:-len('-md5')]
54 if l[0] == '+':
55 add.add(pkg)
56 else:
57 rem.add(pkg)
58
59upd = add.intersection(rem)
60add = add.symmetric_difference(upd)
61rem = rem.symmetric_difference(upd)
62
63ticket = {}
64security = set()
65url = 'https://wiki.linuxfromscratch.org/lfs/report/1?format=tab'
66tsv = urlopen(url)
67for i in tsv:
68 fields = i.decode().split('\t')
69 if len(fields) >= 2:
70 pkg = fields[1].lower()
71 pos = pkg.find(' ')
72 if pos > 0:
73 pkg = pkg[:pos]
74 tic = fields[0]
75 if len(fields) >= 3 and fields[2].startswith("high"):
76 security.add(pkg)
77 ticket[pkg] = tic
78
79hold_ticket = {'vim': '4500', 'iana-etc': '5006'}
80
81print("Plain Text:")
82for (s, act) in [(upd, "Update to "), (add, "Add ")]:
83 for i in s:
84 pkgver = i + "-" + expand_entity(ent, i + "-version")
85 out = act + pkgver
86 if pkgver in ticket:
87 out += ' (#' + ticket[pkgver] + ')'
88 elif i in hold_ticket:
89 out += ' (#' + hold_ticket[i] + ')'
90 print("-", out)
91for i in rem:
92 print("-", "Remove", i)
93
94print("---------------------")
95
96print("XML")
97name = getenv("USER")
98for (s, act) in [(upd, "Update to "), (add, "Add ")]:
99 for i in s:
100 print(' <listitem>')
101 pkgver = i + "-" + expand_entity(ent, i + "-version")
102 out = ' <para>[' + name + '] - ' + act + pkgver
103 if pkgver in security:
104 out += " (security fix)"
105 out += "."
106
107 pkg_ticket = None
108 if pkgver in ticket:
109 out += " Fixes\n "
110 pkg_ticket = ticket[pkgver]
111 elif i in hold_ticket:
112 out += " Addresses\n "
113 pkg_ticket = hold_ticket[i]
114
115 if pkg_ticket:
116 out += "<ulink url='&lfs-ticket-root;" + pkg_ticket + "'>#"
117 out += pkg_ticket + "</ulink>."
118 out += "</para>"
119 print(out)
120 print(' </listitem>')
Note: See TracBrowser for help on using the repository browser.