##// END OF EJS Templates
transaction: use 'util.copyfile' for creating backup...
transaction: use 'util.copyfile' for creating backup Using 'copyfile' (single file) instead of 'copyfiles' (tree) will ensures destination file will be overwritten. This will prevent some abort if backup file are left in place for random reason. It also seems more correct.

File last commit:

r23825:b2358bc1 default
r23900:5eb3541f default
Show More
hghave.py
369 lines | 9.9 KiB | text/x-python | PythonLexer
Matt Mackall
tests: fix unused imports from inotify removal caught by pyflakes
r20644 import os, stat
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 import re
Yuya Nishihara
cmdserver: add service that listens on unix domain socket and forks process...
r22994 import socket
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 import sys
import tempfile
tempprefix = 'hg-hghave-'
Matt Mackall
tests: use a decorator for hghave checks
r22093 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
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 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)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("baz", "GNU Arch baz client")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_baz():
return matchoutput('baz --version 2>&1', r'baz Bazaar version')
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("bzr", "Canonical's Bazaar client")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_bzr():
try:
import bzrlib
return bzrlib.__doc__ is not None
except ImportError:
return False
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("bzr114", "Canonical's Bazaar client >= 1.14")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_bzr114():
try:
import bzrlib
return (bzrlib.__doc__ is not None
and bzrlib.version_info[:2] >= (1, 14))
except ImportError:
return False
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("cvs", "cvs client/server")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_cvs():
re = r'Concurrent Versions System.*?server'
return matchoutput('cvs --version 2>&1', re) and not has_msys()
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("cvs112", "cvs client/server >= 1.12")
Bryan O'Sullivan
hghave: introduce a test (unused) for cvs >= 1.12
r18285 def has_cvs112():
re = r'Concurrent Versions System \(CVS\) 1.12.*?server'
return matchoutput('cvs --version 2>&1', re) and not has_msys()
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("darcs", "darcs client")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_darcs():
return matchoutput('darcs --version', r'2\.[2-9]', True)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("mtn", "monotone client (>= 1.0)")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_mtn():
return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
'mtn --version', r'monotone 0\.', True)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("eol-in-paths", "end-of-lines in paths")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_eol_in_paths():
try:
Mads Kiilerich
tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles...
r16968 fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix, suffix='\n\r')
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 os.close(fd)
os.remove(path)
return True
except (IOError, OSError):
return False
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("execbit", "executable bit")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_executablebit():
try:
EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
Mads Kiilerich
tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles...
r16968 fh, fn = tempfile.mkstemp(dir='.', prefix=tempprefix)
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 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)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("icasefs", "case insensitive file system")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_icasefs():
# Stolen from mercurial.util
Mads Kiilerich
tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles...
r16968 fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix)
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 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)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("fifo", "named pipes")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_fifo():
Mads Kiilerich
tests/hghave: test that a fifo actually can be created on the filesystem...
r16969 if getattr(os, "mkfifo", None) is None:
return False
name = tempfile.mktemp(dir='.', prefix=tempprefix)
try:
os.mkfifo(name)
os.unlink(name)
return True
except OSError:
return False
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("killdaemons", 'killdaemons.py support')
Patrick Mezard
test-http-branchmap: enable on Windows...
r17467 def has_killdaemons():
return True
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("cacheable", "cacheable filesystem")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_cacheable_fs():
from mercurial import util
Mads Kiilerich
tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles...
r16968 fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix)
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 os.close(fd)
try:
return util.cachestat(path).cacheable()
finally:
os.remove(path)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("lsprof", "python lsprof module")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_lsprof():
try:
import _lsprof
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 _lsprof.Profiler # silence unused import warning
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 return True
except ImportError:
return False
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("gettext", "GNU Gettext (msgfmt)")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_gettext():
return matchoutput('msgfmt --version', 'GNU gettext-tools')
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("git", "git command line client")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_git():
return matchoutput('git --version 2>&1', r'^git version')
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("docutils", "Docutils text processing library")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_docutils():
try:
from docutils.core import publish_cmdline
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 publish_cmdline # silence unused import
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 return True
except ImportError:
return False
def getsvnversion():
Thomas Arendsen Hein
subrepo, hghave: use "svn --version --quiet" to determine version number...
r17707 m = matchoutput('svn --version --quiet 2>&1', r'^(\d+)\.(\d+)')
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 if not m:
return (0, 0)
return (int(m.group(1)), int(m.group(2)))
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("svn15", "subversion client and admin tools >= 1.5")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_svn15():
return getsvnversion() >= (1, 5)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("svn13", "subversion client and admin tools >= 1.3")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_svn13():
return getsvnversion() >= (1, 3)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("svn", "subversion client and admin tools")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_svn():
return matchoutput('svn --version 2>&1', r'^svn, version') and \
matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("svn-bindings", "subversion python bindings")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 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
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("p4", "Perforce server and client")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_p4():
return (matchoutput('p4 -V', r'Rev\. P4/') and
matchoutput('p4d -V', r'Rev\. P4D/'))
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("symlink", "symbolic links")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_symlink():
if getattr(os, "symlink", None) is None:
return False
Mads Kiilerich
tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles...
r16968 name = tempfile.mktemp(dir='.', prefix=tempprefix)
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 try:
os.symlink(".", name)
os.unlink(name)
return True
except (OSError, AttributeError):
return False
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("hardlink", "hardlinks")
Mads Kiilerich
tests: introduce hghave hardlinks...
r16971 def has_hardlink():
from mercurial import util
fh, fn = tempfile.mkstemp(dir='.', prefix=tempprefix)
os.close(fh)
name = tempfile.mktemp(dir='.', prefix=tempprefix)
try:
try:
util.oslink(fn, name)
os.unlink(name)
return True
except OSError:
return False
finally:
os.unlink(fn)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("tla", "GNU Arch tla client")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_tla():
return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("gpg", "gpg client")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_gpg():
return matchoutput('gpg --version 2>&1', r'GnuPG')
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("unix-permissions", "unix-style permissions")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_unix_permissions():
Mads Kiilerich
tests/hghave: consistently use dir='.', prefix=tempprefix for tempfiles...
r16968 d = tempfile.mkdtemp(dir='.', prefix=tempprefix)
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 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)
Yuya Nishihara
cmdserver: add service that listens on unix domain socket and forks process...
r22994 @check("unix-socket", "AF_UNIX socket family")
def has_unix_socket():
return getattr(socket, 'AF_UNIX', None) is not None
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("root", "root permissions")
Matt Mackall
tests: skip tests that require not having root (issue4089)...
r20008 def has_root():
Simon Heimberg
tests: fix `hghave root` on windows...
r20114 return getattr(os, 'geteuid', None) and os.geteuid() == 0
Matt Mackall
tests: skip tests that require not having root (issue4089)...
r20008
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("pyflakes", "Pyflakes python linter")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_pyflakes():
return matchoutput("sh -c \"echo 'import re' 2>&1 | pyflakes\"",
r"<stdin>:1: 're' imported but unused",
True)
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("pygments", "Pygments source highlighting library")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_pygments():
try:
import pygments
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 pygments.highlight # silence unused import warning
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 return True
except ImportError:
return False
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("python243", "python >= 2.4.3")
Mads Kiilerich
tests: ignore http tests that are known wontfix failures on python 2.4...
r20384 def has_python243():
return sys.version_info >= (2, 4, 3)
Pierre-Yves David
test: protect the run-tests.py --json test behind an hghave rule...
r22579 @check("json", "some json module available")
def has_json():
try:
Augie Fackler
hghave: use a less brittle have-json check
r23262 import json
Pierre-Yves David
test: protect the run-tests.py --json test behind an hghave rule...
r22579 json.dumps
return True
except ImportError:
Augie Fackler
hghave: use a less brittle have-json check
r23262 try:
import simplejson as json
json.dumps
return True
except ImportError:
pass
return False
Pierre-Yves David
test: protect the run-tests.py --json test behind an hghave rule...
r22579
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("outer-repo", "outer repo")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_outer_repo():
Mads Kiilerich
tests: hghave outer-repo should be true even if a bad repo is found...
r17016 # 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)
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966
Augie Fackler
hghave: we now support Python 2.7.9's ssl for https
r23825 @check("ssl", ("(python >= 2.6 ssl module and python OpenSSL) "
"OR python >= 2.7.9 ssl"))
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_ssl():
try:
import ssl
Augie Fackler
hghave: we now support Python 2.7.9's ssl for https
r23825 if getattr(ssl, 'create_default_context', False):
return True
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 import OpenSSL
OpenSSL.SSL.Context
return True
except ImportError:
return False
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("windows", "Windows")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_windows():
return os.name == 'nt'
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("system-sh", "system() uses sh")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_system_sh():
return os.name != 'nt'
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("serve", "platform and python can manage 'hg serve -d'")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_serve():
return os.name != 'nt' # gross approximation
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("test-repo", "running tests from repository")
Matt Mackall
tests: add repository check for pyflakes test...
r21208 def has_test_repo():
t = os.environ["TESTDIR"]
return os.path.isdir(os.path.join(t, "..", ".hg"))
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("tic", "terminfo compiler and curses module")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_tic():
Mads Kiilerich
tests: 'hghave tic' also requires curses support in Python...
r20304 try:
import curses
curses.COLOR_BLUE
return matchoutput('test -x "`which tic`"', '')
except ImportError:
return False
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("msys", "Windows with MSYS")
Adrian Buehlmann
tests/hghave: extract hghave.py...
r16966 def has_msys():
return os.getenv('MSYSTEM')
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("aix", "AIX")
Jim Hague
tests: AIX can't handle negative date in test-dirstate.t...
r19092 def has_aix():
return sys.platform.startswith("aix")
Mads Kiilerich
ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs...
r22575 @check("osx", "OS X")
def has_osx():
return sys.platform == 'darwin'
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("absimport", "absolute_import in __future__")
FUJIWARA Katsunori
hghave: add "absimport" feature to check "absolute_import" in __future__...
r19930 def has_absimport():
import __future__
from mercurial import util
return util.safehasattr(__future__, "absolute_import")
Matt Mackall
tests: use a decorator for hghave checks
r22093 @check("py3k", "running with Python 3.x")
FUJIWARA Katsunori
hghave: add "py3k" feature to check whether test runs with Python 3.x...
r19931 def has_py3k():
return 3 == sys.version_info[0]