annotate.py (86 lines of code) (raw):
#!/usr/bin/env python3
import json
import os
import pprint
import getopt
import sys
import re
import html
import pprint
import datetime
###########################################################
# Usage
###########################################################
# -s (signature) : signature to annotate
# -a (annotation) : simple text based note. bugzilla references
# will automatically get linked.
# -c : clear any existing data in the database
# -f (bug#) : add a fixed by bug # annotation
# -v (version) : fixed by annotation firefox version ex: '89.0'
#
# examples:
# python annotate.py -s "draw_quad_spans<T>" -a "filed Bug 1712938"
# python annotate.py -s "core::ops::function::Fn::call<T> | szDynamicDaylightDisabled" -f 1751177 -v 97.0.1
# python annotate.py -s "core::ops::function::Fn::call<T> | env_logger::Builder::new" -f 1751177 -v 97.0.1
# python annotate.py -s "" -a "Bug xyz"
# python annotate.py -s "" -a "Bug xyz"
# python annotate.py -s "" -a "Bug xyz"
# python annotate.py -s "" -a "Bug xyz"
# python annotate.py -s "" -a "Bug xyz"
pp = pprint.PrettyPrinter(indent=2)
def saveAnnotations(ann, filename):
file = "%s.json" % filename
with open(file, "w") as database:
database.write(json.dumps(ann))
def loadAnnotations(filename):
file = "%s.json" % filename
try:
with open(file) as database:
annotations = json.load(database)
except FileNotFoundError:
print("Could not find %s file." % file)
return dict()
except json.decoder.JSONDecodeError:
print("Json error parsing %s" % file)
return dict()
return annotations
def escape(text):
return html.escape(text)
def escapeBugLinks(text):
# convert bug references to links
# https://bugzilla.mozilla.org/show_bug.cgi?id=1323439
pattern = "bug ([0-9]*) "
replacement = "<a href='https://bugzilla.mozilla.org/show_bug.cgi?id=\\1'>\\1</a> "
result = re.sub(pattern, replacement, text, flags=re.IGNORECASE)
return result
fixedBy = False
newDatabase = False
dbFilename = "annotations"
annotation = None
options, remainder = getopt.getopt(sys.argv[1:], 's:a:f:p:cv:')
for o, a in options:
if o == '-a':
annotation = a
elif o == '-c':
newDatabase = True
print("Using a new database.")
elif o == '-s':
signature = a
elif o == '-f':
bugId = int(a)
fixedBy = True
elif o == '-v':
appliesToFxVersion = a
elif o == '-p':
param = a.split('=')
parameters[param[0]] = param[1]
#channel = parameters['channel']
#fxVersion = parameters['version']
#processType = parameters['process_type']
annDb = dict()
if not newDatabase:
annDb = loadAnnotations(dbFilename)
signature = signature.strip("'\n \t")
print('signature: [%s]' % signature)
if annotation is None:
annotation = ''
if fixedBy:
if appliesToFxVersion is None or bugId is None or annotation is None:
print("missing parameters for fixed by entry.")
exit()
print("Fixed by version '%s' in bug %d, annotation: '%s'" % (appliesToFxVersion, bugId, annotation))
elif annotation:
print("annotation: '%s'" % annotation)
else:
exit()
annotation = annotation.strip("'\n \t")
record = dict()
if signature in annDb:
record = annDb[signature]
else:
record['annotations'] = list() # [n] = { date: '', annotation: '' }
record['fixedby'] = list() # [n] = { 'version': '87.b0', 'bug': 1234567 }
if fixedBy:
entry = { 'date':datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S'), 'bug': bugId, 'version': appliesToFxVersion, 'annotation':annotation}
record['fixedby'].append(entry)
elif len(annotation) > 0:
annotation = annotation.strip("'\n \t")
entry = { 'date':datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S'), 'annotation':annotation}
record['annotations'].append(entry)
annDb[signature] = record
#pp.pprint(annDb)
saveAnnotations(annDb, dbFilename)