brintos

brintos / linux-shallow public Read only

0
0
Text · 2.5 KiB · 8f727d2 Raw
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