From e06c4638d37743128c9da2f72092abeefbed3f2b Mon Sep 17 00:00:00 2001 From: tecnovert Date: Wed, 29 Apr 2026 12:24:35 +0200 Subject: [PATCH 1/4] fix: workaround for osx ltc release not on github --- basicswap/bin/prepare.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/basicswap/bin/prepare.py b/basicswap/bin/prepare.py index 31721c7..ffd722a 100755 --- a/basicswap/bin/prepare.py +++ b/basicswap/bin/prepare.py @@ -925,9 +925,15 @@ def prepareCore(coin, version_data, settings, data_dir, extra_opts={}): assert_filename, ) elif coin == "litecoin": - release_url = "https://github.com/litecoin-project/litecoin/releases/download/v{}/{}".format( - version + version_tag, release_filename + release_url: str = ( + "https://github.com/litecoin-project/litecoin/releases/download/v{}/{}".format( + version + version_tag, release_filename + ) ) + if os_name == "osx": + release_url: str = ( + f"https://download.litecoin.org/litecoin-{version}{version_tag}/{release_filename}" + ) assert_filename = "{}-core-{}-{}-build.assert".format( coin, os_name, ".".join(version.split(".")[:2]) ) From f626e400ff053d96a6e8bad87d3092d12d9a1a75 Mon Sep 17 00:00:00 2001 From: tecnovert Date: Mon, 4 May 2026 14:54:23 +0200 Subject: [PATCH 2/4] fix: better log format in prepare script --- basicswap/bin/prepare.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/basicswap/bin/prepare.py b/basicswap/bin/prepare.py index ffd722a..7a463d6 100755 --- a/basicswap/bin/prepare.py +++ b/basicswap/bin/prepare.py @@ -185,11 +185,13 @@ else: BIN_ARCH = os.getenv("BIN_ARCH", BIN_ARCH) FILE_EXT = os.getenv("FILE_EXT", FILE_EXT) -logger = logging.getLogger() +logger = logging.getLogger("prepare") LOG_LEVEL = logging.DEBUG +logger.propagate = False logger.level = LOG_LEVEL -if not len(logger.handlers): - logger.addHandler(logging.StreamHandler(sys.stdout)) +handler = logging.StreamHandler(sys.stdout) +handler.setFormatter(logging.Formatter("%(levelname)s : %(message)s")) +logger.addHandler(handler) logging.getLogger("gnupg").setLevel(logging.INFO) BSX_DOCKER_MODE = toBool(os.getenv("BSX_DOCKER_MODE", False)) From bdb7f9bb5af6b974c7611f8190897b7c2fa70425 Mon Sep 17 00:00:00 2001 From: tecnovert Date: Mon, 4 May 2026 14:56:35 +0200 Subject: [PATCH 3/4] feat: add fallback urls to downloadRelease --- basicswap/bin/prepare.py | 78 ++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/basicswap/bin/prepare.py b/basicswap/bin/prepare.py index 7a463d6..c185ed0 100755 --- a/basicswap/bin/prepare.py +++ b/basicswap/bin/prepare.py @@ -29,6 +29,7 @@ import urllib.parse import zipfile import zmq +from typing import List from urllib.request import urlopen import basicswap.config as cfg @@ -460,33 +461,47 @@ def getRemoteFileLength(url: str) -> (int, bool): popConnectionParameters() -def downloadRelease(url: str, path: str, extra_opts, timeout: int = 10) -> None: - """If file exists at path compare it's size to the content length at the url - and attempt to resume download if file size is below expected. - """ - resume_from: int = 0 +def downloadRelease( + url_in: str | List[str], path: str, extra_opts, timeout: int = 10 +) -> None: + # If file exists at path compare it's size to the content length at the url + # and attempt to resume download if file size is below expected. - if os.path.exists(path): - if extra_opts.get("redownload_releases", False): - logging.warning(f"Overwriting: {path}") - elif extra_opts.get("verify_release_file_size", True): - file_size = os.stat(path).st_size - remote_file_length, can_resume = getRemoteFileLength(url) - if file_size < remote_file_length: - logger.warning( - f"{path} is an unexpected size, {file_size} < {remote_file_length}. Attempting to resume download." - ) - if can_resume: - resume_from = file_size + release_filename: str = os.path.basename(path) + urls = ( + url_in + if isinstance(url_in, list) + else [ + url_in, + ] + ) + for url in urls: + try: + resume_from: int = 0 + if os.path.exists(path): + if extra_opts.get("redownload_releases", False): + logging.warning(f"Overwriting: {path}") + elif extra_opts.get("verify_release_file_size", True): + file_size = os.stat(path).st_size + remote_file_length, can_resume = getRemoteFileLength(url) + if file_size < remote_file_length: + logger.warning( + f"{path} is an unexpected size, {file_size} < {remote_file_length}. Attempting to resume download." + ) + if can_resume: + resume_from = file_size + else: + logger.warning("Download can not be resumed, restarting.") + else: + return else: - logger.warning("Download can not be resumed, restarting.") - else: - return - else: - # File exists and size check is disabled - return - - return downloadFile(url, path, timeout, resume_from) + # File exists and size check is disabled + return + return downloadFile(url, path, timeout, resume_from) + except Exception as e: + logger.warning(f"Failed to download {release_filename} from {url}") + logger.debug(f"Download error {e}") + raise RuntimeError(f"Failed to download {release_filename}.") def downloadFile(url: str, path: str, timeout: int = 5, resume_from: int = 0) -> None: @@ -927,15 +942,10 @@ def prepareCore(coin, version_data, settings, data_dir, extra_opts={}): assert_filename, ) elif coin == "litecoin": - release_url: str = ( - "https://github.com/litecoin-project/litecoin/releases/download/v{}/{}".format( - version + version_tag, release_filename - ) - ) - if os_name == "osx": - release_url: str = ( - f"https://download.litecoin.org/litecoin-{version}{version_tag}/{release_filename}" - ) + release_url = [ + f"https://github.com/litecoin-project/litecoin/releases/download/v{version}{version_tag}/{release_filename}", + f"https://download.litecoin.org/litecoin-{version}{version_tag}/{release_filename}", + ] assert_filename = "{}-core-{}-{}-build.assert".format( coin, os_name, ".".join(version.split(".")[:2]) ) From 262593bd2c142689fde7543f59641bfb287e0237 Mon Sep 17 00:00:00 2001 From: tecnovert Date: Wed, 6 May 2026 20:11:21 +0200 Subject: [PATCH 4/4] cores: bump ltc to v0.21.5.5 --- basicswap/bin/prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basicswap/bin/prepare.py b/basicswap/bin/prepare.py index c185ed0..d46b0b4 100755 --- a/basicswap/bin/prepare.py +++ b/basicswap/bin/prepare.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Copyright (c) 2019-2024 tecnovert -# Copyright (c) 2024-2025 The Basicswap developers +# Copyright (c) 2024-2026 The Basicswap developers # Distributed under the MIT software license, see the accompanying # file LICENSE or http://www.opensource.org/licenses/mit-license.php. @@ -59,7 +59,7 @@ PARTICL_LINUX_EXTRA = os.getenv("PARTICL_LINUX_EXTRA", "nousb") BITCOIN_VERSION = os.getenv("BITCOIN_VERSION", "29.3") BITCOIN_VERSION_TAG = os.getenv("BITCOIN_VERSION_TAG", "") -LITECOIN_VERSION = os.getenv("LITECOIN_VERSION", "0.21.5.4") +LITECOIN_VERSION = os.getenv("LITECOIN_VERSION", "0.21.5.5") LITECOIN_VERSION_TAG = os.getenv("LITECOIN_VERSION_TAG", "") DCR_VERSION = os.getenv("DCR_VERSION", "2.1.3") @@ -944,7 +944,7 @@ def prepareCore(coin, version_data, settings, data_dir, extra_opts={}): elif coin == "litecoin": release_url = [ f"https://github.com/litecoin-project/litecoin/releases/download/v{version}{version_tag}/{release_filename}", - f"https://download.litecoin.org/litecoin-{version}{version_tag}/{release_filename}", + f"https://download.litecoin.org/litecoin-{version}{version_tag}/{os_name}/{release_filename}", ] assert_filename = "{}-core-{}-{}-build.assert".format( coin, os_name, ".".join(version.split(".")[:2])