changelog2appdata.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/env python3
  2. import re
  3. import datetime
  4. from xml.etree import ElementTree as ET
  5. import argparse
  6. def parse_changelog(changelog_path):
  7. version_re = re.compile(r'([\d.-]+)\s+(\w+)?\s*\((\d{2}.\d{2}\.\d{2})\)')
  8. entry_re = re.compile(r'-\s(.*)')
  9. with open(changelog_path, "r", encoding="utf-8") as f:
  10. changelog_lines = f.read().splitlines()
  11. releases = []
  12. for l in changelog_lines:
  13. version_match = version_re.match(l)
  14. entry_match = entry_re.match(l)
  15. if version_match is not None:
  16. version, prerelease, date = version_match.groups()
  17. release = (version,
  18. prerelease,
  19. datetime.datetime.strptime(date, '%d.%m.%y').date(),
  20. [])
  21. releases.append(release)
  22. elif entry_match is not None:
  23. release[3].append(entry_match.group(1))
  24. return releases
  25. def get_release_xml(version, prerelease, date, changes):
  26. release = ET.Element("release")
  27. if prerelease is None:
  28. ver_str = version
  29. else:
  30. ver_str = f"{version}~{prerelease}"
  31. release.set("version", ver_str)
  32. release.set("date", date.isoformat())
  33. description = ET.SubElement(release, "description")
  34. changelist = ET.SubElement(description, "ul")
  35. for c in changes:
  36. change = ET.SubElement(changelist, "li")
  37. change.text = c
  38. return release
  39. def get_changelog_xml(changelog, max_items=None):
  40. releases = ET.Element("releases")
  41. if max_items is not None:
  42. changelog = changelog[:max_items]
  43. for rel in changelog:
  44. release = get_release_xml(*rel)
  45. releases.append(release)
  46. return releases
  47. def update_appdata(appdata_path, changelog, max_items=None):
  48. appdata = ET.parse(appdata_path)
  49. root = appdata.getroot()
  50. releases = root.find("releases")
  51. if releases is not None:
  52. root.remove(releases)
  53. root.append(
  54. get_changelog_xml(changelog, max_items)
  55. )
  56. appdata.write(appdata_path, encoding="utf-8", xml_declaration=True)
  57. def main():
  58. ap = argparse.ArgumentParser("Parse Telegram changelog")
  59. ap.add_argument("-c", "--changelog-path", default="changelog.txt")
  60. ap.add_argument("-a", "--appdata-path", default="lib/xdg/org.telegram.desktop.metainfo.xml")
  61. ap.add_argument("-n", "--num-releases", type=int, default=None)
  62. args = ap.parse_args()
  63. update_appdata(args.appdata_path,
  64. parse_changelog(args.changelog_path),
  65. max_items=args.num_releases)
  66. if __name__ == "__main__":
  67. main()