tests/run-tests.py
author Mads Kiilerich <mads@kiilerich.com>
Mon, 15 Oct 2012 02:33:12 +0200
changeset 17777 af7c6bc48d8d
parent 17751 4871c1f343fa
child 17778 80fe64581f3a
permissions -rwxr-xr-x
run-tests: alternative way of handling \r on Windows After f71d60da58fb all \r was stripped from output on Windows, and the places where a \r explicitly was expected it was accepted that it was missing. Ugly hack. Instead we now accept that an extra \r might appear at the end of lines on Windows. That is more to the point and less ugly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     1
#!/usr/bin/env python
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     2
#
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     3
# run-tests.py - Run a set of tests on Mercurial
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     4
#
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     5
# Copyright 2006 Matt Mackall <mpm@selenic.com>
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     6
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8161
diff changeset
     7
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10154
diff changeset
     8
# GNU General Public License version 2 or any later version.
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
     9
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    10
# Modifying this script is tricky because it has many modes:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    11
#   - serial (default) vs parallel (-jN, N > 1)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    12
#   - no coverage (default) vs coverage (-c, -C, -s)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    13
#   - temp install (default) vs specific hg script (--with-hg, --local)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    14
#   - tests are a mix of shell scripts and Python scripts
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    15
#
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    16
# If you change this script, it is recommended that you ensure you
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    17
# haven't broken it by running it in various modes with a representative
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    18
# sample of test scripts.  For example:
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8724
diff changeset
    19
#
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    20
#  1) serial, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    21
#      ./run-tests.py test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    22
#  2) serial, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    23
#      ./run-tests.py --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    24
#  3) serial, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    25
#      ./run-tests.py -c test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    26
#  4) serial, coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    27
#      ./run-tests.py -c --local test-s*      # unsupported
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    28
#  5) parallel, no coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    29
#      ./run-tests.py -j2 test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    30
#  6) parallel, no coverage, local hg:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    31
#      ./run-tests.py -j2 --local test-s*
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    32
#  7) parallel, coverage, temp install:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    33
#      ./run-tests.py -j2 -c test-s*          # currently broken
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
    34
#  8) parallel, coverage, local install:
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    35
#      ./run-tests.py -j2 -c --local test-s*  # unsupported (and broken)
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
    36
#  9) parallel, custom tmp dir:
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
    37
#      ./run-tests.py -j2 --tmpdir /tmp/myhgtests
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    38
#
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    39
# (You could use any subset of the tests: test-s* happens to match
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    40
# enough that it's worth doing parallel runs, few enough that it
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    41
# completes fairly quickly, includes both shell and Python scripts, and
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    42
# includes some scripts that run daemon processes.)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
    43
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
    44
from distutils import version
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    45
import difflib
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    46
import errno
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    47
import optparse
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    48
import os
10905
13a1b2fb7ef2 pylint, pyflakes: remove unused or duplicate imports
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10903
diff changeset
    49
import shutil
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    50
import subprocess
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    51
import signal
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    52
import sys
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
    53
import tempfile
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
    54
import time
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
    55
import re
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
    56
import threading
17464
eddfb9a550d0 run-tests: do not duplicate killdaemons() code
Patrick Mezard <patrick@mezard.eu>
parents: 16906
diff changeset
    57
import killdaemons as killmod
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
    58
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
    59
processlock = threading.Lock()
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
    60
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    61
closefds = os.name == 'posix'
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
    62
def Popen4(cmd, wd, timeout):
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
    63
    processlock.acquire()
14340
defa319d8bb7 run-tests: replace chdir() with Popen cwd option
Patrick Mezard <pmezard@gmail.com>
parents: 14339
diff changeset
    64
    p = subprocess.Popen(cmd, shell=True, bufsize=-1, cwd=wd,
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    65
                         close_fds=closefds,
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    66
                         stdin=subprocess.PIPE, stdout=subprocess.PIPE,
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    67
                         stderr=subprocess.STDOUT)
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
    68
    processlock.release()
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
    69
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    70
    p.fromchild = p.stdout
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    71
    p.tochild = p.stdin
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    72
    p.childerr = p.stderr
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
    73
14337
439ed4721a6d run-tests: ignore timeout when Popen.terminate is unavailable
Patrick Mezard <pmezard@gmail.com>
parents: 14336
diff changeset
    74
    p.timeout = False
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
    75
    if timeout:
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
    76
        def t():
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
    77
            start = time.time()
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
    78
            while time.time() - start < timeout and p.returncode is None:
16346
48692b416fbc tests: shorten post-test sleeps
Matt Mackall <mpm@selenic.com>
parents: 15942
diff changeset
    79
                time.sleep(.1)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
    80
            p.timeout = True
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
    81
            if p.returncode is None:
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
    82
                terminate(p)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
    83
        threading.Thread(target=t).start()
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
    84
8280
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    85
    return p
0b02d98d44d0 util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents: 8258
diff changeset
    86
5685
57d29a45ffbc Use skipped: instead of hghave: for skipping tests, use this in test-merge-types
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5524
diff changeset
    87
# reserved exit code to skip test (used by hghave)
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
    88
SKIPPED_STATUS = 80
5685
57d29a45ffbc Use skipped: instead of hghave: for skipping tests, use this in test-merge-types
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5524
diff changeset
    89
SKIPPED_PREFIX = 'skipped: '
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
    90
FAILED_PREFIX  = 'hghave check failed: '
15448
873f94ecd706 run-tests: convert windows paths to unix
Mads Kiilerich <mads@kiilerich.com>
parents: 15447
diff changeset
    91
PYTHON = sys.executable.replace('\\', '/')
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
    92
IMPL_PATH = 'PYTHONPATH'
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
    93
if 'java' in sys.platform:
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
    94
    IMPL_PATH = 'JYTHONPATH'
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
    95
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
    96
requiredtools = ["python", "diff", "grep", "unzip", "gunzip", "bunzip2", "sed"]
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
    97
6366
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
    98
defaults = {
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
    99
    'jobs': ('HGTEST_JOBS', 1),
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
   100
    'timeout': ('HGTEST_TIMEOUT', 180),
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
   101
    'port': ('HGTEST_PORT', 20059),
15941
af289d6cd422 tests: let run-tests.py default to use 'sh' in $PATH instead of '/bin/sh'
Mads Kiilerich <mads@kiilerich.com>
parents: 15940
diff changeset
   102
    'shell': ('HGTEST_SHELL', 'sh'),
6366
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
   103
}
07c3cd695b48 run-tests.py: Allow environment variables to set jobs/timeout/port.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6343
diff changeset
   104
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   105
def parselistfiles(files, listtype, warn=True):
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   106
    entries = dict()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   107
    for filename in files:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   108
        try:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   109
            path = os.path.expanduser(os.path.expandvars(filename))
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   110
            f = open(path, "r")
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   111
        except IOError, err:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   112
            if err.errno != errno.ENOENT:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   113
                raise
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   114
            if warn:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   115
                print "warning: no such %s file: %s" % (listtype, filename)
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   116
            continue
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   117
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   118
        for line in f.readlines():
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   119
            line = line.split('#', 1)[0].strip()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   120
            if line:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   121
                entries[line] = filename
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   122
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   123
        f.close()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   124
    return entries
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   125
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   126
def parseargs():
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   127
    parser = optparse.OptionParser("%prog [options] [tests]")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   128
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   129
    # keep these sorted
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   130
    parser.add_option("--blacklist", action="append",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   131
        help="skip tests listed in the specified blacklist file")
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   132
    parser.add_option("--whitelist", action="append",
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   133
        help="always run tests listed in the specified whitelist file")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   134
    parser.add_option("-C", "--annotate", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   135
        help="output files annotated with coverage")
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   136
    parser.add_option("--child", type="int",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   137
        help="run as child process, summary to given fd")
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   138
    parser.add_option("-c", "--cover", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   139
        help="print a test coverage report")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   140
    parser.add_option("-d", "--debug", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   141
        help="debug mode: write output of test scripts to console"
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   142
             " rather than capturing and diff'ing it (disables timeout)")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   143
    parser.add_option("-f", "--first", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   144
        help="exit on the first test failure")
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
   145
    parser.add_option("-H", "--htmlcov", action="store_true",
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
   146
        help="create an HTML report of the coverage of the files")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   147
    parser.add_option("--inotify", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   148
        help="enable inotify extension when running tests")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   149
    parser.add_option("-i", "--interactive", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   150
        help="prompt to accept changed output")
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   151
    parser.add_option("-j", "--jobs", type="int",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   152
        help="number of jobs to run in parallel"
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   153
             " (default: $%s or %d)" % defaults['jobs'])
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   154
    parser.add_option("--keep-tmpdir", action="store_true",
9706
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
   155
        help="keep temporary directory after running tests")
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   156
    parser.add_option("-k", "--keywords",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   157
        help="run tests matching keywords")
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   158
    parser.add_option("-l", "--local", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   159
        help="shortcut for --with-hg=<testdir>/../hg")
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   160
    parser.add_option("-n", "--nodiff", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   161
        help="skip showing test changes")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   162
    parser.add_option("-p", "--port", type="int",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   163
        help="port on which servers should listen"
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   164
             " (default: $%s or %d)" % defaults['port'])
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   165
    parser.add_option("--pure", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   166
        help="use pure Python code instead of C extensions")
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   167
    parser.add_option("-R", "--restart", action="store_true",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   168
        help="restart at last error")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   169
    parser.add_option("-r", "--retest", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   170
        help="retest failed tests")
9580
25858f9e65e8 run-tests: add --noskips option
Matt Mackall <mpm@selenic.com>
parents: 9408
diff changeset
   171
    parser.add_option("-S", "--noskips", action="store_true",
25858f9e65e8 run-tests: add --noskips option
Matt Mackall <mpm@selenic.com>
parents: 9408
diff changeset
   172
        help="don't report skip tests verbosely")
14202
b68a41420397 run-tests: add --shell command line flag
Martin Geisler <mg@lazybytes.net>
parents: 14201
diff changeset
   173
    parser.add_option("--shell", type="string",
b68a41420397 run-tests: add --shell command line flag
Martin Geisler <mg@lazybytes.net>
parents: 14201
diff changeset
   174
        help="shell to use (default: $%s or %s)" % defaults['shell'])
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   175
    parser.add_option("-t", "--timeout", type="int",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   176
        help="kill errant tests after TIMEOUT seconds"
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   177
             " (default: $%s or %d)" % defaults['timeout'])
11039
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   178
    parser.add_option("--tmpdir", type="string",
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   179
        help="run tests in the given temporary directory"
cf0a309f6c4d run-tests: sort options
Matt Mackall <mpm@selenic.com>
parents: 11038
diff changeset
   180
             " (implies --keep-tmpdir)")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   181
    parser.add_option("-v", "--verbose", action="store_true",
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   182
        help="output verbose messages")
11040
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   183
    parser.add_option("--view", type="string",
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   184
        help="external diff viewer")
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   185
    parser.add_option("--with-hg", type="string",
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   186
        metavar="HG",
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   187
        help="test using specified hg script rather than a "
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   188
             "temporary installation")
9028
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   189
    parser.add_option("-3", "--py3k-warnings", action="store_true",
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   190
        help="enable Py3k warnings on Python 2.6+")
14134
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
   191
    parser.add_option('--extra-config-opt', action="append",
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
   192
                      help='set the given config opt in the test hgrc')
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   193
14201
57e04ded3da4 run-tests: use type of default to convert environment variable
Martin Geisler <mg@lazybytes.net>
parents: 14192
diff changeset
   194
    for option, (envvar, default) in defaults.items():
57e04ded3da4 run-tests: use type of default to convert environment variable
Martin Geisler <mg@lazybytes.net>
parents: 14192
diff changeset
   195
        defaults[option] = type(default)(os.environ.get(envvar, default))
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   196
    parser.set_defaults(**defaults)
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   197
    (options, args) = parser.parse_args()
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   198
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
   199
    # jython is always pure
