Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-platformio for 
openSUSE:Factory checked in at 2026-03-17 19:04:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-platformio (Old)
 and      /work/SRC/openSUSE:Factory/.python-platformio.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-platformio"

Tue Mar 17 19:04:26 2026 rev:16 rq:1339431 version:6.1.19

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-platformio/python-platformio.changes      
2025-05-20 09:35:03.973633807 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-platformio.new.8177/python-platformio.changes
    2026-03-17 19:06:03.392548154 +0100
@@ -1,0 +2,30 @@
+Mon Mar 16 20:42:18 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 6.1.19:
+  * Added support for Python 3.14
+  * Upgraded the Doctest testing framework to version 2.4.12, the
+    GoogleTest to version 1.17.0, and the Unity to version 2.6.1,
+    incorporating the latest features and improvements for
+    enhanced testing capabilities
+  * Enhanced compatibility with the CCLS language server,
+    improving integration with editors like Emacs, Sublime Text,
+    and Vim (issue #5186)
+  * Improved error messages for package installation to make it
+    easier to understand when a package is missing or
+    incompatible (pull #5336).
+  * Fixed a regression issue where custom build flags were not
+    properly reflected in the compile_commands.json file,
+    ensuring accurate compilation database generation
+  * Fixed an issue where fully-qualified serial port URLs (e.g.,
+    ``rfc2217://host:port``) were incorrectly treated as wildcard
+    patterns (issue #5225)
+  * Fixed an issue where the toolchain path in static analysis
+    was not handled correctly if it contained spaces (pull #5351)
+  * Fixed installation failure when the executable path contains
+    spaces for ``postinstall`` scripts and handling both list and
+    string command formats (pull #5366)
+  * Fixed cleanup of the ``.pio/libdeps`` folder so that leftover
+    libraries are properly removed when the lib_deps option is
+    empty (issue #5110)
+
+-------------------------------------------------------------------

Old:
----
  platformio-6.1.18.tar.gz

New:
----
  platformio-6.1.19.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-platformio.spec ++++++
--- /var/tmp/diff_new_pack.JOLOJ2/_old  2026-03-17 19:06:03.904569372 +0100
+++ /var/tmp/diff_new_pack.JOLOJ2/_new  2026-03-17 19:06:03.908569538 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-platformio
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-platformio
-Version:        6.1.18
+Version:        6.1.19
 Release:        0
 Summary:        New Generation Ecosystem for Embedded Development
 License:        Apache-2.0

++++++ platformio-6.1.18.tar.gz -> platformio-6.1.19.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/PKG-INFO 
new/platformio-6.1.19/PKG-INFO
--- old/platformio-6.1.18/PKG-INFO      2025-03-11 21:00:28.746680700 +0100
+++ new/platformio-6.1.19/PKG-INFO      2026-02-04 14:40:47.688439000 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 2.2
+Metadata-Version: 2.4
 Name: platformio
-Version: 6.1.18
+Version: 6.1.19
 Summary: Your Gateway to Embedded Software Development Excellence. Unlock the 
true potential of embedded software development with PlatformIO's collaborative 
ecosystem, embracing declarative principles, test-driven methodologies, and 
modern toolchains for unrivaled success.
 Home-page: https://platformio.org
 Author: PlatformIO Labs
@@ -21,7 +21,7 @@
 Requires-Python: >=3.6
 License-File: LICENSE
 Requires-Dist: bottle==0.13.*
-Requires-Dist: click<8.1.8,>=8.0.4
+Requires-Dist: click<8.4,>=8.0.4
 Requires-Dist: colorama
 Requires-Dist: marshmallow==3.*
 Requires-Dist: pyelftools<1,>=0.27
@@ -30,8 +30,8 @@
 Requires-Dist: semantic_version==2.10.*
 Requires-Dist: tabulate==0.*
 Requires-Dist: ajsonrpc==1.2.*
-Requires-Dist: starlette<0.47,>=0.19
-Requires-Dist: uvicorn<0.35,>=0.16
+Requires-Dist: starlette<0.53,>=0.19
+Requires-Dist: uvicorn<0.41,>=0.16
 Requires-Dist: wsproto==1.*
 Requires-Dist: chardet<6,>=3.0.2; platform_system == "Darwin" and "arm" in 
platform_machine
 Dynamic: author
@@ -41,6 +41,7 @@
 Dynamic: home-page
 Dynamic: keywords
 Dynamic: license
+Dynamic: license-file
 Dynamic: requires-dist
 Dynamic: requires-python
 Dynamic: summary
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/__init__.py 
new/platformio-6.1.19/platformio/__init__.py
--- old/platformio-6.1.18/platformio/__init__.py        2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/__init__.py        2026-02-04 
14:26:43.000000000 +0100
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-VERSION = (6, 1, 18)
+VERSION = (6, 1, 19)
 __version__ = ".".join([str(s) for s in VERSION])
 
 __title__ = "platformio"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/assets/system/99-platformio-udev.rules 
new/platformio-6.1.19/platformio/assets/system/99-platformio-udev.rules
--- old/platformio-6.1.18/platformio/assets/system/99-platformio-udev.rules     
2025-03-11 20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/assets/system/99-platformio-udev.rules     
2026-02-04 14:26:43.000000000 +0100
@@ -31,6 +31,9 @@
 # FT231XS USB UART
 ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE:="0666", 
ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
 
+# FX2348N USB UART
+ATTRS{idVendor}=="0843", ATTRS{idProduct}=="5740", MODE:="0666", 
ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
+
 # Prolific Technology, Inc. PL2303 Serial Port
 ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0666", 
ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/builder/tools/piobuild.py 
new/platformio-6.1.19/platformio/builder/tools/piobuild.py
--- old/platformio-6.1.18/platformio/builder/tools/piobuild.py  2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/builder/tools/piobuild.py  2026-02-04 
14:26:43.000000000 +0100
@@ -58,8 +58,8 @@
 
 
 def BuildProgram(env):
-    env.ProcessCompileDbToolchainOption()
     env.ProcessProgramDeps()
+    env.ProcessCompileDbToolchainOption()
     env.ProcessProjectDeps()
 
     # append into the beginning a main LD script
@@ -91,26 +91,6 @@
     return program
 
 
-def ProcessCompileDbToolchainOption(env):
-    if "compiledb" not in COMMAND_LINE_TARGETS:
-        return
-    # Resolve absolute path of toolchain
-    for cmd in ("CC", "CXX", "AS"):
-        if cmd not in env:
-            continue
-        if os.path.isabs(env[cmd]) or '"' in env[cmd]:
-            continue
-        env[cmd] = where_is_program(env.subst("$%s" % cmd), 
env.subst("${ENV['PATH']}"))
-        if " " in env[cmd]:  # issue #4998: Space in compilator path
-            env[cmd] = f'"{env[cmd]}"'
-
-    if env.get("COMPILATIONDB_INCLUDE_TOOLCHAIN"):
-        print("Warning! `COMPILATIONDB_INCLUDE_TOOLCHAIN` is scoping")
-        for scope, includes in env.DumpIntegrationIncludes().items():
-            if scope in ("toolchain",):
-                env.Append(CPPPATH=includes)
-
-
 def ProcessProgramDeps(env):
     def _append_pio_macros():
         core_version = pepver_to_semver(__version__)
@@ -148,6 +128,27 @@
     env.ProcessUnFlags(env.get("BUILD_UNFLAGS"))
 
 
+def ProcessCompileDbToolchainOption(env):
+    if "compiledb" not in COMMAND_LINE_TARGETS:
+        return
+
+    # Resolve absolute path of toolchain
+    for cmd in ("CC", "CXX", "AS"):
+        if cmd not in env:
+            continue
+        if os.path.isabs(env[cmd]) or '"' in env[cmd]:
+            continue
+        env[cmd] = where_is_program(env.subst("$%s" % cmd), 
env.subst("${ENV['PATH']}"))
+        if " " in env[cmd]:  # issue #4998: Space in compilator path
+            env[cmd] = f'"{env[cmd]}"'
+
+    if env.get("COMPILATIONDB_INCLUDE_TOOLCHAIN"):
+        print("Warning! `COMPILATIONDB_INCLUDE_TOOLCHAIN` is scoping")
+        for scope, includes in env.DumpIntegrationIncludes().items():
+            if scope in ("toolchain",):
+                env.Append(CPPPATH=includes)
+
+
 def ProcessProjectDeps(env):
     plb = env.ConfigureProjectLibBuilder()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/builder/tools/piomisc.py 
new/platformio-6.1.19/platformio/builder/tools/piomisc.py
--- old/platformio-6.1.18/platformio/builder/tools/piomisc.py   2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/builder/tools/piomisc.py   2026-02-04 
14:26:43.000000000 +0100
@@ -145,7 +145,7 @@
     env.AddMethod(GetActualLDScript)
     env.AddMethod(ConfigureDebugTarget)
     env.AddMethod(GetExtraScripts)
-    # bakward-compatibility with Zephyr build script
+    # backward-compatibility with Zephyr build script
     env.AddMethod(ConfigureDebugTarget, "ConfigureDebugFlags")
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/cache.py 
new/platformio-6.1.19/platformio/cache.py
--- old/platformio-6.1.18/platformio/cache.py   2025-03-11 20:48:05.000000000 
+0100
+++ new/platformio-6.1.19/platformio/cache.py   2026-02-04 14:26:43.000000000 
+0100
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import codecs
 import hashlib
 import os
 from time import time
@@ -57,7 +56,7 @@
         cache_path = self.get_cache_path(key)
         if not os.path.isfile(cache_path):
             return None
-        with codecs.open(cache_path, "rb", encoding="utf8") as fp:
+        with open(cache_path, "r", encoding="utf8") as fp:
             return fp.read()
 
     def set(self, key, data, valid):
@@ -78,7 +77,7 @@
         if not os.path.isdir(os.path.dirname(cache_path)):
             os.makedirs(os.path.dirname(cache_path))
         try:
-            with codecs.open(cache_path, mode="wb", encoding="utf8") as fp:
+            with open(cache_path, mode="w", encoding="utf8") as fp:
                 fp.write(data)
             with open(self._db_path, mode="a", encoding="utf8") as fp:
                 fp.write("%s=%s\n" % (str(expire_time), 
os.path.basename(cache_path)))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/check/tools/base.py 
new/platformio-6.1.19/platformio/check/tools/base.py
--- old/platformio-6.1.18/platformio/check/tools/base.py        2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/check/tools/base.py        2026-02-04 
14:26:43.000000000 +0100
@@ -90,7 +90,7 @@
         def _extract_defines(language, includes_file):
             build_flags = self.cxx_flags if language == "c++" else 
self.cc_flags
             defines = []
-            cmd = "echo | %s -x %s %s %s -dM -E -" % (
+            cmd = 'echo | "%s" -x %s %s %s -dM -E -' % (
                 self.cc_path,
                 language,
                 " ".join(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/check/tools/pvsstudio.py 
new/platformio-6.1.19/platformio/check/tools/pvsstudio.py
--- old/platformio-6.1.18/platformio/check/tools/pvsstudio.py   2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/check/tools/pvsstudio.py   2026-02-04 
14:26:43.000000000 +0100
@@ -192,7 +192,7 @@
             compiler = self.cc_path
 
         cmd = [
-            compiler,
+            '"%s"' % compiler,
             '"%s"' % src_file,
             "-E",
             "-o",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/cli.py 
new/platformio-6.1.19/platformio/cli.py
--- old/platformio-6.1.18/platformio/cli.py     2025-03-11 20:48:05.000000000 
+0100
+++ new/platformio-6.1.19/platformio/cli.py     2026-02-04 14:26:43.000000000 
+0100
@@ -18,7 +18,7 @@
 import click
 
 
-class PlatformioCLI(click.MultiCommand):
+class PlatformioCLI(click.Group):
     leftover_args = []
 
     def __init__(self, *args, **kwargs):
@@ -84,7 +84,7 @@
             PlatformioCLI.leftover_args = ctx.protected_args + ctx.args
         return super().invoke(ctx)
 
-    def list_commands(self, ctx):
+    def list_commands(self, ctx):  # pylint: disable=unused-argument
         return sorted(list(self._find_pio_commands()))
 
     def get_command(self, ctx, cmd_name):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/compat.py 
new/platformio-6.1.19/platformio/compat.py
--- old/platformio-6.1.18/platformio/compat.py  2025-03-11 20:48:05.000000000 
+0100
+++ new/platformio-6.1.19/platformio/compat.py  2026-02-04 14:26:43.000000000 
+0100
@@ -146,3 +146,84 @@
             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
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/debug/cli.py 
new/platformio-6.1.19/platformio/debug/cli.py
--- old/platformio-6.1.18/platformio/debug/cli.py       2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/debug/cli.py       2026-02-04 
14:26:43.000000000 +0100
@@ -167,7 +167,10 @@
 
 
 def _run(project_dir, debug_config, client_extra_args):
-    loop = asyncio.ProactorEventLoop() if IS_WINDOWS else 
asyncio.get_event_loop()
+    try:
+        loop = asyncio.ProactorEventLoop() if IS_WINDOWS else 
asyncio.get_event_loop()
+    except RuntimeError:
+        loop = asyncio.new_event_loop()
     asyncio.set_event_loop(loop)
 
     client = GDBClientProcess(project_dir, debug_config)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/debug/config/native.py 
new/platformio-6.1.19/platformio/debug/config/native.py
--- old/platformio-6.1.18/platformio/debug/config/native.py     2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/debug/config/native.py     2026-02-04 
14:26:43.000000000 +0100
@@ -28,6 +28,4 @@
 end
 
 $INIT_BREAK
-""" + (
-        "set startup-with-shell off" if not IS_WINDOWS else ""
-    )
+""" + ("set startup-with-shell off" if not IS_WINDOWS else "")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/dependencies.py 
new/platformio-6.1.19/platformio/dependencies.py
--- old/platformio-6.1.18/platformio/dependencies.py    2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/dependencies.py    2026-02-04 
14:26:43.000000000 +0100
@@ -29,7 +29,7 @@
 def get_pip_dependencies():
     core = [
         "bottle == 0.13.*",
-        "click >=8.0.4, <8.1.8",
+        "click >=8.0.4, <8.4",  # click 9.0 removes 'protected_args' attribute
         "colorama",
         "marshmallow == 3.*",
         "pyelftools >=0.27, <1",
@@ -42,8 +42,8 @@
     home = [
         # PIO Home requirements
         "ajsonrpc == 1.2.*",
-        "starlette >=0.19, <0.47",
-        "uvicorn >=0.16, <0.35",
+        "starlette >=0.19, <0.53",
+        "uvicorn >=0.16, <0.41",
         "wsproto == 1.*",
     ]
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/device/finder.py 
new/platformio-6.1.19/platformio/device/finder.py
--- old/platformio-6.1.18/platformio/device/finder.py   2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/device/finder.py   2026-02-04 
14:26:43.000000000 +0100
@@ -133,6 +133,10 @@
 
     def find(self, initial_port=None):
         if initial_port:
+            # Treat any URL (contains '://') as a literal port
+            if "://" in initial_port:
+                return initial_port
+            # Otherwise fall back to existing wildcard logic
             if not is_pattern_port(initial_port):
                 return initial_port
             return self.match_serial_port(initial_port)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/device/monitor/filters/base.py 
new/platformio-6.1.19/platformio/device/monitor/filters/base.py
--- old/platformio-6.1.18/platformio/device/monitor/filters/base.py     
2025-03-11 20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/device/monitor/filters/base.py     
2026-02-04 14:26:43.000000000 +0100
@@ -56,6 +56,9 @@
 
 
 def register_filters(platform=None, options=None):
+    # issue #4556: remove default colorize filter
+    miniterm.TRANSFORMATIONS.pop("colorize", None)
+
     # project filters
     load_monitor_filters(
         ProjectConfig.get_instance().get("platformio", "monitor_dir"),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/home/cli.py 
new/platformio-6.1.19/platformio/home/cli.py
--- old/platformio-6.1.18/platformio/home/cli.py        2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/home/cli.py        2026-02-04 
14:26:43.000000000 +0100
@@ -17,7 +17,7 @@
 
 import click
 
-from platformio.compat import IS_WINDOWS
+from platformio.compat import IS_WINDOWS, click_launch
 from platformio.home.run import run_server
 from platformio.package.manager.core import get_core_package_dir
 
@@ -86,7 +86,7 @@
             "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(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/home/rpc/handlers/os.py 
new/platformio-6.1.19/platformio/home/rpc/handlers/os.py
--- old/platformio-6.1.18/platformio/home/rpc/handlers/os.py    2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/home/rpc/handlers/os.py    2026-02-04 
14:26:43.000000000 +0100
@@ -18,11 +18,9 @@
 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
+from platformio.compat import aio_to_thread, click_launch
 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
@@ -84,15 +82,15 @@
 
     @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):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/package/commands/install.py 
new/platformio-6.1.19/platformio/package/commands/install.py
--- old/platformio-6.1.18/platformio/package/commands/install.py        
2025-03-11 20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/package/commands/install.py        
2026-02-04 14:26:43.000000000 +0100
@@ -204,7 +204,6 @@
 
 
 def _install_project_env_libraries(project_env, options):
-    _uninstall_project_unused_libdeps(project_env, options)
     already_up_to_date = not options.get("force")
     config = ProjectConfig.get_instance()
 
@@ -242,6 +241,8 @@
         )
         lib_deps.extend(test_runner.EXTRA_LIB_DEPS or [])
 
+    _uninstall_project_unused_libdeps(env_lm, lib_deps)
+
     for library in lib_deps:
         spec = PackageSpec(library)
         # skip built-in dependencies
@@ -262,12 +263,13 @@
     return not already_up_to_date
 
 
-def _uninstall_project_unused_libdeps(project_env, options):
-    config = ProjectConfig.get_instance()
-    lib_deps = set(config.get(f"env:{project_env}", "lib_deps"))
+def _uninstall_project_unused_libdeps(lm, lib_deps):
+    lib_deps = set(lib_deps)
+    storage_dir = Path(lm.package_dir)
     if not lib_deps:
+        if storage_dir.exists():
+            fs.rmtree(str(storage_dir))
         return
-    storage_dir = Path(config.get("platformio", "libdeps_dir"), project_env)
     integrity_dat = storage_dir / "integrity.dat"
     if integrity_dat.is_file():
         prev_lib_deps = set(
@@ -275,10 +277,7 @@
         )
         if lib_deps == prev_lib_deps:
             return
-        lm = LibraryPackageManager(str(storage_dir))
-        if options.get("silent"):
-            lm.set_log_level(logging.WARN)
-        else:
+        if lm.log.getEffectiveLevel() < logging.WARN:
             click.secho("Removing unused dependencies...")
         for spec in set(prev_lib_deps) - set(lib_deps):
             try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/package/exception.py 
new/platformio-6.1.19/platformio/package/exception.py
--- old/platformio-6.1.18/platformio/package/exception.py       2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/package/exception.py       2026-02-04 
14:26:43.000000000 +0100
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from platformio import util
 from platformio.exception import UserSideException
 
 
@@ -52,9 +51,13 @@
 
 
 class UnknownPackageError(PackageException):
+    MESSAGE = "Could not find the package with '{0}' requirements"
+
+
+class IncompatiblePackageError(UnknownPackageError):
     MESSAGE = (
-        "Could not find the package with '{0}' requirements for your system 
'%s'"
-        % util.get_systype()
+        "Could not find a version of the package with '{0}' requirements "
+        "compatible with the '{1}' system"
     )
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/package/manager/_registry.py 
new/platformio-6.1.19/platformio/package/manager/_registry.py
--- old/platformio-6.1.18/platformio/package/manager/_registry.py       
2025-03-11 20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/package/manager/_registry.py       
2026-02-04 14:26:43.000000000 +0100
@@ -16,8 +16,9 @@
 
 import click
 
-from platformio.package.exception import UnknownPackageError
-from platformio.package.meta import PackageSpec
+from platformio import util
+from platformio.package.exception import IncompatiblePackageError, 
UnknownPackageError
+from platformio.package.meta import PackageSpec, PackageType
 from platformio.package.version import cast_version_to_semver
 from platformio.registry.client import RegistryClient
 from platformio.registry.mirror import RegistryFileMirrorIterator
@@ -44,6 +45,8 @@
 
         pkgfile = self.pick_compatible_pkg_file(version["files"]) if version 
else None
         if not pkgfile:
+            if self.pkg_type == PackageType.TOOL:
+                raise IncompatiblePackageError(spec.humanize(), 
util.get_systype())
             raise UnknownPackageError(spec.humanize())
 
         for url, checksum in 
RegistryFileMirrorIterator(pkgfile["download_url"]):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/package/manager/base.py 
new/platformio-6.1.19/platformio/package/manager/base.py
--- old/platformio-6.1.18/platformio/package/manager/base.py    2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/package/manager/base.py    2026-02-04 
14:26:43.000000000 +0100
@@ -330,7 +330,9 @@
             return
         shell = False
         if not isinstance(cmd, list):
-            shell = True
+            # issue #5366: workaround when command passed as string without 
spaces
+            if " " in cmd:
+                shell = True
             cmd = [cmd]
         os.environ["PIO_PYTHON_EXE"] = get_pythonexe_path()
         with fs.cd(pkg.path):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/package/manifest/schema.py 
new/platformio-6.1.19/platformio/package/manifest/schema.py
--- old/platformio-6.1.18/platformio/package/manifest/schema.py 2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/package/manifest/schema.py 2026-02-04 
14:26:43.000000000 +0100
@@ -276,7 +276,7 @@
     @staticmethod
     @memoized(expire="1h")
     def load_spdx_licenses():
-        version = "3.26.0"
+        version = "3.27.0"
         spdx_data_url = (
             "https://raw.githubusercontent.com/spdx/license-list-data/";
             f"v{version}/json/licenses.json"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/package/pack.py 
new/platformio-6.1.19/platformio/package/pack.py
--- old/platformio-6.1.18/platformio/package/pack.py    2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/package/pack.py    2026-02-04 
14:26:43.000000000 +0100
@@ -49,6 +49,7 @@
         "__*",
         ".DS_Store",
         ".vscode",
+        "**/.vscode/",
         ".cache",
         "**/.cache",
         "**/__pycache__",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/project/integration/generator.py 
new/platformio-6.1.19/platformio/project/integration/generator.py
--- old/platformio-6.1.18/platformio/project/integration/generator.py   
2025-03-11 20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/project/integration/generator.py   
2026-02-04 14:26:43.000000000 +0100
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import codecs
 import os
 import sys
 
@@ -167,12 +166,12 @@
 
     @staticmethod
     def _render_tpl(tpl_path, tpl_vars):
-        with codecs.open(tpl_path, "r", encoding="utf8") as fp:
+        with open(tpl_path, "r", encoding="utf8") as fp:
             return bottle.template(fp.read(), **tpl_vars)
 
     @staticmethod
     def _merge_contents(dst_path, contents):
         if os.path.basename(dst_path) == ".gitignore" and 
os.path.isfile(dst_path):
             return
-        with codecs.open(dst_path, "w", encoding="utf8") as fp:
+        with open(dst_path, "w", encoding="utf8") as fp:
             fp.write(contents)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/project/integration/tpls/emacs/.ccls.tpl 
new/platformio-6.1.19/platformio/project/integration/tpls/emacs/.ccls.tpl
--- old/platformio-6.1.18/platformio/project/integration/tpls/emacs/.ccls.tpl   
2025-03-11 20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/project/integration/tpls/emacs/.ccls.tpl   
2026-02-04 14:26:43.000000000 +0100
@@ -1,6 +1,6 @@
 % from platformio.compat import shlex_join
 %
-clang
+{{ cc_path }}
 
 {{"%c"}} {{ shlex_join(cc_flags) }}
 {{"%cpp"}} {{ shlex_join(cxx_flags) }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/project/integration/tpls/sublimetext/.ccls.tpl 
new/platformio-6.1.19/platformio/project/integration/tpls/sublimetext/.ccls.tpl
--- 
old/platformio-6.1.18/platformio/project/integration/tpls/sublimetext/.ccls.tpl 
    2025-03-11 20:48:05.000000000 +0100
+++ 
new/platformio-6.1.19/platformio/project/integration/tpls/sublimetext/.ccls.tpl 
    2026-02-04 14:26:43.000000000 +0100
@@ -1,6 +1,6 @@
 % from platformio.compat import shlex_join
 %
-clang
+{{ cc_path }}
 
 {{"%c"}} {{ shlex_join(cc_flags) }}
 {{"%cpp"}} {{ shlex_join(cxx_flags) }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/project/integration/tpls/vim/.ccls.tpl 
new/platformio-6.1.19/platformio/project/integration/tpls/vim/.ccls.tpl
--- old/platformio-6.1.18/platformio/project/integration/tpls/vim/.ccls.tpl     
2025-03-11 20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/project/integration/tpls/vim/.ccls.tpl     
2026-02-04 14:26:43.000000000 +0100
@@ -1,6 +1,6 @@
 % from platformio.compat import shlex_join
 %
-clang
+{{ cc_path }}
 
 {{"%c"}} {{ shlex_join(cc_flags) }}
 {{"%cpp"}} {{ shlex_join(cxx_flags) }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/remote/client/device_list.py 
new/platformio-6.1.19/platformio/remote/client/device_list.py
--- old/platformio-6.1.18/platformio/remote/client/device_list.py       
2025-03-11 20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/remote/client/device_list.py       
2026-02-04 14:26:43.000000000 +0100
@@ -36,7 +36,7 @@
             if not success:
                 click.secho(value, fg="red", err=True)
                 continue
-            (agent_name, devlist) = value
+            agent_name, devlist = value
             data[agent_name] = devlist
 
         if self.json_output:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/remote/client/device_monitor.py 
new/platformio-6.1.19/platformio/remote/client/device_monitor.py
--- old/platformio-6.1.18/platformio/remote/client/device_monitor.py    
2025-03-11 20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/remote/client/device_monitor.py    
2026-02-04 14:26:43.000000000 +0100
@@ -99,7 +99,7 @@
             if not success:
                 click.secho(value, fg="red", err=True)
                 continue
-            (agent_name, ports) = value
+            agent_name, ports = value
             for item in ports:
                 if "VID:PID" in item["hwid"]:
                     hwid_devindexes.append(len(devices))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/remote/projectsync.py 
new/platformio-6.1.19/platformio/remote/projectsync.py
--- old/platformio-6.1.18/platformio/remote/projectsync.py      2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/remote/projectsync.py      2026-02-04 
14:26:43.000000000 +0100
@@ -17,7 +17,11 @@
 from binascii import crc32
 from os.path import getmtime, getsize, isdir, isfile, join
 
-from twisted.python import constants  # pylint: disable=import-error
+try:
+    from twisted.python import constants  # pylint: disable=import-error
+except ImportError:
+    # https://docs.twisted.org/en/twisted-16.5.0/core/howto/constants.html
+    import constantly as constants  # pylint: disable=import-error
 
 from platformio.compat import hashlib_encode_data
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/test/runners/doctest.py 
new/platformio-6.1.19/platformio/test/runners/doctest.py
--- old/platformio-6.1.18/platformio/test/runners/doctest.py    2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/test/runners/doctest.py    2026-02-04 
14:26:43.000000000 +0100
@@ -101,7 +101,7 @@
 
 
 class DoctestTestRunner(TestRunnerBase):
-    EXTRA_LIB_DEPS = ["doctest/doctest@^2.4.11"]
+    EXTRA_LIB_DEPS = ["doctest/doctest@^2.4.12"]
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/platformio-6.1.18/platformio/test/runners/googletest.py 
new/platformio-6.1.19/platformio/test/runners/googletest.py
--- old/platformio-6.1.18/platformio/test/runners/googletest.py 2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/test/runners/googletest.py 2026-02-04 
14:26:43.000000000 +0100
@@ -88,7 +88,7 @@
 
 
 class GoogletestTestRunner(TestRunnerBase):
-    EXTRA_LIB_DEPS = ["google/googletest@^1.15.2"]
+    EXTRA_LIB_DEPS = ["google/googletest@^1.17.0"]
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio/test/runners/unity.py 
new/platformio-6.1.19/platformio/test/runners/unity.py
--- old/platformio-6.1.18/platformio/test/runners/unity.py      2025-03-11 
20:48:05.000000000 +0100
+++ new/platformio-6.1.19/platformio/test/runners/unity.py      2026-02-04 
14:26:43.000000000 +0100
@@ -26,7 +26,7 @@
 
 
 class UnityTestRunner(TestRunnerBase):
-    EXTRA_LIB_DEPS = ["throwtheswitch/Unity@^2.6.0"]
+    EXTRA_LIB_DEPS = ["throwtheswitch/Unity@^2.6.1"]
 
     # Examples:
     # test/test_foo.cpp:44:test_function_foo:FAIL: Expected 32 Was 33
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio.egg-info/PKG-INFO 
new/platformio-6.1.19/platformio.egg-info/PKG-INFO
--- old/platformio-6.1.18/platformio.egg-info/PKG-INFO  2025-03-11 
21:00:28.000000000 +0100
+++ new/platformio-6.1.19/platformio.egg-info/PKG-INFO  2026-02-04 
14:40:47.000000000 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 2.2
+Metadata-Version: 2.4
 Name: platformio
-Version: 6.1.18
+Version: 6.1.19
 Summary: Your Gateway to Embedded Software Development Excellence. Unlock the 
true potential of embedded software development with PlatformIO's collaborative 
ecosystem, embracing declarative principles, test-driven methodologies, and 
modern toolchains for unrivaled success.
 Home-page: https://platformio.org
 Author: PlatformIO Labs
@@ -21,7 +21,7 @@
 Requires-Python: >=3.6
 License-File: LICENSE
 Requires-Dist: bottle==0.13.*
-Requires-Dist: click<8.1.8,>=8.0.4
+Requires-Dist: click<8.4,>=8.0.4
 Requires-Dist: colorama
 Requires-Dist: marshmallow==3.*
 Requires-Dist: pyelftools<1,>=0.27
@@ -30,8 +30,8 @@
 Requires-Dist: semantic_version==2.10.*
 Requires-Dist: tabulate==0.*
 Requires-Dist: ajsonrpc==1.2.*
-Requires-Dist: starlette<0.47,>=0.19
-Requires-Dist: uvicorn<0.35,>=0.16
+Requires-Dist: starlette<0.53,>=0.19
+Requires-Dist: uvicorn<0.41,>=0.16
 Requires-Dist: wsproto==1.*
 Requires-Dist: chardet<6,>=3.0.2; platform_system == "Darwin" and "arm" in 
platform_machine
 Dynamic: author
@@ -41,6 +41,7 @@
 Dynamic: home-page
 Dynamic: keywords
 Dynamic: license
+Dynamic: license-file
 Dynamic: requires-dist
 Dynamic: requires-python
 Dynamic: summary
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/platformio-6.1.18/platformio.egg-info/requires.txt 
new/platformio-6.1.19/platformio.egg-info/requires.txt
--- old/platformio-6.1.18/platformio.egg-info/requires.txt      2025-03-11 
21:00:28.000000000 +0100
+++ new/platformio-6.1.19/platformio.egg-info/requires.txt      2026-02-04 
14:40:47.000000000 +0100
@@ -1,5 +1,5 @@
 bottle==0.13.*
-click<8.1.8,>=8.0.4
+click<8.4,>=8.0.4
 colorama
 marshmallow==3.*
 pyelftools<1,>=0.27
@@ -8,8 +8,8 @@
 semantic_version==2.10.*
 tabulate==0.*
 ajsonrpc==1.2.*
-starlette<0.47,>=0.19
-uvicorn<0.35,>=0.16
+starlette<0.53,>=0.19
+uvicorn<0.41,>=0.16
 wsproto==1.*
 
 [:platform_system == "Darwin" and "arm" in platform_machine]

Reply via email to