1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-06-16 23:32:23 +03:00

Re-engineering of EDMC.py version update check

* Uses semantic_version.
* Filters on sparkle:os.
* Catches specific exceptions.
This commit is contained in:
Athanasius 2020-07-17 13:05:30 +01:00
parent af1c313dc3
commit 1ee8756983

46
EDMC.py
View File

@ -16,6 +16,7 @@ from os.path import dirname, getmtime, join
from time import time, sleep from time import time, sleep
from xml.etree import ElementTree from xml.etree import ElementTree
import re import re
import semantic_version
import l10n import l10n
l10n.Translations.install_dummy() l10n.Translations.install_dummy()
@ -62,21 +63,42 @@ try:
args = parser.parse_args() args = parser.parse_args()
if args.version: if args.version:
latest = '' newversion = None
try: try:
# Copied from update.py - probably should refactor update_feed = 'https://ed.miggy.org/misc/semvertest-appcast.xml'
r = requests.get(update_feed, timeout = 10) r = requests.get(update_feed, timeout = 10)
except requests.RequestException as ex:
sys.stderr.write('Error retrieving update_feed file: {}\n'.format(str(ex)))
else:
try:
feed = ElementTree.fromstring(r.text) feed = ElementTree.fromstring(r.text)
items = dict([(item.find('enclosure').attrib.get('{http://www.andymatuschak.org/xml-namespaces/sparkle}version'), except SyntaxError as ex:
item.find('title').text) for item in feed.findall('channel/item')]) sys.stderr.write('Syntax error in update_feed file: {}\n'.format(str(ex)))
lastversion = sorted(items, key=versioncmp)[-1] else:
if versioncmp(lastversion) > versioncmp(appversion): # Want to make items['<version>'] = {'os': '...', 'title': '...' }
latest = items[lastversion] items = dict(
except Exception as e: [
sys.stderr.write('Exception in version check: {}'.format(str(e))) (
#pass # Quietly suppress timeouts etc. item.find('enclosure').attrib.get('{http://www.andymatuschak.org/xml-namespaces/sparkle}version'),
if latest: {'title': item.find('title').text,
print('{CURRENT} ({UPDATE} is available)'.format(CURRENT=appversion, UPDATE=latest)) 'os': item.find('enclosure').attrib.get('{http://www.andymatuschak.org/xml-namespaces/sparkle}os'),
}
) for item in feed.findall('channel/item')
]
)
# Filter on the sparkle:os attribute
os_map = {'darwin': 'macos', 'win32': 'windows', 'linux': 'linux'} # Map sys.platform to sparkle:os
items = { k:v for (k,v) in items.items() if v['os'] == os_map[sys.platform]}
# Look for any remaining version greater than appversion
simple_spec = semantic_version.SimpleSpec('>' + appversion)
newversion = simple_spec.select([semantic_version.Version.coerce(x) for x in items])
if newversion:
print('{CURRENT} ("{UPDATE}" is available)'.format(
CURRENT=appversion,
UPDATE=items[str(newversion)]['title']))
else: else:
print(appversion) print(appversion)
sys.exit(EXIT_SUCCESS) sys.exit(EXIT_SUCCESS)