| 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:]))
 | 
| 
 |