Extract all toolchain packages from a platformio.ini file. Args: platformio_ini_path: Path to platformio.ini file Returns: List of PackageInfo objects for all toolchains
(
platformio_ini_path: Path,
)
| 49 | |
| 50 | |
| 51 | def extract_toolchains_from_platformio_ini( |
| 52 | platformio_ini_path: Path, |
| 53 | ) -> list[PackageInfo]: |
| 54 | """ |
| 55 | Extract all toolchain packages from a platformio.ini file. |
| 56 | |
| 57 | Args: |
| 58 | platformio_ini_path: Path to platformio.ini file |
| 59 | |
| 60 | Returns: |
| 61 | List of PackageInfo objects for all toolchains |
| 62 | """ |
| 63 | try: |
| 64 | pio_ini = PlatformIOIni.parseFile(platformio_ini_path) |
| 65 | except KeyboardInterrupt as ki: |
| 66 | handle_keyboard_interrupt(ki) |
| 67 | raise |
| 68 | except Exception as e: |
| 69 | logger.error(f"Failed to parse {platformio_ini_path}: {e}") |
| 70 | return [] |
| 71 | |
| 72 | all_packages: list[PackageInfo] = [] |
| 73 | |
| 74 | # Get all platform URLs from the ini file |
| 75 | for section_name, option_name, platform_value in pio_ini.get_platform_urls(): |
| 76 | if not platform_value: |
| 77 | continue |
| 78 | |
| 79 | # Resolve platform to get package information |
| 80 | # Use force_resolve=True to query PlatformIO even for direct URLs |
| 81 | try: |
| 82 | resolution = pio_ini.resolve_platform_url_enhanced( |
| 83 | platform_value, force_resolve=True |
| 84 | ) |
| 85 | if resolution and resolution.packages: |
| 86 | logger.info( |
| 87 | f"Found {len(resolution.packages)} packages for platform {platform_value}" |
| 88 | ) |
| 89 | all_packages.extend(resolution.packages) |
| 90 | except KeyboardInterrupt as ki: |
| 91 | handle_keyboard_interrupt(ki) |
| 92 | raise |
| 93 | except Exception as e: |
| 94 | logger.warning( |
| 95 | f"Failed to resolve platform {platform_value} in {section_name}: {e}" |
| 96 | ) |
| 97 | continue |
| 98 | |
| 99 | return all_packages |
| 100 | |
| 101 | |
| 102 | def download_toolchain( |
no test coverage detected