Source code for inet_nm.cli_update_from_os

import argparse
import os
import subprocess
import sys
from pathlib import Path
from typing import List

import inet_nm.config as cfg
from inet_nm._helpers import get_commit, nm_print, nm_prompt_confirm


def _get_names(cmd: str, cwd: Path) -> List[str]:
    """Call make info-boards and parse the output to a list."""
    res = subprocess.run(cmd.split(), cwd=cwd, capture_output=True)
    if res.returncode != 0:
        raise RuntimeError(f"Failed to run {cmd}")
    return res.stdout.decode().split()


def _get_features_provided(
    cmd: str, cwd: Path, board_env_var: str, board_names: List[str]
):
    boards = {}
    errors = []
    for bn in board_names:
        nm_print(f"Getting features_provided for {bn}")
        env = os.environ.copy()
        env[board_env_var] = bn
        # It seems resolving env vars isn't so easy
        # As a test requires echo of a board var, let's just resolve it...
        board_cmd = cmd.replace(f"${{{board_env_var}}}", bn)
        res = subprocess.run(board_cmd.split(), cwd=cwd, env=env, capture_output=True)

        if res.returncode != 0:
            errors.append(bn)
            nm_print(f"FAILED to run {cmd} for {bn}")
        boards[bn] = res.stdout.decode().split()
    return (boards, errors)


[docs] def main(): """CLI entrypoint for updating the board info from the OS.""" parser = argparse.ArgumentParser(description="Cache a list of boards") cfg.config_arg(parser) parser.add_argument("basedir", type=Path, help="Path to the board path directory") parser.add_argument( "-i", "--board-info", type=str, default="make info-boards", help="Command to get board info, defaults to 'make info-boards'", ) parser.add_argument( "-f", "--board-features", type=str, default="make info-features-provided", help="Command to get board features, defaults to 'make info-features-provided'", ) parser.add_argument( "-n", "--board-env-var", type=str, default="BOARD", help="The env var to indicate the board name for features provided," "defaults to 'BOARD'", ) args = parser.parse_args() try: bi_cfg = cfg.BoardInfoConfig(args.config) bich = cfg.BoardInfoCommitHash(args.config) bi_cfg.check_file(writable=True) bich.check_file(writable=True) bns = _get_names(args.board_info, args.basedir) board_info, errors = _get_features_provided( args.board_features, args.basedir, args.board_env_var, bns ) if errors: nm_print(f"Failed to get {args.board_features} for {errors}") if not nm_prompt_confirm("Write boards anyways", default=False): sys.exit(1) bi_cfg.save(board_info) nm_print(f"\nUpdated {bi_cfg.file_path}") bich.save(get_commit(dir=args.basedir)) except KeyboardInterrupt: nm_print("\nUser aborted") sys.exit(2) sys.exit(0)
if __name__ == "__main__": main()