| #!/usr/bin/env python | |
| # | |
| # Copyright (C) 2018 The Android Open Source Project | |
| # | |
| # 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 | |
| # | |
| # http://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. | |
| """ | |
| Verify that one set of hidden API flags is a subset of another. | |
| """ | |
| import argparse | |
| import csv | |
| args_parser = argparse.ArgumentParser(description='Verify that one set of hidden API flags is a subset of another.') | |
| args_parser.add_argument('all', help='All the flags') | |
| args_parser.add_argument('subsets', nargs=argparse.REMAINDER, help='Subsets of the flags') | |
| args = args_parser.parse_args() | |
| def dict_reader(input): | |
| return csv.DictReader(input, delimiter=',', quotechar='|', fieldnames=['signature']) | |
| # Read in all the flags into a dict indexed by signature | |
| allFlagsBySignature = {} | |
| with open(args.all, 'r') as allFlagsFile: | |
| allFlagsReader = dict_reader(allFlagsFile) | |
| for row in allFlagsReader: | |
| signature = row['signature'] | |
| allFlagsBySignature[signature]=row | |
| failed = False | |
| for subsetPath in args.subsets: | |
| mismatchingSignatures = [] | |
| with open(subsetPath, 'r') as subsetFlagsFile: | |
| subsetReader = dict_reader(subsetFlagsFile) | |
| for row in subsetReader: | |
| signature = row['signature'] | |
| if signature in allFlagsBySignature: | |
| allFlags = allFlagsBySignature.get(signature) | |
| if allFlags != row: | |
| mismatchingSignatures.append((signature, row[None], allFlags[None])) | |
| else: | |
| mismatchingSignatures.append((signature, row[None], [])) | |
| if mismatchingSignatures: | |
| failed = True | |
| print("ERROR: Hidden API flags are inconsistent:") | |
| print("< " + subsetPath) | |
| print("> " + args.all) | |
| for mismatch in mismatchingSignatures: | |
| print() | |
| print("< " + mismatch[0] + "," + ",".join(mismatch[1])) | |
| if mismatch[2] != None: | |
| print("> " + mismatch[0] + "," + ",".join(mismatch[2])) | |
| else: | |
| print("> " + mismatch[0] + " - missing") | |
| if failed: | |
| sys.exit(1) |