|  | #!/usr/bin/env python3 | 
|  | # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) | 
|  | """List model names from mapfile.csv files.""" | 
|  | import argparse | 
|  | import csv | 
|  | import os | 
|  | import re | 
|  | from typing import List | 
|  |  | 
|  | def main() -> None: | 
|  | def dir_path(path: str) -> str: | 
|  | """Validate path is a directory for argparse.""" | 
|  | if os.path.isdir(path): | 
|  | return path | 
|  | raise argparse.ArgumentTypeError(f'\'{path}\' is not a valid directory') | 
|  |  | 
|  | def find_archs(start_dir: str, arch: str) -> List[str]: | 
|  | archs = [] | 
|  | for item in os.scandir(start_dir): | 
|  | if not item.is_dir(): | 
|  | continue | 
|  | if arch in (item.name, 'all'): | 
|  | archs.append(item.name) | 
|  |  | 
|  | if len(archs) < 1: | 
|  | raise IOError(f'Missing architecture directory \'{arch}\'') | 
|  |  | 
|  | return archs | 
|  |  | 
|  | def find_mapfiles(start_dir: str, archs: List[str]) -> List[str]: | 
|  | result = [] | 
|  | for arch in archs: | 
|  | for item in os.scandir(f'{start_dir}/{arch}'): | 
|  | if item.is_dir(): | 
|  | continue | 
|  | if item.name == 'mapfile.csv': | 
|  | result.append(f'{start_dir}/{arch}/mapfile.csv') | 
|  | return result | 
|  |  | 
|  | def find_cpuids(mapfiles: List[str], cpuids: str) -> List[str]: | 
|  | result = [] | 
|  | for mapfile in mapfiles: | 
|  | with open(mapfile, encoding='utf-8') as csvfile: | 
|  | first = False | 
|  | table = csv.reader(csvfile) | 
|  | for row in table: | 
|  | if not first or len(row) == 0 or row[0].startswith('#'): | 
|  | first = True | 
|  | continue | 
|  | # Python regular expressions don't handle xdigit. | 
|  | regex = row[0].replace('[[:xdigit:]]', '[0-9a-fA-F]') | 
|  | for cpuid in cpuids.split(','): | 
|  | if re.match(regex, cpuid): | 
|  | result.append(row[2]) | 
|  | return result | 
|  |  | 
|  | ap = argparse.ArgumentParser() | 
|  | ap.add_argument('arch', help='Architecture name like x86') | 
|  | ap.add_argument('cpuid', default='all', help='List of cpuids to convert to model names') | 
|  | ap.add_argument( | 
|  | 'starting_dir', | 
|  | type=dir_path, | 
|  | help='Root of tree containing architecture directories containing json files' | 
|  | ) | 
|  | args = ap.parse_args() | 
|  |  | 
|  | archs = find_archs(args.starting_dir, args.arch) | 
|  | mapfiles = find_mapfiles(args.starting_dir, archs) | 
|  | models = find_cpuids(mapfiles, args.cpuid) | 
|  | print(','.join(models)) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |