tests/hghave.py
author Manuel Jacob <me@manueljacob.de>
Wed, 08 Jul 2020 08:57:21 +0200
branchstable
changeset 45048 2c0043977b6d
parent 44640 51ffb2a6c08a
child 45083 3a6ec080b521
permissions -rw-r--r--
archival: abort if compression method is unavailable `tarfile.CompressionError` is documented to be the "exception for unavailable compression methods". Also, make tests conditional on whether the lzma module is available or not.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43095
fb41ea2ea076 formatting: introduce a `test-check-format-black.t` that enforce formatting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43076
diff changeset
     1
from __future__ import absolute_import, print_function
27298
e1f55b50edcb tests: use absolute_import in hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27114
diff changeset
     2
43352
14e3be17e5f5 hghave: verify we have a black that is new enough for our format
Augie Fackler <augie@google.com>
parents: 43347
diff changeset
     3
import distutils.version
26137
99e8a9ff1f5f hghave: use subprocess instead of os.popen
Augie Fackler <augie@google.com>
parents: 26111
diff changeset
     4
import os
5252
c0281c6b40b0 hghave: wrap command output matching
Patrick Mezard <pmezard@gmail.com>
parents: 5218
diff changeset
     5
import re
22994
840be5ca03e1 cmdserver: add service that listens on unix domain socket and forks process
Yuya Nishihara <yuya@tcha.org>
parents: 22579
diff changeset
     6
import socket
26137
99e8a9ff1f5f hghave: use subprocess instead of os.popen
Augie Fackler <augie@google.com>
parents: 26111
diff changeset
     7
import stat
99e8a9ff1f5f hghave: use subprocess instead of os.popen
Augie Fackler <augie@google.com>
parents: 26111
diff changeset
     8
import subprocess
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
     9
import sys
5072
7e2385a31933 hghave: detect executable permission availability.
Patrick Mezard <pmezard@gmail.com>
parents: 5070
diff changeset
    10
import tempfile
4881
c51c9bc4579d Add hghave utility and run-tests.py support.
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    11
5090
bf60e4bd6672 hghave: prefix temporary files with "hg-hghave-"
Patrick Mezard <pmezard@gmail.com>
parents: 5084
diff changeset
    12
tempprefix = 'hg-hghave-'
bf60e4bd6672 hghave: prefix temporary files with "hg-hghave-"
Patrick Mezard <pmezard@gmail.com>
parents: 5084
diff changeset
    13
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    14
checks = {
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    15
    "true": (lambda: True, "yak shaving"),
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    16
    "false": (lambda: False, "nail clipper"),
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    17
}
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    18
41003
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    19
try:
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    20
    import msvcrt
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    21
41003
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    22
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    23
    msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    24
except ImportError:
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    25
    pass
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    26
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    27
stdout = getattr(sys.stdout, 'buffer', sys.stdout)
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    28
stderr = getattr(sys.stderr, 'buffer', sys.stderr)
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
    29
39759
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    30
if sys.version_info[0] >= 3:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    31
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44279
diff changeset
    32
    def _sys2bytes(p):
39759
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    33
        if p is None:
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    34
            return p
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    35
        return p.encode('utf-8')
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    36
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44279
diff changeset
    37
    def _bytes2sys(p):
39759
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    38
        if p is None:
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    39
            return p
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    40
        return p.decode('utf-8')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    41
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    42
39759
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    43
else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    44
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44279
diff changeset
    45
    def _sys2bytes(p):
39759
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    46
        return p
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    47
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44279
diff changeset
    48
    _bytes2sys = _sys2bytes
39759
aeb2812f304d py3: fix a type error in hghave.has_hardlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 39648
diff changeset
    49
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    50
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    51
def check(name, desc):
28757
93bf61913f33 hghave: add docstring for check
timeless <timeless@mozdev.org>
parents: 28756
diff changeset
    52
    """Registers a check function for a feature."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    53
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    54
    def decorator(func):
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    55
        checks[name] = (func, desc)
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    56
        return func
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    57
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    58
    return decorator
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
    59
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    60
28758
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    61
def checkvers(name, desc, vers):
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    62
    """Registers a check function for each of a series of versions.
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    63
43113
37af48031d6f hghave: document format for version feature checks as <name><vers>, no dots
Kyle Lippincott <spectral@google.com>
parents: 43095
diff changeset
    64
    vers can be a list or an iterator.
37af48031d6f hghave: document format for version feature checks as <name><vers>, no dots
Kyle Lippincott <spectral@google.com>
parents: 43095
diff changeset
    65
37af48031d6f hghave: document format for version feature checks as <name><vers>, no dots
Kyle Lippincott <spectral@google.com>
parents: 43095
diff changeset
    66
    Produces a series of feature checks that have the form <name><vers> without
37af48031d6f hghave: document format for version feature checks as <name><vers>, no dots
Kyle Lippincott <spectral@google.com>
parents: 43095
diff changeset
    67
    any punctuation (even if there's punctuation in 'vers'; i.e. this produces
37af48031d6f hghave: document format for version feature checks as <name><vers>, no dots
Kyle Lippincott <spectral@google.com>
parents: 43095
diff changeset
    68
    'py38', not 'py3.8' or 'py-38')."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    69
28758
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    70
    def decorator(func):
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    71
        def funcv(v):
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    72
            def f():
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    73
                return func(v)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    74
28758
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    75
            return f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    76
28758
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    77
        for v in vers:
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    78
            v = str(v)
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    79
            f = funcv(v)
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    80
            checks['%s%s' % (name, v.replace('.', ''))] = (f, desc % v)
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    81
        return func
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    82
28758
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    83
    return decorator
44e076a12bd3 hghave: add checkvers function
timeless <timeless@mozdev.org>
parents: 28757
diff changeset
    84
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
    85
26067
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    86
def checkfeatures(features):
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    87
    result = {
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    88
        'error': [],
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    89
        'missing': [],
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    90
        'skipped': [],
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    91
    }
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    92
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    93
    for feature in features:
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    94
        negate = feature.startswith('no-')
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    95
        if negate:
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    96
            feature = feature[3:]
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    97
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    98
        if feature not in checks:
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
    99
            result['missing'].append(feature)
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   100
            continue
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   101
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   102
        check, desc = checks[feature]
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   103
        try:
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   104
            available = check()
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   105
        except Exception:
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   106
            result['error'].append('hghave check failed: %s' % feature)
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   107
            continue
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   108
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   109
        if not negate and not available:
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   110
            result['skipped'].append('missing feature: %s' % desc)
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   111
        elif negate and available:
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   112
            result['skipped'].append('system supports %s' % desc)
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   113
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   114
    return result
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   115
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   116
26068
05e7f57c74ac hghave: remove quiet option
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26067
diff changeset
   117
def require(features):
26067
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   118
    """Require that features are available, exiting if not."""
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   119
    result = checkfeatures(features)
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   120
26068
05e7f57c74ac hghave: remove quiet option
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26067
diff changeset
   121
    for missing in result['missing']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   122
        stderr.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   123
            ('skipped: unknown feature: %s\n' % missing).encode('utf-8')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   124
        )
26068
05e7f57c74ac hghave: remove quiet option
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26067
diff changeset
   125
    for msg in result['skipped']:
41003
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
   126
        stderr.write(('skipped: %s\n' % msg).encode('utf-8'))
26068
05e7f57c74ac hghave: remove quiet option
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26067
diff changeset
   127
    for msg in result['error']:
41003
87c98ffbc8c7 py3: use bytes stdout in hghave.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 40453
diff changeset
   128
        stderr.write(('%s\n' % msg).encode('utf-8'))
26067
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   129
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   130
    if result['missing']:
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   131
        sys.exit(2)
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   132
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   133
    if result['skipped'] or result['error']:
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   134
        sys.exit(1)
8107c308ff22 hghave: move feature checking into hghave.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25859
diff changeset
   135
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   136
5302
961876838de0 hghave: detect cvs and cvsps availability
Patrick Mezard <pmezard@gmail.com>
parents: 5252
diff changeset
   137
def matchoutput(cmd, regexp, ignorestatus=False):
27114
a636a46f5094 hghave.py: fix matchoutput documentation
timeless <timeless@mozdev.org>
parents: 26842
diff changeset
   138
    """Return the match object if cmd executes successfully and its output
5252
c0281c6b40b0 hghave: wrap command output matching
Patrick Mezard <pmezard@gmail.com>
parents: 5218
diff changeset
   139
    is matched by the supplied regular expression.
c0281c6b40b0 hghave: wrap command output matching
Patrick Mezard <pmezard@gmail.com>
parents: 5218
diff changeset
   140
    """
c0281c6b40b0 hghave: wrap command output matching
Patrick Mezard <pmezard@gmail.com>
parents: 5218
diff changeset
   141
    r = re.compile(regexp)
41366
fabb0224a599 hghave: let OSError with ENOENT through like any other
Martin von Zweigbergk <martinvonz@google.com>
parents: 41003
diff changeset
   142
    p = subprocess.Popen(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   143
        cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   144
    )
38179
6fb76897e066 hghave: avoid a deadlock reading the child process's output
Matt Harbison <matt_harbison@yahoo.com>
parents: 37415
diff changeset
   145
    s = p.communicate()[0]
6fb76897e066 hghave: avoid a deadlock reading the child process's output
Matt Harbison <matt_harbison@yahoo.com>
parents: 37415
diff changeset
   146
    ret = p.returncode
26137
99e8a9ff1f5f hghave: use subprocess instead of os.popen
Augie Fackler <augie@google.com>
parents: 26111
diff changeset
   147
    return (ignorestatus or not ret) and r.search(s)
5252
c0281c6b40b0 hghave: wrap command output matching
Patrick Mezard <pmezard@gmail.com>
parents: 5218
diff changeset
   148
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   149
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   150
@check("baz", "GNU Arch baz client")
6078
ebc23d34102f convert: added gnu arch (baz) tests
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6063
diff changeset
   151
def has_baz():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   152
    return matchoutput('baz --version 2>&1', br'baz Bazaar version')
6078
ebc23d34102f convert: added gnu arch (baz) tests
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6063
diff changeset
   153
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   154
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   155
@check("bzr", "Canonical's Bazaar client")
7053
209ef5f3534c convert: add bzr source
Marek Kubica <marek@xivilization.net>
parents: 6998
diff changeset
   156
def has_bzr():
7061
8b874f8cd29f tests: check for bzr support by importing bzrlib
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7053
diff changeset
   157
    try:
8b874f8cd29f tests: check for bzr support by importing bzrlib
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7053
diff changeset
   158
        import bzrlib
29866
a5ce381a8da0 hghave: make bzr checks stricter
timeless <timeless@mozdev.org>
parents: 29843
diff changeset
   159
        import bzrlib.bzrdir
a5ce381a8da0 hghave: make bzr checks stricter
timeless <timeless@mozdev.org>
parents: 29843
diff changeset
   160
        import bzrlib.errors
a5ce381a8da0 hghave: make bzr checks stricter
timeless <timeless@mozdev.org>
parents: 29843
diff changeset
   161
        import bzrlib.revision
29903
fe81c953f369 hghave: fix has_bzr() to not try to import RevisionSpec as module
Yuya Nishihara <yuya@tcha.org>
parents: 29873
diff changeset
   162
        import bzrlib.revisionspec
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   163
29903
fe81c953f369 hghave: fix has_bzr() to not try to import RevisionSpec as module
Yuya Nishihara <yuya@tcha.org>
parents: 29873
diff changeset
   164
        bzrlib.revisionspec.RevisionSpec
16684
e617876fe82d cleanup: "x != None" -> "x is not None"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
   165
        return bzrlib.__doc__ is not None
29903
fe81c953f369 hghave: fix has_bzr() to not try to import RevisionSpec as module
Yuya Nishihara <yuya@tcha.org>
parents: 29873
diff changeset
   166
    except (AttributeError, ImportError):
7061
8b874f8cd29f tests: check for bzr support by importing bzrlib
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7053
diff changeset
   167
        return False
7053
209ef5f3534c convert: add bzr source
Marek Kubica <marek@xivilization.net>
parents: 6998
diff changeset
   168
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   169
28760
cef86c3c82d2 hghave: use checkvers for bzr114
timeless <timeless@mozdev.org>
parents: 28759
diff changeset
   170
@checkvers("bzr", "Canonical's Bazaar client >= %s", (1.14,))
cef86c3c82d2 hghave: use checkvers for bzr114
timeless <timeless@mozdev.org>
parents: 28759
diff changeset
   171