10766
afbcea270bb8 run-tests: force to test pure on pypy as well
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10765
diff changeset
   200
    if 'java' in sys.platform or '__pypy__' in sys.modules:
10765
fd31a3237498 Fix run-tests.py -jX after 2ed667a9dfcb
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10758
diff changeset
   201
        options.pure = True
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
   202
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   203
    if options.with_hg:
15942
d7a34c07e69b run-tests: expand user in --with-hg
Mads Kiilerich <mads@kiilerich.com>
parents: 15941
diff changeset
   204
        options.with_hg = os.path.expanduser(options.with_hg)
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   205
        if not (os.path.isfile(options.with_hg) and
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   206
                os.access(options.with_hg, os.X_OK)):
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   207
            parser.error('--with-hg must specify an executable hg script')
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   208
        if not os.path.basename(options.with_hg) == 'hg':
14359
ad5c68a0db6a run-tests: print a newline after all warnings
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14340
diff changeset
   209
            sys.stderr.write('warning: --with-hg should specify an hg script\n')
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   210
    if options.local:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   211
        testdir = os.path.dirname(os.path.realpath(sys.argv[0]))
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   212
        hgbin = os.path.join(os.path.dirname(testdir), 'hg')
16538
dd194e5df4c1 tests: don't require 'hg' without extension on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 16346
diff changeset
   213
        if os.name != 'nt' and not os.access(hgbin, os.X_OK):
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   214
            parser.error('--local specified, but %r not found or not executable'
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   215
                         % hgbin)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   216
        options.with_hg = hgbin
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   217
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
   218
    options.anycoverage = options.cover or options.annotate or options.htmlcov
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   219
    if options.anycoverage:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   220
        try:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   221
            import coverage
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   222
            covver = version.StrictVersion(coverage.__version__).version
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   223
            if covver < (3, 3):
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   224
                parser.error('coverage options require coverage 3.3 or later')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   225
        except ImportError:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   226
            parser.error('coverage options now require the coverage package')
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   227
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   228
    if options.anycoverage and options.local:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   229
        # this needs some path mangling somewhere, I guess
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   230
        parser.error("sorry, coverage options do not work when --local "
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   231
                     "is specified")
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   232
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
   233
    global vlog
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   234
    if options.verbose:
8671
a434c94b48e7 run-tests: show PID if running in parallel mode with -v.
Greg Ward <greg-hg@gerg.ca>
parents: 8651
diff changeset
   235
        if options.jobs > 1 or options.child is not None:
a434c94b48e7 run-tests: show PID if running in parallel mode with -v.
Greg Ward <greg-hg@gerg.ca>
parents: 8651
diff changeset
   236
            pid = "[%d]" % os.getpid()
a434c94b48e7 run-tests: show PID if running in parallel mode with -v.
Greg Ward <greg-hg@gerg.ca>
parents: 8651
diff changeset
   237
        else:
a434c94b48e7 run-tests: show PID if running in parallel mode with -v.
Greg Ward <greg-hg@gerg.ca>
parents: 8651
diff changeset
   238
            pid = None
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   239
        def vlog(*msg):
14018
7ba2c728cf32 run-tests: add iolock to vlog
Matt Mackall <mpm@selenic.com>
parents: 14006
diff changeset
   240
            iolock.acquire()
8671
a434c94b48e7 run-tests: show PID if running in parallel mode with -v.
Greg Ward <greg-hg@gerg.ca>
parents: 8651
diff changeset
   241
            if pid:
a434c94b48e7 run-tests: show PID if running in parallel mode with -v.
Greg Ward <greg-hg@gerg.ca>
parents: 8651
diff changeset
   242
                print pid,
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   243
            for m in msg:
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   244
                print m,
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   245
            print
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   246
            sys.stdout.flush()
14018
7ba2c728cf32 run-tests: add iolock to vlog
Matt Mackall <mpm@selenic.com>
parents: 14006
diff changeset
   247
            iolock.release()
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   248
    else:
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   249
        vlog = lambda *msg: None
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   250
9394
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
   251
    if options.tmpdir:
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
   252
        options.tmpdir = os.path.expanduser(options.tmpdir)
31203db1b2ac run-tests: expand --tmpdir and create it if needed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9031
diff changeset
   253
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   254
    if options.jobs < 1:
9408
70bf7f853adc run-tests: standardize on --foo instead of -f/--foo
Martin Geisler <mg@lazybytes.net>
parents: 9407
diff changeset
   255
        parser.error('--jobs must be positive')
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   256
    if options.interactive and options.jobs > 1:
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   257
        print '(--interactive overrides --jobs)'
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   258
        options.jobs = 1
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   259
    if options.interactive and options.debug:
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   260
        parser.error("-i/--interactive and -d/--debug are incompatible")
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   261
    if options.debug:
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   262
        if options.timeout != defaults['timeout']:
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   263
            sys.stderr.write(
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   264
                'warning: --timeout option ignored with --debug\n')
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   265
        options.timeout = 0
9028
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   266
    if options.py3k_warnings:
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   267
        if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0):
9408
70bf7f853adc run-tests: standardize on --foo instead of -f/--foo
Martin Geisler <mg@lazybytes.net>
parents: 9407
diff changeset
   268
            parser.error('--py3k-warnings can only be used on Python 2.6+')
9959
b37b060d84c7 run-tests: add a "--blacklist target" option to skip predefined test lists
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9958
diff changeset
   269
    if options.blacklist:
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   270
        options.blacklist = parselistfiles(options.blacklist, 'blacklist')
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   271
    if options.whitelist:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   272
        options.whitelisted = parselistfiles(options.whitelist, 'whitelist',
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   273
                                             warn=options.child is None)
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   274
    else:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   275
        options.whitelisted = {}
8091
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   276
e85cc856d2e1 run-tests: factor out parse_args(). Clarify use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8060
diff changeset
   277
    return (options, args)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
   278
5800
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   279
def rename(src, dst):
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   280
    """Like os.rename(), trade atomicity and opened files friendliness
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   281
    for existing destination support.
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   282
    """
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   283
    shutil.copy(src, dst)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   284
    os.remove(src)
2f597243e1d7 Make run-tests.py --interactive work on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 5524
diff changeset
   285
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   286
def parsehghaveoutput(lines):
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   287
    '''Parse hghave log lines.
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   288
    Return tuple of lists (missing, failed):
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   289
      * the missing/unknown features
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   290
      * the features for which existence check failed'''
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   291
    missing = []
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   292
    failed = []
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   293
    for line in lines:
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   294
        if line.startswith(SKIPPED_PREFIX):
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   295
            line = line.splitlines()[0]
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   296
            missing.append(line[len(SKIPPED_PREFIX):])
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   297
        elif line.startswith(FAILED_PREFIX):
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   298
            line = line.splitlines()[0]
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   299
            failed.append(line[len(FAILED_PREFIX):])
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   300
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   301
    return missing, failed
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   302
10088
ec8304e66ea5 run-tests.py: Show paths to failing tests, .err and .out
Mads Kiilerich <mads@kiilerich.com>
parents: 10030
diff changeset
   303
def showdiff(expected, output, ref, err):
14062
643381286e0c run-tests: print a new line before writing the diff
Idan Kamara <idankk86@gmail.com>
parents: 14037
diff changeset
   304
    print
10088
ec8304e66ea5 run-tests.py: Show paths to failing tests, .err and .out
Mads Kiilerich <mads@kiilerich.com>
parents: 10030
diff changeset
   305
    for line in difflib.unified_diff(expected, output, ref, err):
2247
546c76e5a3e6 run-tests.py: fix handling of newlines.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2246
diff changeset
   306
        sys.stdout.write(line)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   307
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   308
def findprogram(program):
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   309
    """Search PATH for a executable program"""
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   310
    for p in os.environ.get('PATH', os.defpath).split(os.pathsep):
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   311
        name = os.path.join(p, program)
14335
220f31030e7f run-tests: fix python executable detection and copy on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 14282
diff changeset
   312
        if os.name == 'nt' or os.access(name, os.X_OK):
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   313
            return name
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   314
    return None
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   315
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   316
def checktools():
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   317
    # Before we go any further, check for pre-requisite tools
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   318
    # stuff from coreutils (cat, rm, etc) are not tested
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   319
    for p in requiredtools:
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   320
        if os.name == 'nt':
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   321
            p += '.exe'
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   322
        found = findprogram(p)
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   323
        if found:
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   324
            vlog("# Found prerequisite", p, "at", found)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   325
        else:
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   326
            print "WARNING: Did not find prerequisite tool: "+p
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   327
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
   328
def terminate(proc):
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
   329
    """Terminate subprocess (with fallback for Python versions < 2.6)"""
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
   330
    vlog('# Terminating process %d' % proc.pid)
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
   331
    try:
14971
0b21ae0a2366 tests: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14867
diff changeset
   332
        getattr(proc, 'terminate', lambda : os.kill(proc.pid, signal.SIGTERM))()
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
   333
    except OSError:
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
   334
        pass
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
   335
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
   336
def killdaemons():
17464
eddfb9a550d0 run-tests: do not duplicate killdaemons() code
Patrick Mezard <patrick@mezard.eu>
parents: 16906
diff changeset
   337
    return killmod.killdaemons(DAEMON_PIDS, tryhard=False, remove=True,
eddfb9a550d0 run-tests: do not duplicate killdaemons() code
Patrick Mezard <patrick@mezard.eu>
parents: 16906
diff changeset
   338
                               logfn=vlog)
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
   339
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   340
def cleanup(options):
6208
c88b9e597588 tests: add --keep-tmp to run-tests.py to debug test environment
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6004
diff changeset
   341
    if not options.keep_tmpdir:
8671
a434c94b48e7 run-tests: show PID if running in parallel mode with -v.
Greg Ward <greg-hg@gerg.ca>
parents: 8651
diff changeset
   342
        vlog("# Cleaning up HGTMP", HGTMP)
6208
c88b9e597588 tests: add --keep-tmp to run-tests.py to debug test environment
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6004
diff changeset
   343
        shutil.rmtree(HGTMP, True)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   344
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   345
def usecorrectpython():
2570
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   346
    # some tests run python interpreter. they must use same
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   347
    # interpreter we use or bad things will happen.
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   348
    exedir, exename = os.path.split(sys.executable)
14335
220f31030e7f run-tests: fix python executable detection and copy on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 14282
diff changeset
   349
    if exename in ('python', 'python.exe'):
220f31030e7f run-tests: fix python executable detection and copy on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 14282
diff changeset
   350
        path = findprogram(exename)
2570
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   351
        if os.path.dirname(path) == exedir:
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   352
            return
14335
220f31030e7f run-tests: fix python executable detection and copy on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 14282
diff changeset
   353
    else:
220f31030e7f run-tests: fix python executable detection and copy on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 14282
diff changeset
   354
        exename = 'python'
2570
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   355
    vlog('# Making python executable in test path use correct Python')
14335
220f31030e7f run-tests: fix python executable detection and copy on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 14282
diff changeset
   356
    mypython = os.path.join(BINDIR, exename)
2570
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   357
    try:
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   358
        os.symlink(sys.executable, mypython)
2570
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   359
    except AttributeError:
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   360
        # windows fallback
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   361
        shutil.copyfile(sys.executable, mypython)
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   362
        shutil.copymode(sys.executable, mypython)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2989
diff changeset
   363
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   364
def installhg(options):
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   365
    vlog("# Performing temporary installation of HG")
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   366
    installerrs = os.path.join("tests", "install.err")
7723
a343cd25e425 run-tests: add --pure flag for using pure Python modules
Martin Geisler <mg@daimi.au.dk>
parents: 7529
diff changeset
   367
    pure = options.pure and "--pure" or ""
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   368
5267
b817d17c7ee5 Make run-tests.py work when invoked outside of tests.
Brendan Cully <brendan@kublai.com>
parents: 5251
diff changeset
   369
    # Run installer in hg root
