blob: e5bbf193731a7e6f890957e4b814968b401ca669 [file] [log] [blame]
#!/usr/bin/env python3.8
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import os
import subprocess
import sys
import json
import yaml
def main():
parser = argparse.ArgumentParser('Runs analysis on a given package')
parser.add_argument(
'--source-file', help='Path to the list of sources', required=True)
parser.add_argument(
'--dot-packages', help='Path to the .packages file', required=True)
parser.add_argument(
'--dartanalyzer',
help='Path to the Dart analyzer executable',
required=True)
parser.add_argument(
'--dart-sdk', help='Path to the Dart SDK', required=True)
parser.add_argument(
'--options', help='Path to analysis options', required=True)
parser.add_argument(
'--stamp',
type=argparse.FileType('w'),
help='File to touch when analysis succeeds',
required=True)
parser.add_argument(
'--depname', help='Name of the depfile target', required=True)
parser.add_argument(
'--depfile',
type=argparse.FileType('w'),
help='Path to the depfile to generate',
required=True)
parser.add_argument(
'--all-deps-sources-file',
type=argparse.FileType('r'),
help=
'Path to a file containing sources this target and all of its direct and transitive dependencies',
required=True)
args = parser.parse_args()
with open(args.source_file, 'r') as source_file:
sources = source_file.read().strip().split('\n')
args.depfile.write(
'{}: {}'.format(
args.depname,
' '.join(json.load(args.all_deps_sources_file)),
),
)
options = args.options
while True:
if not os.path.isabs(options):
print('Expected absolute path, got {}'.format(options))
return 1
if not os.path.exists(options):
print('Could not find options file: {}'.format(options))
return 1
args.depfile.write(' {}'.format(options))
with open(options, 'r') as options_file:
content = yaml.safe_load(options_file)
if not 'include' in content:
break
included = content['include']
if not os.path.isabs(included):
included = os.path.join(os.path.dirname(options), included)
options = included
call_args = [
args.dartanalyzer,
'--packages={}'.format(args.dot_packages),
'--dart-sdk={}'.format(args.dart_sdk),
'--options={}'.format(args.options),
'--fatal-warnings',
'--fatal-hints',
'--fatal-lints',
'--enable-experiment',
'non-nullable',
] + sources
# Call Dart anaylzer.
call = subprocess.Popen(
call_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = call.communicate()
# Convert output to strings, assuming UTF-8 output from dart.
stdout = stdout.decode('utf-8')
stderr = stderr.decode('utf-8')
if call.returncode:
print(stdout + stderr)
return 1
args.stamp.write('Success!')
return 0
if __name__ == '__main__':
sys.exit(main())