Index: third_party/mojo/src/mojo/public/tools/dart_analyze.py |
diff --git a/third_party/mojo/src/mojo/public/tools/dart_analyze.py b/third_party/mojo/src/mojo/public/tools/dart_analyze.py |
index 8b8117e205cd0f6a282ba4102bd0ec0987fc8a91..c200783adcdebb20ce8f6c80518185ab841b9c75 100755 |
--- a/third_party/mojo/src/mojo/public/tools/dart_analyze.py |
+++ b/third_party/mojo/src/mojo/public/tools/dart_analyze.py |
@@ -10,58 +10,71 @@ |
# directory, which we treat as the package root. The second is the stamp file |
# to touch if we succeed. The rest are passed to the analyzer verbatim. |
+import glob |
import os |
+import re |
+import shutil |
import subprocess |
import sys |
-import re |
+import tempfile |
+import zipfile |
_ANALYZING_PATTERN = re.compile(r'^Analyzing \[') |
-_FINAL_REPORT_PATTERN = re.compile(r'^[0-9]+ errors and [0-9]+ warnings found.') |
+_ERRORS_AND_WARNINGS_PATTERN = re.compile( |
+ r'^[0-9]+ errors? and [0-9]+ warnings? found.') |
+_ERRORS_PATTERN = re.compile(r'^([0-9]+|No) (error|warning|issue)s? found.') |
-_NATIVE_ERROR_PATTERN = re.compile( |
- r'^\[error\] Native functions can only be declared in the SDK and code that ' |
- r'is loaded through native extensions') |
-_WARNING_PATTERN = re.compile(r'^\[warning\]') |
-_THAT_ONE_BROKEN_CLOSE_IN_WEB_SOCKETS_PATTERN = re.compile( |
- r'^\[error\] The name \'close\' is already defined') |
def main(args): |
- cmd = [ |
- "../../third_party/dart-sdk/dart-sdk/bin/dartanalyzer", |
- ] |
- |
- gen_dir = args.pop(0) |
+ dartzip_file = args.pop(0) |
stamp_file = args.pop(0) |
- cmd.extend(args) |
- cmd.append("--package-root=%s" % gen_dir) |
- passed = True |
+ dartzip_basename = os.path.basename(dartzip_file) + ":" |
+ |
+ # Unzip |dartzip_file| to a temporary directory. |
try: |
- subprocess.check_output(cmd, shell=False, stderr=subprocess.STDOUT) |
- except subprocess.CalledProcessError as e: |
- # Perform post processing on the output. Filter out non-error messages and |
- # known problem patterns that we're working on. |
- raw_lines = e.output.split('\n') |
- # Remove the last empty line |
- raw_lines.pop() |
- filtered_lines = [i for i in raw_lines if ( |
- not re.match(_ANALYZING_PATTERN, i) and |
- not re.match(_FINAL_REPORT_PATTERN, i) and |
- # TODO(erg): Remove the rest of these as fixes land: |
- not re.match(_WARNING_PATTERN, i) and |
- not re.match(_NATIVE_ERROR_PATTERN, i) and |
- not re.match(_THAT_ONE_BROKEN_CLOSE_IN_WEB_SOCKETS_PATTERN, i))] |
- for line in filtered_lines: |
- passed = False |
- print >> sys.stderr, line |
+ temp_dir = tempfile.mkdtemp() |
+ zipfile.ZipFile(dartzip_file).extractall(temp_dir) |
+ |
+ cmd = [ |
+ "../../third_party/dart-sdk/dart-sdk/bin/dartanalyzer", |
+ ] |
+ |
+ # Grab all the toplevel dart files in the archive. |
+ dart_files = glob.glob(os.path.join(temp_dir, "*.dart")) |
+ |
+ cmd.extend(dart_files) |
+ cmd.extend(args) |
+ cmd.append("--package-root=%s" % temp_dir) |
+ cmd.append("--fatal-warnings") |
+ |
+ passed = True |
+ try: |
+ subprocess.check_output(cmd, shell=False, stderr=subprocess.STDOUT) |
+ except subprocess.CalledProcessError as e: |
+ # Perform post processing on the output. Filter out non-error messages and |
+ # known problem patterns that we're working on. |
+ raw_lines = e.output.split('\n') |
+ # Remove the last empty line |
+ raw_lines.pop() |
+ filtered_lines = [i for i in raw_lines if ( |
+ not re.match(_ANALYZING_PATTERN, i) and |
+ not re.match(_ERRORS_AND_WARNINGS_PATTERN, i) and |
+ not re.match(_ERRORS_PATTERN, i))] |
+ for line in filtered_lines: |
+ passed = False |
+ print >> sys.stderr, line.replace(temp_dir + "/", dartzip_basename) |
+ |
+ if passed: |
+ # We passed cleanly, so touch the stamp file so that we don't run again. |
+ with open(stamp_file, 'a'): |
+ os.utime(stamp_file, None) |
+ return 0 |
+ else: |
+ return -2 |
+ finally: |
+ shutil.rmtree(temp_dir) |
- if passed: |
- # We passed cleanly, so touch the stamp file so that we don't run again. |
- with open(stamp_file, 'a'): |
- os.utime(stamp_file, None) |
- return 0 |
- else: |
- return -2 |
if __name__ == '__main__': |
sys.exit(main(sys.argv[1:])) |