def has_bzr_range(v):
42215
07e479ef7c96 hghave: deal with "rc" release
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41842
diff changeset
   172
    major, minor = v.split('rc')[0].split('.')[0:2]
8126
13b36eb14324 convert/bzr: handle files replaced by directories (issue1623)
Patrick Mezard <pmezard@gmail.com>
parents: 7823
diff changeset
   173
    try:
13b36eb14324 convert/bzr: handle files replaced by directories (issue1623)
Patrick Mezard <pmezard@gmail.com>
parents: 7823
diff changeset
   174
        import bzrlib
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   175
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   176
        return bzrlib.__doc__ is not None and bzrlib.version_info[:2] >= (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   177
            int(major),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   178
            int(minor),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   179
        )
8126
13b36eb14324 convert/bzr: handle files replaced by directories (issue1623)
Patrick Mezard <pmezard@gmail.com>
parents: 7823
diff changeset
   180
    except ImportError:
13b36eb14324 convert/bzr: handle files replaced by directories (issue1623)
Patrick Mezard <pmezard@gmail.com>
parents: 7823
diff changeset
   181
        return False
13b36eb14324 convert/bzr: handle files replaced by directories (issue1623)
Patrick Mezard <pmezard@gmail.com>
parents: 7823
diff changeset
   182
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   183
28880
f74eed3115fd hghave: add "chg" flag to skip tests that can't be compatible with chg
Yuya Nishihara <yuya@tcha.org>
parents: 28796
diff changeset
   184
@check("chg", "running with chg")
f74eed3115fd hghave: add "chg" flag to skip tests that can't be compatible with chg
Yuya Nishihara <yuya@tcha.org>
parents: 28796
diff changeset
   185
def has_chg():
f74eed3115fd hghave: add "chg" flag to skip tests that can't be compatible with chg
Yuya Nishihara <yuya@tcha.org>
parents: 28796
diff changeset
   186
    return 'CHGHG' in os.environ
f74eed3115fd hghave: add "chg" flag to skip tests that can't be compatible with chg
Yuya Nishihara <yuya@tcha.org>
parents: 28796
diff changeset
   187
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   188
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   189
@check("cvs", "cvs client/server")
5302
961876838de0 hghave: detect cvs and cvsps availability
Patrick Mezard <pmezard@gmail.com>
parents: 5252
diff changeset
   190
def has_cvs():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   191
    re = br'Concurrent Versions System.*?server'
15568
08635f4e44be tests: skip cvs tests with msys on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15567
diff changeset
   192
    return matchoutput('cvs --version 2>&1', re) and not has_msys()
5302
961876838de0 hghave: detect cvs and cvsps availability
Patrick Mezard <pmezard@gmail.com>
parents: 5252
diff changeset
   193
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   194
28756
45954a251a40 hghave: update cvs112 description
timeless <timeless@mozdev.org>
parents: 28591
diff changeset
   195
@check("cvs112", "cvs client/server 1.12.* (not cvsnt)")
18285
9589227657bc hghave: introduce a test (unused) for cvs >= 1.12
Bryan O'Sullivan <bryano@fb.com>
parents: 17707
diff changeset
   196
def has_cvs112():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   197
    re = br'Concurrent Versions System \(CVS\) 1.12.*?server'
18285
9589227657bc hghave: introduce a test (unused) for cvs >= 1.12
Bryan O'Sullivan <bryano@fb.com>
parents: 17707
diff changeset
   198
    return matchoutput('cvs --version 2>&1', re) and not has_msys()
9589227657bc hghave: introduce a test (unused) for cvs >= 1.12
Bryan O'Sullivan <bryano@fb.com>
parents: 17707
diff changeset
   199
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   200
28796
08a686a4a0a2 hghave: add cvsnt
timeless <timeless@mozdev.org>
parents: 28779
diff changeset
   201
@check("cvsnt", "cvsnt client/server")
08a686a4a0a2 hghave: add cvsnt
timeless <timeless@mozdev.org>
parents: 28779
diff changeset
   202
def has_cvsnt():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   203
    re = br'Concurrent Versions System \(CVSNT\) (\d+).(\d+).*\(client/server\)'
28796
08a686a4a0a2 hghave: add cvsnt
timeless <timeless@mozdev.org>
parents: 28779
diff changeset
   204
    return matchoutput('cvsnt --version 2>&1', re)
08a686a4a0a2 hghave: add cvsnt
timeless <timeless@mozdev.org>
parents: 28779
diff changeset
   205
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   206
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   207
@check("darcs", "darcs client")
5410
2daecf3d2582 hghave: detect darcs client
Patrick Mezard <pmezard@gmail.com>
parents: 5409
diff changeset
   208
def has_darcs():
30297
d4db88a26ad5 hghave: check darcs version more strictly
Yuya Nishihara <yuya@tcha.org>
parents: 30242
diff changeset
   209
    return matchoutput('darcs --version', br'\b2\.([2-9]|\d{2})', True)
5410
2daecf3d2582 hghave: detect darcs client
Patrick Mezard <pmezard@gmail.com>
parents: 5409
diff changeset
   210
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   211
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   212
@check("mtn", "monotone client (>= 1.0)")
6372
8f79820443a4 Add a test for monotone conversion
Patrick Mezard <pmezard@gmail.com>
parents: 6355
diff changeset
   213
def has_mtn():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   214
    return matchoutput('mtn --version', br'monotone', True) and not matchoutput(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   215
        'mtn --version', br'monotone 0\.', True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   216
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   217
6372
8f79820443a4 Add a test for monotone conversion
Patrick Mezard <pmezard@gmail.com>
parents: 6355
diff changeset
   218
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   219
@check("eol-in-paths", "end-of-lines in paths")
5409
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   220
def has_eol_in_paths():
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   221
    try:
16968
456f457e376d tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles
Mads Kiilerich <mads@kiilerich.com>
parents: 16966
diff changeset
   222
        fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix, suffix='\n\r')
5409
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   223
        os.close(fd)
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   224
        os.remove(path)
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   225
        return True
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16685
diff changeset
   226
    except (IOError, OSError):
5409
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   227
        return False
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   228
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   229
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   230
@check("execbit", "executable bit")
5072
7e2385a31933 hghave: detect executable permission availability.
Patrick Mezard <pmezard@gmail.com>
parents: 5070
diff changeset
   231
def has_executablebit():
7e2385a31933 hghave: detect executable permission availability.
Patrick Mezard <pmezard@gmail.com>
parents: 5070
diff changeset
   232
    try:
16320
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   233
        EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
16968
456f457e376d tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles
Mads Kiilerich <mads@kiilerich.com>
parents: 16966
diff changeset
   234
        fh, fn = tempfile.mkstemp(dir='.', prefix=tempprefix)
16320
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   235
        try:
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   236
            os.close(fh)
25658
e93036747902 global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25413
diff changeset
   237
            m = os.stat(fn).st_mode & 0o777
16320
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   238
            new_file_has_exec = m & EXECFLAGS
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   239
            os.chmod(fn, m ^ EXECFLAGS)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   240
            exec_flags_cannot_flip = (os.stat(fn).st_mode & 0o777) == m
16320
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   241
        finally:
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   242
            os.unlink(fn)
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   243
    except (IOError, OSError):
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   244
        # we don't care, the user probably won't be able to commit anyway
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   245
        return False
e11ab387e89c tests: make hghave handle exec bit on Linux with vfat
Matt Mackall <mpm@selenic.com>
parents: 16319
diff changeset
   246
    return not (new_file_has_exec or exec_flags_cannot_flip)
5072
7e2385a31933 hghave: detect executable permission availability.
Patrick Mezard <pmezard@gmail.com>
parents: 5070
diff changeset
   247
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   248
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   249
@check("icasefs", "case insensitive file system")
6806
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   250
def has_icasefs():
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   251
    # Stolen from mercurial.util
16968
456f457e376d tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles
Mads Kiilerich <mads@kiilerich.com>
parents: 16966
diff changeset
   252
    fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix)
6806
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   253
    os.close(fd)
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   254
    try:
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   255
        s1 = os.stat(path)
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   256
        d, b = os.path.split(path)
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   257
        p2 = os.path.join(d, b.upper())
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   258
        if path == p2:
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   259
            p2 = os.path.join(d, b.lower())
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   260
        try:
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   261
            s2 = os.stat(p2)
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   262
            return s2 == s1
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16685
diff changeset
   263
        except OSError:
6806
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   264
            return False
2134d6c09432 Add test for case folding issues
Patrick Mezard <pmezard@gmail.com>
parents: 6626
diff changeset
   265
    finally:
6998
ddfcefab8b97 merge with -stable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6806 6996
diff changeset
   266
        os.remove(path)
ddfcefab8b97 merge with -stable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6806 6996
diff changeset
   267
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   268
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   269
@check("fifo", "named pipes")
5409
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   270
def has_fifo():
16969
6d1673107143 tests/hghave: test that a fifo actually can be created on the filesystem
Mads Kiilerich <mads@kiilerich.com>
parents: 16968
diff changeset
   271
    if getattr(os, "mkfifo", None) is None:
6d1673107143 tests/hghave: test that a fifo actually can be created on the filesystem
Mads Kiilerich <mads@kiilerich.com>
parents: 16968
diff changeset
   272
        return False
6d1673107143 tests/hghave: test that a fifo actually can be created on the filesystem
Mads Kiilerich <mads@kiilerich.com>
parents: 16968
diff changeset
   273
    name = tempfile.mktemp(dir='.', prefix=tempprefix)
6d1673107143 tests/hghave: test that a fifo actually can be created on the filesystem
Mads Kiilerich <mads@kiilerich.com>
parents: 16968
diff changeset
   274
    try:
6d1673107143 tests/hghave: test that a fifo actually can be created on the filesystem
Mads Kiilerich <mads@kiilerich.com>
parents: 16968
diff changeset
   275
        os.mkfifo(name)
6d1673107143 tests/hghave: test that a fifo actually can be created on the filesystem
Mads Kiilerich <mads@kiilerich.com>
parents: 16968
diff changeset
   276
        os.unlink(name)
6d1673107143 tests/hghave: test that a fifo actually can be created on the filesystem
Mads Kiilerich <mads@kiilerich.com>
parents: 16968
diff changeset
   277
        return True
6d1673107143 tests/hghave: test that a fifo actually can be created on the filesystem
Mads Kiilerich <mads@kiilerich.com>
parents: 16968
diff changeset
   278
    except OSError:
6d1673107143 tests/hghave: test that a fifo actually can be created on the filesystem
Mads Kiilerich <mads@kiilerich.com>
parents: 16968
diff changeset
   279
        return False
5074
e86788af599a hghave: detect support for EOL in paths.
Patrick Mezard <pmezard@gmail.com>
parents: 5072
diff changeset
   280
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   281
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   282
@check("killdaemons", 'killdaemons.py support')
17467
448d0c452140 test-http-branchmap: enable on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 17016
diff changeset
   283
def has_killdaemons():
448d0c452140 test-http-branchmap: enable on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 17016
diff changeset
   284
    return True
448d0c452140 test-http-branchmap: enable on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 17016
diff changeset
   285
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   286
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   287
@check("cacheable", "cacheable filesystem")
14927
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14550
diff changeset
   288
def has_cacheable_fs():
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14550
diff changeset
   289
    from mercurial import util
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14550
diff changeset
   290
16968
456f457e376d tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles
Mads Kiilerich <mads@kiilerich.com>
parents: 16966
diff changeset
   291
    fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix)
14927
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14550
diff changeset
   292
    os.close(fd)
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14550
diff changeset
   293
    try:
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14550
diff changeset
   294
        return util.cachestat(path).cacheable()
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14550
diff changeset
   295
    finally:
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14550
diff changeset
   296
        os.remove(path)
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14550
diff changeset
   297
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   298
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   299
@check("lsprof", "python lsprof module")
5099
105d4cf7ec24 Test --time, --profile and --lsprof
Patrick Mezard <pmezard@gmail.com>
parents: 5092
diff changeset
   300
def has_lsprof():
105d4cf7ec24 Test --time, --profile and --lsprof
Patrick Mezard <pmezard@gmail.com>
parents: 5092
diff changeset
   301
    try:
105d4cf7ec24 Test --time, --profile and --lsprof
Patrick Mezard <pmezard@gmail.com>
parents: 5092
diff changeset
   302
        import _lsprof
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   303
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   304
        _lsprof.Profiler  # silence unused import warning
5099
105d4cf7ec24 Test --time, --profile and --lsprof
Patrick Mezard <pmezard@gmail.com>
parents: 5092
diff changeset
   305
        return True
105d4cf7ec24 Test --time, --profile and --lsprof
Patrick Mezard <pmezard@gmail.com>
parents: 5092
diff changeset
   306
    except ImportError:
105d4cf7ec24 Test --time, --profile and --lsprof
Patrick Mezard <pmezard@gmail.com>
parents: 5092
diff changeset
   307
        return False
105d4cf7ec24 Test --time, --profile and --lsprof
Patrick Mezard <pmezard@gmail.com>
parents: 5092
diff changeset
   308
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   309
44279
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   310
def _gethgversion():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   311
    m = matchoutput('hg --version --quiet 2>&1', br'(\d+)\.(\d+)')
28761
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   312
    if not m:
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   313
        return (0, 0)
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   314
    return (int(m.group(1)), int(m.group(2)))
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   315
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   316
44279
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   317
_hgversion = None
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   318
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   319
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   320
def gethgversion():
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   321
    global _hgversion
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   322
    if _hgversion is None:
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   323
        _hgversion = _gethgversion()
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   324
    return _hgversion
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   325
e48a996d12bc hghave: cache the result of gethgversion
Julien Cristau <jcristau@mozilla.com>
parents: 44264
diff changeset
   326
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   327
@checkvers(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   328
    "hg", "Mercurial >= %s", list([(1.0 * x) / 10 for x in range(9, 99)])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   329
)
28761
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   330
def has_hg_range(v):
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   331
    major, minor = v.split('.')[0:2]
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   332
    return gethgversion() >= (int(major), int(minor))
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   333
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   334
44465
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   335
@check("rust", "Using the Rust extensions")
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   336
def has_rust():
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   337
    """Check is the mercurial currently running is using some rust code"""
44640
51ffb2a6c08a tests: pass str to matchoutput()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44498
diff changeset
   338
    cmd = 'hg debuginstall --quiet 2>&1'
44465
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   339
    match = br'checking module policy \(([^)]+)\)'
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   340
    policy = matchoutput(cmd, match)
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   341
    if not policy:
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   342
        return False
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   343
    return b'rust' in policy.group(1)
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   344
75ada5fe9b62 hghave: add a `rust` keyword to detect the use of compiled rust code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44461
diff changeset
   345
28761
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   346
@check("hg08", "Mercurial >= 0.8")
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   347
def has_hg08():
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   348
    if checks["hg09"][0]():
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   349
        return True
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   350
    return matchoutput('hg help annotate 2>&1', '--date')
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   351
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   352
28761
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   353
@check("hg07", "Mercurial >= 0.7")
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   354
def has_hg07():
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   355
    if checks["hg08"][0]():
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   356
        return True
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   357
    return matchoutput('hg --version --quiet 2>&1', 'Mercurial Distributed SCM')
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   358
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   359
28761
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   360
@check("hg06", "Mercurial >= 0.6")
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   361
def has_hg06():
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   362
    if checks["hg07"][0]():
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   363
        return True
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   364
    return matchoutput('hg --version --quiet 2>&1', 'Mercurial version')
be13a0fb84e8 hghave: add hg06..hg39
timeless <timeless@mozdev.org>
parents: 28760
diff changeset
   365
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   366
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   367
@check("gettext", "GNU Gettext (msgfmt)")
13442
bb107a31820e test-i18n: make test conditional on msgfmt availability
Martin Geisler <mg@lazybytes.net>
parents: 13418
diff changeset
   368
def has_gettext():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   369
    return matchoutput('msgfmt --version', br'GNU gettext-tools')
13442
bb107a31820e test-i18n: make test conditional on msgfmt availability
Martin Geisler <mg@lazybytes.net>
parents: 13418
diff changeset
   370
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   371
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   372
@check("git", "git command line client")
5218
4fa0f2dff643 hghave: detect git availability
Patrick Mezard <pmezard@gmail.com>
parents: 5103
diff changeset
   373
def has_git():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   374
    return matchoutput('git --version 2>&1', br'^git version')
5218
4fa0f2dff643 hghave: detect git availability
Patrick Mezard <pmezard@gmail.com>
parents: 5103
diff changeset
   375
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   376
32901
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   377
def getgitversion():
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   378
    m = matchoutput('git --version 2>&1', br'git version (\d+)\.(\d+)')
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   379
    if not m:
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   380
        return (0, 0)
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   381
    return (int(m.group(1)), int(m.group(2)))
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   382
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   383
44483
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   384
@check("pygit2", "pygit2 Python library")
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   385
def has_git():
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   386
    try:
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   387
        import pygit2
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   388
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   389
        pygit2.Oid  # silence unused import
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   390
        return True
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   391
    except ImportError:
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   392
        return False
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   393
2e464925f662 hghave: add a check for pygit2
Martin von Zweigbergk <martinvonz@google.com>
parents: 44465
diff changeset
   394
35139
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   395
# https://github.com/git-lfs/lfs-test-server
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   396
@check("lfs-test-server", "git-lfs test server")
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   397
def has_lfsserver():
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   398
    exe = 'lfs-test-server'
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   399
    if has_windows():
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   400
        exe = 'lfs-test-server.exe'
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   401
    return any(
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   402
        os.access(os.path.join(path, exe), os.X_OK)
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   403
        for path in os.environ["PATH"].split(os.pathsep)
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   404
    )
a2e927ded455 hghave: add a check for lfs-test-server
Matt Harbison <matt_harbison@yahoo.com>
parents: 35043
diff changeset
   405
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   406
32901
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   407
@checkvers("git", "git client (with ext::sh support) version >= %s", (1.9,))
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   408
def has_git_range(v):
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   409
    major, minor = v.split('.')[0:2]
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   410
    return getgitversion() >= (int(major), int(minor))
559db66dead5 hghave: add has_git_range for testing if git understands ext::sh
Sean Farley <sean@farley.io>
parents: 32856
diff changeset
   411
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   412
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   413
@check("docutils", "Docutils text processing library")
10971
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents: 9819
diff changeset
   414
def has_docutils():
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents: 9819
diff changeset
   415
    try:
28779
0970ebec29b4 hghave: replace relative import of docutils.core
Yuya Nishihara <yuya@tcha.org>
parents: 28761
diff changeset
   416
        import docutils.core
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   417
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   418
        docutils.core.publish_cmdline  # silence unused import
10971
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents: 9819
diff changeset
   419
        return True
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents: 9819
diff changeset
   420
    except ImportError:
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents: 9819
diff changeset
   421
        return False
9446
57d682d7d2da test-gendoc: test documentation generation
Martin Geisler <mg@lazybytes.net>
parents: 9395
diff changeset
   422
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   423
14050
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 13543
diff changeset
   424
def getsvnversion():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   425
    m = matchoutput('svn --version --quiet 2>&1', br'^(\d+)\.(\d+)')
14050
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 13543
diff changeset
   426
    if not m:
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 13543
diff changeset
   427
        return (0, 0)
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 13543
diff changeset
   428
    return (int(m.group(1)), int(m.group(2)))
9e8a9d45945c subrepo: handle svn tracked/unknown directory collisions
Patrick Mezard <pmezard@gmail.com>
parents: 13543
diff changeset
   429
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   430
28759
2348ca49aaee hghave: replace has_svn13/has_svn15 with checkvers
timeless <timeless@mozdev.org>
parents: 28758
diff changeset
   431
@checkvers("svn", "subversion client and admin tools >= %s", (1.3, 1.5))
2348ca49aaee hghave: replace has_svn13/has_svn15 with checkvers
timeless <timeless@mozdev.org>
parents: 28758
diff changeset
   432
def has_svn_range(v):
2348ca49aaee hghave: replace has_svn13/has_svn15 with checkvers
timeless <timeless@mozdev.org>
parents: 28758
diff changeset
   433
    major, minor = v.split('.')[0:2]
2348ca49aaee hghave: replace has_svn13/has_svn15 with checkvers
timeless <timeless@mozdev.org>
parents: 28758
diff changeset
   434
    return getsvnversion() >= (int(major), int(minor))
15346
53f37b24f26a tests: check for svn >= 1.3 and >= 1.5 in tests that require those versions
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14927
diff changeset
   435
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   436
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   437
@check("svn", "subversion client and admin tools")
5253
d82ebcdf20e1 hghave: detect subversion client and admin tools availability
Patrick Mezard <pmezard@gmail.com>
parents: 5252
diff changeset
   438