8943
09ff905cdc86 run-tests: use os.path.realpath() to find hg's setup.py.
Greg Ward <greg-hg@gerg.ca>
parents: 8843
diff changeset
   370
    script = os.path.realpath(sys.argv[0])
09ff905cdc86 run-tests: use os.path.realpath() to find hg's setup.py.
Greg Ward <greg-hg@gerg.ca>
parents: 8843
diff changeset
   371
    hgroot = os.path.dirname(os.path.dirname(script))
09ff905cdc86 run-tests: use os.path.realpath() to find hg's setup.py.
Greg Ward <greg-hg@gerg.ca>
parents: 8843
diff changeset
   372
    os.chdir(hgroot)
9905
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
   373
    nohome = '--home=""'
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
   374
    if os.name == 'nt':
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
   375
        # The --home="" trick works only on OS where os.sep == '/'
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
   376
        # because of a distutils convert_path() fast-path. Avoid it at
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
   377
        # least on Windows for now, deal with .pydistutils.cfg bugs
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
   378
        # when they happen.
95517eb3c9a7 run-tests: work around a distutils bug triggered by 0a8a43b4ca75
Patrick Mezard <pmezard@gmail.com>
parents: 9902
diff changeset
   379
        nohome = ''
7723
a343cd25e425 run-tests: add --pure flag for using pure Python modules
Martin Geisler <mg@daimi.au.dk>
parents: 7529
diff changeset
   380
    cmd = ('%s setup.py %s clean --all'
12502
41f2fa72fa82 run-tests: move build/ directory to HGTMP
Martin Geisler <mg@lazybytes.net>
parents: 12377
diff changeset
   381
           ' build --build-base="%s"'
7139
bcbba59e233d run-tests.py: use --prefix instead of --home
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7018
diff changeset
   382
           ' install --force --prefix="%s" --install-lib="%s"'
10030
cbc93d8ed46a run-tests: backout d7c23f4a14c7
Martin Geisler <mg@lazybytes.net>
parents: 10020
diff changeset
   383
           ' --install-scripts="%s" %s >%s 2>&1'
12502
41f2fa72fa82 run-tests: move build/ directory to HGTMP
Martin Geisler <mg@lazybytes.net>
parents: 12377
diff changeset
   384
           % (sys.executable, pure, os.path.join(HGTMP, "build"),
41f2fa72fa82 run-tests: move build/ directory to HGTMP
Martin Geisler <mg@lazybytes.net>
parents: 12377
diff changeset
   385
              INST, PYTHONDIR, BINDIR, nohome, installerrs))
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   386
    vlog("# Running", cmd)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   387
    if os.system(cmd) == 0:
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   388
        if not options.verbose:
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   389
            os.remove(installerrs)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   390
    else:
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   391
        f = open(installerrs)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   392
        for line in f:
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   393
            print line,
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   394
        f.close()
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   395
        sys.exit(1)
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
   396
    os.chdir(TESTDIR)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   397
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   398
    usecorrectpython()
2570
2264b2b077a1 run-tests.py: make tests use same python interpreter as test harness.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2409
diff changeset
   399
7172
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   400
    vlog("# Installing dummy diffstat")
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   401
    f = open(os.path.join(BINDIR, 'diffstat'), 'w')
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   402
    f.write('#!' + sys.executable + '\n'
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   403
            'import sys\n'
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   404
            'files = 0\n'
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   405
            'for line in sys.stdin:\n'
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   406
            '    if line.startswith("diff "):\n'
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   407
            '        files += 1\n'
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   408
            'sys.stdout.write("files patched: %d\\n" % files)\n')
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   409
    f.close()
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   410
    os.chmod(os.path.join(BINDIR, 'diffstat'), 0700)
fb1d7a42663c Use dummy diffstat in tests and remove older diffstat workaround.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7144
diff changeset
   411
9028
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   412
    if options.py3k_warnings and not options.anycoverage:
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   413
        vlog("# Updating hg command to enable Py3k Warnings switch")
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   414
        f = open(os.path.join(BINDIR, 'hg'), 'r')
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   415
        lines = [line.rstrip() for line in f]
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   416
        lines[0] += ' -3'
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   417
        f.close()
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   418
        f = open(os.path.join(BINDIR, 'hg'), 'w')
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   419
        for line in lines:
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   420
            f.write(line + '\n')
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   421
        f.close()
bea567ae3ff6 tests: add -3 switch to run-tests.py
Alejandro Santos <alejolp@alejolp.com>
parents: 8943
diff changeset
   422
14336
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   423
    hgbat = os.path.join(BINDIR, 'hg.bat')
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   424
    if os.path.isfile(hgbat):
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   425
        # hg.bat expects to be put in bin/scripts while run-tests.py
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   426
        # installation layout put it in bin/ directly. Fix it
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   427
        f = open(hgbat, 'rb')
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   428
        data = f.read()
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   429
        f.close()
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   430
        if '"%~dp0..\python" "%~dp0hg" %*' in data:
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   431
            data = data.replace('"%~dp0..\python" "%~dp0hg" %*',
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   432
                                '"%~dp0python" "%~dp0hg" %*')
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   433
            f = open(hgbat, 'wb')
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   434
            f.write(data)
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   435
            f.close()
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   436
        else:
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   437
            print 'WARNING: cannot fix hg.bat reference to python.exe'
0cbf0d1f7939 run-tests: fix hg.bat python reference
Patrick Mezard <pmezard@gmail.com>
parents: 14335
diff changeset
   438
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   439
    if options.anycoverage:
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   440
        custom = os.path.join(TESTDIR, 'sitecustomize.py')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   441
        target = os.path.join(PYTHONDIR, 'sitecustomize.py')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   442
        vlog('# Installing coverage trigger to %s' % target)
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   443
        shutil.copyfile(custom, target)
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   444
        rc = os.path.join(TESTDIR, '.coveragerc')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   445
        vlog('# Installing coverage rc to %s' % rc)
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   446
        os.environ['COVERAGE_PROCESS_START'] = rc
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   447
        fn = os.path.join(INST, '..', '.coverage')
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   448
        os.environ['COVERAGE_FILE'] = fn
8092
c49578c5122f run-tests: move _hgpath() up so it's not in the middle of the main program.
Greg Ward <greg-hg@gerg.ca>
parents: 8091
diff changeset
   449
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   450
def outputcoverage(options):
8620
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   451
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   452
    vlog('# Producing coverage report')
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   453
    os.chdir(PYTHONDIR)
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   454
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   455
    def covrun(*args):
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   456
        cmd = 'coverage %s' % ' '.join(args)
8620
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   457
        vlog('# Running: %s' % cmd)
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   458
        os.system(cmd)
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   459
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   460
    if options.child:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   461
        return
8620
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   462
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
   463
    covrun('-c')
15858
14132a55d66b run-tests: use a list comprehension instead of map
Matt Mackall <mpm@selenic.com>
parents: 15857
diff changeset
   464
    omit = ','.join(os.path.join(x, '*') for x in [BINDIR, TESTDIR])
8620
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   465
    covrun('-i', '-r', '"--omit=%s"' % omit) # report
15859
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
   466
    if options.htmlcov:
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
   467
        htmldir = os.path.join(TESTDIR, 'htmlcov')
44a371823f83 tests: add htmlcov option
Markus Zapke-Gründemann <info@keimlink.de>
parents: 15858
diff changeset
   468
        covrun('-i', '-b', '"--directory=%s"' % htmldir, '"--omit=%s"' % omit)
2145
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
   469
    if options.annotate:
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
   470
        adir = os.path.join(TESTDIR, 'annotated')
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
   471
        if not os.path.isdir(adir):
5bb3cb9e5d13 make indentation of coverage code in run-tests.py nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2144
diff changeset
   472
            os.mkdir(adir)
8620
b38f275bb5c2 tests: make coverage run in parallel mode, clean up coverage code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8592
diff changeset
   473
        covrun('-i', '-a', '"--directory=%s"' % adir, '"--omit=%s"' % omit)
2144
d3bddedfdbd0 Add code coverage to the python version of run-tests (inc. annotation)
Stephen Darnell <stephen@darnell.plus.com>
parents: 2133
diff changeset
   474
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
   475
def pytest(test, wd, options, replacements):
11740
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
   476
    py3kswitch = options.py3k_warnings and ' -3' or ''
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
   477
    cmd = '%s%s "%s"' % (PYTHON, py3kswitch, test)
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
   478
    vlog("# Running", cmd)
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
   479
    return run(cmd, wd, options, replacements)
11740
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
   480
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
   481
def shtest(test, wd, options, replacements):
15517
9ec8569e9a8b tests: use the specified shell for running old fashioned sh tests
Mads Kiilerich <mads@kiilerich.com>
parents: 15451
diff changeset
   482
    cmd = '%s "%s"' % (options.shell, test)
11740
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
   483
    vlog("# Running", cmd)
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
   484
    return run(cmd, wd, options, replacements)
11740
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
   485
12941
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   486
needescape = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   487
escapesub = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   488
escapemap = dict((chr(i), r'\x%02x' % i) for i in range(256))
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   489
escapemap.update({'\\': '\\\\', '\r': r'\r'})
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   490
def escapef(m):
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   491
    return escapemap[m.group(0)]
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   492
def stringescape(s):
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   493
    return escapesub(escapef, s)
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   494
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   495
def rematch(el, l):
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   496
    try:
17777
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
   497
        # use \Z to ensure that the regex matches to the end of the string
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
   498
        if os.name == 'nt':
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
   499
            return re.match(el + r'\r?\n\Z', l)
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
   500
        return re.match(el + r'\n\Z', l)
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   501
    except re.error:
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   502
        # el is an invalid regex
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   503
        return False
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   504
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   505
def globmatch(el, l):
15447
9910f60a37ee tests: make (glob) on windows accept \ instead of /
Mads Kiilerich <mads@kiilerich.com>
parents: 15435
diff changeset
   506
    # The only supported special characters are * and ? plus / which also
9910f60a37ee tests: make (glob) on windows accept \ instead of /
Mads Kiilerich <mads@kiilerich.com>
parents: 15435
diff changeset
   507
    # matches \ on windows. Escaping of these caracters is supported.
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   508
    i, n = 0, len(el)
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   509
    res = ''
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   510
    while i < n:
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   511
        c = el[i]
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   512
        i += 1
15447
9910f60a37ee tests: make (glob) on windows accept \ instead of /
Mads Kiilerich <mads@kiilerich.com>
parents: 15435
diff changeset
   513
        if c == '\\' and el[i] in '*?\\/':
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   514
            res += el[i - 1:i + 1]
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   515
            i += 1
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   516
        elif c == '*':
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   517
            res += '.*'
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   518
        elif c == '?':
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   519
            res += '.'
15447
9910f60a37ee tests: make (glob) on windows accept \ instead of /
Mads Kiilerich <mads@kiilerich.com>
parents: 15435
diff changeset
   520
        elif c == '/' and os.name == 'nt':
9910f60a37ee tests: make (glob) on windows accept \ instead of /
Mads Kiilerich <mads@kiilerich.com>
parents: 15435
diff changeset
   521
            res += '[/\\\\]'
15414
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   522
        else:
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   523
            res += re.escape(c)
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   524
    return rematch(res, l)
2a62d7c8aee7 run-tests: pull out unified matching funcs
Matt Mackall <mpm@selenic.com>
parents: 15413
diff changeset
   525
15415
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
   526
def linematch(el, l):
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
   527
    if el == l: # perfect match (fast)
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
   528
        return True
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
   529
    if (el and
17777
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
   530
        (el.endswith(" (re)\n") and rematch(el[:-6], l) or
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
   531
         el.endswith(" (glob)\n") and globmatch(el[:-8], l) or
15435
493fffdc6398 tests: make '(esc)' matching in run-tests.py work as intended
Mads Kiilerich <mads@kiilerich.com>
parents: 15434
diff changeset
   532
         el.endswith(" (esc)\n") and
15449
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
   533
             (el[:-7].decode('string-escape') + '\n' == l or
17777
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
   534
              os.name == 'nt' and
af7c6bc48d8d run-tests: alternative way of handling \r on Windows
Mads Kiilerich <mads@kiilerich.com>
parents: 17751
diff changeset
   535
              el[:-7].decode('string-escape') + '\n' == l))):
