86 |
86 |
87 origenviron = os.environ.copy() |
87 origenviron = os.environ.copy() |
88 osenvironb = getattr(os, 'environb', os.environ) |
88 osenvironb = getattr(os, 'environb', os.environ) |
89 processlock = threading.Lock() |
89 processlock = threading.Lock() |
90 |
90 |
|
91 with_color = False |
|
92 try: # is pygments installed |
|
93 import pygments |
|
94 import pygments.lexers as lexers |
|
95 import pygments.formatters as formatters |
|
96 with_color = True |
|
97 except ImportError: |
|
98 pass |
|
99 |
|
100 if not sys.stderr.isatty(): # check if the terminal is capable |
|
101 with_color = False |
|
102 |
91 if sys.version_info > (3, 5, 0): |
103 if sys.version_info > (3, 5, 0): |
92 PYTHON3 = True |
104 PYTHON3 = True |
93 xrange = range # we use xrange in one place, and we'd rather not use range |
105 xrange = range # we use xrange in one place, and we'd rather not use range |
94 def _bytespath(p): |
106 def _bytespath(p): |
95 return p.encode('utf-8') |
107 return p.encode('utf-8') |
253 help="run tests that are changed in parent rev or working directory") |
265 help="run tests that are changed in parent rev or working directory") |
254 parser.add_option("-C", "--annotate", action="store_true", |
266 parser.add_option("-C", "--annotate", action="store_true", |
255 help="output files annotated with coverage") |
267 help="output files annotated with coverage") |
256 parser.add_option("-c", "--cover", action="store_true", |
268 parser.add_option("-c", "--cover", action="store_true", |
257 help="print a test coverage report") |
269 help="print a test coverage report") |
|
270 parser.add_option("--color", choices=["always", "auto", "never"], |
|
271 default="auto", |
|
272 help="colorisation: always|auto|never (default: auto)") |
258 parser.add_option("-d", "--debug", action="store_true", |
273 parser.add_option("-d", "--debug", action="store_true", |
259 help="debug mode: write output of test scripts to console" |
274 help="debug mode: write output of test scripts to console" |
260 " rather than capturing and diffing it (disables timeout)") |
275 " rather than capturing and diffing it (disables timeout)") |
261 parser.add_option("-f", "--first", action="store_true", |
276 parser.add_option("-f", "--first", action="store_true", |
262 help="exit on the first test failure") |
277 help="exit on the first test failure") |
395 if options.chg and options.with_hg: |
410 if options.chg and options.with_hg: |
396 # chg shares installation location with hg |
411 # chg shares installation location with hg |
397 parser.error('--chg does not work when --with-hg is specified ' |
412 parser.error('--chg does not work when --with-hg is specified ' |
398 '(use --with-chg instead)') |
413 '(use --with-chg instead)') |
399 |
414 |
|
415 global with_color |
|
416 if options.color != 'auto': |
|
417 if options.color == 'never': |
|
418 with_color = False |
|
419 else: # 'always', for testing purposes |
|
420 with_color = True |
|
421 |
400 global useipv6 |
422 global useipv6 |
401 if options.ipv6: |
423 if options.ipv6: |
402 useipv6 = checksocketfamily('AF_INET6') |
424 useipv6 = checksocketfamily('AF_INET6') |
403 else: |
425 else: |
404 # only use IPv6 if IPv4 is unavailable and IPv6 is available |
426 # only use IPv6 if IPv4 is unavailable and IPv6 is available |
1623 raise test.failureException( |
1645 raise test.failureException( |
1624 'server failed to start (HGPORT=%s)' % test._startport) |
1646 'server failed to start (HGPORT=%s)' % test._startport) |
1625 else: |
1647 else: |
1626 self.stream.write('\n') |
1648 self.stream.write('\n') |
1627 for line in lines: |
1649 for line in lines: |
|
1650 if with_color: |
|
1651 line = pygments.highlight( |
|
1652 line, |
|
1653 lexers.DiffLexer(), |
|
1654 formatters.Terminal256Formatter()) |
1628 if PYTHON3: |
1655 if PYTHON3: |
1629 self.stream.flush() |
1656 self.stream.flush() |
1630 self.stream.buffer.write(line) |
1657 self.stream.buffer.write(line) |
1631 self.stream.buffer.flush() |
1658 self.stream.buffer.flush() |
1632 else: |
1659 else: |