##// END OF EJS Templates
hghave: wrap command output matching
hghave: wrap command output matching

File last commit:

r5252:c0281c6b default
r5252:c0281c6b default
Show More
hghave
123 lines | 3.1 KiB | text/plain | TextLexer
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 #!/usr/bin/env python
"""Test the running system for features availability. Exit with zero
Patrick Mezard
hghave: feature absence can be checked by prefixing with 'no-'
r5084 if all features are there, non-zero otherwise. If a feature name is
prefixed with "no-", the absence of feature is tested.
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 """
import optparse
import os
Patrick Mezard
hghave: wrap command output matching
r5252 import re
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 import sys
Patrick Mezard
hghave: detect executable permission availability.
r5072 import tempfile
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881
Patrick Mezard
hghave: prefix temporary files with "hg-hghave-"
r5090 tempprefix = 'hg-hghave-'
Patrick Mezard
hghave: wrap command output matching
r5252 def matchoutput(cmd, regexp):
"""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 ret is None and r.search(s)
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 def has_symlink():
return hasattr(os, "symlink")
Patrick Mezard
hghave: detect FIFO availability
r5070 def has_fifo():
return hasattr(os, "mkfifo")
Patrick Mezard
hghave: detect executable permission availability.
r5072 def has_executablebit():
Patrick Mezard
hghave: prefix temporary files with "hg-hghave-"
r5090 fd, path = tempfile.mkstemp(prefix=tempprefix)
Patrick Mezard
hghave: detect executable permission availability.
r5072 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)
Patrick Mezard
hghave: detect support for EOL in paths.
r5074 def has_eol_in_paths():
try:
Patrick Mezard
hghave: prefix temporary files with "hg-hghave-"
r5090 fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
Patrick Mezard
hghave: detect support for EOL in paths.
r5074 os.close(fd)
os.remove(path)
return True
except:
return False
Patrick Mezard
test-profile: fix grep, check hotshot availability
r5102 def has_hotshot():
try:
Patrick Mezard
hghave: test hotshot dependencies (debian does not provide profile)
r5103 # hotshot.stats tests hotshot and many problematic dependencies
# like profile.
import hotshot.stats
Patrick Mezard
test-profile: fix grep, check hotshot availability
r5102 return True
except ImportError:
return False
Patrick Mezard
Test --time, --profile and --lsprof
r5099 def has_lsprof():
try:
import _lsprof
return True
except ImportError:
return False
Patrick Mezard
hghave: detect git availability
r5218 def has_git():
Patrick Mezard
hghave: wrap command output matching
r5252 return matchoutput('git --version 2>&1', r'^git version')
Patrick Mezard
hghave: detect git availability
r5218
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 checks = {
Patrick Mezard
Test --time, --profile and --lsprof
r5099 "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
"execbit": (has_executablebit, "executable bit"),
Patrick Mezard
hghave: detect git availability
r5218 "git": (has_git, "git command line client"),
Patrick Mezard
hghave: detect FIFO availability
r5070 "fifo": (has_fifo, "named pipes"),
Patrick Mezard
test-profile: fix grep, check hotshot availability
r5102 "hotshot": (has_hotshot, "python hotshot module"),
Patrick Mezard
Test --time, --profile and --lsprof
r5099 "lsprof": (has_lsprof, "python lsprof module"),
"symlink": (has_symlink, "symbolic links"),
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 }
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)
Thomas Arendsen Hein
Remove trailing spaces
r5081
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 quiet = options.quiet
failures = 0
def error(msg):
global failures
if not quiet:
sys.stderr.write(msg + '\n')
failures += 1
Thomas Arendsen Hein
Remove trailing spaces
r5081
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 for feature in args:
Patrick Mezard
hghave: feature absence can be checked by prefixing with 'no-'
r5084 negate = feature.startswith('no-')
if negate:
feature = feature[3:]
Thomas Arendsen Hein
Hide absolute path from test-no-symlinks output....
r5091
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 if feature not in checks:
error('hghave: unknown feature: ' + feature)
continue
Thomas Arendsen Hein
Remove trailing spaces
r5081
check, desc = checks[feature]
Patrick Mezard
hghave: feature absence can be checked by prefixing with 'no-'
r5084 if not negate and not check():
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881 error('hghave: missing feature: ' + desc)
Patrick Mezard
hghave: feature absence can be checked by prefixing with 'no-'
r5084 elif negate and check():
Thomas Arendsen Hein
Print less scary message if the system supports symlinks:...
r5092 error('hghave: system supports %s' % desc)
Patrick Mezard
Add hghave utility and run-tests.py support....
r4881
if failures != 0:
sys.exit(1)
Thomas Arendsen Hein
Remove trailing spaces
r5081