def has_svn():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   439
    return matchoutput('svn --version 2>&1', br'^svn, version') and matchoutput(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   440
        'svnadmin --version 2>&1', br'^svnadmin, version'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   441
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   442
5253
d82ebcdf20e1 hghave: detect subversion client and admin tools availability
Patrick Mezard <pmezard@gmail.com>
parents: 5252
diff changeset
   443
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   444
@check("svn-bindings", "subversion python bindings")
5254
d61e98a82cee hghave: detect subversion bindings availability
Patrick Mezard <pmezard@gmail.com>
parents: 5253
diff changeset
   445
def has_svn_bindings():
d61e98a82cee hghave: detect subversion bindings availability
Patrick Mezard <pmezard@gmail.com>
parents: 5253
diff changeset
   446
    try:
d61e98a82cee hghave: detect subversion bindings availability
Patrick Mezard <pmezard@gmail.com>
parents: 5253
diff changeset
   447
        import svn.core
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   448
7315
408cf9eb9e5d tests: run svn tests only with svn bindings >1.3
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7061
diff changeset
   449
        version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
408cf9eb9e5d tests: run svn tests only with svn bindings >1.3
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7061
diff changeset
   450
        if version < (1, 4):
408cf9eb9e5d tests: run svn tests only with svn bindings >1.3
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7061
diff changeset
   451
            return False
5254
d61e98a82cee hghave: detect subversion bindings availability
Patrick Mezard <pmezard@gmail.com>
parents: 5253
diff changeset
   452
        return True
d61e98a82cee hghave: detect subversion bindings availability
Patrick Mezard <pmezard@gmail.com>
parents: 5253
diff changeset
   453
    except ImportError:
d61e98a82cee hghave: detect subversion bindings availability
Patrick Mezard <pmezard@gmail.com>
parents: 5253
diff changeset
   454
        return False
d61e98a82cee hghave: detect subversion bindings availability
Patrick Mezard <pmezard@gmail.com>
parents: 5253
diff changeset
   455
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   456
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   457
@check("p4", "Perforce server and client")
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 7773
diff changeset
   458
def has_p4():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   459
    return matchoutput('p4 -V', br'Rev\. P4/') and matchoutput(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   460
        'p4d -V', br'Rev\. P4D/'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   461
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   462
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 7773
diff changeset
   463
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   464
@check("symlink", "symbolic links")
5409
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   465
def has_symlink():
43455
6792da448437 hghave: disallow symlinks on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 43412
diff changeset
   466
    # mercurial.windows.checklink() is a hard 'no' at the moment
6792da448437 hghave: disallow symlinks on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 43412
diff changeset
   467
    if os.name == 'nt' or getattr(os, "symlink", None) is None:
16319
ac0da5caebec tests: teach hghave to actually test for symlink support
Matt Mackall <mpm@selenic.com>
parents: 15568
diff changeset
   468
        return False
16968
456f457e376d tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles
Mads Kiilerich <mads@kiilerich.com>
parents: 16966
diff changeset
   469
    name = tempfile.mktemp(dir='.', prefix=tempprefix)
16319
ac0da5caebec tests: teach hghave to actually test for symlink support
Matt Mackall <mpm@selenic.com>
parents: 15568
diff changeset
   470
    try:
ac0da5caebec tests: teach hghave to actually test for symlink support
Matt Mackall <mpm@selenic.com>
parents: 15568
diff changeset
   471
        os.symlink(".", name)
ac0da5caebec tests: teach hghave to actually test for symlink support
Matt Mackall <mpm@selenic.com>
parents: 15568
diff changeset
   472
        os.unlink(name)
ac0da5caebec tests: teach hghave to actually test for symlink support
Matt Mackall <mpm@selenic.com>
parents: 15568
diff changeset
   473
        return True
ac0da5caebec tests: teach hghave to actually test for symlink support
Matt Mackall <mpm@selenic.com>
parents: 15568
diff changeset
   474
    except (OSError, AttributeError):
ac0da5caebec tests: teach hghave to actually test for symlink support
Matt Mackall <mpm@selenic.com>
parents: 15568
diff changeset
   475
        return False
5409
190c234c8fa0 hghave: reorder check functions and entries
Patrick Mezard <pmezard@gmail.com>
parents: 5308
diff changeset
   476
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   477
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   478
@check("hardlink", "hardlinks")
16971
8aeb2f1ae94c tests: introduce hghave hardlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 16970
diff changeset
   479
def has_hardlink():
8aeb2f1ae94c tests: introduce hghave hardlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 16970
diff changeset
   480
    from mercurial import util
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   481
16971
8aeb2f1ae94c tests: introduce hghave hardlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 16970
diff changeset
   482
    fh, fn = tempfile.mkstemp(dir='.', prefix=tempprefix)
8aeb2f1ae94c tests: introduce hghave hardlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 16970
diff changeset
   483
    os.close(fh)
8aeb2f1ae94c tests: introduce hghave hardlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 16970
diff changeset
   484
    name = tempfile.mktemp(dir='.', prefix=tempprefix)
8aeb2f1ae94c tests: introduce hghave hardlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 16970
diff changeset
   485
    try:
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44279
diff changeset
   486
        util.oslink(_sys2bytes(fn), _sys2bytes(name))
25090
252412e24551 hghave: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24290
diff changeset
   487
        os.unlink(name)
252412e24551 hghave: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24290
diff changeset
   488
        return True
252412e24551 hghave: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24290
diff changeset
   489
    except OSError:
252412e24551 hghave: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24290
diff changeset
   490
        return False
16971
8aeb2f1ae94c tests: introduce hghave hardlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 16970
diff changeset
   491
    finally:
8aeb2f1ae94c tests: introduce hghave hardlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 16970
diff changeset
   492
        os.unlink(fn)
8aeb2f1ae94c tests: introduce hghave hardlinks
Mads Kiilerich <mads@kiilerich.com>
parents: 16970
diff changeset
   493
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   494
31576
07f0cddb0594 hghave: add a check about whitelisted filesystem that supports hardlink
Jun Wu <quark@fb.com>
parents: 31413
diff changeset
   495
@check("hardlink-whitelisted", "hardlinks on whitelisted filesystems")
07f0cddb0594 hghave: add a check about whitelisted filesystem that supports hardlink
Jun Wu <quark@fb.com>
parents: 31413
diff changeset
   496
def has_hardlink_whitelisted():
31674
b33e352c365c hghave: use util.getfstype
Yuya Nishihara <yuya@tcha.org>
parents: 31576
diff changeset
   497
    from mercurial import util
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   498
31678
1ed57a7dd904 statfs: make getfstype() raise OSError
Yuya Nishihara <yuya@tcha.org>
parents: 31674
diff changeset
   499
    try:
36942
bf73012877a4 hghave: fix hardlink-whitelisted check on Python 3
Augie Fackler <augie@google.com>
parents: 36941
diff changeset
   500
        fstype = util.getfstype(b'.')
31678
1ed57a7dd904 statfs: make getfstype() raise OSError
Yuya Nishihara <yuya@tcha.org>
parents: 31674
diff changeset
   501
    except OSError:
1ed57a7dd904 statfs: make getfstype() raise OSError
Yuya Nishihara <yuya@tcha.org>
parents: 31674
diff changeset
   502
        return False
31576
07f0cddb0594 hghave: add a check about whitelisted filesystem that supports hardlink
Jun Wu <quark@fb.com>
parents: 31413
diff changeset
   503
    return fstype in util._hardlinkfswhitelist
07f0cddb0594 hghave: add a check about whitelisted filesystem that supports hardlink
Jun Wu <quark@fb.com>
parents: 31413
diff changeset
   504
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   505
30230
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   506
@check("rmcwd", "can remove current working directory")
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   507
def has_rmcwd():
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   508
    ocwd = os.getcwd()
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   509
    temp = tempfile.mkdtemp(dir='.', prefix=tempprefix)
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   510
    try:
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   511
        os.chdir(temp)
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   512
        # On Linux, 'rmdir .' isn't allowed, but the other names are okay.
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   513
        # On Solaris and Windows, the cwd can't be removed by any names.
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   514
        os.rmdir(os.getcwd())
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   515
        return True
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   516
    except OSError:
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   517
        return False
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   518
    finally:
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   519
        os.chdir(ocwd)
30242
389cbfe63586 hghave: fix 'rmcwd' to ensure temporary directory is removed
Yuya Nishihara <yuya@tcha.org>
parents: 30230
diff changeset
   520
        # clean up temp dir on platforms where cwd can't be removed
389cbfe63586 hghave: fix 'rmcwd' to ensure temporary directory is removed
Yuya Nishihara <yuya@tcha.org>
parents: 30230
diff changeset
   521
        try:
389cbfe63586 hghave: fix 'rmcwd' to ensure temporary directory is removed
Yuya Nishihara <yuya@tcha.org>
parents: 30230
diff changeset
   522
            os.rmdir(temp)
389cbfe63586 hghave: fix 'rmcwd' to ensure temporary directory is removed
Yuya Nishihara <yuya@tcha.org>
parents: 30230
diff changeset
   523
        except OSError:
389cbfe63586 hghave: fix 'rmcwd' to ensure temporary directory is removed
Yuya Nishihara <yuya@tcha.org>
parents: 30230
diff changeset
   524
            pass
30230
46a0203dfb89 tests: run "cwd was removed" test only if cwd can actually be removed
Yuya Nishihara <yuya@tcha.org>
parents: 29903
diff changeset
   525
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   526
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   527
@check("tla", "GNU Arch tla client")
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   528
def has_tla():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   529
    return matchoutput('tla --version 2>&1', br'The GNU Arch Revision')
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   530
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   531
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   532
@check("gpg", "gpg client")
8809
6fce36336e42 gpg: add test
Brendan Cully <brendan@kublai.com>
parents: 8213
diff changeset
   533
def has_gpg():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   534
    return matchoutput('gpg --version 2>&1', br'GnuPG')
8809
6fce36336e42 gpg: add test
Brendan Cully <brendan@kublai.com>
parents: 8213
diff changeset
   535
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   536
29790
94fb0458a791 test-gpg: start gpg-agent under control of the test runner
Yuya Nishihara <yuya@tcha.org>
parents: 29611
diff changeset
   537
@check("gpg2", "gpg client v2")
94fb0458a791 test-gpg: start gpg-agent under control of the test runner
Yuya Nishihara <yuya@tcha.org>
parents: 29611
diff changeset
   538
def has_gpg2():
94fb0458a791 test-gpg: start gpg-agent under control of the test runner
Yuya Nishihara <yuya@tcha.org>
parents: 29611
diff changeset
   539
    return matchoutput('gpg --version 2>&1', br'GnuPG[^0-9]+2\.')
94fb0458a791 test-gpg: start gpg-agent under control of the test runner
Yuya Nishihara <yuya@tcha.org>
parents: 29611
diff changeset
   540
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   541
29873
80ba176bad62 test-gpg: start gpg-agent by gpg-connect-agent only if GnuPG v2.1+ detected
Yuya Nishihara <yuya@tcha.org>
parents: 29867
diff changeset
   542
@check("gpg21", "gpg client v2.1+")
80ba176bad62 test-gpg: start gpg-agent by gpg-connect-agent only if GnuPG v2.1+ detected
Yuya Nishihara <yuya@tcha.org>
parents: 29867
diff changeset
   543
def has_gpg21():
80ba176bad62 test-gpg: start gpg-agent by gpg-connect-agent only if GnuPG v2.1+ detected
Yuya Nishihara <yuya@tcha.org>
parents: 29867
diff changeset
   544
    return matchoutput('gpg --version 2>&1', br'GnuPG[^0-9]+2\.(?!0)')
80ba176bad62 test-gpg: start gpg-agent by gpg-connect-agent only if GnuPG v2.1+ detected
Yuya Nishihara <yuya@tcha.org>
parents: 29867
diff changeset
   545
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   546
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   547
@check("unix-permissions", "unix-style permissions")
6063
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   548
def has_unix_permissions():
16968
456f457e376d tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles
Mads Kiilerich <mads@kiilerich.com>
parents: 16966
diff changeset
   549
    d = tempfile.mkdtemp(dir='.', prefix=tempprefix)
6063
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   550
    try:
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   551
        fname = os.path.join(d, 'foo')
25658
e93036747902 global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25413
diff changeset
   552
        for umask in (0o77, 0o07, 0o22):
6063
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   553
            os.umask(umask)
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   554
            f = open(fname, 'w')
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   555
            f.close()
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   556
            mode = os.stat(fname).st_mode
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   557
            os.unlink(fname)
25658
e93036747902 global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25413
diff changeset
   558
            if mode & 0o777 != ~umask & 0o666:
6063
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   559
                return False
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   560
        return True
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   561
    finally:
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   562
        os.rmdir(d)
b74a0c4bfb30 hghave: detect unix-style permissions
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5685
diff changeset
   563
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   564
22994
840be5ca03e1 cmdserver: add service that listens on unix domain socket and forks process
Yuya Nishihara <yuya@tcha.org>
parents: 22579
diff changeset
   565
@check("unix-socket", "AF_UNIX socket family")
840be5ca03e1 cmdserver: add service that listens on unix domain socket and forks process
Yuya Nishihara <yuya@tcha.org>
parents: 22579
diff changeset
   566
def has_unix_socket():
840be5ca03e1 cmdserver: add service that listens on unix domain socket and forks process
Yuya Nishihara <yuya@tcha.org>
parents: 22579
diff changeset
   567
    return getattr(socket, 'AF_UNIX', None) is not None
840be5ca03e1 cmdserver: add service that listens on unix domain socket and forks process
Yuya Nishihara <yuya@tcha.org>
parents: 22579
diff changeset
   568
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   569
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   570
@check("root", "root permissions")
20008
e54a078153f7 tests: skip tests that require not having root (issue4089)
Matt Mackall <mpm@selenic.com>
parents: 19931
diff changeset
   571
def has_root():
20114
390aff33c2f9 tests: fix `hghave root` on windows
Simon Heimberg <simohe@besonet.ch>
parents: 20008
diff changeset
   572
    return getattr(os, 'geteuid', None) and os.geteuid() == 0
20008
e54a078153f7 tests: skip tests that require not having root (issue4089)
Matt Mackall <mpm@selenic.com>
parents: 19931
diff changeset
   573
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   574
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   575
@check("pyflakes", "Pyflakes python linter")
14140
82f0412ef7de tests: add pyflakes checking for unused imports
timeless <timeless@mozdev.org>
parents: 14050
diff changeset
   576
def has_pyflakes():
44498
aa0e1341457b tests: check availability of pyflakes by trying to import pyflakes module
Manuel Jacob <me@manueljacob.de>
parents: 44483
diff changeset
   577
    try:
aa0e1341457b tests: check availability of pyflakes by trying to import pyflakes module
Manuel Jacob <me@manueljacob.de>
parents: 44483
diff changeset
   578
        import pyflakes
aa0e1341457b tests: check availability of pyflakes by trying to import pyflakes module
Manuel Jacob <me@manueljacob.de>
parents: 44483
diff changeset
   579
aa0e1341457b tests: check availability of pyflakes by trying to import pyflakes module
Manuel Jacob <me@manueljacob.de>
parents: 44483
diff changeset
   580
        pyflakes.__version__
aa0e1341457b tests: check availability of pyflakes by trying to import pyflakes module
Manuel Jacob <me@manueljacob.de>
parents: 44483
diff changeset
   581
    except ImportError:
aa0e1341457b tests: check availability of pyflakes by trying to import pyflakes module
Manuel Jacob <me@manueljacob.de>
parents: 44483
diff changeset
   582
        return False
aa0e1341457b tests: check availability of pyflakes by trying to import pyflakes module
Manuel Jacob <me@manueljacob.de>
parents: 44483
diff changeset
   583
    else:
aa0e1341457b tests: check availability of pyflakes by trying to import pyflakes module
Manuel Jacob <me@manueljacob.de>
parents: 44483
diff changeset
   584
        return True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   585
14140
82f0412ef7de tests: add pyflakes checking for unused imports
timeless <timeless@mozdev.org>
parents: 14050
diff changeset
   586
31413
aa797bd54f44 test: add a basic 'test-check-pylint.t'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30559
diff changeset
   587
@check("pylint", "Pylint python linter")
aa797bd54f44 test: add a basic 'test-check-pylint.t'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30559
diff changeset
   588
def has_pylint():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   589
    return matchoutput("pylint --help", br"Usage:  pylint", True)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   590
31413
aa797bd54f44 test: add a basic 'test-check-pylint.t'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30559
diff changeset
   591
34696
15b561fffde5 hghave: add a check for clang-format
Augie Fackler <augie@google.com>
parents: 34401
diff changeset
   592
@check("clang-format", "clang-format C code formatter")
15b561fffde5 hghave: add a check for clang-format
Augie Fackler <augie@google.com>
parents: 34401
diff changeset
   593
def has_clang_format():
38703
b93dc48e74ad hghave: require clang-format >= 6 due to output change
Yuya Nishihara <yuya@tcha.org>
parents: 38239
diff changeset
   594
    m = matchoutput('clang-format --version', br'clang-format version (\d)')
b93dc48e74ad hghave: require clang-format >= 6 due to output change
Yuya Nishihara <yuya@tcha.org>
parents: 38239
diff changeset
   595
    # style changed somewhere between 4.x and 6.x
b93dc48e74ad hghave: require clang-format >= 6 due to output change
Yuya Nishihara <yuya@tcha.org>
parents: 38239
diff changeset
   596
    return m and int(m.group(1)) >= 6
34696
15b561fffde5 hghave: add a check for clang-format
Augie Fackler <augie@google.com>
parents: 34401
diff changeset
   597
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   598
35043
5d4369079c86 tests: use jshint when available to check .js files
Anton Shestakov <av6@dwimlabs.net>
parents: 34892
diff changeset
   599
@check("jshint", "JSHint static code analysis tool")
5d4369079c86 tests: use jshint when available to check .js files
Anton Shestakov <av6@dwimlabs.net>
parents: 34892
diff changeset
   600
def has_jshint():
5d4369079c86 tests: use jshint when available to check .js files
Anton Shestakov <av6@dwimlabs.net>
parents: 34892
diff changeset
   601
    return matchoutput("jshint --version 2>&1", br"jshint v")
5d4369079c86 tests: use jshint when available to check .js files
Anton Shestakov <av6@dwimlabs.net>
parents: 34892
diff changeset
   602
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   603
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   604
@check("pygments", "Pygments source highlighting library")
6355
3b841c189ab7 tests: add highlight extension tests
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6079
diff changeset
   605
def has_pygments():
3b841c189ab7 tests: add highlight extension tests
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6079
diff changeset
   606
    try:
3b841c189ab7 tests: add highlight extension tests
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6079
diff changeset
   607
        import pygments
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   608
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   609
        pygments.highlight  # silence unused import warning
6355
3b841c189ab7 tests: add highlight extension tests
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6079
diff changeset
   610
        return True
3b841c189ab7 tests: add highlight extension tests
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6079
diff changeset
   611
    except ImportError:
3b841c189ab7 tests: add highlight extension tests
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6079
diff changeset
   612
        return False
3b841c189ab7 tests: add highlight extension tests
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6079
diff changeset
   613
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   614
44119
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   615
@check("pygments25", "Pygments version >= 2.5")
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   616
def pygments25():
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   617
    try:
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   618
        import pygments
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   619
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   620
        v = pygments.__version__
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   621
    except ImportError:
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   622
        return False
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   623
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   624
    parts = v.split(".")
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   625
    major = int(parts[0])
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   626
    minor = int(parts[1])
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   627
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   628
    return (major, minor) >= (2, 5)
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   629
5b38c2ab6ad3 tests: conditionalize test-hightlight.t on pygments version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43819
diff changeset
   630
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   631
@check("outer-repo", "outer repo")
7429
dbc40381620e tests: Skip tests if they will fail because of outer repo
Mads Kiilerich <mads@kiilerich.com>
parents: 7315
diff changeset
   632
def has_outer_repo():
17016
468a950aebc3 tests: hghave outer-repo should be true even if a bad repo is found
Mads Kiilerich <mads@kiilerich.com>
parents: 16971
diff changeset
   633
    # failing for other reasons than 'no repo' imply that there is a repo
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   634
    return not matchoutput('hg root 2>&1', br'abort: no repository found', True)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   635
7429
dbc40381620e tests: Skip tests if they will fail because of outer repo
Mads Kiilerich <mads@kiilerich.com>
parents: 7315
diff changeset
   636
28591
f29cab5c519c hghave: change ssl check to just check ssl module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28582
diff changeset
   637
@check("ssl", "ssl module available")
12740
b86c6954ec4c serve: fix https mode and add test
Mads Kiilerich <mads@kiilerich.com>
parents: 10971
diff changeset
   638
def has_ssl():
b86c6954ec4c serve: fix https mode and add test
Mads Kiilerich <mads@kiilerich.com>
parents: 10971
diff changeset
   639
    try:
b86c6954ec4c serve: fix https mode and add test
Mads Kiilerich <mads@kiilerich.com>
parents: 10971
diff changeset
   640
        import ssl
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   641
28591
f29cab5c519c hghave: change ssl check to just check ssl module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28582
diff changeset
   642
        ssl.CERT_NONE
12740
b86c6954ec4c serve: fix https mode and add test
Mads Kiilerich <mads@kiilerich.com>
parents: 10971
diff changeset
   643
        return True
b86c6954ec4c serve: fix https mode and add test
Mads Kiilerich <mads@kiilerich.com>
parents: 10971
diff changeset
   644
    except ImportError:
b86c6954ec4c serve: fix https mode and add test
Mads Kiilerich <mads@kiilerich.com>
parents: 10971
diff changeset
   645
        return False
b86c6954ec4c serve: fix https mode and add test
Mads Kiilerich <mads@kiilerich.com>
parents: 10971
diff changeset
   646
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   647
25413
4d705f6a3c35 test-https: test basic functions of client certificate authentication
Yuya Nishihara <yuya@tcha.org>
parents: 25106
diff changeset
   648
@check("sslcontext", "python >= 2.7.9 ssl")
4d705f6a3c35 test-https: test basic functions of client certificate authentication
Yuya Nishihara <yuya@tcha.org>
parents: 25106
diff changeset
   649
def has_sslcontext():
4d705f6a3c35 test-https: test basic functions of client certificate authentication
Yuya Nishihara <yuya@tcha.org>
parents: 25106
diff changeset
   650
    try:
4d705f6a3c35 test-https: test basic functions of client certificate authentication
Yuya Nishihara <yuya@tcha.org>
parents: 25106
diff changeset
   651
        import ssl
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   652
25413
4d705f6a3c35 test-https: test basic functions of client certificate authentication
Yuya Nishihara <yuya@tcha.org>
parents: 25106
diff changeset
   653
        ssl.SSLContext
4d705f6a3c35 test-https: test basic functions of client certificate authentication
Yuya Nishihara <yuya@tcha.org>
parents: 25106
diff changeset
   654
        return True
4d705f6a3c35 test-https: test basic functions of client certificate authentication
Yuya Nishihara <yuya@tcha.org>
parents: 25106
diff changeset
   655
    except (ImportError, AttributeError):
4d705f6a3c35 test-https: test basic functions of client certificate authentication
Yuya Nishihara <yuya@tcha.org>
parents: 25106
diff changeset
   656
        return False
4d705f6a3c35 test-https: test basic functions of client certificate authentication
Yuya Nishihara <yuya@tcha.org>
parents: 25106
diff changeset
   657
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   658
24289
07fafcd4bc74 test-https: enable dummycert test only if Apple python is used (issue4500)
Yuya Nishihara <yuya@tcha.org>
parents: 23825
diff changeset
   659
@check("defaultcacerts", "can verify SSL certs by system's CA certs store")
07fafcd4bc74 test-https: enable dummycert test only if Apple python is used (issue4500)
Yuya Nishihara <yuya@tcha.org>
parents: 23825
diff changeset
   660
def has_defaultcacerts():
29483
918dce4b8c26 sslutil: pass ui to _defaultcacerts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29481
diff changeset
   661
    from mercurial import sslutil, ui as uimod
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   662
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30441
diff changeset
   663
    ui = uimod.ui.load()
29483
918dce4b8c26 sslutil: pass ui to _defaultcacerts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29481
diff changeset
   664
    return sslutil._defaultcacerts(ui) or sslutil._canloaddefaultcerts
24289
07fafcd4bc74 test-https: enable dummycert test only if Apple python is used (issue4500)
Yuya Nishihara <yuya@tcha.org>
parents: 23825
diff changeset
   665
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   666
29481
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   667
@check("defaultcacertsloaded", "detected presence of loaded system CA certs")
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   668
def has_defaultcacertsloaded():
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   669
    import ssl
29483
918dce4b8c26 sslutil: pass ui to _defaultcacerts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29481
diff changeset
   670
    from mercurial import sslutil, ui as uimod
29481
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   671
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   672
    if not has_defaultcacerts():
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   673
        return False
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   674
    if not has_sslcontext():
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   675
        return False
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   676
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30441
diff changeset
   677
    ui = uimod.ui.load()
29483
918dce4b8c26 sslutil: pass ui to _defaultcacerts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29481
diff changeset
   678
    cafile = sslutil._defaultcacerts(ui)
29481
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   679
    ctx = ssl.create_default_context()
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   680
    if cafile:
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   681
        ctx.load_verify_locations(cafile=cafile)
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   682
    else:
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   683
        ctx.load_default_certs()
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   684
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   685
    return len(ctx.get_ca_certs()) > 0
5caa415aa48b tests: better testing of loaded certificates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29140
diff changeset
   686
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   687
29601
6cff2ac0ccb9 sslutil: more robustly detect protocol support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29576
diff changeset
   688
@check("tls1.2", "TLS 1.2 protocol support")
6cff2ac0ccb9 sslutil: more robustly detect protocol support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29576
diff changeset
   689
def has_tls1_2():
6cff2ac0ccb9 sslutil: more robustly detect protocol support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29576
diff changeset
   690
    from mercurial import sslutil
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   691
41381
423a6b2ddafa tests: add b'' when testing for tls1.2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41366
diff changeset
   692
    return b'tls1.2' in sslutil.supportedprotocols
29601
6cff2ac0ccb9 sslutil: more robustly detect protocol support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29576
diff changeset
   693
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   694
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   695
@check("windows", "Windows")
15444
e1f05d7a8c7b tests: use 'hghave no-windows' to avoid testing reserved file names on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15441
diff changeset
   696
def has_windows():
e1f05d7a8c7b tests: use 'hghave no-windows' to avoid testing reserved file names on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15441
diff changeset
   697
    return os.name == 'nt'
e1f05d7a8c7b tests: use 'hghave no-windows' to avoid testing reserved file names on windows
Mads Kiilerich <mads@kiilerich.com>
parents: 15441
diff changeset
   698
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   699
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   700
@check("system-sh", "system() uses sh")
15445
7cbb81c47025 tests: use 'hghave system-sh' to guard tests that requires sh in system()
Mads Kiilerich <mads@kiilerich.com>
parents: 15444
diff changeset
   701
def has_system_sh():
7cbb81c47025 tests: use 'hghave system-sh' to guard tests that requires sh in system()
Mads Kiilerich <mads@kiilerich.com>
parents: 15444
diff changeset
   702
    return os.name != 'nt'
7cbb81c47025 tests: use 'hghave system-sh' to guard tests that requires sh in system()
Mads Kiilerich <mads@kiilerich.com>
parents: 15444
diff changeset
   703
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   704
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   705
@check("serve", "platform and python can manage 'hg serve -d'")
15446
c5c9ca3719f9 tests: use 'hghave serve' to guard tests that requires serve daemon management
Mads Kiilerich <mads@kiilerich.com>
parents: 15445
diff changeset
   706
def has_serve():
32856
41f99a90675d hghave: enable 'serve' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 32770
diff changeset
   707
    return True
15446
c5c9ca3719f9 tests: use 'hghave serve' to guard tests that requires serve daemon management
Mads Kiilerich <mads@kiilerich.com>
parents: 15445
diff changeset
   708
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   709
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   710
@check("test-repo", "running tests from repository")
21208
0e1cbd3d52f7 tests: add repository check for pyflakes test
Matt Mackall <mpm@selenic.com>
parents: 20644
diff changeset
   711
def has_test_repo():
0e1cbd3d52f7 tests: add repository check for pyflakes test
Matt Mackall <mpm@selenic.com>
parents: 20644
diff changeset
   712
    t = os.environ["TESTDIR"]
0e1cbd3d52f7 tests: add repository check for pyflakes test
Matt Mackall <mpm@selenic.com>
parents: 20644
diff changeset
   713
    return os.path.isdir(os.path.join(t, "..", ".hg"))
0e1cbd3d52f7 tests: add repository check for pyflakes test
Matt Mackall <mpm@selenic.com>
parents: 20644
diff changeset
   714
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   715
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   716
@check("tic", "terminfo compiler and curses module")
15539
d09ea5bbc9a4 tests: skip color test on platforms without tic
Mads Kiilerich <mads@kiilerich.com>
parents: 15446
diff changeset
   717
def has_tic():
20304
e457321a5687 tests: 'hghave tic' also requires curses support in Python
Mads Kiilerich <madski@unity3d.com>
parents: 20114
diff changeset
   718
    try:
e457321a5687 tests: 'hghave tic' also requires curses support in Python
Mads Kiilerich <madski@unity3d.com>
parents: 20114
diff changeset
   719
        import curses
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   720
20304
e457321a5687 tests: 'hghave tic' also requires curses support in Python
Mads Kiilerich <madski@unity3d.com>
parents: 20114
diff changeset
   721
        curses.COLOR_BLUE
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   722
        return matchoutput('test -x "`which tic`"', br'')
44264
d3f776c4760e py3: catch AttributeError too with ImportError
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44119
diff changeset
   723
    except (ImportError, AttributeError):
20304
e457321a5687 tests: 'hghave tic' also requires curses support in Python
Mads Kiilerich <madski@unity3d.com>
parents: 20114
diff changeset
   724
        return False
15539
d09ea5bbc9a4 tests: skip color test on platforms without tic
Mads Kiilerich <mads@kiilerich.com>
parents: 15446
diff changeset
   725
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   726
43699
21e05aabef8c hghave: add a check for the `xz` compression utility
Matt Harbison <matt_harbison@yahoo.com>
parents: 43470
diff changeset
   727
@check("xz", "xz compression utility")
21e05aabef8c hghave: add a check for the `xz` compression utility
Matt Harbison <matt_harbison@yahoo.com>
parents: 43470
diff changeset
   728
def has_xz():
21e05aabef8c hghave: add a check for the `xz` compression utility
Matt Harbison <matt_harbison@yahoo.com>
parents: 43470
diff changeset
   729
    # When Windows invokes a subprocess in shell mode, it uses `cmd.exe`, which
21e05aabef8c hghave: add a check for the `xz` compression utility
Matt Harbison <matt_harbison@yahoo.com>
parents: 43470
diff changeset
   730
    # only knows `where`, not `which`.  So invoke MSYS shell explicitly.
21e05aabef8c hghave: add a check for the `xz` compression utility
Matt Harbison <matt_harbison@yahoo.com>
parents: 43470
diff changeset
   731
    return matchoutput("sh -c 'test -x \"`which xz`\"'", b'')
21e05aabef8c hghave: add a check for the `xz` compression utility
Matt Harbison <matt_harbison@yahoo.com>
parents: 43470
diff changeset
   732
21e05aabef8c hghave: add a check for the `xz` compression utility
Matt Harbison <matt_harbison@yahoo.com>
parents: 43470
diff changeset
   733
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   734
@check("msys", "Windows with MSYS")
15567
8b84d040d9f9 tests: introduce 'hghave msys' to skip tests that would fail because of msys
Mads Kiilerich <mads@kiilerich.com>
parents: 15539
diff changeset
   735
def has_msys():
8b84d040d9f9 tests: introduce 'hghave msys' to skip tests that would fail because of msys
Mads Kiilerich <mads@kiilerich.com>
parents: 15539
diff changeset
   736
    return os.getenv('MSYSTEM')
8b84d040d9f9 tests: introduce 'hghave msys' to skip tests that would fail because of msys
Mads Kiilerich <mads@kiilerich.com>
parents: 15539
diff changeset
   737
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   738
22093
45611a306f77 tests: use a decorator for hghave checks
Matt Mackall <mpm@selenic.com>
parents: 21208
diff changeset
   739
@check("aix", "AIX")
19092
8c560ad1cdc4 tests: AIX can't handle negative date in test-dirstate.t
Jim Hague <jim.hague@acm.org>
parents: 18285
diff changeset
   740
def has_aix():
8c560ad1cdc4 tests: AIX can't handle negative date in test-dirstate.t
Jim Hague <jim.hague@acm.org>
parents: 18285
diff changeset
   741
    return sys.platform.startswith("aix")
8c560ad1cdc4 tests: AIX can't handle negative date in test-dirstate.t
Jim Hague <jim.hague@acm.org>
parents: 18285
diff changeset
   742
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   743
22575
d7f7f1860f00 ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs
Mads Kiilerich <madski@unity3d.com>
parents: 22198
diff changeset
   744
@check("osx", "OS X")
d7f7f1860f00 ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs
Mads Kiilerich <madski@unity3d.com>
parents: 22198
diff changeset
   745
def has_osx():
d7f7f1860f00 ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs
Mads Kiilerich <madski@unity3d.com>
parents: 22198
diff changeset
   746
    return sys.platform == 'darwin'
d7f7f1860f00 ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs
Mads Kiilerich <madski@unity3d.com>
parents: 22198
diff changeset
   747
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   748
29026
80f15aa32edd hghave: add check for OS X packaging tools
Augie Fackler <augie@google.com>
parents: 29022
diff changeset
   749
@check("osxpackaging", "OS X packaging tools")
80f15aa32edd hghave: add check for OS X packaging tools
Augie Fackler <augie@google.com>
parents: 29022
diff changeset
   750
def has_osxpackaging():
80f15aa32edd hghave: add check for OS X packaging tools
Augie Fackler <augie@google.com>
parents: 29022
diff changeset
   751
    try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   752
        return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   753
            matchoutput('pkgbuild', br'Usage: pkgbuild ', ignorestatus=1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   754
            and matchoutput(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   755
                'productbuild', br'Usage: productbuild ', ignorestatus=1
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   756
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   757
            and matchoutput('lsbom', br'Usage: lsbom', ignorestatus=1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   758
            and matchoutput('xar --help', br'Usage: xar', ignorestatus=1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   759
        )
29026
80f15aa32edd hghave: add check for OS X packaging tools
Augie Fackler <augie@google.com>
parents: 29022
diff changeset
   760
    except ImportError:
80f15aa32edd hghave: add check for OS X packaging tools
Augie Fackler <augie@google.com>
parents: 29022
diff changeset
   761
        return False
80f15aa32edd hghave: add check for OS X packaging tools
Augie Fackler <augie@google.com>
parents: 29022
diff changeset
   762
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   763
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34840
diff changeset
   764
@check('linuxormacos', 'Linux or MacOS')
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34840
diff changeset
   765
def has_linuxormacos():
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34840
diff changeset
   766
    # This isn't a perfect test for MacOS. But it is sufficient for our needs.
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34840
diff changeset
   767
    return sys.platform.startswith(('linux', 'darwin'))
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34840
diff changeset
   768
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   769
26111
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   770
@check("docker", "docker support")
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   771
def has_docker():
29140
47eab0cb72e3 hghave: matchoutput needs to use bytes for regexp
timeless <timeless@mozdev.org>
parents: 29107
diff changeset
   772
    pat = br'A self-sufficient runtime for'
26111
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   773
    if matchoutput('docker --help', pat):
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   774
        if 'linux' not in sys.platform:
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   775
            # TODO: in theory we should be able to test docker-based
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   776
            # package creation on non-linux using boot2docker, but in
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   777
            # practice that requires extra coordination to make sure
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   778
            # $TESTTEMP is going to be visible at the same path to the
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   779
            # boot2docker VM. If we figure out how to verify that, we
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   780
            # can use the following instead of just saying False:
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   781
            # return 'DOCKER_HOST' in os.environ
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   782
            return False
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   783
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   784
        return True
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   785
    return False
dcc12365fa38 hghave: add a check for docker support
Augie Fackler <augie@google.com>
parents: 26110
diff changeset
   786
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   787
26110
2dcfb98c5314 hghave: add a check for debian packaging tools
Augie Fackler <augie@google.com>
parents: 26109
diff changeset
   788
@check("debhelper", "debian packaging tools")
2dcfb98c5314 hghave: add a check for debian packaging tools
Augie Fackler <augie@google.com>
parents: 26109
diff changeset
   789
def has_debhelper():
34394
dbf83230e8be hghave: fix dpkg --version check to work on recent dpkg versions
Kyle Lippincott <spectral@google.com>
parents: 33697
diff changeset
   790
    # Some versions of dpkg say `dpkg', some say 'dpkg' (` vs ' on the first
dbf83230e8be hghave: fix dpkg --version check to work on recent dpkg versions
Kyle Lippincott <spectral@google.com>
parents: 33697
diff changeset
   791
    # quote), so just accept anything in that spot.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   792
    dpkg = matchoutput(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   793
        'dpkg --version', br"Debian .dpkg' package management program"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   794
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   795
    dh = matchoutput(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   796
        'dh --help', br'dh is a part of debhelper.', ignorestatus=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   797
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   798
    dh_py2 = matchoutput(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   799
        'dh_python2 --help', br'other supported Python versions'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   800
    )
34399
200eadbcf0b0 hghave: check for debuild being installed as well
Kyle Lippincott <spectral@google.com>
parents: 34394
diff changeset
   801
    # debuild comes from the 'devscripts' package, though you might want
200eadbcf0b0 hghave: check for debuild being installed as well
Kyle Lippincott <spectral@google.com>
parents: 34394
diff changeset
   802
    # the 'build-debs' package instead, which has a dependency on devscripts.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   803
    debuild = matchoutput(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   804
        'debuild --help', br'to run debian/rules with given parameter'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   805
    )
34399
200eadbcf0b0 hghave: check for debuild being installed as well
Kyle Lippincott <spectral@google.com>
parents: 34394
diff changeset
   806
    return dpkg and dh and dh_py2 and debuild
26110
2dcfb98c5314 hghave: add a check for debian packaging tools
Augie Fackler <augie@google.com>
parents: 26109
diff changeset
   807
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   808
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   809
@check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   810
    "debdeps", "debian build dependencies (run dpkg-checkbuilddeps in contrib/)"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   811
)
34401
13d3f8aaed87 tests: add "have" check for dpkg builddeps
Kyle Lippincott <spectral@google.com>
parents: 34399
diff changeset
   812
def has_debdeps():
13d3f8aaed87 tests: add "have" check for dpkg builddeps
Kyle Lippincott <spectral@google.com>
parents: 34399
diff changeset
   813
    # just check exit status (ignoring output)
38009
e51c91c14a07 packaging: move contrib/debian to contrib/packaging/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37415
diff changeset
   814
    path = '%s/../contrib/packaging/debian/control' % os.environ['TESTDIR']
34401
13d3f8aaed87 tests: add "have" check for dpkg builddeps
Kyle Lippincott <spectral@google.com>
parents: 34399
diff changeset
   815
    return matchoutput('dpkg-checkbuilddeps %s' % path, br'')
13d3f8aaed87 tests: add "have" check for dpkg builddeps
Kyle Lippincott <spectral@google.com>
parents: 34399
diff changeset
   816
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   817
29867
b05a3a04f046 hghave: add demandimport checking
timeless <timeless@mozdev.org>
parents: 29866
diff changeset
   818
@check("demandimport", "demandimport enabled")
b05a3a04f046 hghave: add demandimport checking
timeless <timeless@mozdev.org>
parents: 29866
diff changeset
   819
def has_demandimport():
34840
88624b40a9cb hghave: disable demandimport when chg is running
Saurabh Singh <singhsrb@fb.com>
parents: 34696
diff changeset
   820
    # chg disables demandimport intentionally for performance wins.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   821
    return (not has_chg()) and os.environ.get('HGDEMANDIMPORT') != 'disable'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   822
29867
b05a3a04f046 hghave: add demandimport checking
timeless <timeless@mozdev.org>
parents: 29866
diff changeset
   823
43113
37af48031d6f hghave: document format for version feature checks as <name><vers>, no dots
Kyle Lippincott <spectral@google.com>
parents: 43095
diff changeset
   824
# Add "py27", "py35", ... as possible feature checks. Note that there's no
37af48031d6f hghave: document format for version feature checks as <name><vers>, no dots
Kyle Lippincott <spectral@google.com>
parents: 43095
diff changeset
   825
# punctuation here.
41443
1a6a01a21d6a hghave: add pyXY features for Python version numbers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41381
diff changeset
   826
@checkvers("py", "Python >= %s", (2.7, 3.5, 3.6, 3.7, 3.8, 3.9))
1a6a01a21d6a hghave: add pyXY features for Python version numbers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41381
diff changeset
   827
def has_python_range(v):
1a6a01a21d6a hghave: add pyXY features for Python version numbers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41381
diff changeset
   828
    major, minor = v.split('.')[0:2]
1a6a01a21d6a hghave: add pyXY features for Python version numbers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41381
diff changeset
   829
    py_major, py_minor = sys.version_info.major, sys.version_info.minor
1a6a01a21d6a hghave: add pyXY features for Python version numbers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41381
diff changeset
   830
1a6a01a21d6a hghave: add pyXY features for Python version numbers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41381
diff changeset
   831
    return (py_major, py_minor) >= (int(major), int(minor))
1a6a01a21d6a hghave: add pyXY features for Python version numbers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41381
diff changeset
   832
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   833
40263
8cf459d8b111 py3: use py3 as the test tag, dropping the k
Martijn Pieters <mj@octobus.net>
parents: 39759
diff changeset
   834
@check("py3", "running with Python 3.x")
8cf459d8b111 py3: use py3 as the test tag, dropping the k
Martijn Pieters <mj@octobus.net>
parents: 39759
diff changeset
   835
def has_py3():
19931
8bbe208c1812 hghave: add "py3k" feature to check whether test runs with Python 3.x
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19930
diff changeset
   836
    return 3 == sys.version_info[0]
25859
1619563959b3 tests: disable test of buffer overflow in parsers.c if --pure
Yuya Nishihara <yuya@tcha.org>
parents: 25658
diff changeset
   837
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   838
28582
cdbc25306696 run-tests: add --with-python3 to define a Python 3 interpreter
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28383
diff changeset
   839
@check("py3exe", "a Python 3.x interpreter is available")
cdbc25306696 run-tests: add --with-python3 to define a Python 3 interpreter
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28383
diff changeset
   840
def has_python3exe():
39351
4cfd1eebe6aa hghave: move from requiring the PYTHON3 env var to looking for `python3`
Augie Fackler <augie@google.com>
parents: 38703
diff changeset
   841
    return matchoutput('python3 -V', br'^Python 3.(5|6|7|8|9)')
28582
cdbc25306696 run-tests: add --with-python3 to define a Python 3 interpreter
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28383
diff changeset
   842
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   843
25859
1619563959b3 tests: disable test of buffer overflow in parsers.c if --pure
Yuya Nishihara <yuya@tcha.org>
parents: 25658
diff changeset
   844
@check("pure", "running with pure Python code")
1619563959b3 tests: disable test of buffer overflow in parsers.c if --pure
Yuya Nishihara <yuya@tcha.org>
parents: 25658
diff changeset
   845
def has_pure():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   846
    return any(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   847
        [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   848
            os.environ.get("HGMODULEPOLICY") == "py",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   849
            os.environ.get("HGTEST_RUN_TESTS_PURE") == "--pure",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   850
        ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   851
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   852
26109
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26068
diff changeset
   853
32474
c2b7fb580794 tests: hint how to run slow tests when rejecting
Kyle Lippincott <spectral@google.com>
parents: 32245
diff changeset
   854
@check("slow", "allow slow tests (use --allow-slow-tests)")
26109
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26068
diff changeset
   855
def has_slow():
bad09bd22b6a run-tests: add support for marking tests as very slow
Augie Fackler <augie@google.com>
parents: 26068
diff changeset
   856
    return os.environ.get('HGTEST_SLOW') == 'slow'
26842
0f76c64f5cc3 testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents: 26145
diff changeset
   857
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   858
28383
e13e0e189990 hghave: improve description of Hypothesis
timeless <timeless@mozdev.org>
parents: 28126
diff changeset
   859
@check("hypothesis", "Hypothesis automated test generation")
26842
0f76c64f5cc3 testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents: 26145
diff changeset
   860
def has_hypothesis():
0f76c64f5cc3 testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents: 26145
diff changeset
   861
    try:
0f76c64f5cc3 testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents: 26145
diff changeset
   862
        import hypothesis
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   863
26842
0f76c64f5cc3 testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents: 26145
diff changeset
   864
        hypothesis.given
0f76c64f5cc3 testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents: 26145
diff changeset
   865
        return True
0f76c64f5cc3 testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents: 26145
diff changeset
   866
    except ImportError:
0f76c64f5cc3 testing: add hypothesis fuzz testing
David R. MacIver <david@drmaciver.com>
parents: 26145
diff changeset
   867
        return False
29843
00ca4f966ca6 hghave: add a check for unzip(1) that understands symlinks
Augie Fackler <augie@google.com>
parents: 29809
diff changeset
   868
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   869
29843
00ca4f966ca6 hghave: add a check for unzip(1) that understands symlinks
Augie Fackler <augie@google.com>
parents: 29809
diff changeset
   870
@check("unziplinks", "unzip(1) understands and extracts symlinks")
00ca4f966ca6 hghave: add a check for unzip(1) that understands symlinks
Augie Fackler <augie@google.com>
parents: 29809
diff changeset
   871
def unzip_understands_symlinks():
00ca4f966ca6 hghave: add a check for unzip(1) that understands symlinks
Augie Fackler <augie@google.com>
parents: 29809
diff changeset
   872
    return matchoutput('unzip --help', br'Info-ZIP')
30441
de48d3a0573a hghave: add check for zstd support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30297
diff changeset
   873
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   874
30441
de48d3a0573a hghave: add check for zstd support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30297
diff changeset
   875
@check("zstd", "zstd Python module available")
de48d3a0573a hghave: add check for zstd support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30297
diff changeset
   876
def has_zstd():
de48d3a0573a hghave: add check for zstd support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30297
diff changeset
   877
    try:
de48d3a0573a hghave: add check for zstd support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30297
diff changeset
   878
        import mercurial.zstd
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   879
30441
de48d3a0573a hghave: add check for zstd support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30297
diff changeset
   880
        mercurial.zstd.__version__
de48d3a0573a hghave: add check for zstd support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30297
diff changeset
   881
        return True
de48d3a0573a hghave: add check for zstd support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30297
diff changeset
   882
    except ImportError:
de48d3a0573a hghave: add check for zstd support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30297
diff changeset
   883
        return False
31964
ebaada96aec3 stdio: add Linux-specific tests for error checking
Bryan O'Sullivan <bryano@fb.com>
parents: 31678
diff changeset
   884
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   885
31964
ebaada96aec3 stdio: add Linux-specific tests for error checking
Bryan O'Sullivan <bryano@fb.com>
parents: 31678
diff changeset
   886
@check("devfull", "/dev/full special file")
ebaada96aec3 stdio: add Linux-specific tests for error checking
Bryan O'Sullivan <bryano@fb.com>
parents: 31678
diff changeset
   887
def has_dev_full():
ebaada96aec3 stdio: add Linux-specific tests for error checking
Bryan O'Sullivan <bryano@fb.com>
parents: 31678
diff changeset
   888
    return os.path.exists('/dev/full')
32726
a6e4c4218b71 hghave: add check for virtualenv
Augie Fackler <augie@google.com>
parents: 32474
diff changeset
   889
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   890
43412
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   891
@check("ensurepip", "ensurepip module")
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   892
def has_ensurepip():
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   893
    try:
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   894
        import ensurepip
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   895
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   896
        ensurepip.bootstrap
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   897
        return True
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   898
    except ImportError:
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   899
        return False
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   900
ca0cd0a13514 tests: look for ensurepip before using venv
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43406
diff changeset
   901
32726
a6e4c4218b71 hghave: add check for virtualenv
Augie Fackler <augie@google.com>
parents: 32474
diff changeset
   902
@check("virtualenv", "Python virtualenv support")
a6e4c4218b71 hghave: add check for virtualenv
Augie Fackler <augie@google.com>
parents: 32474
diff changeset
   903
def has_virtualenv():
a6e4c4218b71 hghave: add check for virtualenv
Augie Fackler <augie@google.com>
parents: 32474
diff changeset
   904
    try:
a6e4c4218b71 hghave: add check for virtualenv
Augie Fackler <augie@google.com>
parents: 32474
diff changeset
   905
        import virtualenv
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   906
32726
a6e4c4218b71 hghave: add check for virtualenv
Augie Fackler <augie@google.com>
parents: 32474
diff changeset
   907
        virtualenv.ACTIVATE_SH
a6e4c4218b71 hghave: add check for virtualenv
Augie Fackler <augie@google.com>
parents: 32474
diff changeset
   908
        return True
a6e4c4218b71 hghave: add check for virtualenv
Augie Fackler <augie@google.com>
parents: 32474
diff changeset
   909
    except ImportError:
a6e4c4218b71 hghave: add check for virtualenv
Augie Fackler <augie@google.com>
parents: 32474
diff changeset
   910
        return False
32770
9cf74abd1252 hghave: add test for whether fsmonitor is enabled
Siddharth Agarwal <sid0@fb.com>
parents: 32726
diff changeset
   911
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   912
32770
9cf74abd1252 hghave: add test for whether fsmonitor is enabled
Siddharth Agarwal <sid0@fb.com>
parents: 32726
diff changeset
   913
@check("fsmonitor", "running tests with fsmonitor")
9cf74abd1252 hghave: add test for whether fsmonitor is enabled
Siddharth Agarwal <sid0@fb.com>
parents: 32726
diff changeset
   914
def has_fsmonitor():
9cf74abd1252 hghave: add test for whether fsmonitor is enabled
Siddharth Agarwal <sid0@fb.com>
parents: 32726
diff changeset
   915
    return 'HGFSMONITOR_TESTS' in os.environ
33697
4d1e79945c2e releasenotes: add import check for fuzzywuzzy
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 33528
diff changeset
   916
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   917
33697
4d1e79945c2e releasenotes: add import check for fuzzywuzzy
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 33528
diff changeset
   918
@check("fuzzywuzzy", "Fuzzy string matching library")
4d1e79945c2e releasenotes: add import check for fuzzywuzzy
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 33528
diff changeset
   919
def has_fuzzywuzzy():
4d1e79945c2e releasenotes: add import check for fuzzywuzzy
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 33528
diff changeset
   920
    try:
4d1e79945c2e releasenotes: add import check for fuzzywuzzy
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 33528
diff changeset
   921
        import fuzzywuzzy
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   922
33697
4d1e79945c2e releasenotes: add import check for fuzzywuzzy
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 33528
diff changeset
   923
        fuzzywuzzy.__version__
4d1e79945c2e releasenotes: add import check for fuzzywuzzy
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 33528
diff changeset
   924
        return True
4d1e79945c2e releasenotes: add import check for fuzzywuzzy
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 33528
diff changeset
   925
    except ImportError:
4d1e79945c2e releasenotes: add import check for fuzzywuzzy
Rishabh Madan <rishabhmadan96@gmail.com>
parents: 33528
diff changeset
   926
        return False
35668
67cead0eb671 hghave: add test for clang 6 and later
Augie Fackler <augie@google.com>
parents: 35139
diff changeset
   927
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   928
35668
67cead0eb671 hghave: add test for clang 6 and later
Augie Fackler <augie@google.com>
parents: 35139
diff changeset
   929
@check("clang-libfuzzer", "clang new enough to include libfuzzer")
67cead0eb671 hghave: add test for clang 6 and later
Augie Fackler <augie@google.com>
parents: 35139
diff changeset
   930
def has_clang_libfuzzer():
41543
dddf53473315 tests: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41443
diff changeset
   931
    mat = matchoutput('clang --version', br'clang version (\d)')
35668
67cead0eb671 hghave: add test for clang 6 and later
Augie Fackler <augie@google.com>
parents: 35139
diff changeset
   932
    if mat:
67cead0eb671 hghave: add test for clang 6 and later
Augie Fackler <augie@google.com>
parents: 35139
diff changeset
   933
        # libfuzzer is new in clang 6
67cead0eb671 hghave: add test for clang 6 and later
Augie Fackler <augie@google.com>
parents: 35139
diff changeset
   934
        return int(mat.group(1)) > 5
67cead0eb671 hghave: add test for clang 6 and later
Augie Fackler <augie@google.com>
parents: 35139
diff changeset
   935
    return False
36678
7834927f0243 tests: add tests about diff quality
Jun Wu <quark@fb.com>
parents: 36659
diff changeset
   936
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   937
38236
a6347ae6168d test-fuzz-targets: look for clang-6.0 binary as well
Yuya Nishihara <yuya@tcha.org>
parents: 38009
diff changeset
   938
@check("clang-6.0", "clang 6.0 with version suffix (libfuzzer included)")
a6347ae6168d test-fuzz-targets: look for clang-6.0 binary as well
Yuya Nishihara <yuya@tcha.org>
parents: 38009
diff changeset
   939
def has_clang60():
41543
dddf53473315 tests: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41443
diff changeset
   940
    return matchoutput('clang-6.0 --version', br'clang version 6\.')
38236
a6347ae6168d test-fuzz-targets: look for clang-6.0 binary as well
Yuya Nishihara <yuya@tcha.org>
parents: 38009
diff changeset
   941
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   942
36678
7834927f0243 tests: add tests about diff quality
Jun Wu <quark@fb.com>
parents: 36659
diff changeset
   943
@check("xdiff", "xdiff algorithm")
7834927f0243 tests: add tests about diff quality
Jun Wu <quark@fb.com>
parents: 36659
diff changeset
   944
def has_xdiff():
7834927f0243 tests: add tests about diff quality
Jun Wu <quark@fb.com>
parents: 36659
diff changeset
   945
    try:
7834927f0243 tests: add tests about diff quality
Jun Wu <quark@fb.com>
parents: 36659
diff changeset
   946
        from mercurial import policy
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   947
36678
7834927f0243 tests: add tests about diff quality
Jun Wu <quark@fb.com>
parents: 36659
diff changeset
   948
        bdiff = policy.importmod('bdiff')
36941
3f7bbce8fbaa hghave: fix xdiff check on Python 3
Augie Fackler <augie@google.com>
parents: 36694
diff changeset
   949
        return bdiff.xdiffblocks(b'', b'') == [(0, 0, 0, 0)]
36694
1d06407d0ee9 hghave: remove unused "as ex" in exception block
Augie Fackler <augie@google.com>
parents: 36678
diff changeset
   950
    except (ImportError, AttributeError):
36678
7834927f0243 tests: add tests about diff quality
Jun Wu <quark@fb.com>
parents: 36659
diff changeset
   951
        return False
37338
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   952
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   953
37342
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37338
diff changeset
   954
@check('extraextensions', 'whether tests are running with extra extensions')
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37338
diff changeset
   955
def has_extraextensions():
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37338
diff changeset
   956
    return 'HGTESTEXTRAEXTENSIONS' in os.environ
4e6a6d0dccee tests: conditionalize tests based on presence of custom extensions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37338
diff changeset
   957
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   958
37338
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   959
def getrepofeatures():
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   960
    """Obtain set of repository features in use.
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   961
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   962
    HGREPOFEATURES can be used to define or remove features. It contains
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   963
    a space-delimited list of feature strings. Strings beginning with ``-``
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   964
    mean to remove.
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   965
    """
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   966
    # Default list provided by core.
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   967
    features = {
37346
45a4799174a1 tests: disallow using simple store repo with bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37342
diff changeset
   968
        'bundlerepo',
37338
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   969
        'revlogstore',
37415
c2c8962a9465 simplestore: use a custom store for the simple store repo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37346
diff changeset
   970
        'fncache',
37338
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   971
    }
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   972
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   973
    # Features that imply other features.
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   974
    implies = {
37415
c2c8962a9465 simplestore: use a custom store for the simple store repo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37346
diff changeset
   975
        'simplestore': ['-revlogstore', '-bundlerepo', '-fncache'],
37338
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   976
    }
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   977
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   978
    for override in os.environ.get('HGREPOFEATURES', '').split(' '):
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   979
        if not override:
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   980
            continue
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   981
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   982
        if override.startswith('-'):
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   983
            if override[1:] in features:
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   984
                features.remove(override[1:])
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   985
        else:
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   986
            features.add(override)
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   987
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   988
            for imply in implies.get(override, []):
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   989
                if imply.startswith('-'):
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   990
                    if imply[1:] in features:
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   991
                        features.remove(imply[1:])
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   992
                else:
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   993
                    features.add(imply)
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   994
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   995
    return features
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   996
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
   997
37338
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   998
@check('reporevlogstore', 'repository using the default revlog store')
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
   999
def has_reporevlogstore():
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
  1000
    return 'revlogstore' in getrepofeatures()
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
  1001
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
  1002
37338
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
  1003
@check('reposimplestore', 'repository using simple storage extension')
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
  1004
def has_reposimplestore():
cbc4425e81b5 tests: conditionalize tests based on presence of revlogs for files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36942
diff changeset
  1005
    return 'simplestore' in getrepofeatures()
37346
45a4799174a1 tests: disallow using simple store repo with bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37342
diff changeset
  1006
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
  1007
37346
45a4799174a1 tests: disallow using simple store repo with bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37342
diff changeset
  1008
@check('repobundlerepo', 'whether we can open bundle files as repos')
45a4799174a1 tests: disallow using simple store repo with bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37342
diff changeset
  1009
def has_repobundlerepo():
45a4799174a1 tests: disallow using simple store repo with bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37342
diff changeset
  1010
    return 'bundlerepo' in getrepofeatures()
37415
c2c8962a9465 simplestore: use a custom store for the simple store repo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37346
diff changeset
  1011
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
  1012
37415
c2c8962a9465 simplestore: use a custom store for the simple store repo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37346
diff changeset
  1013
@check('repofncache', 'repository has an fncache')
c2c8962a9465 simplestore: use a custom store for the simple store repo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37346
diff changeset
  1014
def has_repofncache():
c2c8962a9465 simplestore: use a custom store for the simple store repo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37346
diff changeset
  1015
    return 'fncache' in getrepofeatures()
39648
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1016
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
  1017
40326
fed697fa1734 sqlitestore: file storage backend using SQLite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40263
diff changeset
  1018
@check('sqlite', 'sqlite3 module is available')
fed697fa1734 sqlitestore: file storage backend using SQLite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40263
diff changeset
  1019
def has_sqlite():
fed697fa1734 sqlitestore: file storage backend using SQLite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40263
diff changeset
  1020
    try:
fed697fa1734 sqlitestore: file storage backend using SQLite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40263
diff changeset
  1021
        import sqlite3
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
  1022
40453
1bf3e6041e2c tests: require SQLite 3.8.3+ as sqlitestore relies on "WITH" clause
Yuya Nishihara <yuya@tcha.org>
parents: 40326
diff changeset
  1023
        version = sqlite3.sqlite_version_info
40326
fed697fa1734 sqlitestore: file storage backend using SQLite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40263
diff changeset
  1024
    except ImportError:
fed697fa1734 sqlitestore: file storage backend using SQLite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40263
diff changeset
  1025
        return False
fed697fa1734 sqlitestore: file storage backend using SQLite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40263
diff changeset
  1026
40453
1bf3e6041e2c tests: require SQLite 3.8.3+ as sqlitestore relies on "WITH" clause
Yuya Nishihara <yuya@tcha.org>
parents: 40326
diff changeset
  1027
    if version < (3, 8, 3):
1bf3e6041e2c tests: require SQLite 3.8.3+ as sqlitestore relies on "WITH" clause
Yuya Nishihara <yuya@tcha.org>
parents: 40326
diff changeset
  1028
        # WITH clause not supported
1bf3e6041e2c tests: require SQLite 3.8.3+ as sqlitestore relies on "WITH" clause
Yuya Nishihara <yuya@tcha.org>
parents: 40326
diff changeset
  1029
        return False
1bf3e6041e2c tests: require SQLite 3.8.3+ as sqlitestore relies on "WITH" clause
Yuya Nishihara <yuya@tcha.org>
parents: 40326
diff changeset
  1030
41543
dddf53473315 tests: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41443
diff changeset
  1031
    return matchoutput('sqlite3 -version', br'^3\.\d+')
40326
fed697fa1734 sqlitestore: file storage backend using SQLite
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40263
diff changeset
  1032
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
  1033
39648
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1034
@check('vcr', 'vcr http mocking library')
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1035
def has_vcr():
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1036
    try:
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1037
        import vcr
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
  1038
39648
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1039
        vcr.VCR
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1040
        return True
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1041
    except (ImportError, AttributeError):
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1042
        pass
e37a0fcd82c0 hghave: add a checker for the vcr HTTP record/replay library
Augie Fackler <raf@durin42.com>
parents: 39402
diff changeset
  1043
    return False
41787
2a6ca0d94b70 hghave: add check for GNU emacs
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
  1044
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42215
diff changeset
  1045
41787
2a6ca0d94b70 hghave: add check for GNU emacs
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
  1046
@check('emacs', 'GNU Emacs')
2a6ca0d94b70 hghave: add check for GNU emacs
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
  1047
def has_emacs():
41842
28842adf8ed5 hghave: skip emacs tests on 24.3 and earlier
Augie Fackler <augie@google.com>
parents: 41787
diff changeset
  1048
    # Our emacs lisp uses `with-eval-after-load` which is new in emacs
28842adf8ed5 hghave: skip emacs tests on 24.3 and earlier
Augie Fackler <augie@google.com>
parents: 41787
diff changeset
  1049
    # 24.4, so we allow emacs 24.4, 24.5, and 25+ (24.5 was the last
28842adf8ed5 hghave: skip emacs tests on 24.3 and earlier
Augie Fackler <augie@google.com>
parents: 41787
diff changeset
  1050
    # 24 release)
28842adf8ed5 hghave: skip emacs tests on 24.3 and earlier
Augie Fackler <augie@google.com>
parents: 41787
diff changeset
  1051
    return matchoutput('emacs --version', b'GNU Emacs 2(4.4|4.5|5|6|7|8|9)')
43095
fb41ea2ea076 formatting: introduce a `test-check-format-black.t` that enforce formatting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43076
diff changeset
  1052
fb41ea2ea076 formatting: introduce a `test-check-format-black.t` that enforce formatting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43076
diff changeset
  1053
43347
abb95b6f79d3 formatting: using black to check for formatting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43194
diff changeset
  1054
@check('black', 'the black formatter for python')
43095
fb41ea2ea076 formatting: introduce a `test-check-format-black.t` that enforce formatting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43076
diff changeset
  1055
def has_black():
43347
abb95b6f79d3 formatting: using black to check for formatting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43194
diff changeset
  1056
    blackcmd = 'black --version'
43352
14e3be17e5f5 hghave: verify we have a black that is new enough for our format
Augie Fackler <augie@google.com>
parents: 43347
diff changeset
  1057
    version_regex = b'black, version ([0-9a-b.]+)'
14e3be17e5f5 hghave: verify we have a black that is new enough for our format
Augie Fackler <augie@google.com>
parents: 43347
diff changeset
  1058
    version = matchoutput(blackcmd, version_regex)
14e3be17e5f5 hghave: verify we have a black that is new enough for our format
Augie Fackler <augie@google.com>
parents: 43347
diff changeset
  1059
    sv = distutils.version.StrictVersion
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44279
diff changeset
  1060
    return version and sv(_bytes2sys(version.group(1))) >= sv('19.10b0')
43470
32ac4d0b4102 hghave: add a check for pytype, Google's Python type checker
Augie Fackler <augie@google.com>
parents: 43455
diff changeset
  1061
32ac4d0b4102 hghave: add a check for pytype, Google's Python type checker
Augie Fackler <augie@google.com>
parents: 43455
diff changeset
  1062
32ac4d0b4102 hghave: add a check for pytype, Google's Python type checker
Augie Fackler <augie@google.com>
parents: 43455
diff changeset
  1063
@check('pytype', 'the pytype type checker')
32ac4d0b4102 hghave: add a check for pytype, Google's Python type checker
Augie Fackler <augie@google.com>
parents: 43455
diff changeset
  1064
def has_pytype():
32ac4d0b4102 hghave: add a check for pytype, Google's Python type checker
Augie Fackler <augie@google.com>
parents: 43455
diff changeset
  1065
    pytypecmd = 'pytype --version'
32ac4d0b4102 hghave: add a check for pytype, Google's Python type checker
Augie Fackler <augie@google.com>
parents: 43455
diff changeset
  1066
    version = matchoutput(pytypecmd, b'[0-9a-b.]+')
32ac4d0b4102 hghave: add a check for pytype, Google's Python type checker
Augie Fackler <augie@google.com>
parents: 43455
diff changeset
  1067
    sv = distutils.version.StrictVersion
44448
55c443fcb4fc tests: rename _bytespath() to _sys2bytes() and _strpath() to _sys2str()
Manuel Jacob <me@manueljacob.de>
parents: 44279
diff changeset
  1068
    return version and sv(_bytes2sys(version.group(0))) >= sv('2019.10.17')
43819
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43699
diff changeset
  1069
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43699
diff changeset
  1070
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43699
diff changeset
  1071
@check("rustfmt", "rustfmt tool")
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43699
diff changeset
  1072
def has_rustfmt():
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43699
diff changeset
  1073
    # We use Nightly's rustfmt due to current unstable config options.
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43699
diff changeset
  1074
    return matchoutput(
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43699
diff changeset
  1075
        '`rustup which --toolchain nightly rustfmt` --version', b'rustfmt'
e8a3bbffdc7d tests: add test for Rust formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43699
diff changeset
  1076
    )
45048
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1077
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1078
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1079
@check("lzma", "python lzma module")
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1080
def has_lzma():
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1081
    try:
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1082
        import _lzma
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1083
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1084
        _lzma.FORMAT_XZ
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1085
        return True
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1086
    except ImportError:
2c0043977b6d archival: abort if compression method is unavailable
Manuel Jacob <me@manueljacob.de>
parents: 44640
diff changeset
  1087
        return False