diff --git a/external_updater.py b/external_updater.py index 6ff4e2593fc741f15d41e2ba3d589436915e5a8b..314c1e63fb11df7d7a5314c241f5702d9b7d6372 100644 --- a/external_updater.py +++ b/external_updater.py @@ -92,7 +92,7 @@ def check_update(proj_path): else: print(color_string(' Up to date.', 'FRESH')) return (updater, new_version) - except IOError as err: + except (IOError, ValueError) as err: print('{} {}.'.format(color_string('Failed.', 'ERROR'), err)) return (None, None) @@ -132,7 +132,7 @@ def checkall(args): dirs.sort(key=lambda d: d.lower()) if fileutils.METADATA_FILENAME in files: # Skip sub directories. - dirs = [] + dirs[:] = [] check_update(root) diff --git a/github_archive_updater.py b/github_archive_updater.py index ea7ffc46909d66dfda407aa7e043fba8bd02c425..bcb4bd58763b9b6eac5f0a1a912a91b5b9defa99 100644 --- a/github_archive_updater.py +++ b/github_archive_updater.py @@ -20,6 +20,7 @@ import urllib.request import archive_utils import fileutils +import git_utils import metadata_pb2 # pylint: disable=import-error import updater_utils @@ -76,7 +77,8 @@ class GithubArchiveUpdater(): self.old_url = url self.owner = None self.repo = None - self.data = None + self.new_version = None + self.new_url = None self._parse_url(url) def _parse_url(self, url): @@ -91,13 +93,38 @@ class GithubArchiveUpdater(): raise ValueError('Url format is not supported.') def _get_latest_version(self): - """Checks upstream and returns the latest version name we found.""" + """Checks upstream and gets the latest release tag.""" url = 'https://api.github.com/repos/{}/{}/releases/latest'.format( self.owner, self.repo) with urllib.request.urlopen(url) as request: - self.data = json.loads(request.read().decode()) - return self.data[self.VERSION_FIELD] + data = json.loads(request.read().decode()) + self.new_version = data[self.VERSION_FIELD] + + supported_assets = [ + a['browser_download_url'] for a in data['assets'] + if archive_utils.is_supported_archive(a['browser_download_url'])] + + # Adds source code urls. + supported_assets.append( + 'https://github.com/{}/{}/archive/{}.tar.gz'.format( + self.owner, self.repo, data.get('tag_name'))) + supported_assets.append( + 'https://github.com/{}/{}/archive/{}.zip'.format( + self.owner, self.repo, data.get('tag_name'))) + + self.new_url = choose_best_url(supported_assets, self.old_url.value) + + def _get_latest_commit(self): + """Checks upstream and gets the latest commit to master.""" + + url = 'https://api.github.com/repos/{}/{}/commits/master'.format( + self.owner, self.repo) + with urllib.request.urlopen(url) as request: + data = json.loads(request.read().decode()) + self.new_version = data['sha'] + self.new_url = 'https://github.com/{}/{}/archive/{}.zip'.format( + self.owner, self.repo, self.new_version) def _get_current_version(self): """Returns the latest version name recorded in METADATA.""" @@ -106,7 +133,7 @@ class GithubArchiveUpdater(): def _write_metadata(self, url, path): updated_metadata = metadata_pb2.MetaData() updated_metadata.CopyFrom(self.metadata) - updated_metadata.third_party.version = self.data[self.VERSION_FIELD] + updated_metadata.third_party.version = self.new_version for metadata_url in updated_metadata.third_party.url: if metadata_url == self.old_url: metadata_url.value = url @@ -117,37 +144,25 @@ class GithubArchiveUpdater(): Returns True if a new version is available. """ - latest = self._get_latest_version() current = self._get_current_version() + if git_utils.is_commit(current): + self._get_latest_commit() + else: + self._get_latest_version() print('Current version: {}. Latest version: {}'.format( - current, latest), end='') - return current != latest + current, self.new_version), end='') + return current != self.new_version def update(self): """Updates the package. Has to call check() before this function. """ - - supported_assets = [ - a['browser_download_url'] for a in self.data['assets'] - if archive_utils.is_supported_archive(a['browser_download_url'])] - - # Adds source code urls. - supported_assets.append( - 'https://github.com/{}/{}/archive/{}.tar.gz'.format( - self.owner, self.repo, self.data.get('tag_name'))) - supported_assets.append( - 'https://github.com/{}/{}/archive/{}.zip'.format( - self.owner, self.repo, self.data.get('tag_name'))) - - latest_url = choose_best_url(supported_assets, self.old_url.value) - temporary_dir = None try: - temporary_dir = archive_utils.download_and_extract(latest_url) + temporary_dir = archive_utils.download_and_extract(self.new_url) package_dir = archive_utils.find_archive_root(temporary_dir) - self._write_metadata(latest_url, package_dir) + self._write_metadata(self.new_url, package_dir) updater_utils.replace_package(package_dir, self.proj_path) finally: # Don't remove the temporary directory, or it'll be impossible diff --git a/updater_utils.py b/updater_utils.py index b72d9cf2522125ef086037af66f98be9d9ae1dd3..9daa2da726e2368a36593b168f9c33ef54ab9b86 100644 --- a/updater_utils.py +++ b/updater_utils.py @@ -94,7 +94,10 @@ def get_latest_version(current_version, version_list): """ prefix, _, suffix = _parse_version(current_version) - latest = max(version_list + [current_version], + latest = max(version_list, key=lambda ver: _match_and_get_version( - prefix, suffix, ver)) + prefix, suffix, ver), + default=[]) + if not latest: + raise ValueError('No matching version.') return latest