77 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| import re
 | |
| import datetime
 | |
| from xml.etree import ElementTree as ET
 | |
| import argparse
 | |
| 
 | |
| def parse_changelog(changelog_path):
 | |
|     version_re = re.compile(r'([\d.-]+)\s+(\w+)?\s*\((\d{2}.\d{2}\.\d{2})\)')
 | |
|     entry_re = re.compile(r'-\s(.*)')
 | |
| 
 | |
|     with open(changelog_path, "r", encoding="utf-8") as f:
 | |
|         changelog_lines = f.read().splitlines()
 | |
| 
 | |
|     releases = []
 | |
|     for l in changelog_lines:
 | |
|         version_match = version_re.match(l)
 | |
|         entry_match = entry_re.match(l)
 | |
|         if version_match is not None:
 | |
|             version, prerelease, date = version_match.groups()
 | |
|             release = (version,
 | |
|                        prerelease,
 | |
|                        datetime.datetime.strptime(date, '%d.%m.%y').date(),
 | |
|                        [])
 | |
|             releases.append(release)
 | |
|         elif entry_match is not None:
 | |
|             release[3].append(entry_match.group(1))
 | |
| 
 | |
|     return releases
 | |
| 
 | |
| def get_release_xml(version, prerelease, date, changes):
 | |
|     release = ET.Element("release")
 | |
|     if prerelease is None:
 | |
|         ver_str = version
 | |
|     else:
 | |
|         ver_str = f"{version}~{prerelease}"
 | |
|     release.set("version", ver_str)
 | |
|     release.set("date", date.isoformat())
 | |
|     description = ET.SubElement(release, "description")
 | |
|     changelist = ET.SubElement(description, "ul")
 | |
|     for c in changes:
 | |
|         change = ET.SubElement(changelist, "li")
 | |
|         change.text = c
 | |
|     return release
 | |
| 
 | |
| def get_changelog_xml(changelog, max_items=None):
 | |
|     releases = ET.Element("releases")
 | |
|     if max_items is not None:
 | |
|         changelog = changelog[:max_items]
 | |
|     for rel in changelog:
 | |
|         release = get_release_xml(*rel)
 | |
|         releases.append(release)
 | |
|     return releases
 | |
| 
 | |
| def update_appdata(appdata_path, changelog, max_items=None):
 | |
|     appdata = ET.parse(appdata_path)
 | |
|     root = appdata.getroot()
 | |
|     releases = root.find("releases")
 | |
|     if releases is not None:
 | |
|         root.remove(releases)
 | |
|     root.append(
 | |
|         get_changelog_xml(changelog, max_items)
 | |
|     )
 | |
|     appdata.write(appdata_path, encoding="utf-8", xml_declaration=True)
 | |
| 
 | |
| def main():
 | |
|     ap = argparse.ArgumentParser("Parse Telegram changelog")
 | |
|     ap.add_argument("-c", "--changelog-path", default="changelog.txt")
 | |
|     ap.add_argument("-a", "--appdata-path", default="lib/xdg/telegramdesktop.metainfo.xml")
 | |
|     ap.add_argument("-n", "--num-releases", type=int, default=None)
 | |
|     args = ap.parse_args()
 | |
|     update_appdata(args.appdata_path,
 | |
|                    parse_changelog(args.changelog_path),
 | |
|                    max_items=args.num_releases)
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 | 