15415
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
   536
        return True
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
   537
    return False
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
   538
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
   539
def tsttest(test, wd, options, replacements):
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   540
    # We generate a shell script which outputs unique markers to line
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   541
    # up script results with our source. These markers include input
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   542
    # line number and the last return code
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   543
    salt = "SALT" + str(time.time())
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   544
    def addsalt(line, inpython):
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   545
        if inpython:
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   546
            script.append('%s %d 0\n' % (salt, line))
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   547
        else:
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   548
            script.append('echo %s %s $?\n' % (salt, line))
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   549
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   550
    # After we run the shell script, we re-unify the script output
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   551
    # with non-active parts of the source, with synchronization by our
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   552
    # SALT line number markers. The after table contains the
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   553
    # non-active components, ordered by line number
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   554
    after = {}
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   555
    pos = prepos = -1
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   556
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   557
    # Expected shellscript output
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   558
    expected = {}
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   559
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   560
    # We keep track of whether or not we're in a Python block so we
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   561
    # can generate the surrounding doctest magic
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   562
    inpython = False
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   563
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   564
    # True or False when in a true or false conditional section
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   565
    skipping = None
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   566
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   567
    def hghave(reqs):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   568
        # TODO: do something smarter when all other uses of hghave is gone
16897
2774576dee4d tests/run-tests: avoid C:/ in arguments
Adrian Buehlmann <adrian@cadifra.com>
parents: 16890
diff changeset
   569
        tdir = TESTDIR.replace('\\', '/')
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   570
        proc = Popen4('%s -c "%s/hghave %s"' %
16906
2a95830cff77 tests: use the right directory for running hghave from run-tests.py
Mads Kiilerich <mads@kiilerich.com>
parents: 16905
diff changeset
   571
                      (options.shell, tdir, ' '.join(reqs)), wd, 0)
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   572
        proc.communicate()
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   573
        ret = proc.wait()
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   574
        if wifexited(ret):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   575
            ret = os.WEXITSTATUS(ret)
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   576
        return ret == 0
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   577
15416
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
   578
    f = open(test)
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
   579
    t = f.readlines()
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
   580
    f.close()
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
   581
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
   582
    script = []
15940
4bc35496136f tests: add 'set -x' to the .t sh scripts in run-tests.py debug mode
Mads Kiilerich <mads@kiilerich.com>
parents: 15859
diff changeset
   583
    if options.debug:
4bc35496136f tests: add 'set -x' to the .t sh scripts in run-tests.py debug mode
Mads Kiilerich <mads@kiilerich.com>
parents: 15859
diff changeset
   584
        script.append('set -x\n')
15569
3e13ade423f0 tests: use an alias to make msys 'pwd' return paths with forward slashes
Mads Kiilerich <mads@kiilerich.com>
parents: 15517
diff changeset
   585
    if os.getenv('MSYSTEM'):
3e13ade423f0 tests: use an alias to make msys 'pwd' return paths with forward slashes
Mads Kiilerich <mads@kiilerich.com>
parents: 15517
diff changeset
   586
        script.append('alias pwd="pwd -W"\n')
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   587
    for n, l in enumerate(t):
12934
ea7ad8c3988a tests: handle .t files without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12895
diff changeset
   588
        if not l.endswith('\n'):
ea7ad8c3988a tests: handle .t files without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12895
diff changeset
   589
            l += '\n'
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   590
        if l.startswith('#if'):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   591
            if skipping is not None:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   592
                after.setdefault(pos, []).append('  !!! nested #if\n')
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   593
            skipping = not hghave(l.split()[1:])
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   594
            after.setdefault(pos, []).append(l)
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   595
        elif l.startswith('#else'):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   596
            if skipping is None:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   597
                after.setdefault(pos, []).append('  !!! missing #if\n')
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   598
            skipping = not skipping
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   599
            after.setdefault(pos, []).append(l)
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   600
        elif l.startswith('#endif'):
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   601
            if skipping is None:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   602
                after.setdefault(pos, []).append('  !!! missing #if\n')
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   603
            skipping = None
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   604
            after.setdefault(pos, []).append(l)
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   605
        elif skipping:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   606
            after.setdefault(pos, []).append(l)
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   607
        elif l.startswith('  >>> '): # python inlines
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   608
            after.setdefault(pos, []).append(l)
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   609
            prepos = pos
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   610
            pos = n
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   611
            if not inpython:
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   612
                # we've just entered a Python block, add the header
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   613
                inpython = True
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   614
                addsalt(prepos, False) # make sure we report the exit code
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   615
                script.append('%s -m heredoctest <<EOF\n' % PYTHON)
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   616
            addsalt(n, True)
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   617
            script.append(l[2:])
16841
f2555e891982 run-tests: don't add python lines to expected dict
Adrian Buehlmann <adrian@cadifra.com>
parents: 16840
diff changeset
   618
        elif l.startswith('  ... '): # python inlines
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   619
            after.setdefault(prepos, []).append(l)
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   620
            script.append(l[2:])
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   621
        elif l.startswith('  $ '): # commands
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   622
            if inpython:
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   623
                script.append("EOF\n")
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   624
                inpython = False
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   625
            after.setdefault(pos, []).append(l)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   626
            prepos = pos
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   627
            pos = n
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   628
            addsalt(n, False)
16905
671c73d523cf tests: make .t tests stop immediately if a cd fails
Mads Kiilerich <mads@kiilerich.com>
parents: 16897
diff changeset
   629
            cmd = l[4:].split()
671c73d523cf tests: make .t tests stop immediately if a cd fails
Mads Kiilerich <mads@kiilerich.com>
parents: 16897
diff changeset
   630
            if len(cmd) == 2 and cmd[0] == 'cd':
671c73d523cf tests: make .t tests stop immediately if a cd fails
Mads Kiilerich <mads@kiilerich.com>
parents: 16897
diff changeset
   631
                l = '  $ cd %s || exit 1\n' % cmd[1]
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   632
            script.append(l[4:])
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   633
        elif l.startswith('  > '): # continuations
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   634
            after.setdefault(prepos, []).append(l)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   635
            script.append(l[4:])
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   636
        elif l.startswith('  '): # results
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   637
            # queue up a list of expected results
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   638
            expected.setdefault(pos, []).append(l[2:])
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   639
        else:
15412
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   640
            if inpython:
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   641
                script.append("EOF\n")
59fe460bb0f0 tests: rewrite inline Python support
Matt Mackall <mpm@selenic.com>
parents: 15344
diff changeset
   642
                inpython = False
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   643
            # non-command/result - queue up for merged output
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   644
            after.setdefault(pos, []).append(l)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   645
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   646
    if inpython:
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   647
        script.append("EOF\n")
16842
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   648
    if skipping is not None:
a3ea092203a5 tests: introduce c-style conditional sections in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 16841
diff changeset
   649
        after.setdefault(pos, []).append('  !!! missing #endif\n')
15434
5635a4017061 run-tests: replace inline python handling with more native scheme
Matt Mackall <mpm@selenic.com>
parents: 15416
diff changeset
   650
    addsalt(n + 1, False)
12316
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
   651
15416
3b7c4f96885c run-tests: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 15415
diff changeset
   652
    # Write out the script and execute it
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   653
    fd, name = tempfile.mkstemp(suffix='hg-tst')
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   654
    try:
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   655
        for l in script:
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   656
            os.write(fd, l)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   657
        os.close(fd)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   658
15450
90c15a7573df run-tests: don't quote command names - that do apparently not work with msys
Mads Kiilerich <mads@kiilerich.com>
parents: 15449
diff changeset
   659
        cmd = '%s "%s"' % (options.shell, name)
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   660
        vlog("# Running", cmd)
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
   661
        exitcode, output = run(cmd, wd, options, replacements)
12573
be4b0a397470 tests: show skip reason instead of "irrelevant" with unified tests, too
Thomas Arendsen Hein <thomas@intevation.de>
parents: 12502
diff changeset
   662
        # do not merge output if skipped, return hghave message instead
13002
6747d4a5c45d run-tests: fix --debug for .t tests
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12955
diff changeset
   663
        # similarly, with --debug, output is None
6747d4a5c45d run-tests: fix --debug for .t tests
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12955
diff changeset
   664
        if exitcode == SKIPPED_STATUS or output is None:
12573
be4b0a397470 tests: show skip reason instead of "irrelevant" with unified tests, too
Thomas Arendsen Hein <thomas@intevation.de>
parents: 12502
diff changeset
   665
            return exitcode, output
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   666
    finally:
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   667
        os.remove(name)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   668
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   669
    # Merge the script output back into a unified test
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   670
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   671
    pos = -1
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   672
    postout = []
12316
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
   673
    ret = 0
17739
5b08e8b7ab00 run-tests: drop unused enumerate
Mads Kiilerich <mads@kiilerich.com>
parents: 17541
diff changeset
   674
    for l in output:
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   675
        lout, lcmd = l, None
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   676
        if salt in l:
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   677
            lout, lcmd = l.split(salt, 1)
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   678
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   679
        if lout:
17741
a51304b851c6 run-tests: use more explicit criteria for detecting no-eol
Mads Kiilerich <mads@kiilerich.com>
parents: 17739
diff changeset
   680
            if not lout.endswith('\n'):
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   681
                lout += ' (no-eol)\n'
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   682
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   683
            # find the expected output at the current position
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   684
            el = None
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   685
            if pos in expected and expected[pos]:
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   686
                el = expected[pos].pop(0)
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   687
15415
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
   688
            if linematch(el, lout):
8c90b3df5bed run-tests: pull out line matching function
Matt Mackall <mpm@selenic.com>
parents: 15414
diff changeset
   689
                postout.append("  " + el)
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   690
            else:
12941
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   691
                if needescape(lout):
b911cb80c671 tests: use (esc) markup for string-escape
Mads Kiilerich <mads@kiilerich.com>
parents: 12940
diff changeset
   692
                    lout = stringescape(lout.rstrip('\n')) + " (esc)\n"
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   693
                postout.append("  " + lout) # let diff deal with it
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   694
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   695
        if lcmd:
12316
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
   696
            # add on last return code
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   697
            ret = int(lcmd.split()[1])
12316
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
   698
            if ret != 0:
4134686b83e1 tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents: 11781
diff changeset
   699
                postout.append("  [%s]\n" % ret)
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   700
            if pos in after:
15413
8e60433e070a tests: add some comments to the unified test code
Matt Mackall <mpm@selenic.com>
parents: 15412
diff changeset
   701
                # merge in non-active test bits
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   702
                postout += after.pop(pos)
12940
518dd70d1a6e tests: (no-eol) markup for command output without trailing LF
Mads Kiilerich <mads@kiilerich.com>
parents: 12934
diff changeset
   703
            pos = int(lcmd.split()[0])
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   704
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   705
    if pos in after:
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   706
        postout += after.pop(pos)
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   707
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   708
    return exitcode, postout
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   709
13348
31fdb04cb5e8 run-tests: only call WIFEXITED on systems it exists
Simon Heimberg <simohe@besonet.ch>
parents: 13347
diff changeset
   710
wifexited = getattr(os, "WIFEXITED", lambda x: False)
14019
fbbd5f91d5e1 run-tests: do chdir for tests under a lock for thread safety
Matt Mackall <mpm@selenic.com>
parents: 14018
diff changeset
   711
def run(cmd, wd, options, replacements):
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   712
    """Run command in a sub-process, capturing the output (stdout and stderr).
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   713
    Return a tuple (exitcode, output).  output is None in debug mode."""
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   714
    # TODO: Use subprocess.Popen if we're running on Python 2.4
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   715
    if options.debug:
14339
ed0bf8e1cd28 run-tests: make --debug run in the temporary test directory
Patrick Mezard <pmezard@gmail.com>
parents: 14338
diff changeset
   716
        proc = subprocess.Popen(cmd, shell=True, cwd=wd)
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   717
        ret = proc.wait()
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   718
        return (ret, None)
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   719
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   720
    proc = Popen4(cmd, wd, options.timeout)
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   721
    def cleanup():
14821
2017495bd552 run-tests: fallback to SIGTERM if subprocess.Popen does not have terminate()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14598
diff changeset
   722
        terminate(proc)
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   723
        ret = proc.wait()
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   724
        if ret == 0:
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   725
            ret = signal.SIGTERM << 8
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   726
        killdaemons()
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   727
        return ret
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   728
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   729
    output = ''
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   730
    proc.tochild.close()
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
   731
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   732
    try:
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   733
        output = proc.fromchild.read()
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   734
    except KeyboardInterrupt:
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   735
        vlog('# Handling keyboard interrupt')
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   736
        cleanup()
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   737
        raise
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
   738
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   739
    ret = proc.wait()
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   740
    if wifexited(ret):
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   741
        ret = os.WEXITSTATUS(ret)
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   742
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   743
    if proc.timeout:
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   744
        ret = 'timeout'
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   745
14338
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   746
    if ret:
862f8cd87546 run-tests: use the common test path on Windows and Java
Patrick Mezard <pmezard@gmail.com>
parents: 14337
diff changeset
   747
        killdaemons()
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   748
12639
236058a65cb4 tests: replace test tmp directory with $TESTTMP in test output
Mads Kiilerich <mads@kiilerich.com>
parents: 12621
diff changeset
   749
    for s, r in replacements:
12895
53cfde2b3cf9 run-tests: use regex when searching for $HGPORT in test output
Martin Geisler <mg@aragost.com>
parents: 12721
diff changeset
   750
        output = re.sub(s, r, output)
17742
405b6bd015df run-tests: allow test output lines to be terminated with \r in addition to \n
Mads Kiilerich <mads@kiilerich.com>
parents: 17741
diff changeset
   751
    return ret, output.splitlines(True)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   752
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   753
def runone(options, test):
2710
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
   754
    '''tristate output:
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
   755
    None -> skipped
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
   756
    True -> passed
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
   757
    False -> failed'''
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
   758
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
   759
    global results, resultslock, iolock
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   760
13989
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   761
    testpath = os.path.join(TESTDIR, test)
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   762
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   763
    def result(l, e):
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   764
        resultslock.acquire()
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   765
        results[l].append(e)
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   766
        resultslock.release()
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   767
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
   768
    def skip(msg):
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   769
        if not options.verbose:
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   770
            result('s', (test, msg))
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
   771
        else:
14003
ba734ff5cadd run-tests: fix some missing i/o locks
Matt Mackall <mpm@selenic.com>
parents: 14002
diff changeset
   772
            iolock.acquire()
10088
ec8304e66ea5 run-tests.py: Show paths to failing tests, .err and .out
Mads Kiilerich <mads@kiilerich.com>
parents: 10030
diff changeset
   773
            print "\nSkipping %s: %s" % (testpath, msg)
14003
ba734ff5cadd run-tests: fix some missing i/o locks
Matt Mackall <mpm@selenic.com>
parents: 14002
diff changeset
   774
            iolock.release()
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
   775
        return None
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
   776
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
   777
    def fail(msg, ret):
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   778
        if not options.nodiff:
14003
ba734ff5cadd run-tests: fix some missing i/o locks
Matt Mackall <mpm@selenic.com>
parents: 14002
diff changeset
   779
            iolock.acquire()
10088
ec8304e66ea5 run-tests.py: Show paths to failing tests, .err and .out
Mads Kiilerich <mads@kiilerich.com>
parents: 10030
diff changeset
   780
            print "\nERROR: %s %s" % (testpath, msg)
14003
ba734ff5cadd run-tests: fix some missing i/o locks
Matt Mackall <mpm@selenic.com>
parents: 14002
diff changeset
   781
            iolock.release()
13999
8f9478be9a94 run-tests: fix --interactive (after 994ad067ac6e)
Patrick Mezard <pmezard@gmail.com>
parents: 13995
diff changeset
   782
        if (not ret and options.interactive
8f9478be9a94 run-tests: fix --interactive (after 994ad067ac6e)
Patrick Mezard <pmezard@gmail.com>
parents: 13995
diff changeset
   783
            and os.path.exists(testpath + ".err")):
14003
ba734ff5cadd run-tests: fix some missing i/o locks
Matt Mackall <mpm@selenic.com>
parents: 14002
diff changeset
   784
            iolock.acquire()
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
   785
            print "Accept this change? [n] ",
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
   786
            answer = sys.stdin.readline().strip()
14003
ba734ff5cadd run-tests: fix some missing i/o locks
Matt Mackall <mpm@selenic.com>
parents: 14002
diff changeset
   787
            iolock.release()
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
   788
            if answer.lower() in "y yes".split():
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
   789
                if test.endswith(".t"):
13999
8f9478be9a94 run-tests: fix --interactive (after 994ad067ac6e)
Patrick Mezard <pmezard@gmail.com>
parents: 13995
diff changeset
   790
                    rename(testpath + ".err", testpath)
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
   791
                else:
13999
8f9478be9a94 run-tests: fix --interactive (after 994ad067ac6e)
Patrick Mezard <pmezard@gmail.com>
parents: 13995
diff changeset
   792
                    rename(testpath + ".err", testpath + ".out")
14867
b601b9eb372d run-tests: fix summary when accepting changes interactively
Patrick Mezard <pmezard@gmail.com>
parents: 14822
diff changeset
   793
                result('p', test)
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
   794
                return
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   795
        result('f', (test, msg))
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
   796
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
   797
    def success():
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   798
        result('p', test)
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
   799
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
   800
    def ignore(msg):
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
   801
        result('i', (test, msg))
6244
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
   802
14264
8e00906066c9 run-tests: take the basepath when constructing the test temp dir
Idan Kamara <idankk86@gmail.com>
parents: 14263
diff changeset
   803
    if (os.path.basename(test).startswith("test-") and '~' not in test and
13989
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   804
        ('.' not in test or test.endswith('.py') or
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   805
         test.endswith('.bat') or test.endswith('.t'))):
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   806
        if not os.path.exists(test):
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   807
            skip("doesn't exist")
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   808
            return None
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   809
    else:
14598
259ba7502370 run-tests: verbose log ignored test
Idan Kamara <idankk86@gmail.com>
parents: 14493
diff changeset
   810
        vlog('# Test file', test, 'not supported, ignoring')
13989
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   811
        return None # not a supported test, don't record
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
   812
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   813
    if not (options.whitelisted and test in options.whitelisted):
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   814
        if options.blacklist and test in options.blacklist:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   815
            skip("blacklisted")
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   816
            return None
13993
174d0a113757 run-tests: move blacklist and retest filtering to runone
Matt Mackall <mpm@selenic.com>
parents: 13992
diff changeset
   817
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   818
        if options.retest and not os.path.exists(test + ".err"):
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   819
            ignore("not retesting")
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   820
            return None
13993
174d0a113757 run-tests: move blacklist and retest filtering to runone
Matt Mackall <mpm@selenic.com>
parents: 13992
diff changeset
   821
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   822
        if options.keywords:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   823
            fp = open(test)
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   824
            t = fp.read().lower() + test.lower()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   825
            fp.close()
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   826
            for k in options.keywords.lower().split():
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   827
                if k in t:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   828
                    break
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   829
                else:
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   830
                    ignore("doesn't match keyword")
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
   831
                    return None
13991
8cfe191e2ce4 run-tests: move keyword checking into runone
Matt Mackall <mpm@selenic.com>
parents: 13990
diff changeset
   832
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   833
    vlog("# Test", test)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   834
2989
3091b1153e2c Clear contents of global hgrc for tests before running each test.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2710
diff changeset
   835
    # create a fresh hgrc
9031
3b76321aa0de compat: use open() instead of file() everywhere
Alejandro Santos <alejolp@alejolp.com>
parents: 9028
diff changeset
   836
    hgrc = open(HGRCPATH, 'w+')
4529
860478527568 run-tests.py: set ui.slash = True
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4387
diff changeset
   837
    hgrc.write('[ui]\n')
860478527568 run-tests.py: set ui.slash = True
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4387
diff changeset
   838
    hgrc.write('slash = True\n')
5524
453acf64f71f run-tests.py: add a default --date "0 0" argument to commit et al
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5518
diff changeset
   839
    hgrc.write('[defaults]\n')
453acf64f71f run-tests.py: add a default --date "0 0" argument to commit et al
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5518
diff changeset
   840
    hgrc.write('backout = -d "0 0"\n')
453acf64f71f run-tests.py: add a default --date "0 0" argument to commit et al
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5518
diff changeset
   841
    hgrc.write('commit = -d "0 0"\n')
453acf64f71f run-tests.py: add a default --date "0 0" argument to commit et al
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5518
diff changeset
   842
    hgrc.write('tag = -d "0 0"\n')
9958
777c1df76ef4 run-tests: add --inotify option to test runner
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9940
diff changeset
   843
    if options.inotify:
777c1df76ef4 run-tests: add --inotify option to test runner
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9940
diff changeset
   844
        hgrc.write('[extensions]\n')
777c1df76ef4 run-tests: add --inotify option to test runner
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9940
diff changeset
   845
        hgrc.write('inotify=\n')
777c1df76ef4 run-tests: add --inotify option to test runner
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9940
diff changeset
   846
        hgrc.write('[inotify]\n')
777c1df76ef4 run-tests: add --inotify option to test runner
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9940
diff changeset
   847
        hgrc.write('pidfile=%s\n' % DAEMON_PIDS)
10013
b2e87fde6806 run-tests: --inotify: use inotify.appendpid to append pids to $DAEMON_PIDS
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9959
diff changeset
   848
        hgrc.write('appendpid=True\n')
14134
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
   849
    if options.extra_config_opt:
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
   850
        for opt in options.extra_config_opt:
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
   851
            section, key = opt.split('.', 1)
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
   852
            assert '=' in key, ('extra config opt %s must '
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
   853
                                'have an = for assignment' % opt)
8468ec1109d1 run-tests: add flag to provide extra hgrc options for test runs
Augie Fackler <durin42@gmail.com>
parents: 14062
diff changeset
   854
            hgrc.write('[%s]\n%s\n' % (section, key))
2989
3091b1153e2c Clear contents of global hgrc for tests before running each test.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2710
diff changeset
   855
    hgrc.close()
3091b1153e2c Clear contents of global hgrc for tests before running each test.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2710
diff changeset
   856
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   857
    ref = os.path.join(TESTDIR, test+".out")
10406
6586a6889f66 run-tests.py: skipped tests shouldn't change working directory
Mads Kiilerich <mads@kiilerich.com>
parents: 10336
diff changeset
   858
    err = os.path.join(TESTDIR, test+".err")
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   859
    if os.path.exists(err):
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   860
        os.remove(err)       # Remove any previous output files
4321
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
   861
    try:
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
   862
        tf = open(testpath)
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
   863
        firstline = tf.readline().rstrip()
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
   864
        tf.close()
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16613
diff changeset
   865
    except IOError:
4321
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
   866
        firstline = ''
2710
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
   867
    lctest = test.lower()
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   868
4321
99184c6fd88f run-tests.py: use coverage.py with "#!/usr/bin/env python" tests
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4320
diff changeset
   869
    if lctest.endswith('.py') or firstline == '#!/usr/bin/env python':
11740
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
   870
        runner = pytest
11741
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   871
    elif lctest.endswith('.t'):
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   872
        runner = tsttest
