74 lines · python
1#!/usr/bin/env python32# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)3"""List model names from mapfile.csv files."""4import argparse5import csv6import os7import re8from typing import List9 10def main() -> None:11 def dir_path(path: str) -> str:12 """Validate path is a directory for argparse."""13 if os.path.isdir(path):14 return path15 raise argparse.ArgumentTypeError(f'\'{path}\' is not a valid directory')16 17 def find_archs(start_dir: str, arch: str) -> List[str]:18 archs = []19 for item in os.scandir(start_dir):20 if not item.is_dir():21 continue22 if arch in (item.name, 'all'):23 archs.append(item.name)24 25 if len(archs) < 1:26 raise IOError(f'Missing architecture directory \'{arch}\'')27 28 return archs29 30 def find_mapfiles(start_dir: str, archs: List[str]) -> List[str]:31 result = []32 for arch in archs:33 for item in os.scandir(f'{start_dir}/{arch}'):34 if item.is_dir():35 continue36 if item.name == 'mapfile.csv':37 result.append(f'{start_dir}/{arch}/mapfile.csv')38 return result39 40 def find_cpuids(mapfiles: List[str], cpuids: str) -> List[str]:41 result = []42 for mapfile in mapfiles:43 with open(mapfile, encoding='utf-8') as csvfile:44 first = False45 table = csv.reader(csvfile)46 for row in table:47 if not first or len(row) == 0 or row[0].startswith('#'):48 first = True49 continue50 # Python regular expressions don't handle xdigit.51 regex = row[0].replace('[[:xdigit:]]', '[0-9a-fA-F]')52 for cpuid in cpuids.split(','):53 if re.match(regex, cpuid):54 result.append(row[2])55 return result56 57 ap = argparse.ArgumentParser()58 ap.add_argument('arch', help='Architecture name like x86')59 ap.add_argument('cpuid', default='all', help='List of cpuids to convert to model names')60 ap.add_argument(61 'starting_dir',62 type=dir_path,63 help='Root of tree containing architecture directories containing json files'64 )65 args = ap.parse_args()66 67 archs = find_archs(args.starting_dir, args.arch)68 mapfiles = find_mapfiles(args.starting_dir, archs)69 models = find_cpuids(mapfiles, args.cpuid)70 print(','.join(models))71 72if __name__ == '__main__':73 main()74