Adapted from commit 7bc2931 - we are already changing the click dependency by sed From 7bc29315ab0ace6a6272966c4337e0eae56c57e3 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 11 Jun 2026 14:18:09 +0300 Subject: [PATCH] Add support for the latest Click --- a/platformio/compat.py +++ b/platformio/compat.py @@ -128,84 +128,3 @@ def is_proxy_set(socks=False): continue return True return False - - -def click_launch(url, wait=False, locate=False) -> int: - return _click_open_url(url, wait=wait, locate=locate) - - -def _click_open_url( # pylint: disable=too-many-branches, too-many-return-statements, consider-using-with, import-outside-toplevel, unspecified-encoding - url, wait=False, locate=False -): - """ - Issue https://github.com/pallets/click/issues/2868 - Keep in sync with https://github.com/pallets/click/blob/main/src/click/_termui_impl.py - """ - import subprocess - - def _unquote_file(url) -> str: - from urllib.parse import unquote - - if url.startswith("file://"): - url = unquote(url[7:]) - - return url - - if IS_MACOS: - args = ["open"] - if wait: - args.append("-W") - if locate: - args.append("-R") - args.append(_unquote_file(url)) - null = open("/dev/null", "w") - try: - return subprocess.Popen(args, stderr=null).wait() - finally: - null.close() - elif IS_WINDOWS: - if locate: - url = _unquote_file(url) - args = ["explorer", f"/select,{url}"] - else: - args = ["start"] - if wait: - args.append("/WAIT") - args.append("") - args.append(url) - try: - return subprocess.call(args, shell=True) - except OSError: - # Command not found - return 127 - elif IS_CYGWIN: - if locate: - url = _unquote_file(url) - args = ["cygstart", os.path.dirname(url)] - else: - args = ["cygstart"] - if wait: - args.append("-w") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - - try: - if locate: - url = os.path.dirname(_unquote_file(url)) or "." - else: - url = _unquote_file(url) - c = subprocess.Popen(["xdg-open", url]) - if wait: - return c.wait() - return 0 - except OSError: - if url.startswith(("http://", "https://")) and not locate and not wait: - import webbrowser - - webbrowser.open(url) - return 0 - return 1 --- a/platformio/home/cli.py +++ b/platformio/home/cli.py @@ -17,7 +17,7 @@ import click -from platformio.compat import IS_WINDOWS, click_launch +from platformio.compat import IS_WINDOWS from platformio.home.run import run_server from platformio.package.manager.core import get_core_package_dir @@ -86,7 +86,7 @@ def cli(port, host, no_open, shutdown_timeout, session_id): "PlatformIO Home server is already started in another process.", fg="yellow" ) if not no_open: - click_launch(home_url) + click.launch(home_url) return run_server( --- a/platformio/home/rpc/handlers/os.py +++ b/platformio/home/rpc/handlers/os.py @@ -18,9 +18,11 @@ import shutil from functools import cmp_to_key +import click + from platformio import fs from platformio.cache import ContentCache -from platformio.compat import aio_to_thread, click_launch +from platformio.compat import aio_to_thread from platformio.device.list.util import list_logical_devices from platformio.home.rpc.handlers.base import BaseRPCHandler from platformio.http import HTTPSession, ensure_internet_on @@ -82,15 +84,15 @@ async def request_content(self, uri, data=None, headers=None, cache_valid=None): @staticmethod def open_url(url): - return click_launch(url) + return click.launch(url) @staticmethod def reveal_file(path): - return click_launch(path, locate=True) + return click.launch(path, locate=True) @staticmethod def open_file(path): - return click_launch(path) + return click.launch(path) @staticmethod def call_path_module_func(name, args, **kwargs):