431e2bf37ae7 tests: basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11740
diff changeset
   873
        ref = testpath
2710
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
   874
    else:
e475fe2a6029 run-tests.py: skip tests that should not run.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2705
diff changeset
   875
        # do not try to run non-executable programs
12678
61642a4679e9 run-tests.py: remove support for .bat files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12677
diff changeset
   876
        if not os.access(testpath, os.X_OK):
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
   877
            return skip("not executable")
11740
e5c79e31feb6 tests: move script execution in runner helpers
Matt Mackall <mpm@selenic.com>
parents: 11040
diff changeset
   878
        runner = shtest
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   879
10406
6586a6889f66 run-tests.py: skipped tests shouldn't change working directory
Mads Kiilerich <mads@kiilerich.com>
parents: 10336
diff changeset
   880
    # Make a tmp subdirectory to work in
13764
8ed67e44c71c tests: set HOME to the test temp dir (issue2707)
Idan Kamara <idankk86@gmail.com>
parents: 13539
diff changeset
   881
    testtmp = os.environ["TESTTMP"] = os.environ["HOME"] = \
16897
2774576dee4d tests/run-tests: avoid C:/ in arguments
Adrian Buehlmann <adrian@cadifra.com>
parents: 16890
diff changeset
   882
        os.path.join(HGTMP, os.path.basename(test))
13764
8ed67e44c71c tests: set HOME to the test temp dir (issue2707)
Idan Kamara <idankk86@gmail.com>
parents: 13539
diff changeset
   883
15449
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
   884
    replacements = [
12895
53cfde2b3cf9 run-tests: use regex when searching for $HGPORT in test output
Martin Geisler <mg@aragost.com>
parents: 12721
diff changeset
   885
        (r':%s\b' % options.port, ':$HGPORT'),
53cfde2b3cf9 run-tests: use regex when searching for $HGPORT in test output
Martin Geisler <mg@aragost.com>
parents: 12721
diff changeset
   886
        (r':%s\b' % (options.port + 1), ':$HGPORT1'),
53cfde2b3cf9 run-tests: use regex when searching for $HGPORT in test output
Martin Geisler <mg@aragost.com>
parents: 12721
diff changeset
   887
        (r':%s\b' % (options.port + 2), ':$HGPORT2'),
15449
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
   888
        ]
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
   889
    if os.name == 'nt':
15451
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
   890
        replacements.append(
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
   891
            (''.join(c.isalpha() and '[%s%s]' % (c.lower(), c.upper()) or
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
   892
                     c in '/\\' and r'[/\\]' or
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
   893
                     c.isdigit() and c or
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
   894
                     '\\' + c
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
   895
                     for c in testtmp), '$TESTTMP'))
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
   896
    else:
23144f06919c run-tests: make $TESTTMP matching case-insensitive on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15450
diff changeset
   897
        replacements.append((re.escape(testtmp), '$TESTTMP'))
15449
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
   898
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
   899
    os.mkdir(testtmp)
f71d60da58fb tests: ignore \r on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15448
diff changeset
   900
    ret, out = runner(testpath, testtmp, options, replacements)
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   901
    vlog("# Ret was:", ret)
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   902
7343
e47dab64be8d run-tests: allow turning off diff display
Matt Mackall <mpm@selenic.com>
parents: 7214
diff changeset
   903
    mark = '.'
e47dab64be8d run-tests: allow turning off diff display
Matt Mackall <mpm@selenic.com>
parents: 7214
diff changeset
   904
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   905
    skipped = (ret == SKIPPED_STATUS)
11040
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   906
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   907
    # If we're not in --debug mode and reference output file exists,
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   908
    # check test output against it.
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   909
    if options.debug:
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 13002
diff changeset
   910
        refout = None                   # to match "out is None"
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   911
    elif os.path.exists(ref):
2213
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
   912
        f = open(ref, "r")
17742
405b6bd015df run-tests: allow test output lines to be terminated with \r in addition to \n
Mads Kiilerich <mads@kiilerich.com>
parents: 17741
diff changeset
   913
        refout = f.read().splitlines(True)
2213
6f76a479ae51 run-tests.py must print changed test output no matter what exit code is.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2183
diff changeset
   914
        f.close()
2246
3fd603eb6add run-tests.py: print diff if reference output not existing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2213
diff changeset
   915
    else:
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   916
        refout = []
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   917
11040
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   918
    if (ret != 0 or out != refout) and not skipped and not options.debug:
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   919
        # Save errors to a file for diagnosis
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   920
        f = open(err, "wb")
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   921
        for line in out:
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   922
            f.write(line)
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   923
        f.close()
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   924
17751
4871c1f343fa tests: correctly report a test killed by a signal
Bryan O'Sullivan <bryano@fb.com>
parents: 17742
diff changeset
   925
    def describe(ret):
4871c1f343fa tests: correctly report a test killed by a signal
Bryan O'Sullivan <bryano@fb.com>
parents: 17742
diff changeset
   926
        if ret < 0:
4871c1f343fa tests: correctly report a test killed by a signal
Bryan O'Sullivan <bryano@fb.com>
parents: 17742
diff changeset
   927
            return 'killed by signal %d' % -ret
4871c1f343fa tests: correctly report a test killed by a signal
Bryan O'Sullivan <bryano@fb.com>
parents: 17742
diff changeset
   928
        return 'returned error code %d' % ret
4871c1f343fa tests: correctly report a test killed by a signal
Bryan O'Sullivan <bryano@fb.com>
parents: 17742
diff changeset
   929
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   930
    if skipped:
7343
e47dab64be8d run-tests: allow turning off diff display
Matt Mackall <mpm@selenic.com>
parents: 7214
diff changeset
   931
        mark = 's'
9707
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   932
        if out is None:                 # debug mode: nothing to parse
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   933
            missing = ['unknown']
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   934
            failed = None
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   935
        else:
38deec407f8d run-tests: add "debug" mode: don't capture child output, just show it.
Greg Ward <greg-hg@gerg.ca>
parents: 9706
diff changeset
   936
            missing, failed = parsehghaveoutput(out)
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   937
        if not missing:
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   938
            missing = ['irrelevant']
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   939
        if failed:
13988
994ad067ac6e run-tests: move interactive handling into runone
Matt Mackall <mpm@selenic.com>
parents: 13918
diff changeset
   940
            fail("hghave failed checking for %s" % failed[-1], ret)
8060
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   941
            skipped = False
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   942
        else:
84d0fe34427b run-tests: detect when hghave fails to check for a feature and fail test
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 7813
diff changeset
   943
            skip(missing[-1])
14001
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   944
    elif ret == 'timeout':
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   945
        mark = 't'
9c4da6ab4e5a run-tests: switch timeout handling from alarm to helper thread
Matt Mackall <mpm@selenic.com>
parents: 14000
diff changeset
   946
        fail("timed out", ret)
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
   947
    elif out != refout:
7343
e47dab64be8d run-tests: allow turning off diff display
Matt Mackall <mpm@selenic.com>
parents: 7214
diff changeset
   948
        mark = '!'
14006
a395575691a6 run-tests: display diff before prompting with --interactive
Patrick Mezard <pmezard@gmail.com>
parents: 14003
diff changeset
   949
        if not options.nodiff:
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
   950
            iolock.acquire()
11040
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   951
            if options.view:
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   952
                os.system("%s %s %s" % (options.view, ref, err))
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   953
            else:
8f951ed6c63c run-tests: add --view switch to use external diff viewer
Matt Mackall <mpm@selenic.com>
parents: 11039
diff changeset
   954
                showdiff(refout, out, ref, err)
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
   955
            iolock.release()
14006
a395575691a6 run-tests: display diff before prompting with --interactive
Patrick Mezard <pmezard@gmail.com>
parents: 14003
diff changeset
   956
        if ret:
17751
4871c1f343fa tests: correctly report a test killed by a signal
Bryan O'Sullivan <bryano@fb.com>
parents: 17742
diff changeset
   957
            fail("output changed and " + describe(ret), ret)
14006
a395575691a6 run-tests: display diff before prompting with --interactive
Patrick Mezard <pmezard@gmail.com>
parents: 14003
diff changeset
   958
        else:
a395575691a6 run-tests: display diff before prompting with --interactive
Patrick Mezard <pmezard@gmail.com>
parents: 14003
diff changeset
   959
            fail("output changed", ret)
6383
38485d45f947 run-tests.py: Only one fail message when output changed and error code.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6366
diff changeset
   960
        ret = 1
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   961
    elif ret:
7343
e47dab64be8d run-tests: allow turning off diff display
Matt Mackall <mpm@selenic.com>
parents: 7214
diff changeset
   962
        mark = '!'
17751
4871c1f343fa tests: correctly report a test killed by a signal
Bryan O'Sullivan <bryano@fb.com>
parents: 17742
diff changeset
   963
        fail(describe(ret), ret)
14037
4ab1e987941b run-tests: don't count test as succeeded if it failed
Idan Kamara <idankk86@gmail.com>
parents: 14019
diff changeset
   964
    else:
4ab1e987941b run-tests: don't count test as succeeded if it failed
Idan Kamara <idankk86@gmail.com>
parents: 14019
diff changeset
   965
        success()
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   966
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
   967
    if not options.verbose:
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
   968
        iolock.acquire()
7343
e47dab64be8d run-tests: allow turning off diff display
Matt Mackall <mpm@selenic.com>
parents: 7214
diff changeset
   969
        sys.stdout.write(mark)
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
   970
        sys.stdout.flush()
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
   971
        iolock.release()
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
   972
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
   973
    killdaemons()
2571
83cfd95eafb5 tests: add timeouts, make run-tests.py clean up dead daemon processes
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2570
diff changeset
   974
6208
c88b9e597588 tests: add --keep-tmp to run-tests.py to debug test environment
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6004
diff changeset
   975
    if not options.keep_tmpdir:
12639
236058a65cb4 tests: replace test tmp directory with $TESTTMP in test output
Mads Kiilerich <mads@kiilerich.com>
parents: 12621
diff changeset
   976
        shutil.rmtree(testtmp, True)
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   977
    if skipped:
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents: 4880
diff changeset
   978
        return None
2110
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   979
    return ret == 0
25a8d116ab6a Add a pure python version of run-tests.
Stephen Darnell <stephen@darnell.plus.com>
parents:
diff changeset
   980
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   981
_hgpath = None
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   982
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   983
def _gethgpath():
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   984
    """Return the path to the mercurial package that is actually found by
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   985
    the current Python interpreter."""
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   986
    global _hgpath
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   987
    if _hgpath is not None:
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   988
        return _hgpath
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   989
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   990
    cmd = '%s -c "import mercurial; print mercurial.__path__[0]"'
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   991
    pipe = os.popen(cmd % PYTHON)
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   992
    try:
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   993
        _hgpath = pipe.read().strip()
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   994
    finally:
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   995
        pipe.close()
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   996
    return _hgpath
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   997
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   998
def _checkhglib(verb):
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
   999
    """Ensure that the 'mercurial' package imported by python is
8673
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
  1000
    the one we expect it to be.  If not, print a warning to stderr."""
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
  1001
    expecthg = os.path.join(PYTHONDIR, 'mercurial')
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1002
    actualhg = _gethgpath()
14263
7352ff757a48 run-tests: compare absolute paths in _checkhglib
Idan Kamara <idankk86@gmail.com>
parents: 14202
diff changeset
  1003
    if os.path.abspath(actualhg) != os.path.abspath(expecthg):
8673
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
  1004
        sys.stderr.write('warning: %s with unexpected mercurial lib: %s\n'
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
  1005
                         '         (expected %s)\n'
a8066f2fd1aa run-tests: fix _checkhglib() so it's correct when using --with-hg.
Greg Ward <greg-hg@gerg.ca>
parents: 8672
diff changeset
  1006
                         % (verb, actualhg, expecthg))
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1007
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1008
def runchildren(options, tests):
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1009
    if INST:
