| #!/usr/bin/env python |
| # Copyright 2014 The Chromium 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 re |
| import subprocess |
| import sys |
| |
| SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) |
| SKY_ROOT = os.path.dirname(SKY_TOOLS_DIR) |
| SRC_ROOT = os.path.dirname(SKY_ROOT) |
| |
| WORKBENCH = os.path.join(SRC_ROOT, 'sky', 'packages', 'workbench') |
| DART_SDK = os.path.join(SRC_ROOT, 'third_party', 'dart-sdk', 'dart-sdk', 'bin') |
| DARTANALYZER = os.path.join(DART_SDK, 'dartanalyzer') |
| |
| _IGNORED_PATTERNS = [ |
| # Ignored because they're not indicative of specific errors. |
| re.compile(r'^$'), |
| re.compile(r'^Analyzing \['), |
| re.compile(r'^No issues found'), |
| re.compile(r'^[0-9]+ errors? and [0-9]+ warnings? found.'), |
| re.compile(r'^([0-9]+|No) (error|warning|issue)s? found.'), |
| |
| # Ignore analyzer status output. |
| re.compile(r'^[0-9]+ errors(, [0-9]+ warnings)? and [0-9]+ hints found.'), |
| |
| # Ignored because they don't affect Sky code |
| re.compile(r'\[hint\] When compiled to JS, this test might return true when the left hand side is an int'), |
| |
| # TODO: Fix all the warnings in the mojo packages |
| re.compile(r'.*dart-pub-cache.*\.mojom\.dart'), |
| re.compile(r'.*dart-pub-cache.*/mojo-'), |
| re.compile(r'.*/mojo/public/dart/'), |
| |
| # TODO: Remove this once Sky no longer generates this warning. |
| # dartbug.com/22836 |
| re.compile(r'.*cannot both be unnamed'), |
| ] |
| |
| def main(): |
| parser = argparse.ArgumentParser(description='Sky Analyzer') |
| parser.add_argument('--congratulate', action="store_true") |
| parser.add_argument('app_path', type=str) |
| args = parser.parse_args() |
| |
| try: |
| subprocess.check_output([ |
| DARTANALYZER, "--package-warnings", args.app_path, |
| "--package-root", os.path.join(WORKBENCH, "packages"), |
| "--fatal-warnings" |
| ], stderr=subprocess.STDOUT) |
| except subprocess.CalledProcessError as e: |
| errors = [l for l in e.output.split('\n') |
| if not any(p.match(l) for p in _IGNORED_PATTERNS)] |
| if len(errors) > 0: |
| for error in errors: |
| print >> sys.stderr, error |
| # Propagate analyzer error code. |
| return e.returncode |
| # If we do not have any errors left after filtering, return 0. |
| if args.congratulate: |
| print >> sys.stdout, "No analyzer warnings!" |
| return 0 |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |