OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 3 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
4 # for details. All rights reserved. Use of this source code is governed by a | 4 # for details. All rights reserved. Use of this source code is governed by a |
5 # BSD-style license that can be found in the LICENSE file. | 5 # BSD-style license that can be found in the LICENSE file. |
6 # | 6 # |
7 | 7 |
8 import optparse | 8 import optparse |
9 import os | 9 import os |
10 import shutil | 10 import shutil |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 def is_empty_chunk(chunk): | 252 def is_empty_chunk(chunk): |
253 empty_chunk = ['Check dependencies', '', ''] | 253 empty_chunk = ['Check dependencies', '', ''] |
254 return not chunk or (len(chunk) == 4 and chunk[1:] == empty_chunk) | 254 return not chunk or (len(chunk) == 4 and chunk[1:] == empty_chunk) |
255 | 255 |
256 def unbuffered(callable): | 256 def unbuffered(callable): |
257 # Use iter to disable buffering in for-in. | 257 # Use iter to disable buffering in for-in. |
258 return iter(callable, '') | 258 return iter(callable, '') |
259 | 259 |
260 section = None | 260 section = None |
261 chunk = [] | 261 chunk = [] |
262 # Is stdout a terminal? | 262 # Is stdout a terminal which supports colors? |
263 isatty = sys.stdout.isatty() | 263 is_fancy_tty = False |
| 264 clr_eol = None |
| 265 if sys.stdout.isatty(): |
| 266 term = os.getenv('TERM', 'dumb') |
| 267 # The capability "clr_eol" means clear the line from cursor to end |
| 268 # of line. See man pages for tput and terminfo. |
| 269 clr_eol = subprocess.check_output(['tput', '-T' + term, 'el']) |
| 270 if clr_eol: |
| 271 is_fancy_tty = True |
264 for line in unbuffered(process.stdout.readline): | 272 for line in unbuffered(process.stdout.readline): |
265 line = line.rstrip() | 273 line = line.rstrip() |
266 if line.startswith('=== BUILD ') or line.startswith('** BUILD '): | 274 if line.startswith('=== BUILD ') or line.startswith('** BUILD '): |
267 if not is_empty_chunk(chunk): | 275 if not is_empty_chunk(chunk): |
268 print '\n'.join(chunk) | 276 print '\n'.join(chunk) |
269 section = line | 277 section = line |
270 if isatty: | 278 if is_fancy_tty: |
271 # If stdout is a terminal, emit "progress" information. | 279 # If stdout is a terminal, emit "progress" information. The |
272 print '%s[2K%s\r' % (chr(27), section), | 280 # progress information is the first line of the current chunk. |
| 281 # After printing the line, move the cursor back to the |
| 282 # beginning of the line. This has two effects: First, if the |
| 283 # chunk isn't empty, the first line will be overwritten |
| 284 # (avoiding duplication). Second, the next segment line will |
| 285 # overwrite it too avoid long scrollback. clr_eol ensures |
| 286 # that there is no trailing garbage when a shorter line |
| 287 # overwrites a longer line. |
| 288 print '%s%s\r' % (clr_eol, section), |
273 chunk = [] | 289 chunk = [] |
274 if not section: | 290 if not section: |
275 print line | 291 print line |
276 else: | 292 else: |
277 chunk.append(line) | 293 chunk.append(line) |
278 if not is_empty_chunk(chunk): | 294 if not is_empty_chunk(chunk): |
279 print '\n'.join(chunk) | 295 print '\n'.join(chunk) |
280 | 296 |
281 | 297 |
282 def Main(): | 298 def Main(): |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 process.wait() | 402 process.wait() |
387 if process.returncode != 0: | 403 if process.returncode != 0: |
388 print "BUILD FAILED" | 404 print "BUILD FAILED" |
389 return 1 | 405 return 1 |
390 | 406 |
391 return 0 | 407 return 0 |
392 | 408 |
393 | 409 |
394 if __name__ == '__main__': | 410 if __name__ == '__main__': |
395 sys.exit(Main()) | 411 sys.exit(Main()) |
OLD | NEW |