tests/hghave: extract hghave.py
authorAdrian Buehlmann <adrian@cadifra.com>
Thu, 14 Jun 2012 12:54:54 +0200
changeset 16966 23f621ca04b5
parent 16965 91284af53508
child 16967 30cfa286947c
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.
tests/hghave
tests/hghave.py
--- 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"),
+}