OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from collections import defaultdict | 5 from collections import defaultdict |
6 import os | 6 import os |
7 import re | 7 import re |
8 import subprocess | 8 import subprocess |
9 import sys | 9 import sys |
10 import tempfile | 10 import tempfile |
11 | 11 |
12 | 12 |
13 | 13 |
14 class LineNumber(object): | 14 class LineNumber(object): |
15 def __init__(self, file, line_number): | 15 def __init__(self, file, line_number): |
16 self.file = file | 16 self.file = file |
17 self.line_number = int(line_number) | 17 self.line_number = int(line_number) |
18 | 18 |
19 | 19 |
20 class FileCache(object): | 20 class FileCache(object): |
21 _cache = defaultdict(str) | 21 _cache = defaultdict(str) |
22 | 22 |
23 def _read(self, file): | 23 def _read(self, file): |
24 file = os.path.abspath(file) | 24 file = os.path.abspath(file) |
25 self._cache[file] = self._cache[file] or open(file, "r").read() | 25 self._cache[file] = self._cache[file] or open(file, "r").read() |
26 return self._cache[file] | 26 return self._cache[file] |
27 | 27 |
28 @staticmethod | 28 @staticmethod |
29 def read(file): | 29 def read(file): |
30 return FileCache()._read(file) | 30 return FileCache()._read(file) |
31 | 31 |
32 | 32 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 | 121 |
122 self._debug("Deleting temporary files: " + ", ".join(self._temp_files)) | 122 self._debug("Deleting temporary files: " + ", ".join(self._temp_files)) |
123 for f in self._temp_files: | 123 for f in self._temp_files: |
124 os.remove(f) | 124 os.remove(f) |
125 self._temp_files = [] | 125 self._temp_files = [] |
126 | 126 |
127 def _debug(self, msg, error=False): | 127 def _debug(self, msg, error=False): |
128 if self._verbose: | 128 if self._verbose: |
129 print "(INFO) " + msg | 129 print "(INFO) " + msg |
130 | 130 |
131 def _fatal(self, msg): | 131 def _error(self, msg): |
132 print >> sys.stderr, "(FATAL) " + msg | 132 print >> sys.stderr, "(ERROR) " + msg |
133 self._clean_up() | 133 self._clean_up() |
134 sys.exit(1) | |
135 | 134 |
136 def _run_command(self, cmd): | 135 def _run_command(self, cmd): |
137 cmd_str = " ".join(cmd) | 136 cmd_str = " ".join(cmd) |
138 self._debug("Running command: " + cmd_str) | 137 self._debug("Running command: " + cmd_str) |
139 | 138 |
140 devnull = open(os.devnull, "w") | 139 devnull = open(os.devnull, "w") |
141 return subprocess.Popen( | 140 return subprocess.Popen( |
142 cmd_str, stdout=devnull, stderr=subprocess.PIPE, shell=True) | 141 cmd_str, stdout=devnull, stderr=subprocess.PIPE, shell=True) |
143 | 142 |
144 def _check_java_path(self): | 143 def _check_java_path(self): |
145 if self._found_java: | 144 if not self._found_java: |
146 return | 145 proc = self._run_command(["which", "java"]) |
| 146 proc.communicate() |
| 147 if proc.returncode == 0: |
| 148 self._found_java = True |
| 149 else: |
| 150 self._error("Cannot find java (`which java` => %s)" % proc.returncode) |
147 | 151 |
148 proc = self._run_command(["which", "java"]) | 152 return self._found_java |
149 proc.communicate() | |
150 if proc.returncode == 0: | |
151 self._found_java = True | |
152 else: | |
153 self._fatal("Cannot find java (`which java` => %s)" % proc.returncode) | |
154 | 153 |
155 def _run_jar(self, jar, args=[]): | 154 def _run_jar(self, jar, args=[]): |
156 self._check_java_path() | 155 self._check_java_path() |
157 return self._run_command(self._jar_command + [jar] + args) | 156 return self._run_command(self._jar_command + [jar] + args) |
158 | 157 |
159 def _fix_line_number(self, match): | 158 def _fix_line_number(self, match): |
160 real_file = self._flattener.get_file_from_line(match.group(1)) | 159 real_file = self._flattener.get_file_from_line(match.group(1)) |
161 return "%s:%d" % (os.path.abspath(real_file.file), real_file.line_number) | 160 return "%s:%d" % (os.path.abspath(real_file.file), real_file.line_number) |
162 | 161 |
163 def _fix_up_error(self, error): | 162 def _fix_up_error(self, error): |
(...skipping 10 matching lines...) Expand all Loading... |
174 contents = ("\n" + "## ").join("\n\n".join(errors).splitlines()) | 173 contents = ("\n" + "## ").join("\n\n".join(errors).splitlines()) |
175 return "## " + contents if contents else "" | 174 return "## " + contents if contents else "" |
176 | 175 |
177 def _create_temp_file(self, contents): | 176 def _create_temp_file(self, contents): |
178 with tempfile.NamedTemporaryFile(mode='wt', delete=False) as tmp_file: | 177 with tempfile.NamedTemporaryFile(mode='wt', delete=False) as tmp_file: |
179 self._temp_files.append(tmp_file.name) | 178 self._temp_files.append(tmp_file.name) |
180 tmp_file.write(contents) | 179 tmp_file.write(contents) |
181 return tmp_file.name | 180 return tmp_file.name |
182 | 181 |
183 def check(self, file, depends=[], externs=[]): | 182 def check(self, file, depends=[], externs=[]): |
| 183 if not self._check_java_path(): |
| 184 return 1, "" |
| 185 |
184 self._debug("FILE: " + file) | 186 self._debug("FILE: " + file) |
185 | 187 |
186 if file.endswith("_externs.js"): | 188 if file.endswith("_externs.js"): |
187 self._debug("Skipping externs: " + file) | 189 self._debug("Skipping externs: " + file) |
188 return | 190 return |
189 | 191 |
190 self._file_arg = file | 192 self._file_arg = file |
191 | 193 |
192 tmp_dir = tempfile.gettempdir() | 194 tmp_dir = tempfile.gettempdir() |
193 rel_path = lambda f: os.path.join(os.path.relpath(os.getcwd(), tmp_dir), f) | 195 rel_path = lambda f: os.path.join(os.path.relpath(os.getcwd(), tmp_dir), f) |
(...skipping 15 matching lines...) Expand all Loading... |
209 | 211 |
210 runner_args = ["--compiler-args-file=" + args_file] | 212 runner_args = ["--compiler-args-file=" + args_file] |
211 runner_cmd = self._run_jar(self._runner_jar, args=runner_args) | 213 runner_cmd = self._run_jar(self._runner_jar, args=runner_args) |
212 (_, stderr) = runner_cmd.communicate() | 214 (_, stderr) = runner_cmd.communicate() |
213 | 215 |
214 errors = stderr.strip().split("\n\n") | 216 errors = stderr.strip().split("\n\n") |
215 self._debug("Summary: " + errors.pop()) | 217 self._debug("Summary: " + errors.pop()) |
216 | 218 |
217 output = self._format_errors(map(self._fix_up_error, errors)) | 219 output = self._format_errors(map(self._fix_up_error, errors)) |
218 if runner_cmd.returncode: | 220 if runner_cmd.returncode: |
219 self._fatal("Error in: " + file + ("\n" + output if output else "")) | 221 self._error("Error in: " + file + ("\n" + output if output else "")) |
220 elif output: | 222 elif output: |
221 self._debug("Output: " + output) | 223 self._debug("Output: " + output) |
222 | 224 |
223 self._clean_up() | 225 self._clean_up() |
224 | 226 |
225 return runner_cmd.returncode == 0 | 227 return runner_cmd.returncode, output |
OLD | NEW |