github.com/fafucoder/cilium@v1.6.11/contrib/packaging/deb/changelog_parser.py (about)

     1  #!/usr/bin/env python
     2  
     3  import sys
     4  from docutils.core import publish_doctree
     5  from datetime import datetime
     6  
     7  
     8  class ParseSection(object):
     9  
    10      @property
    11      def date(self):
    12          return datetime.strptime(self._meta.get("date"), "%Y-%m-%d")
    13  
    14      @property
    15      def unixtime(self):
    16          return int(self.date.strftime("%s"))
    17  
    18      def __init__(self, section):
    19          self._section = section
    20          self._meta = {}
    21          self._invalid = False
    22  
    23      def parse(self):
    24          if self._section.tagname != "section":
    25              return False
    26  
    27          children = self._section.children
    28  
    29          self._parse_title(children[0])
    30          self._parse_metadata(children[1])
    31          self._parse_changelog(children[2:])
    32          return self
    33  
    34      def _parse_title(self, title):
    35          try:
    36              self._meta["version"] = float(
    37                  title.astext().lower().strip("version"))
    38          except:
    39              self._invalid = True
    40  
    41      def _parse_metadata(self, metadata):
    42          for x in metadata:
    43              self._meta[x.children[0].astext()] = x.children[1].astext()
    44  
    45      def _parse_changelog(self, body):
    46          self._changelog = ""
    47          for section in body:
    48              data = [x for x in section.astext().split("\n") if len(x) > 0]
    49              self._changelog += "\n    ".join(data)
    50  
    51      def export(self):
    52          if self._invalid:
    53              return False
    54          return """cilium ({1}) zesty; urgency=medium
    55    * Changes:
    56      commit: {4}
    57      {0._changelog}
    58  
    59   -- Cilium Team <info@cilium.io>  {3}
    60          """.format(
    61              self,
    62              self._meta.get("version"),
    63              self._meta.get("author"),
    64              self.date.strftime("%a, %d %b %Y %H:%M:%S +0000"),
    65              self._meta.get("commit"))
    66  
    67  
    68  def main():
    69      data = ""
    70      with open(sys.argv[1], 'r') as f:
    71          data = f.readlines()
    72  
    73      doctree = publish_doctree("".join(data))
    74  
    75      result = []
    76      for x in doctree:
    77          p = ParseSection(x)
    78          if p.parse():
    79              result.append(p)
    80  
    81      for section in sorted(result, key=lambda x: x.unixtime, reverse=True):
    82          log = section.export()
    83          if log:
    84              print log
    85  
    86  
    87  if __name__ == "__main__":
    88      main()