8107
0eeb4f0a5d21 run-tests: fix -jN broken by 60a9e3cf0cf4
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8097
diff changeset
  1010
        installhg(options)
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1011
        _checkhglib("Testing")
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1012
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1013
    optcopy = dict(options.__dict__)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1014
    optcopy['jobs'] = 1
14447
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1015
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
  1016
    # Because whitelist has to override keyword matches, we have to
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
  1017
    # actually load the whitelist in the children as well, so we allow
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
  1018
    # the list of whitelist files to pass through and be parsed in the
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
  1019
    # children, but not the dict of whitelisted tests resulting from
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
  1020
    # the parse, used here to override blacklisted tests.
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
  1021
    whitelist = optcopy['whitelisted'] or []
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
  1022
    del optcopy['whitelisted']
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
  1023
14447
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1024
    blacklist = optcopy['blacklist'] or []
10904
26d1d23e5a2b Fix --blacklist when --jobs > 1 in run_tests.py.
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 10902
diff changeset
  1025
    del optcopy['blacklist']
14447
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1026
    blacklisted = []
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1027
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1028
    if optcopy['with_hg'] is None:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1029
        optcopy['with_hg'] = os.path.join(BINDIR, "hg")
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
  1030
    optcopy.pop('anycoverage', None)
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
  1031
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1032
    opts = []
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1033
    for opt, value in optcopy.iteritems():
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1034
        name = '--' + opt.replace('_', '-')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1035
        if value is True:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1036
            opts.append(name)
14192
38e387a64f58 run-tests.py: correctly handle list options with parallel tasks
Augie Fackler <durin42@gmail.com>
parents: 14134
diff changeset
  1037
        elif isinstance(value, list):
38e387a64f58 run-tests.py: correctly handle list options with parallel tasks
Augie Fackler <durin42@gmail.com>
parents: 14134
diff changeset
  1038
            for v in value:
38e387a64f58 run-tests.py: correctly handle list options with parallel tasks
Augie Fackler <durin42@gmail.com>
parents: 14134
diff changeset
  1039
                opts.append(name + '=' + str(v))
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1040
        elif value is not None:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1041
            opts.append(name + '=' + str(value))
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1042
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1043
    tests.reverse()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1044
    jobs = [[] for j in xrange(options.jobs)]
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1045
    while tests:
8161
1bb8a75fceb3 run-tests: cosmetics
Simon Heimberg <simohe@besonet.ch>
parents: 8116
diff changeset
  1046
        for job in jobs:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1047
            if not tests:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1048
                break
14447
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1049
            test = tests.pop()
14493
5cc7905bccc9 run-tests: allow whitelisting tests that should always run
Augie Fackler <durin42@gmail.com>
parents: 14454
diff changeset
  1050
            if test not in whitelist and test in blacklist:
14447
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1051
                blacklisted.append(test)
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1052
            else:
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1053
                job.append(test)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1054
    fps = {}
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
  1055
8161
1bb8a75fceb3 run-tests: cosmetics
Simon Heimberg <simohe@besonet.ch>
parents: 8116
diff changeset
  1056
    for j, job in enumerate(jobs):
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1057
        if not job:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1058
            continue
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1059
        rfd, wfd = os.pipe()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1060
        childopts = ['--child=%d' % wfd, '--port=%d' % (options.port + j * 3)]
9899
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
  1061
        childtmp = os.path.join(HGTMP, 'child%d' % j)
be574a37a8ae run-tests: give each child its own tmp dir (issue1911)
Greg Ward <greg@gerg.ca>
parents: 9707
diff changeset
  1062
        childopts += ['--tmpdir', childtmp]
8096
a110d7a20f3f run-tests: upper-case global PYTHON variable
Martin Geisler <mg@lazybytes.net>
parents: 8095
diff changeset
  1063
        cmdline = [PYTHON, sys.argv[0]] + opts + childopts + job
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1064
        vlog(' '.join(cmdline))
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1065
        fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1066
        os.close(wfd)
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
  1067
    signal.signal(signal.SIGINT, signal.SIG_IGN)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1068
    failures = 0
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1069
    tested, skipped, failed = 0, 0, 0
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
  1070
    skips = []
6244
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
  1071
    fails = []
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1072
    while fps:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1073
        pid, status = os.wait()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1074
        fp = fps.pop(pid)
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
  1075
        l = fp.read().splitlines()
10336
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
  1076
        try:
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
  1077
            test, skip, fail = map(int, l[:3])
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
  1078
        except ValueError:
bc9a3bb267fa run-tests: kill daemons on ^C with -j.
Brendan Cully <brendan@kublai.com>
parents: 10300
diff changeset
  1079
            test, skip, fail = 0, 0, 0
6244
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
  1080
        split = -fail or len(l)
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
  1081
        for s in l[3:split]:
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
  1082
            skips.append(s.split(" ", 1))
6244
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
  1083
        for s in l[split:]:
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
  1084
            fails.append(s.split(" ", 1))
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1085
        tested += test
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1086
        skipped += skip
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1087
        failed += fail
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1088
        vlog('pid %d exited, status %d' % (pid, status))
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1089
        failures |= status
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
  1090
    print
14447
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1091
    skipped += len(blacklisted)
9580
25858f9e65e8 run-tests: add --noskips option
Matt Mackall <mpm@selenic.com>
parents: 9408
diff changeset
  1092
    if not options.noskips:
25858f9e65e8 run-tests: add --noskips option
Matt Mackall <mpm@selenic.com>
parents: 9408
diff changeset
  1093
        for s in skips:
25858f9e65e8 run-tests: add --noskips option
Matt Mackall <mpm@selenic.com>
parents: 9408
diff changeset
  1094
            print "Skipped %s: %s" % (s[0], s[1])
14447
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1095
        for s in blacklisted:
f63b7fb4b5f6 run-tests: fix --blacklist with jobs > 1
Idan Kamara <idankk86@gmail.com>
parents: 14446
diff changeset
  1096
            print "Skipped %s: blacklisted" % s
6244
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
  1097
    for s in fails:
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
  1098
        print "Failed %s: %s" % (s[0], s[1])
6982
9fc5bf4adbcf imported patch test-check
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6681
diff changeset
  1099
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1100
    _checkhglib("Tested")
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
  1101
    print "# Ran %d tests, %d skipped, %d failed." % (
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1102
        tested, skipped, failed)
10648
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
  1103
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
  1104
    if options.anycoverage:
58128004cca1 tests: use external coverage, mandate newer version
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents: 10413
diff changeset
  1105
        outputcoverage(options)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1106
    sys.exit(failures != 0)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1107
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
  1108
results = dict(p=[], f=[], s=[], i=[])
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
  1109
resultslock = threading.Lock()
14002
a738c30d4b18 run-tests: add a lock for console I/O
Matt Mackall <mpm@selenic.com>
parents: 14001
diff changeset
  1110
iolock = threading.Lock()
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
  1111
13995
b29b7cbc252f run-tests: move test loop into a helper function
Matt Mackall <mpm@selenic.com>
parents: 13994
diff changeset
  1112
def runqueue(options, tests, results):
b29b7cbc252f run-tests: move test loop into a helper function
Matt Mackall <mpm@selenic.com>
parents: 13994
diff changeset
  1113
    for test in tests:
14000
636a6f5aa2cd run-tests: add locking on results struct
Matt Mackall <mpm@selenic.com>
parents: 13999
diff changeset
  1114
        ret = runone(options, test)
13995
b29b7cbc252f run-tests: move test loop into a helper function
Matt Mackall <mpm@selenic.com>
parents: 13994
diff changeset
  1115
        if options.first and ret is not None and not ret:
b29b7cbc252f run-tests: move test loop into a helper function
Matt Mackall <mpm@selenic.com>
parents: 13994
diff changeset
  1116
            break
b29b7cbc252f run-tests: move test loop into a helper function
Matt Mackall <mpm@selenic.com>
parents: 13994
diff changeset
  1117
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1118
def runtests(options, tests):
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1119
    global DAEMON_PIDS, HGRCPATH
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1120
    DAEMON_PIDS = os.environ["DAEMON_PIDS"] = os.path.join(HGTMP, 'daemon.pids')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1121
    HGRCPATH = os.environ["HGRCPATH"] = os.path.join(HGTMP, '.hgrc')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1122
2258
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
  1123
    try:
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1124
        if INST:
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
  1125
            installhg(options)
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1126
            _checkhglib("Testing")
6982
9fc5bf4adbcf imported patch test-check
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6681
diff changeset
  1127
3625
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1128
        if options.restart:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1129
            orig = list(tests)
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1130
            while tests:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1131
                if os.path.exists(tests[0] + ".err"):
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1132
                    break
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1133
                tests.pop(0)
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1134
            if not tests:
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1135
                print "running all tests"
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1136
                tests = orig
2133
4334be196f8d Tidyups for run-tests.py inc. try/finally cleanup and allow tests to be specified on command line
Stephen Darnell <stephen@darnell.plus.com>
parents: 2110
diff changeset
  1137
13995
b29b7cbc252f run-tests: move test loop into a helper function
Matt Mackall <mpm@selenic.com>
parents: 13994
diff changeset
  1138
        runqueue(options, tests, results)
3625
cc0cd5942223 tests: add -R switch
Matt Mackall <mpm@selenic.com>
parents: 3624
diff changeset
  1139
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1140
        failed = len(results['f'])
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1141
        tested = len(results['p']) + failed
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1142
        skipped = len(results['s'])
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1143
        ignored = len(results['i'])
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1144
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1145
        if options.child:
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1146
            fp = os.fdopen(options.child, 'w')
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1147
            fp.write('%d\n%d\n%d\n' % (tested, skipped, failed))
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1148
            for s in results['s']:
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5685
diff changeset
  1149
                fp.write("%s %s\n" % s)
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1150
            for s in results['f']:
6244
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
  1151
                fp.write("%s %s\n" % s)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1152
            fp.close()
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1153
        else:
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
  1154
            print
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1155
            for s in results['s']:
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
  1156
                print "Skipped %s: %s" % s
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1157
            for s in results['f']:
6244
b36774d0fce1 run-tests.py: add a summary of failed tests at the end
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6212
diff changeset
  1158
                print "Failed %s: %s" % s
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1159
            _checkhglib("Tested")
5470
8374f3f081f2 tests: tidy up reporting of skipped tests
Matt Mackall <mpm@selenic.com>
parents: 5388
diff changeset
  1160
            print "# Ran %d tests, %d skipped, %d failed." % (
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1161
                tested, skipped + ignored, failed)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1162
8095
f5428d4ffd97 run-tests: reduce global variables set by parse_args().
Greg Ward <greg-hg@gerg.ca>
parents: 8094
diff changeset
  1163
        if options.anycoverage:
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
  1164
            outputcoverage(options)
2258
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
  1165
    except KeyboardInterrupt:
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
  1166
        failed = True
7e43d68f3900 catch KeyboardInterrupt in run-tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2247
diff changeset
  1167
        print "\ninterrupted!"
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1168
13994
f31a5b7f5c07 run-tests: use a results dict
Matt Mackall <mpm@selenic.com>
parents: 13993
diff changeset
  1169
    if failed:
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1170
        sys.exit(1)
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1171
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1172
def main():
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
  1173
    (options, args) = parseargs()
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1174
    if not options.child:
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1175
        os.umask(022)
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
  1176
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
  1177
        checktools()
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
  1178
12677
9848a94e2ad6 run-tests.py: do not install hg when the tests do no exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12643
diff changeset
  1179
    if len(args) == 0:
9848a94e2ad6 run-tests.py: do not install hg when the tests do no exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12643
diff changeset
  1180
        args = os.listdir(".")
9848a94e2ad6 run-tests.py: do not install hg when the tests do no exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12643
diff changeset
  1181
    args.sort()
9848a94e2ad6 run-tests.py: do not install hg when the tests do no exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12643
diff changeset
  1182
