diff --git a/install.ps1 b/install.ps1 index 48f2ca54b..37de60804 100644 --- a/install.ps1 +++ b/install.ps1 @@ -16,7 +16,7 @@ # and Invoke-WebRequest throws on a cut transfer before the hash is read: # the site's build rewrites this line there (scripts/sitebootstrap.py). $mismatchAdvice = "The download was most likely cut short: try again. Within minutes of an update of this project the two files can come from caches of different ages. Waiting five minutes settles that." - $defaultInstallSha256 = "627e9c3bb72daacae022a93f5ca2ba010cd8fb025ef92d69f020734575ee9bad" + $defaultInstallSha256 = "7cbbbe3baefc4a03f5e8a85ee915df4ae23217d21aa61a2dcfccb4cbc846f546" $maximumInstallerBytes = 2MB $installerExit = 0 $installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null } diff --git a/install.py b/install.py index 21dcb64d4..a46e1e478 100644 --- a/install.py +++ b/install.py @@ -9233,6 +9233,7 @@ class GamesData: raw = _read_capped(beside / "index.json", MAX_GAMES_INDEX_BYTES) cached = self.cached("index.json") reason = "offline" + failure = "" if raw is None and network: try: raw = _fetch_json(GAMES_URL.format(path="index.json"), MAX_GAMES_INDEX_BYTES, @@ -9242,8 +9243,7 @@ class GamesData: except (urllib.error.URLError, OSError, ValueError, http.client.HTTPException) as exc: reason = "network" - if os.environ.get("RETROBIOS_DEBUG"): - print(f" Games index: {exc}", file=sys.stderr) + failure = str(exc) else: if cached is not None: _cache_write(cached, raw) @@ -9252,7 +9252,8 @@ class GamesData: if raw is None: raise GamesUnavailable(reason, ( f"the games index is not on this machine and {offline_words()}" - if reason == "offline" else "the games index could not be downloaded")) + if reason == "offline" + else f"the games index could not be downloaded ({failure})")) try: data = json.loads(raw.decode("utf-8")) except (UnicodeDecodeError, json.JSONDecodeError) as exc: diff --git a/install.sh b/install.sh index 7e3eb0e3f..8555cd2c6 100755 --- a/install.sh +++ b/install.sh @@ -23,7 +23,7 @@ DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/ins # curl or wget stop on a cut transfer before the hash is read: the site's # build rewrites this line there (scripts/sitebootstrap.py). MISMATCH_ADVICE="The download was most likely cut short: try again. Within minutes of an update of this project the two files can come from caches of different ages. Waiting five minutes settles that." -DEFAULT_INSTALL_SHA256="627e9c3bb72daacae022a93f5ca2ba010cd8fb025ef92d69f020734575ee9bad" +DEFAULT_INSTALL_SHA256="7cbbbe3baefc4a03f5e8a85ee915df4ae23217d21aa61a2dcfccb4cbc846f546" MAX_INSTALLER_BYTES=2097152 cleanup() { diff --git a/install/launchers/index.json b/install/launchers/index.json index 45856d1f4..4aaafb661 100644 --- a/install/launchers/index.json +++ b/install/launchers/index.json @@ -27,8 +27,8 @@ { "dest": "roms/ports/retrobios/install.py", "repo_path": "install.py", - "size": 1080043, - "sha256": "627e9c3bb72daacae022a93f5ca2ba010cd8fb025ef92d69f020734575ee9bad", + "size": 1080006, + "sha256": "7cbbbe3baefc4a03f5e8a85ee915df4ae23217d21aa61a2dcfccb4cbc846f546", "executable": false }, { @@ -71,8 +71,8 @@ "muos": { "archive": { "dest": "ARCHIVE/RetroBIOS.muxapp", - "size": 1133220, - "sha256": "818f6453e8c441729b395a765f47735d5c3710a03db288ab5609b4485710d2cd" + "size": 1133183, + "sha256": "cc752f0ea8becaba5f3d96c6c77ca9c39b8b870fd9d2019985e1fd78ed912592" }, "members": [ { @@ -92,8 +92,8 @@ { "name": "RetroBIOS/install.py", "repo_path": "install.py", - "size": 1080043, - "sha256": "627e9c3bb72daacae022a93f5ca2ba010cd8fb025ef92d69f020734575ee9bad", + "size": 1080006, + "sha256": "7cbbbe3baefc4a03f5e8a85ee915df4ae23217d21aa61a2dcfccb4cbc846f546", "executable": false }, { @@ -166,8 +166,8 @@ { "dest": ".config/modules/retrobios/install.py", "repo_path": "install.py", - "size": 1080043, - "sha256": "627e9c3bb72daacae022a93f5ca2ba010cd8fb025ef92d69f020734575ee9bad", + "size": 1080006, + "sha256": "7cbbbe3baefc4a03f5e8a85ee915df4ae23217d21aa61a2dcfccb4cbc846f546", "executable": false }, { diff --git a/tests/test_install_games.py b/tests/test_install_games.py index f5c98ce54..117970364 100644 --- a/tests/test_install_games.py +++ b/tests/test_install_games.py @@ -22,6 +22,7 @@ import sys import tempfile import threading import unittest +import urllib.error import zipfile import zlib from pathlib import Path @@ -777,6 +778,18 @@ class Unavailable(GamesTestCase): install.plan_games("retroarch", self.card.bios, manifest(), os_type="linux") self.assertEqual(caught.exception.reason, "offline") + def test_a_failed_download_says_why(self): + """The cause was printed only under RETROBIOS_DEBUG: a proxy's 403 + or a TLS refusal read as a bare "could not be downloaded".""" + shutil.rmtree(self.card.lists / "games") + refusal = urllib.error.HTTPError( + "https://example.invalid/index.json", 403, "Forbidden", {}, None) + with mock.patch.object(install, "_fetch_json", side_effect=refusal), \ + self.assertRaises(install.GamesUnavailable) as caught: + install.GamesData().load_index(network=True, attempts=1) + self.assertEqual(caught.exception.reason, "network") + self.assertIn("403", caught.exception.words) + def test_a_document_that_is_not_the_one_listed_is_refused(self): (self.card.lists / "games" / "setups" / "retroarch.json").write_text("{}") with self.assertRaises(install.GamesUnavailable) as caught: