Main entry point for command-line usage.
()
| 294 | |
| 295 | |
| 296 | def main() -> int: |
| 297 | """Main entry point for command-line usage.""" |
| 298 | import argparse |
| 299 | |
| 300 | parser = argparse.ArgumentParser( |
| 301 | description="Pre-download toolchains from platformio.ini" |
| 302 | ) |
| 303 | parser.add_argument( |
| 304 | "platformio_ini", |
| 305 | type=Path, |
| 306 | help="Path to platformio.ini file", |
| 307 | ) |
| 308 | parser.add_argument( |
| 309 | "--cache-dir", |
| 310 | type=Path, |
| 311 | default=None, |
| 312 | help="Cache directory (default: ~/.platformio/global_cache)", |
| 313 | ) |
| 314 | parser.add_argument( |
| 315 | "--max-workers", |
| 316 | type=int, |
| 317 | default=4, |
| 318 | help="Maximum number of concurrent downloads (default: 4)", |
| 319 | ) |
| 320 | parser.add_argument( |
| 321 | "--force-unlock", |
| 322 | action="store_true", |
| 323 | help="Break all locks before starting (recovery from crashes)", |
| 324 | ) |
| 325 | |
| 326 | args = parser.parse_args() |
| 327 | |
| 328 | if not args.platformio_ini.exists(): |
| 329 | logger.error(f"platformio.ini not found: {args.platformio_ini}") |
| 330 | return 1 |
| 331 | |
| 332 | # Get cache directory |
| 333 | cache_dir = ( |
| 334 | args.cache_dir |
| 335 | if args.cache_dir |
| 336 | else Path.home() / ".platformio" / "global_cache" |
| 337 | ) |
| 338 | |
| 339 | # Handle force unlock if requested |
| 340 | if args.force_unlock: |
| 341 | logger.info("🔓 Breaking all locks in cache directory...") |
| 342 | broken = force_unlock_cache(cache_dir) |
| 343 | if broken > 0: |
| 344 | logger.info(f" Broke {broken} lock(s)") |
| 345 | else: |
| 346 | logger.info(" No locks found") |
| 347 | |
| 348 | try: |
| 349 | results = predownload_toolchains( |
| 350 | args.platformio_ini, |
| 351 | cache_dir=cache_dir, |
| 352 | max_workers=args.max_workers, |
| 353 | ) |
no test coverage detected