From 780c62d92536ca2d3eb90386939c42fc34db31ba Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 24 Aug 2022 13:30:19 +0300 Subject: [PATCH] Speeded up device port finder by avoiding loading board HWIDs from development platforms --- HISTORY.rst | 1 + platformio/device/finder.py | 26 ++++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 6cacb13e..19241e89 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -16,6 +16,7 @@ PlatformIO Core 6 6.1.5 (2022-??-??) ~~~~~~~~~~~~~~~~~~ +* Speeded up device port finder by avoiding loading board HWIDs from development platforms * Improved caching of build metadata in debug mode 6.1.4 (2022-08-12) diff --git a/platformio/device/finder.py b/platformio/device/finder.py index bf35c542..61d57d81 100644 --- a/platformio/device/finder.py +++ b/platformio/device/finder.py @@ -14,6 +14,7 @@ import os from fnmatch import fnmatch +from functools import lru_cache import click import serial @@ -119,6 +120,8 @@ class SerialPortFinder: @staticmethod def match_device_hwid(patterns): + if not patterns: + return None for item in list_serial_ports(as_objects=True): if not item.vid or not item.pid: continue @@ -215,20 +218,27 @@ class SerialPortFinder: if os.path.isfile(udev_rules_path): hwids.extend(parse_udev_rules_hwids(udev_rules_path)) - # load from installed dev-platforms - for platform in PlatformPackageManager().get_installed(): - p = PlatformFactory.new(platform) - for board_config in p.get_boards().values(): - for board_hwid in board_config.get("build.hwids", []): - board_hwid = self.normalize_board_hwid(board_hwid) - if board_hwid not in hwids: - hwids.append(board_hwid) + @lru_cache(maxsize=1) + def _fetch_hwids_from_platforms(): + """load from installed dev-platforms""" + result = [] + print(result) + for platform in PlatformPackageManager().get_installed(): + p = PlatformFactory.new(platform) + for board_config in p.get_boards().values(): + for board_hwid in board_config.get("build.hwids", []): + board_hwid = self.normalize_board_hwid(board_hwid) + if board_hwid not in hwids: + result.append(board_hwid) + return result try: @retry(timeout=self.timeout) def wrapper(): device = self.match_device_hwid(hwids) + if not device: + device = self.match_device_hwid(_fetch_hwids_from_platforms()) if device: return device raise retry.RetryNextException()