view tests/hghave @ 5304:b85f7cc133cc

convert: avoid interpreting Windows path as CVS connection strings. CVS connection strings regexp detect colons to separate protocols from path and login. Unfortunately, Windows paths contains colons and were interpreted as rsh connection strings.
author Patrick Mezard <pmezard@gmail.com>
date Fri, 14 Sep 2007 22:17:53 +0200
parents 961876838de0
children 9400d677efc7
line wrap: on
line source

#!/usr/bin/env python
"""Test the running system for features availability. Exit with zero
if all features are there, non-zero otherwise. If a feature name is
prefixed with "no-", the absence of feature is tested.
"""
import optparse
import os
import re
import sys
import tempfile

tempprefix = 'hg-hghave-'

def matchoutput(cmd, regexp, ignorestatus=False):
    """Return True if cmd executes successfully and its output
    is matched by the supplied regular expression.
    """
    r = re.compile(regexp)
    fh = os.popen(cmd)
    s = fh.read()
    ret = fh.close()
    return (ignorestatus or ret is None) and r.search(s)

def has_symlink():
    return hasattr(os, "symlink")

def has_fifo():
    return hasattr(os, "mkfifo")

def has_cvs():
    return matchoutput('cvs --version 2>&1', r'Concurrent Versions System')

def has_cvsps():
    return matchoutput('cvsps -h -q 2>&1', r'cvsps version', True)

def has_executablebit():
    fd, path = tempfile.mkstemp(prefix=tempprefix)
    os.close(fd)
    try:
        s = os.lstat(path).st_mode
        os.chmod(path, s | 0100)
        return (os.lstat(path).st_mode & 0100 != 0)
    finally:
        os.remove(path)

def has_eol_in_paths():
    try:
        fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
        os.close(fd)
        os.remove(path)
        return True
    except:
        return False

def has_hotshot():
    try:
        # hotshot.stats tests hotshot and many problematic dependencies
        # like profile.
        import hotshot.stats
        return True
    except ImportError:
        return False

def has_lsprof():
    try:
        import _lsprof
        return True
    except ImportError:
        return False

def has_git():
    return matchoutput('git --version 2>&1', r'^git version')

checks = {
    "cvs": (has_cvs, "cvs client"),
    "cvsps": (has_cvsps, "cvsps utility"),
    "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
    "execbit": (has_executablebit, "executable bit"),
    "git": (has_git, "git command line client"),
    "fifo": (has_fifo, "named pipes"),
    "hotshot": (has_hotshot, "python hotshot module"),
    "lsprof": (has_lsprof, "python lsprof module"),
    "symlink": (has_symlink, "symbolic links"),
}

def list_features():
    for name, feature in checks.iteritems():
        desc = feature[1]
        print name + ':', desc

parser = optparse.OptionParser("%prog [options] [features]")
parser.add_option("--list-features", action="store_true",
                  help="list available features")
parser.add_option("-q", "--quiet", action="store_true",
                  help="check features silently")

if __name__ == '__main__':
    options, args = parser.parse_args()
    if options.list_features:
        list_features()
        sys.exit(0)

    quiet = options.quiet

    failures = 0

    def error(msg):
        global failures
        if not quiet:
            sys.stderr.write(msg + '\n')
        failures += 1

    for feature in args:
        negate = feature.startswith('no-')
        if negate:
            feature = feature[3:]

        if feature not in checks:
            error('hghave: unknown feature: ' + feature)
            continue

        check, desc = checks[feature]
        if not negate and not check():
            error('hghave: missing feature: ' + desc)
        elif negate and check():
            error('hghave: system supports %s' % desc)

    if failures != 0:
        sys.exit(1)