From 727ff2f44afa8b93d27753fe2cbd2cdbbc497950 Mon Sep 17 00:00:00 2001 From: Emilio Pozuelo Monfort Date: Tue, 1 Dec 2020 12:59:17 +0100 Subject: sectracker.parsers: better parse annotations --- lib/python/sectracker/parsers.py | 62 +++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 35 deletions(-) (limited to 'lib') diff --git a/lib/python/sectracker/parsers.py b/lib/python/sectracker/parsers.py index 813810e217..12b295d3e6 100644 --- a/lib/python/sectracker/parsers.py +++ b/lib/python/sectracker/parsers.py @@ -81,26 +81,27 @@ StringAnnotation = _namedtuple("StringAnnotation", XrefAnnotation = _namedtuple("XrefAnnotation", "line type bugs") PackageAnnotation = _namedtuple( "PackageAnnotation", - "line type release package kind version description " - + "urgency debian_bugs bug_filed") + "line type release package kind version description flags") +PackageBugAnnotation = _namedtuple("PackageBugAnnotation", "bug") +PackageUrgencyAnnotation = _namedtuple("PackageUrgencyAnnotation", "severity") def _annotationdispatcher(): # Parser for inner annotations, like (bug #1345; low) urgencies=set("unimportant low medium high".split()) @_regexpcase.rule('(bug filed|%s)' % '|'.join(urgencies)) - def innerflag(groups, diag, flags, bugs): + def innerflag(groups, diag, flags): f = groups[0] - if f in flags: - diag.error("duplicate flag: " + repr(f)) + if PackageUrgencyAnnotation(f) in flags: + diag.error("duplicate urgency: " + repr(f)) else: - flags.add(f) + flags.append(PackageUrgencyAnnotation(f)) @_regexpcase.rule(r'bug #(\d+)') - def innerbug(groups, diag, flags, bugs): + def innerbug(groups, diag, flags): no = int(groups[0]) - if no in bugs: + if PackageBugAnnotation(no) in flags: diag.error("duplicate bug number: " + groups[0]) else: - bugs.add(no) + flags.append(PackageBugAnnotation(no)) def innerdefault(text, diag, flags, bugs): diag.error("invalid inner annotation: " + repr(text)) innerdispatch = _regexpcase.RegexpCase((innerflag, innerbug), @@ -108,27 +109,16 @@ def _annotationdispatcher(): def parseinner(diag, inner): if not inner: - return (None, (), False) - flags = set() - bugs = set() + return [] + flags = [] for innerann in inner.split(";"): - innerdispatch(innerann.strip(), diag, flags, bugs) + innerdispatch(innerann.strip(), diag, flags) - urgency = urgencies.intersection(flags) - if urgency: - if len(urgency) > 1: - diag.error("multiple urgencies: " + ", ".join(urgency)) - else: - urgency = urgency.pop() - else: - urgency = None - - bug_filed = "bug filed" in flags - if bugs and bug_filed: - diag.error("'bug filed' and bug numbers listed") - bug_filed = False + urgencies = [f for f in flags if isinstance(f, PackageUrgencyAnnotation)] + if len(urgencies) > 1: + diag.error("multiple urgencies: " + ", ".join(urgency)) - return (urgency, _sortedtuple(bugs), bug_filed) + return flags # Parsers for indented annotations (NOT-FOR-US:, " - foo " etc.) @@ -136,14 +126,14 @@ def _annotationdispatcher(): + r'(?:\s([A-Za-z0-9:.+~-]+)\s*)?(?:\s\((.*)\))?') def package_version(groups, diag): release, package, version, inner = groups - inner = parseinner(diag, inner) + flags = parseinner(diag, inner) if version is None: kind = "unfixed" else: kind = "fixed" return PackageAnnotation( *((diag.line(), "package", release, package, kind, - version, None) + inner)) + version, None, flags))) pseudo_freetext = "no-dsa not-affected end-of-life ignored postponed".split() pseudo_struct = set("unfixed removed itp undetermined".split()) @@ -154,14 +144,14 @@ def _annotationdispatcher(): if version in pseudo_freetext: return PackageAnnotation( diag.line(), "package", release, package, version, - None, inner, None, (), False) + None, inner, []) elif version in pseudo_struct: - inner = parseinner(diag, inner) + flags = parseinner(diag, inner) if version == "itp" and not inner[1]: diag.error(" needs Debian bug reference") return PackageAnnotation( *((diag.line(), "package", release, package, version, - None, None) + inner)) + None, None, flags))) else: diag.error("invalid pseudo-version: " + repr(version)) return None @@ -263,9 +253,11 @@ def cvelist(path, f): def cveuniquename(line, anns): bug = 0 for ann in anns: - if ann.type == "package" and ann.debian_bugs: - bug = ann.debian_bugs[0] - break + if ann.type == "package": + bugs = [f for f in ann.flags if isinstance(f, PackageBugAnnotation)] + if bugs: + bug = bugs[0].bug + break return "TEMP-%07d-%06d" % (bug, line) def finish(header, headerlineno, anns, diag): name, desc = header -- cgit v1.2.3