Skip to content

Commit

Permalink
Check previous releases for available asset if latest asset is not av…
Browse files Browse the repository at this point in the history
…ailable.
  • Loading branch information
mrclary committed Sep 29, 2024
1 parent e2edc67 commit f5b0d71
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 27 deletions.
2 changes: 1 addition & 1 deletion spyder/plugins/updatemanager/widgets/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ def _set_installer_path(self):
asset_info = get_asset_info(self.latest_release)
self.update_type = asset_info['update_type']

dirname = osp.join(get_temp_dir(), 'updates', self.latest_release)
dirname = osp.join(get_temp_dir(), 'updates', str(self.latest_release))
self.installer_path = osp.join(dirname, asset_info['name'])
self.installer_size_path = osp.join(dirname, "size")

Expand Down
71 changes: 45 additions & 26 deletions spyder/plugins/updatemanager/workers.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,25 +170,54 @@ def __init__(self, stable_only):
super().__init__()
self.stable_only = stable_only
self.latest_release = None
self.releases = None
self.update_available = False
self.error = None
self.channel = None

def _check_update_available(self):
def _check_update_available(self, releases, github=True):
"""Checks if there is an update available from releases."""
# Filter releases
releases = self.releases.copy()
if self.stable_only:
# Only use stable releases
releases = [r for r in releases if not r.is_prerelease]
logger.debug(f"Available versions: {self.releases}")
logger.debug(f"Available versions: {releases}")

latest_release = max(releases) if releases else CURR_VER
update_available = CURR_VER < latest_release

logger.debug(f"Latest release: {latest_release}")
logger.debug(f"Update available: {update_available}")

# Check if the asset is available for download.
# If the asset is not available, then check the next latest
# release, and so on until either a new asset is available or there
# is no update available.
if github:
asset_available = False
while update_available and not asset_available:
asset_info = get_asset_info(latest_release)
page = requests.head(asset_info['url'])
if page.status_code == 302:
# The asset is found
logger.debug(f"Asset available for url: {page.url}")
asset_available = True
else:
# The asset is not available
logger.debug(
"Asset not available: "
f"{page.status_code} Client Error: {page.reason}"
f" for url: {page.url}"
)
asset_available = False
releases.remove(latest_release)

latest_release = max(releases) if releases else CURR_VER
update_available = CURR_VER < latest_release

self.latest_release = max(releases) if releases else CURR_VER
self.update_available = CURR_VER < self.latest_release
logger.debug(f"Latest release: {latest_release}")
logger.debug(f"Update available: {update_available}")

logger.debug(f"Update available: {self.update_available}")
logger.debug(f"Latest release: {self.latest_release}")
self.latest_release = latest_release
self.update_available = update_available

def start(self):
"""Main method of the worker."""
Expand All @@ -208,6 +237,7 @@ def start(self):
# behind our latest release.
if self.channel == "pkgs/main":
url = channel_url + '/channeldata.json'
github = "api.github.com" in url

headers = {}
token = os.getenv('GITHUB_TOKEN')
Expand All @@ -221,28 +251,17 @@ def start(self):
page.raise_for_status()

data = page.json()
if url.endswith('releases'):
if github:
# Github url
self.releases = [parse(item['tag_name']) for item in data]
releases = [parse(item['tag_name']) for item in data]
else:
# Conda url
# Conda pkgs/main url
spyder_data = data['packages'].get('spyder')
if spyder_data:
self.releases = [parse(spyder_data["version"])]
self.releases.sort()
releases = [parse(spyder_data["version"])]
releases.sort()

self._check_update_available()

# Check if asset is available for download
if url.endswith('releases') and self.update_available:
asset_info = get_asset_info(self.latest_release)
page = requests.head(asset_info['url'], headers=headers)
_rate_limits(page)
if page.status_code == 404:
# The asset is not available
self.latest_release = CURR_VER
self.update_available = False
logger.debug(f"Asset is not available: {url}")
self._check_update_available(releases, github)

except SSLError as err:
error_msg = SSL_ERROR_MSG
Expand Down

0 comments on commit f5b0d71

Please sign in to comment.