|
|
|
|
|
|
|
|
|
|
|
#!/usr/bin/env python3 |
|
|
|
|
|
|
|
|
|
|
|
import sys |
|
|
|
|
|
import os |
|
|
|
|
|
import xml.etree.ElementTree as etree |
|
|
|
|
|
|
|
|
|
|
|
passed = True |
|
|
|
|
|
|
|
|
|
|
|
def check_result(check, message): |
|
|
|
|
|
global passed |
|
|
|
|
|
if check: |
|
|
|
|
|
print('passed') |
|
|
|
|
|
elif message: |
|
|
|
|
|
print('failed: ' + message) |
|
|
|
|
|
passed = False |
|
|
|
|
|
else: |
|
|
|
|
|
print('failed') |
|
|
|
|
|
passed = False |
|
|
|
|
|
|
|
|
|
|
|
def check_missing(items, target): |
|
|
|
|
|
missing = [] |
|
|
|
|
|
for item in items: |
|
|
|
|
|
if not item in target: |
|
|
|
|
|
missing.append(item) |
|
|
|
|
|
check_result(len(missing) == 0, ', '.join(missing)) |
|
|
|
|
|
return missing |
|
|
|
|
|
|
|
|
|
|
|
def all_descendants(proj, name): |
|
|
|
|
|
for e in proj.iter(): |
|
|
|
|
|
if e.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}' + name: |
|
|
|
|
|
yield e |
|
|
|
|
|
|
|
|
|
|
|
def children(e, name): |
|
|
|
|
|
for c in e: |
|
|
|
|
|
if not isinstance(c, str): |
|
|
|
|
|
if c.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}' + name: |
|
|
|
|
|
yield c |
|
|
|
|
|
|
|
|
|
|
|
def element_map(proj, name): |
|
|
|
|
|
print('testing for duplicate \'' + name + '\' names ... ', end='') |
|
|
|
|
|
items = {} |
|
|
|
|
|
duplicates = [] |
|
|
|
|
|
for e in all_descendants(proj, name): |
|
|
|
|
|
id = e.attrib.get("Name") |
|
|
|
|
|
if id in items.keys(): |
|
|
|
|
|
duplicates.append(id) |
|
|
|
|
|
else: |
|
|
|
|
|
items[id] = e |
|
|
|
|
|
check_result(len(duplicates) == 0 , ', '.join(duplicates)) |
|
|
|
|
|
return items |
|
|
|
|
|
|
|
|
|
|
|
def list_dictionaries(): |
|
|
|
|
|
for file in os.listdir('dictsource'): |
|
|
|
|
|
if file.endswith('_rules'): |
|
|
|
|
|
yield file.split('_')[0] |
|
|
|
|
|
|
|
|
|
|
|
# 1. Check for missing/duplicate names ################################################################################# |
|
|
|
|
|
|
|
|
|
|
|
proj = etree.parse('src/windows/data.vcxproj').getroot() |
|
|
|
|
|
targets = element_map(proj, 'Target') |
|
|
|
|
|
|
|
|
|
|
|
# 2. Check for missing dictionaries #################################################################################### |
|
|
|
|
|
|
|
|
|
|
|
dictionaries = list(list_dictionaries()) |
|
|
|
|
|
depends_on_dictionaries = targets['Dictionaries'].attrib.get('DependsOnTargets').split(';') |
|
|
|
|
|
|
|
|
|
|
|
print('testing for missing dictionary targets ... ', end='') |
|
|
|
|
|
check_missing(depends_on_dictionaries, targets.keys()) |
|
|
|
|
|
|
|
|
|
|
|
print('testing for missing dependencies on dictionaries ... ', end='') |
|
|
|
|
|
check_missing(set.intersection(set(dictionaries), set(targets.keys())), depends_on_dictionaries) |
|
|
|
|
|
|
|
|
|
|
|
######################################################################################################################## |
|
|
|
|
|
|
|
|
|
|
|
if not passed: |
|
|
|
|
|
sys.exit(-1) |