# Copyright 2022 The Pigweed Authors # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. """Transforms a JSON list of paths using -ffile-prefix-map style rules.""" import argparse import json from typing import Iterator, List, TextIO # Note: This should be List[Tuple[str, str]], but using string.split() # produces Tuple[Any,...], so this permits that typing for convenience. PrefixMaps = List[tuple] def _parse_args() -> argparse.Namespace: """Parses and returns the command line arguments.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( 'in_json', type=argparse.FileType('r'), help='The JSON file containing a list of file names ' 'that the prefix map operations should be applied to', ) parser.add_argument( '--prefix-map-json', type=argparse.FileType('r'), required=True, help=( 'JSON file containing an array of prefix map transformations to ' 'apply to the strings before tokenizing. These string literal ' 'transformations are of the form "from=to". All strings with the ' 'prefix `from` will have the prefix replaced with `to`. ' 'Transformations are applied in the order they are listed in the ' 'JSON file.' ), ) parser.add_argument( '--output', type=argparse.FileType('w'), help='File path to write transformed paths to.', ) return parser.parse_args() def remap_paths(paths: List[str], prefix_maps: PrefixMaps) -> Iterator[str]: for path in paths: for from_prefix, to_prefix in prefix_maps: if path.startswith(from_prefix): path = path.replace(from_prefix, to_prefix, 1) yield path def remap_json_paths( in_json: TextIO, output: TextIO, prefix_map_json: TextIO ) -> None: paths = json.load(in_json) prefix_maps: PrefixMaps = [ tuple(m.split('=', maxsplit=1)) for m in json.load(prefix_map_json) ] json.dump(list(remap_paths(paths, prefix_maps)), output) if __name__ == '__main__': remap_json_paths(**vars(_parse_args()))