--- a/tests/hghave.py Sun Aug 10 23:13:12 2014 -0500
+++ b/tests/hghave.py Mon Aug 11 09:35:24 2014 -0500
@@ -5,6 +5,17 @@
tempprefix = 'hg-hghave-'
+checks = {
+ "true": (lambda: True, "yak shaving"),
+ "false": (lambda: False, "nail clipper"),
+}
+
+def check(name, desc):
+ def decorator(func):
+ checks[name] = (func, desc)
+ return func
+ return decorator
+
def matchoutput(cmd, regexp, ignorestatus=False):
"""Return True if cmd executes successfully and its output
is matched by the supplied regular expression.
@@ -19,9 +30,11 @@
ret = 1
return (ignorestatus or ret is None) and r.search(s)
+@check("baz", "GNU Arch baz client")
def has_baz():
return matchoutput('baz --version 2>&1', r'baz Bazaar version')
+@check("bzr", "Canonical's Bazaar client")
def has_bzr():
try:
import bzrlib
@@ -29,6 +42,7 @@
except ImportError:
return False
+@check("bzr114", "Canonical's Bazaar client >= 1.14")
def has_bzr114():
try:
import bzrlib
@@ -37,21 +51,26 @@
except ImportError:
return False
+@check("cvs", "cvs client/server")
def has_cvs():
re = r'Concurrent Versions System.*?server'
return matchoutput('cvs --version 2>&1', re) and not has_msys()
+@check("cvs112", "cvs client/server >= 1.12")
def has_cvs112():
re = r'Concurrent Versions System \(CVS\) 1.12.*?server'
return matchoutput('cvs --version 2>&1', re) and not has_msys()
+@check("darcs", "darcs client")
def has_darcs():
return matchoutput('darcs --version', r'2\.[2-9]', True)
+@check("mtn", "monotone client (>= 1.0)")
def has_mtn():
return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
'mtn --version', r'monotone 0\.', True)
+@check("eol-in-paths", "end-of-lines in paths")
def has_eol_in_paths():
try:
fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix, suffix='\n\r')
@@ -61,6 +80,7 @@
except (IOError, OSError):
return False
+@check("execbit", "executable bit")
def has_executablebit():
try:
EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
@@ -78,6 +98,7 @@
return False
return not (new_file_has_exec or exec_flags_cannot_flip)
+@check("icasefs", "case insensitive file system")
def has_icasefs():
# Stolen from mercurial.util
fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix)
@@ -96,6 +117,7 @@
finally:
os.remove(path)
+@check("fifo", "named pipes")
def has_fifo():
if getattr(os, "mkfifo", None) is None:
return False
@@ -107,9 +129,11 @@
except OSError:
return False
+@check("killdaemons", 'killdaemons.py support')
def has_killdaemons():
return True
+@check("cacheable", "cacheable filesystem")
def has_cacheable_fs():
from mercurial import util
@@ -120,6 +144,7 @@
finally:
os.remove(path)
+@check("lsprof", "python lsprof module")
def has_lsprof():
try:
import _lsprof
@@ -127,12 +152,15 @@
except ImportError:
return False
+@check("gettext", "GNU Gettext (msgfmt)")
def has_gettext():
return matchoutput('msgfmt --version', 'GNU gettext-tools')
+@check("git", "git command line client")
def has_git():
return matchoutput('git --version 2>&1', r'^git version')
+@check("docutils", "Docutils text processing library")
def has_docutils():
try:
from docutils.core import publish_cmdline
@@ -146,16 +174,20 @@
return (0, 0)
return (int(m.group(1)), int(m.group(2)))
+@check("svn15", "subversion client and admin tools >= 1.5")
def has_svn15():
return getsvnversion() >= (1, 5)
+@check("svn13", "subversion client and admin tools >= 1.3")
def has_svn13():
return getsvnversion() >= (1, 3)
+@check("svn", "subversion client and admin tools")
def has_svn():
return matchoutput('svn --version 2>&1', r'^svn, version') and \
matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
+@check("svn-bindings", "subversion python bindings")
def has_svn_bindings():
try:
import svn.core
@@ -166,10 +198,12 @@
except ImportError:
return False
+@check("p4", "Perforce server and client")
def has_p4():
return (matchoutput('p4 -V', r'Rev\. P4/') and
matchoutput('p4d -V', r'Rev\. P4D/'))
+@check("symlink", "symbolic links")
def has_symlink():
if getattr(os, "symlink", None) is None:
return False
@@ -181,6 +215,7 @@
except (OSError, AttributeError):
return False
+@check("hardlink", "hardlinks")
def has_hardlink():
from mercurial import util
fh, fn = tempfile.mkstemp(dir='.', prefix=tempprefix)
@@ -196,12 +231,15 @@
finally:
os.unlink(fn)
+@check("tla", "GNU Arch tla client")
def has_tla():
return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
+@check("gpg", "gpg client")
def has_gpg():
return matchoutput('gpg --version 2>&1', r'GnuPG')
+@check("unix-permissions", "unix-style permissions")
def has_unix_permissions():
d = tempfile.mkdtemp(dir='.', prefix=tempprefix)
try:
@@ -218,14 +256,17 @@
finally:
os.rmdir(d)
+@check("root", "root permissions")
def has_root():
return getattr(os, 'geteuid', None) and os.geteuid() == 0
+@check("pyflakes", "Pyflakes python linter")
def has_pyflakes():
return matchoutput("sh -c \"echo 'import re' 2>&1 | pyflakes\"",
r"<stdin>:1: 're' imported but unused",
True)
+@check("pygments", "Pygments source highlighting library")
def has_pygments():
try:
import pygments
@@ -233,14 +274,17 @@
except ImportError:
return False
+@check("python243", "python >= 2.4.3")
def has_python243():
return sys.version_info >= (2, 4, 3)
+@check("outer-repo", "outer repo")
def has_outer_repo():
# failing for other reasons than 'no repo' imply that there is a repo
return not matchoutput('hg root 2>&1',
r'abort: no repository found', True)
+@check("ssl", "python >= 2.6 ssl module and python OpenSSL")
def has_ssl():
try:
import ssl
@@ -250,19 +294,24 @@
except ImportError:
return False
+@check("windows", "Windows")
def has_windows():
return os.name == 'nt'
+@check("system-sh", "system() uses sh")
def has_system_sh():
return os.name != 'nt'
+@check("serve", "platform and python can manage 'hg serve -d'")
def has_serve():
return os.name != 'nt' # gross approximation
+@check("test-repo", "running tests from repository")
def has_test_repo():
t = os.environ["TESTDIR"]
return os.path.isdir(os.path.join(t, "..", ".hg"))
+@check("tic", "terminfo compiler and curses module")
def has_tic():
try:
import curses
@@ -271,63 +320,20 @@
except ImportError:
return False
+@check("msys", "Windows with MSYS")
def has_msys():
return os.getenv('MSYSTEM')
+@check("aix", "AIX")
def has_aix():
return sys.platform.startswith("aix")
+@check("absimport", "absolute_import in __future__")
def has_absimport():
import __future__
from mercurial import util
return util.safehasattr(__future__, "absolute_import")
+@check("py3k", "running with Python 3.x")
def has_py3k():
return 3 == sys.version_info[0]
-
-checks = {
- "true": (lambda: True, "yak shaving"),
- "false": (lambda: False, "nail clipper"),
- "baz": (has_baz, "GNU Arch baz client"),
- "bzr": (has_bzr, "Canonical's Bazaar client"),
- "bzr114": (has_bzr114, "Canonical's Bazaar client >= 1.14"),
- "cacheable": (has_cacheable_fs, "cacheable filesystem"),
- "cvs": (has_cvs, "cvs client/server"),
- "cvs112": (has_cvs112, "cvs client/server >= 1.12"),
- "darcs": (has_darcs, "darcs client"),
- "docutils": (has_docutils, "Docutils text processing library"),
- "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
- "execbit": (has_executablebit, "executable bit"),
- "fifo": (has_fifo, "named pipes"),
- "gettext": (has_gettext, "GNU Gettext (msgfmt)"),
- "git": (has_git, "git command line client"),
- "gpg": (has_gpg, "gpg client"),
- "hardlink": (has_hardlink, "hardlinks"),
- "icasefs": (has_icasefs, "case insensitive file system"),
- "killdaemons": (has_killdaemons, 'killdaemons.py support'),
- "lsprof": (has_lsprof, "python lsprof module"),
- "mtn": (has_mtn, "monotone client (>= 1.0)"),
- "outer-repo": (has_outer_repo, "outer repo"),
- "p4": (has_p4, "Perforce server and client"),
- "pyflakes": (has_pyflakes, "Pyflakes python linter"),
- "pygments": (has_pygments, "Pygments source highlighting library"),
- "python243": (has_python243, "python >= 2.4.3"),
- "root": (has_root, "root permissions"),
- "serve": (has_serve, "platform and python can manage 'hg serve -d'"),
- "ssl": (has_ssl, "python >= 2.6 ssl module and python OpenSSL"),
- "svn": (has_svn, "subversion client and admin tools"),
- "svn13": (has_svn13, "subversion client and admin tools >= 1.3"),
- "svn15": (has_svn15, "subversion client and admin tools >= 1.5"),
- "svn-bindings": (has_svn_bindings, "subversion python bindings"),
- "symlink": (has_symlink, "symbolic links"),
- "system-sh": (has_system_sh, "system() uses sh"),
- "test-repo": (has_test_repo, "running tests from repository"),
- "tic": (has_tic, "terminfo compiler and curses module"),
- "tla": (has_tla, "GNU Arch tla client"),
- "unix-permissions": (has_unix_permissions, "unix-style permissions"),
- "windows": (has_windows, "Windows"),
- "msys": (has_msys, "Windows with MSYS"),
- "aix": (has_aix, "AIX"),
- "absimport": (has_absimport, "absolute_import in __future__"),
- "py3k": (has_py3k, "running with Python 3.x"),
-}