platform_build_soong/scripts/hiddenapi/verify_overlaps.py

70 lines
2.5 KiB
Python
Executable File

#!/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)