tests/hghave: extract hghave.py
hghave is degraded to a bare script, moving the functions to hghave.py
so they can be shared later on.
--- a/tests/hghave Sat Jun 16 21:57:42 2012 +0200
+++ b/tests/hghave Thu Jun 14 12:54:54 2012 +0200
@@ -4,280 +4,10 @@
prefixed with "no-", the absence of feature is tested.
"""
import optparse
-import os, stat
-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()
- try:
- ret = fh.close()
- except IOError:
- # Happen in Windows test environment
- ret = 1
- return (ignorestatus or ret is None) and r.search(s)
-
-def has_baz():
- return matchoutput('baz --version 2>&1', r'baz Bazaar version')
-
-def has_bzr():
- try:
- import bzrlib
- return bzrlib.__doc__ is not None
- except ImportError:
- return False
-
-def has_bzr114():
- try:
- import bzrlib
- return (bzrlib.__doc__ is not None
- and bzrlib.version_info[:2] >= (1, 14))
- except ImportError:
- return False
-
-def has_cvs():
- re = r'Concurrent Versions System.*?server'
- return matchoutput('cvs --version 2>&1', re) and not has_msys()
-
-def has_darcs():
- return matchoutput('darcs --version', r'2\.[2-9]', True)
-
-def has_mtn():
- return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
- 'mtn --version', r'monotone 0\.', True)
-
-def has_eol_in_paths():
- try:
- fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
- os.close(fd)
- os.remove(path)
- return True
- except (IOError, OSError):
- return False
-
-def has_executablebit():
- try:
- EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
- fh, fn = tempfile.mkstemp(dir=".", prefix='hg-checkexec-')
- try:
- os.close(fh)
- m = os.stat(fn).st_mode & 0777
- new_file_has_exec = m & EXECFLAGS
- os.chmod(fn, m ^ EXECFLAGS)
- exec_flags_cannot_flip = ((os.stat(fn).st_mode & 0777) == m)
- finally:
- os.unlink(fn)
- except (IOError, OSError):
- # we don't care, the user probably won't be able to commit anyway
- return False
- return not (new_file_has_exec or exec_flags_cannot_flip)
-
-def has_icasefs():
- # Stolen from mercurial.util
- fd, path = tempfile.mkstemp(prefix=tempprefix, dir='.')
- os.close(fd)
- try:
- s1 = os.stat(path)
- d, b = os.path.split(path)
- p2 = os.path.join(d, b.upper())
- if path == p2:
- p2 = os.path.join(d, b.lower())
- try:
- s2 = os.stat(p2)
- return s2 == s1
- except OSError:
- return False
- finally:
- os.remove(path)
-
-def has_inotify():
- try:
- import hgext.inotify.linux.watcher
- return True
- except ImportError:
- return False
-
-def has_fifo():
- return getattr(os, "mkfifo", None) is not None
-
-def has_cacheable_fs():
- from mercurial import util
-
- fd, path = tempfile.mkstemp(prefix=tempprefix)
- os.close(fd)
- try:
- return util.cachestat(path).cacheable()
- finally:
- os.remove(path)
-
-def has_lsprof():
- try:
- import _lsprof
- return True
- except ImportError:
- return False
-
-def has_gettext():
- return matchoutput('msgfmt --version', 'GNU gettext-tools')
-
-def has_git():
- return matchoutput('git --version 2>&1', r'^git version')
-
-def has_docutils():
- try:
- from docutils.core import publish_cmdline
- return True
- except ImportError:
- return False
+import hghave
-def getsvnversion():
- m = matchoutput('svn --version 2>&1', r'^svn,\s+version\s+(\d+)\.(\d+)')
- if not m:
- return (0, 0)
- return (int(m.group(1)), int(m.group(2)))
-
-def has_svn15():
- return getsvnversion() >= (1, 5)
-
-def has_svn13():
- return getsvnversion() >= (1, 3)
-
-def has_svn():
- return matchoutput('svn --version 2>&1', r'^svn, version') and \
- matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
-
-def has_svn_bindings():
- try:
- import svn.core
- version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
- if version < (1, 4):
- return False
- return True
- except ImportError:
- return False
-
-def has_p4():
- return (matchoutput('p4 -V', r'Rev\. P4/') and
- matchoutput('p4d -V', r'Rev\. P4D/'))
-
-def has_symlink():
- if getattr(os, "symlink", None) is None:
- return False
- name = tempfile.mktemp(dir=".", prefix='hg-checklink-')
- try:
- os.symlink(".", name)
- os.unlink(name)
- return True
- except (OSError, AttributeError):
- return False
-
-def has_tla():
- return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
-
-def has_gpg():
- return matchoutput('gpg --version 2>&1', r'GnuPG')
-
-def has_unix_permissions():
- d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
- try:
- fname = os.path.join(d, 'foo')
- for umask in (077, 007, 022):
- os.umask(umask)
- f = open(fname, 'w')
- f.close()
- mode = os.stat(fname).st_mode
- os.unlink(fname)
- if mode & 0777 != ~umask & 0666:
- return False
- return True
- finally:
- os.rmdir(d)
-
-def has_pyflakes():
- return matchoutput("sh -c \"echo 'import re' 2>&1 | pyflakes\"",
- r"<stdin>:1: 're' imported but unused",
- True)
-
-def has_pygments():
- try:
- import pygments
- return True
- except ImportError:
- return False
-
-def has_outer_repo():
- return matchoutput('hg root 2>&1', r'')
-
-def has_ssl():
- try:
- import ssl
- import OpenSSL
- OpenSSL.SSL.Context
- return True
- except ImportError:
- return False
-
-def has_windows():
- return os.name == 'nt'
-
-def has_system_sh():
- return os.name != 'nt'
-
-def has_serve():
- return os.name != 'nt' # gross approximation
-
-def has_tic():
- return matchoutput('test -x "`which tic`"', '')
-
-def has_msys():
- return os.getenv('MSYSTEM')
-
-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"),
- "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"),
- "icasefs": (has_icasefs, "case insensitive file system"),
- "inotify": (has_inotify, "inotify extension 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"),
- "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"),
- "tic": (has_tic, "terminfo compiler"),
- "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"),
-}
+checks = hghave.checks
def list_features():
for name, feature in checks.iteritems():
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/hghave.py Thu Jun 14 12:54:54 2012 +0200
@@ -0,0 +1,274 @@
+import os, stat
+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()
+ try:
+ ret = fh.close()
+ except IOError:
+ # Happen in Windows test environment
+ ret = 1
+ return (ignorestatus or ret is None) and r.search(s)
+
+def has_baz():
+ return matchoutput('baz --version 2>&1', r'baz Bazaar version')
+
+def has_bzr():
+ try:
+ import bzrlib
+ return bzrlib.__doc__ is not None
+ except ImportError:
+ return False
+
+def has_bzr114():
+ try:
+ import bzrlib
+ return (bzrlib.__doc__ is not None
+ and bzrlib.version_info[:2] >= (1, 14))
+ except ImportError:
+ return False
+
+def has_cvs():
+ re = r'Concurrent Versions System.*?server'
+ return matchoutput('cvs --version 2>&1', re) and not has_msys()
+
+def has_darcs():
+ return matchoutput('darcs --version', r'2\.[2-9]', True)
+
+def has_mtn():
+ return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
+ 'mtn --version', r'monotone 0\.', True)
+
+def has_eol_in_paths():
+ try:
+ fd, path = tempfile.mkstemp(prefix=tempprefix, suffix='\n\r')
+ os.close(fd)
+ os.remove(path)
+ return True
+ except (IOError, OSError):
+ return False
+
+def has_executablebit():
+ try:
+ EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
+ fh, fn = tempfile.mkstemp(dir=".", prefix='hg-checkexec-')
+ try:
+ os.close(fh)
+ m = os.stat(fn).st_mode & 0777
+ new_file_has_exec = m & EXECFLAGS
+ os.chmod(fn, m ^ EXECFLAGS)
+ exec_flags_cannot_flip = ((os.stat(fn).st_mode & 0777) == m)
+ finally:
+ os.unlink(fn)
+ except (IOError, OSError):
+ # we don't care, the user probably won't be able to commit anyway
+ return False
+ return not (new_file_has_exec or exec_flags_cannot_flip)
+
+def has_icasefs():
+ # Stolen from mercurial.util
+ fd, path = tempfile.mkstemp(prefix=tempprefix, dir='.')
+ os.close(fd)
+ try:
+ s1 = os.stat(path)
+ d, b = os.path.split(path)
+ p2 = os.path.join(d, b.upper())
+ if path == p2:
+ p2 = os.path.join(d, b.lower())
+ try:
+ s2 = os.stat(p2)
+ return s2 == s1
+ except OSError:
+ return False
+ finally:
+ os.remove(path)
+
+def has_inotify():
+ try:
+ import hgext.inotify.linux.watcher
+ return True
+ except ImportError:
+ return False
+
+def has_fifo():
+ return getattr(os, "mkfifo", None) is not None
+
+def has_cacheable_fs():
+ from mercurial import util
+
+ fd, path = tempfile.mkstemp(prefix=tempprefix)
+ os.close(fd)
+ try:
+ return util.cachestat(path).cacheable()
+ finally:
+ os.remove(path)
+
+def has_lsprof():
+ try:
+ import _lsprof
+ return True
+ except ImportError:
+ return False
+
+def has_gettext():
+ return matchoutput('msgfmt --version', 'GNU gettext-tools')
+
+def has_git():
+ return matchoutput('git --version 2>&1', r'^git version')
+
+def has_docutils():
+ try:
+ from docutils.core import publish_cmdline
+ return True
+ except ImportError:
+ return False
+
+def getsvnversion():
+ m = matchoutput('svn --version 2>&1', r'^svn,\s+version\s+(\d+)\.(\d+)')
+ if not m:
+ return (0, 0)
+ return (int(m.group(1)), int(m.group(2)))
+
+def has_svn15():
+ return getsvnversion() >= (1, 5)
+
+def has_svn13():
+ return getsvnversion() >= (1, 3)
+
+def has_svn():
+ return matchoutput('svn --version 2>&1', r'^svn, version') and \
+ matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
+
+def has_svn_bindings():
+ try:
+ import svn.core
+ version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
+ if version < (1, 4):
+ return False
+ return True
+ except ImportError:
+ return False
+
+def has_p4():
+ return (matchoutput('p4 -V', r'Rev\. P4/') and
+ matchoutput('p4d -V', r'Rev\. P4D/'))
+
+def has_symlink():
+ if getattr(os, "symlink", None) is None:
+ return False
+ name = tempfile.mktemp(dir=".", prefix='hg-checklink-')
+ try:
+ os.symlink(".", name)
+ os.unlink(name)
+ return True
+ except (OSError, AttributeError):
+ return False
+
+def has_tla():
+ return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
+
+def has_gpg():
+ return matchoutput('gpg --version 2>&1', r'GnuPG')
+
+def has_unix_permissions():
+ d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
+ try:
+ fname = os.path.join(d, 'foo')
+ for umask in (077, 007, 022):
+ os.umask(umask)
+ f = open(fname, 'w')
+ f.close()
+ mode = os.stat(fname).st_mode
+ os.unlink(fname)
+ if mode & 0777 != ~umask & 0666:
+ return False
+ return True
+ finally:
+ os.rmdir(d)
+
+def has_pyflakes():
+ return matchoutput("sh -c \"echo 'import re' 2>&1 | pyflakes\"",
+ r"<stdin>:1: 're' imported but unused",
+ True)
+
+def has_pygments():
+ try:
+ import pygments
+ return True
+ except ImportError:
+ return False
+
+def has_outer_repo():
+ return matchoutput('hg root 2>&1', r'')
+
+def has_ssl():
+ try:
+ import ssl
+ import OpenSSL
+ OpenSSL.SSL.Context
+ return True
+ except ImportError:
+ return False
+
+def has_windows():
+ return os.name == 'nt'
+
+def has_system_sh():
+ return os.name != 'nt'
+
+def has_serve():
+ return os.name != 'nt' # gross approximation
+
+def has_tic():
+ return matchoutput('test -x "`which tic`"', '')
+
+def has_msys():
+ return os.getenv('MSYSTEM')
+
+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"),
+ "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"),
+ "icasefs": (has_icasefs, "case insensitive file system"),
+ "inotify": (has_inotify, "inotify extension 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"),
+ "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"),
+ "tic": (has_tic, "terminfo compiler"),
+ "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"),
+}