Skip to content
Snippets Groups Projects
Commit 801795dc authored by Haibo Huang's avatar Haibo Huang Committed by android-build-merger
Browse files

[Updater] Support updating to head of github repo am: 8845e1e9 am: 0f6b93dc

am: f173026e

Change-Id: Ic47be4f88060a468200d81ce404b97ca9f08ad7d
parents 0acbaa37 f173026e
No related branches found
No related tags found
No related merge requests found
...@@ -92,7 +92,7 @@ def check_update(proj_path): ...@@ -92,7 +92,7 @@ def check_update(proj_path):
else: else:
print(color_string(' Up to date.', 'FRESH')) print(color_string(' Up to date.', 'FRESH'))
return (updater, new_version) return (updater, new_version)
except IOError as err: except (IOError, ValueError) as err:
print('{} {}.'.format(color_string('Failed.', 'ERROR'), print('{} {}.'.format(color_string('Failed.', 'ERROR'),
err)) err))
return (None, None) return (None, None)
...@@ -132,7 +132,7 @@ def checkall(args): ...@@ -132,7 +132,7 @@ def checkall(args):
dirs.sort(key=lambda d: d.lower()) dirs.sort(key=lambda d: d.lower())
if fileutils.METADATA_FILENAME in files: if fileutils.METADATA_FILENAME in files:
# Skip sub directories. # Skip sub directories.
dirs = [] dirs[:] = []
check_update(root) check_update(root)
......
...@@ -20,6 +20,7 @@ import urllib.request ...@@ -20,6 +20,7 @@ import urllib.request
import archive_utils import archive_utils
import fileutils import fileutils
import git_utils
import metadata_pb2 # pylint: disable=import-error import metadata_pb2 # pylint: disable=import-error
import updater_utils import updater_utils
...@@ -76,7 +77,8 @@ class GithubArchiveUpdater(): ...@@ -76,7 +77,8 @@ class GithubArchiveUpdater():
self.old_url = url self.old_url = url
self.owner = None self.owner = None
self.repo = None self.repo = None
self.data = None self.new_version = None
self.new_url = None
self._parse_url(url) self._parse_url(url)
def _parse_url(self, url): def _parse_url(self, url):
...@@ -91,13 +93,38 @@ class GithubArchiveUpdater(): ...@@ -91,13 +93,38 @@ class GithubArchiveUpdater():
raise ValueError('Url format is not supported.') raise ValueError('Url format is not supported.')
def _get_latest_version(self): 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( url = 'https://api.github.com/repos/{}/{}/releases/latest'.format(
self.owner, self.repo) self.owner, self.repo)
with urllib.request.urlopen(url) as request: with urllib.request.urlopen(url) as request:
self.data = json.loads(request.read().decode()) data = json.loads(request.read().decode())
return self.data[self.VERSION_FIELD] 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): def _get_current_version(self):
"""Returns the latest version name recorded in METADATA.""" """Returns the latest version name recorded in METADATA."""
...@@ -106,7 +133,7 @@ class GithubArchiveUpdater(): ...@@ -106,7 +133,7 @@ class GithubArchiveUpdater():
def _write_metadata(self, url, path): def _write_metadata(self, url, path):
updated_metadata = metadata_pb2.MetaData() updated_metadata = metadata_pb2.MetaData()
updated_metadata.CopyFrom(self.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: for metadata_url in updated_metadata.third_party.url:
if metadata_url == self.old_url: if metadata_url == self.old_url:
metadata_url.value = url metadata_url.value = url
...@@ -117,37 +144,25 @@ class GithubArchiveUpdater(): ...@@ -117,37 +144,25 @@ class GithubArchiveUpdater():
Returns True if a new version is available. Returns True if a new version is available.
""" """
latest = self._get_latest_version()
current = self._get_current_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( print('Current version: {}. Latest version: {}'.format(
current, latest), end='') current, self.new_version), end='')
return current != latest return current != self.new_version
def update(self): def update(self):
"""Updates the package. """Updates the package.
Has to call check() before this function. 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 temporary_dir = None
try: 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) 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) updater_utils.replace_package(package_dir, self.proj_path)
finally: finally:
# Don't remove the temporary directory, or it'll be impossible # Don't remove the temporary directory, or it'll be impossible
......
...@@ -94,7 +94,10 @@ def get_latest_version(current_version, version_list): ...@@ -94,7 +94,10 @@ def get_latest_version(current_version, version_list):
""" """
prefix, _, suffix = _parse_version(current_version) prefix, _, suffix = _parse_version(current_version)
latest = max(version_list + [current_version], latest = max(version_list,
key=lambda ver: _match_and_get_version( key=lambda ver: _match_and_get_version(
prefix, suffix, ver)) prefix, suffix, ver),
default=[])
if not latest:
raise ValueError('No matching version.')
return latest return latest
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment