summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorEmilio Pozuelo Monfort <pochu@debian.org>2020-12-01 12:59:17 +0100
committerEmilio Pozuelo Monfort <pochu@debian.org>2020-12-02 09:32:38 +0100
commit727ff2f44afa8b93d27753fe2cbd2cdbbc497950 (patch)
tree9c91d0e173d88e4dd510bb1183132dc55b41d4d6 /lib
parentbf5184f1f5e06b88ba8382d5610e04c9cb56fda1 (diff)
sectracker.parsers: better parse annotations
Diffstat (limited to 'lib')
-rw-r--r--lib/python/sectracker/parsers.py62
1 files changed, 27 insertions, 35 deletions
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 <unfixed>" 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("<itp> 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

© 2014-2024 Faster IT GmbH | imprint | privacy policy