76 lines
2.2 KiB
Python
76 lines
2.2 KiB
Python
# Copyright The IETF Trust 2012-2019, All Rights Reserved
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import absolute_import, print_function, unicode_literals
|
|
import re
|
|
import six
|
|
from tzparse import tzparse
|
|
from datetime import datetime as Datetime
|
|
|
|
def parse_date(dstr):
|
|
formats = [
|
|
"%d %b %Y %H:%M:%S %Z", # standard logfile format
|
|
"%d %b %Y %H:%M:%S",
|
|
"%d %b %Y %H:%M %Z",
|
|
"%d %b %Y %H:%M",
|
|
"%d %b %Y %Z",
|
|
"%Y-%m-%d %H:%M:%S %Z",
|
|
"%Y-%m-%d %H:%M:%S",
|
|
"%Y-%m-%d_%H:%M:%S %Z",
|
|
"%Y-%m-%d_%H:%M:%S",
|
|
"%Y-%m-%dT%H:%M:%S%Z",
|
|
"%Y-%m-%dT%H:%M:%S",
|
|
"%Y-%m-%d %H:%M %Z",
|
|
"%Y-%m-%d %H:%M",
|
|
"%Y-%m-%d",
|
|
]
|
|
for format in formats:
|
|
try:
|
|
t = tzparse(dstr, format)
|
|
return t
|
|
except ValueError:
|
|
pass
|
|
raise Exception("Couldn't parse the date string '%s'" % dstr)
|
|
|
|
class ChangeLogEntry:
|
|
package = ""
|
|
version = ""
|
|
logentry = ""
|
|
author = ""
|
|
email = ""
|
|
date = ""
|
|
time = ""
|
|
title = ""
|
|
|
|
def parse(logfile):
|
|
ver_line = r"^(\w+) \((\S+)\) (\S+;)? (?:urgency=(\S+))?$"
|
|
sig_line = r"^ -- ([^<]+) <([^>]+)> (.*?) *$"
|
|
inf_line = r"^ \*\*(.*)\*\* *"
|
|
|
|
entries = []
|
|
if isinstance(logfile, six.string_types):
|
|
logfile = open(logfile)
|
|
entry = None
|
|
for line in logfile:
|
|
if re.match(ver_line, line):
|
|
package, version, distribution, urgency = re.match(ver_line, line).groups()
|
|
entry = ChangeLogEntry()
|
|
entry.package = package
|
|
entry.version = version
|
|
entry.logentry = ""
|
|
elif re.match(sig_line, line):
|
|
author, email, date = re.match(sig_line, line).groups()
|
|
entry.author = author
|
|
entry.email = email
|
|
entry.date = date
|
|
entry.time = parse_date(date)
|
|
entry.logentry = entry.logentry.rstrip()
|
|
entries += [ entry ]
|
|
elif entry and re.match(inf_line, line):
|
|
entry.title = re.match(inf_line, line).group(1)
|
|
elif entry:
|
|
entry.logentry += line
|
|
else:
|
|
print("Unexpected line: '%s'" % line)
|
|
return entries
|