13989
55ba68a4dd28 run-tests: move existence/name format check into runone
Matt Mackall <mpm@selenic.com>
parents: 13988
diff changeset
  1183
    tests = args
12677
9848a94e2ad6 run-tests.py: do not install hg when the tests do no exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 12643
diff changeset
  1184
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1185
    # Reset some environment variables to well-known values so that
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1186
    # the tests produce repeatable output.
9931
a0680daed7b2 run-tests: LANGUAGE may make tests fail
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 9707
diff changeset
  1187
    os.environ['LANG'] = os.environ['LC_ALL'] = os.environ['LANGUAGE'] = 'C'
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1188
    os.environ['TZ'] = 'GMT'
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1189
    os.environ["EMAIL"] = "Foo Bar <foo.bar@example.com>"
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1190
    os.environ['CDPATH'] = ''
9913
e3237af51def run-tests: always set $COLUMNS, fix running tests under emacs shell
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9899
diff changeset
  1191
    os.environ['COLUMNS'] = '80'
10750
92ff2d0b751a run-tests: make sure GREP_OPTIONS isn't set
Brodie Rao <brodie@bitheap.org>
parents: 10648
diff changeset
  1192
    os.environ['GREP_OPTIONS'] = ''
10154
d4a62b6d4a58 run-tests.py: clears http_proxy for all tests
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 9939
diff changeset
  1193
    os.environ['http_proxy'] = ''
15344
ec50fe3f7a76 run-tests: make sure no_proxy/NO_PROXY are empty to fix test-http-proxy.t
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15248
diff changeset
  1194
    os.environ['no_proxy'] = ''
ec50fe3f7a76 run-tests: make sure no_proxy/NO_PROXY are empty to fix test-http-proxy.t
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15248
diff changeset
  1195
    os.environ['NO_PROXY'] = ''
16613
6a7ce975edd6 tests: set a standard terminal type
Matt Mackall <mpm@selenic.com>
parents: 16538
diff changeset
  1196
    os.environ['TERM'] = 'xterm'
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
  1197
10902
4eb6311d217a run-tests.py: reset env variables set by hooks
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10648
diff changeset
  1198
    # unset env related to hooks
4eb6311d217a run-tests.py: reset env variables set by hooks
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10648
diff changeset
  1199
    for k in os.environ.keys():
4eb6311d217a run-tests.py: reset env variables set by hooks
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10648
diff changeset
  1200
        if k.startswith('HG_'):
10923
1782278bab8a run-tests.py: can't remove from os.environ on solaris
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10904
diff changeset
  1201
            # can't remove on solaris
1782278bab8a run-tests.py: can't remove from os.environ on solaris
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10904
diff changeset
  1202
            os.environ[k] = ''
10902
4eb6311d217a run-tests.py: reset env variables set by hooks
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10648
diff changeset
  1203
            del os.environ[k]
17541
3e3dfa7e6864 tests: unset variable HG if it is set
Simon Heimberg <simohe@besonet.ch>
parents: 17464
diff changeset
  1204
    if 'HG' in os.environ:
3e3dfa7e6864 tests: unset variable HG if it is set
Simon Heimberg <simohe@besonet.ch>
parents: 17464
diff changeset
  1205
        # can't remove on solaris
3e3dfa7e6864 tests: unset variable HG if it is set
Simon Heimberg <simohe@besonet.ch>
parents: 17464
diff changeset
  1206
        os.environ['HG'] = ''
3e3dfa7e6864 tests: unset variable HG if it is set
Simon Heimberg <simohe@besonet.ch>
parents: 17464
diff changeset
  1207
        del os.environ['HG']
10902
4eb6311d217a run-tests.py: reset env variables set by hooks
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10648
diff changeset
  1208
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1209
    global TESTDIR, HGTMP, INST, BINDIR, PYTHONDIR, COVERAGE_FILE
16897
2774576dee4d tests/run-tests: avoid C:/ in arguments
Adrian Buehlmann <adrian@cadifra.com>
parents: 16890
diff changeset
  1210
    TESTDIR = os.environ["TESTDIR"] = os.getcwd()
9706
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1211
    if options.tmpdir:
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1212
        options.keep_tmpdir = True
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1213
        tmpdir = options.tmpdir
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1214
        if os.path.exists(tmpdir):
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1215
            # Meaning of tmpdir has changed since 1.3: we used to create
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1216
            # HGTMP inside tmpdir; now HGTMP is tmpdir.  So fail if
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1217
            # tmpdir already exists.
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1218
            sys.exit("error: temp dir %r already exists" % tmpdir)
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1219
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1220
            # Automatically removing tmpdir sounds convenient, but could
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1221
            # really annoy anyone in the habit of using "--tmpdir=/tmp"
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1222
            # or "--tmpdir=$HOME".
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1223
            #vlog("# Removing temp dir", tmpdir)
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1224
            #shutil.rmtree(tmpdir)
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1225
        os.makedirs(tmpdir)
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1226
    else:
16890
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
  1227
        d = None
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
  1228
        if os.name == 'nt':
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
  1229
            # without this, we get the default temp dir location, but
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
  1230
            # in all lowercase, which causes troubles with paths (issue3490)
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
  1231
            d = os.getenv('TMP')
4d95878712ad tests/run-tests: use $TMP on Windows (issue3490)
Adrian Buehlmann <adrian@cadifra.com>
parents: 16842
diff changeset
  1232
        tmpdir = tempfile.mkdtemp('', 'hgtests.', d)
9706
f8b4df4b033d run-tests: make --tmpdir option more useful.
Greg Ward <greg-hg@gerg.ca>
parents: 9582
diff changeset
  1233
    HGTMP = os.environ['HGTMP'] = os.path.realpath(tmpdir)
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1234
    DAEMON_PIDS = None
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1235
    HGRCPATH = None
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
  1236
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1237
    os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1238
    os.environ["HGMERGE"] = "internal:merge"
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1239
    os.environ["HGUSER"]   = "test"
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1240
    os.environ["HGENCODING"] = "ascii"
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1241
    os.environ["HGENCODINGMODE"] = "strict"
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1242
    os.environ["HGPORT"] = str(options.port)
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1243
    os.environ["HGPORT1"] = str(options.port + 1)
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1244
    os.environ["HGPORT2"] = str(options.port + 2)
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
  1245
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1246
    if options.with_hg:
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1247
        INST = None
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1248
        BINDIR = os.path.dirname(os.path.realpath(options.with_hg))
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1249
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1250
        # This looks redundant with how Python initializes sys.path from
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1251
        # the location of the script being executed.  Needed because the
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1252
        # "hg" specified by --with-hg is not the only Python script
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1253
        # executed in the test suite that needs to import 'mercurial'
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1254
        # ... which means it's not really redundant at all.
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1255
        PYTHONDIR = BINDIR
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1256
    else:
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1257
        INST = os.path.join(HGTMP, "install")
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1258
        BINDIR = os.environ["BINDIR"] = os.path.join(INST, "bin")
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1259
        PYTHONDIR = os.path.join(INST, "lib", "python")
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1260
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1261
    os.environ["BINDIR"] = BINDIR
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1262
    os.environ["PYTHON"] = PYTHON
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1263
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1264
    if not options.child:
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1265
        path = [BINDIR] + os.environ["PATH"].split(os.pathsep)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1266
        os.environ["PATH"] = os.pathsep.join(path)
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1267
8724
6e41d3c5619f Unbreak run-tests support for out-of-tree extensions
Brendan Cully <brendan@kublai.com>
parents: 8696
diff changeset
  1268
        # Include TESTDIR in PYTHONPATH so that out-of-tree extensions
6e41d3c5619f Unbreak run-tests support for out-of-tree extensions
Brendan Cully <brendan@kublai.com>
parents: 8696
diff changeset
  1269
        # can run .../tests/run-tests.py test-foo where test-foo
6e41d3c5619f Unbreak run-tests support for out-of-tree extensions
Brendan Cully <brendan@kublai.com>
parents: 8696
diff changeset
  1270
        # adds an extension to HGRC
6e41d3c5619f Unbreak run-tests support for out-of-tree extensions
Brendan Cully <brendan@kublai.com>
parents: 8696
diff changeset
  1271
        pypath = [PYTHONDIR, TESTDIR]
8687
78ab2a12b4d9 run-tests: don't replace PYTHONPATH, just augment it.
Greg Ward <greg-hg@gerg.ca>
parents: 8674
diff changeset
  1272
        # We have to augment PYTHONPATH, rather than simply replacing
78ab2a12b4d9 run-tests: don't replace PYTHONPATH, just augment it.
Greg Ward <greg-hg@gerg.ca>
parents: 8674
diff changeset
  1273
        # it, in case external libraries are only available via current
78ab2a12b4d9 run-tests: don't replace PYTHONPATH, just augment it.
Greg Ward <greg-hg@gerg.ca>
parents: 8674
diff changeset
  1274
        # PYTHONPATH.  (In particular, the Subversion bindings on OS X
78ab2a12b4d9 run-tests: don't replace PYTHONPATH, just augment it.
Greg Ward <greg-hg@gerg.ca>
parents: 8674
diff changeset
  1275
        # are in /opt/subversion.)
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
  1276
        oldpypath = os.environ.get(IMPL_PATH)
8724
6e41d3c5619f Unbreak run-tests support for out-of-tree extensions
Brendan Cully <brendan@kublai.com>
parents: 8696
diff changeset
  1277
        if oldpypath:
6e41d3c5619f Unbreak run-tests support for out-of-tree extensions
Brendan Cully <brendan@kublai.com>
parents: 8696
diff changeset
  1278
            pypath.append(oldpypath)
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
  1279
        os.environ[IMPL_PATH] = os.pathsep.join(pypath)
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1280
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1281
    COVERAGE_FILE = os.path.join(TESTDIR, ".coverage")
8093
70d8f70264c4 run-tests: move bits of main program so it's all at the bottom.
Greg Ward <greg-hg@gerg.ca>
parents: 8092
diff changeset
  1282
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1283
    vlog("# Using TESTDIR", TESTDIR)
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1284
    vlog("# Using HGTMP", HGTMP)
8674
0941ee76489e run-tests: redefine --with-hg so it takes the 'hg' script to run.
Greg Ward <greg-hg@gerg.ca>
parents: 8673
diff changeset
  1285
    vlog("# Using PATH", os.environ["PATH"])
10758
2ed667a9dfcb tests: adapt the test runner to work with jython
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 10750
diff changeset
  1286
    vlog("# Using", IMPL_PATH, os.environ[IMPL_PATH])
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1287
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1288
    try:
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1289
        if len(tests) > 1 and options.jobs > 1:
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1290
            runchildren(options, tests)
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1291
        else:
8672
d6b243731763 run-tests: factor out _checkhglib() to check import path of 'mercurial'.
Greg Ward <greg-hg@gerg.ca>
parents: 8671
diff changeset
  1292
            runtests(options, tests)
8094
60a9e3cf0cf4 run-tests: factor out main(); reduce use of globals a bit.
Greg Ward <greg-hg@gerg.ca>
parents: 8093
diff changeset
  1293
    finally:
16346
48692b416fbc tests: shorten post-test sleeps
Matt Mackall <mpm@selenic.com>
parents: 15942
diff changeset
  1294
        time.sleep(.1)
8097
eea3c1a8fba8 run-tests: removed some underscores (coding style)
Martin Geisler <mg@lazybytes.net>
parents: 8096
diff changeset
  1295
        cleanup(options)
5384
e3a0c092b4e2 Allow tests to run in parallel.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5383
diff changeset
  1296
13347
ce07defe7d9f run-tests: loadable as module
Simon Heimberg <simohe@besonet.ch>
parents: 13031
diff changeset
  1297
if __name__ == '__main__':
ce07defe7d9f run-tests: loadable as module
Simon Heimberg <simohe@besonet.ch>
parents: 13031
diff changeset
  1298
    main()