Merge PR #252 'no-executable'
This commit is contained in:
commit
a2795ea5ff
46
setup.py
46
setup.py
|
@ -173,51 +173,6 @@ class Trial(Command):
|
||||||
sys.exit(rc)
|
sys.exit(rc)
|
||||||
|
|
||||||
|
|
||||||
class MakeExecutable(Command):
|
|
||||||
description = "make the 'bin%stahoe' scripts" % (os.sep,)
|
|
||||||
user_options = install.install.user_options
|
|
||||||
|
|
||||||
def initialize_options(self):
|
|
||||||
pass
|
|
||||||
def finalize_options(self):
|
|
||||||
pass
|
|
||||||
def run(self):
|
|
||||||
# A bin/tahoe (or bin/tahoe-script.py) is only necessary for the
|
|
||||||
# test_runner tests which exercise CLI invocation of a brand new
|
|
||||||
# tahoe process. It is also handy for users who are accustomed to
|
|
||||||
# running bin/tahoe (and have not yet gotten used to the new
|
|
||||||
# virtualenv-based "just run tahoe" world). Eventually this will be
|
|
||||||
# removed.
|
|
||||||
|
|
||||||
# This must be run *after* a 'pip install' (hopefully inside a
|
|
||||||
# virtualenv), because it needs to locate the tahoe executable (named
|
|
||||||
# 'tahoe' or 'tahoe.exe' or 'tahoe-script.py' or something) on $PATH.
|
|
||||||
|
|
||||||
# This is safe because we're run after 'install', which installed
|
|
||||||
# Twisted. It would not be safe to run before that. Note that this
|
|
||||||
# uses $PATHEXT for a list of executable suffixes.
|
|
||||||
from twisted.python.procutils import which
|
|
||||||
|
|
||||||
installed_tahoes = which("tahoe")
|
|
||||||
if not installed_tahoes:
|
|
||||||
err = ("Cannot find installed 'tahoe' binary "
|
|
||||||
"('setup.py make_executable' must be run after"
|
|
||||||
" 'setup.py install')")
|
|
||||||
raise RuntimeError(err)
|
|
||||||
|
|
||||||
if not os.path.isdir("bin"):
|
|
||||||
os.mkdir("bin")
|
|
||||||
|
|
||||||
installed_tahoe = installed_tahoes[0]
|
|
||||||
bin_tahoe = os.path.join("bin", "tahoe")
|
|
||||||
with open(installed_tahoe, "rb") as inf:
|
|
||||||
with open(bin_tahoe, "wb") as outf:
|
|
||||||
outf.write(inf.read())
|
|
||||||
|
|
||||||
# copy file mode
|
|
||||||
os.chmod(bin_tahoe, os.stat(installed_tahoe).st_mode)
|
|
||||||
|
|
||||||
|
|
||||||
GIT_VERSION_BODY = '''
|
GIT_VERSION_BODY = '''
|
||||||
# This _version.py is generated from git metadata by the tahoe setup.py.
|
# This _version.py is generated from git metadata by the tahoe setup.py.
|
||||||
|
|
||||||
|
@ -410,7 +365,6 @@ setup(name=APPNAME,
|
||||||
url='https://tahoe-lafs.org/',
|
url='https://tahoe-lafs.org/',
|
||||||
license='GNU GPL', # see README.rst -- there is an alternative licence
|
license='GNU GPL', # see README.rst -- there is an alternative licence
|
||||||
cmdclass={"trial": Trial,
|
cmdclass={"trial": Trial,
|
||||||
"make_executable": MakeExecutable,
|
|
||||||
"update_version": UpdateVersion,
|
"update_version": UpdateVersion,
|
||||||
"sdist": MySdist,
|
"sdist": MySdist,
|
||||||
},
|
},
|
||||||
|
|
|
@ -5,6 +5,7 @@ from twisted.trial import unittest
|
||||||
|
|
||||||
from twisted.python import usage, runtime
|
from twisted.python import usage, runtime
|
||||||
from twisted.internet import threads
|
from twisted.internet import threads
|
||||||
|
from twisted.internet.defer import inlineCallbacks, returnValue
|
||||||
|
|
||||||
from allmydata.util import fileutil, pollmixin
|
from allmydata.util import fileutil, pollmixin
|
||||||
from allmydata.util.encodingutil import unicode_to_argv, unicode_to_output, get_filesystem_encoding
|
from allmydata.util.encodingutil import unicode_to_argv, unicode_to_output, get_filesystem_encoding
|
||||||
|
@ -48,6 +49,11 @@ if sys.platform == "win32" and not os.path.exists(bintahoe):
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
|
# This memoizes find_import_location(), so we don't have to run
|
||||||
|
# --version-and-path multiple times for the same binary. In practice, this
|
||||||
|
# will only ever have one entry.
|
||||||
|
CACHED_IMPORT_PATH = {}
|
||||||
|
|
||||||
class RunBinTahoeMixin:
|
class RunBinTahoeMixin:
|
||||||
def skip_if_cannot_run_bintahoe(self):
|
def skip_if_cannot_run_bintahoe(self):
|
||||||
if not os.path.exists(bintahoe):
|
if not os.path.exists(bintahoe):
|
||||||
|
@ -59,6 +65,19 @@ class RunBinTahoeMixin:
|
||||||
# twistd on windows doesn't daemonize. cygwin should work normally.
|
# twistd on windows doesn't daemonize. cygwin should work normally.
|
||||||
raise unittest.SkipTest("twistd does not fork under windows")
|
raise unittest.SkipTest("twistd does not fork under windows")
|
||||||
|
|
||||||
|
@inlineCallbacks
|
||||||
|
def find_import_location(self):
|
||||||
|
if bintahoe in CACHED_IMPORT_PATH:
|
||||||
|
returnValue(CACHED_IMPORT_PATH[bintahoe])
|
||||||
|
res = yield self.run_bintahoe(["--version-and-path"])
|
||||||
|
out, err, rc_or_sig = res
|
||||||
|
self.assertEqual(rc_or_sig, 0, res)
|
||||||
|
lines = out.splitlines()
|
||||||
|
tahoe_pieces = lines[0].split()
|
||||||
|
self.assertEqual(tahoe_pieces[0], "allmydata-tahoe:", (tahoe_pieces, res))
|
||||||
|
CACHED_IMPORT_PATH[bintahoe] = tahoe_pieces[-1].strip("()")
|
||||||
|
returnValue(CACHED_IMPORT_PATH[bintahoe])
|
||||||
|
|
||||||
def run_bintahoe(self, args, stdin=None, python_options=[], env=None):
|
def run_bintahoe(self, args, stdin=None, python_options=[], env=None):
|
||||||
self.skip_if_cannot_run_bintahoe()
|
self.skip_if_cannot_run_bintahoe()
|
||||||
|
|
||||||
|
@ -82,67 +101,30 @@ class RunBinTahoeMixin:
|
||||||
|
|
||||||
|
|
||||||
class BinTahoe(common_util.SignalMixin, unittest.TestCase, RunBinTahoeMixin):
|
class BinTahoe(common_util.SignalMixin, unittest.TestCase, RunBinTahoeMixin):
|
||||||
def _check_right_code(self, file_to_check):
|
@inlineCallbacks
|
||||||
root_to_check = get_root_from_file(file_to_check)
|
def test_the_right_code(self):
|
||||||
if os.path.basename(root_to_check) == 'dist':
|
# running "tahoe" in a subprocess should find the same code that
|
||||||
root_to_check = os.path.dirname(root_to_check)
|
# holds this test file, else something is weird
|
||||||
|
test_path = os.path.dirname(os.path.dirname(os.path.normcase(os.path.realpath(srcfile))))
|
||||||
|
bintahoe_import_path = yield self.find_import_location()
|
||||||
|
|
||||||
cwd = os.path.normcase(os.path.realpath("."))
|
same = (bintahoe_import_path == test_path)
|
||||||
root_from_cwd = os.path.dirname(cwd)
|
|
||||||
if os.path.basename(root_from_cwd) == 'src':
|
|
||||||
root_from_cwd = os.path.dirname(root_from_cwd)
|
|
||||||
|
|
||||||
# This is needed if we are running in a temporary directory created by 'make tmpfstest'.
|
|
||||||
if os.path.basename(root_from_cwd).startswith('tmp'):
|
|
||||||
root_from_cwd = os.path.dirname(root_from_cwd)
|
|
||||||
|
|
||||||
same = (root_from_cwd == root_to_check)
|
|
||||||
if not same:
|
if not same:
|
||||||
try:
|
msg = ("My tests and my 'tahoe' executable are using different paths.\n"
|
||||||
same = os.path.samefile(root_from_cwd, root_to_check)
|
"tahoe: %r\n"
|
||||||
except AttributeError, e:
|
"tests: %r\n"
|
||||||
e # hush pyflakes
|
"( according to the test source filename %r)\n" %
|
||||||
|
(bintahoe_import_path, test_path, srcfile))
|
||||||
|
|
||||||
if not same:
|
if (not isinstance(rootdir, unicode) and
|
||||||
msg = ("We seem to be testing the code at %r,\n"
|
rootdir.decode(get_filesystem_encoding(), 'replace') != rootdir):
|
||||||
"(according to the source filename %r),\n"
|
msg += ("However, this may be a false alarm because the import path\n"
|
||||||
"but expected to be testing the code at %r.\n"
|
"is not representable in the filesystem encoding.")
|
||||||
% (root_to_check, file_to_check, root_from_cwd))
|
|
||||||
|
|
||||||
root_from_cwdu = os.path.dirname(os.path.normcase(os.path.normpath(os.getcwdu())))
|
|
||||||
if os.path.basename(root_from_cwdu) == u'src':
|
|
||||||
root_from_cwdu = os.path.dirname(root_from_cwdu)
|
|
||||||
|
|
||||||
# This is needed if we are running in a temporary directory created by 'make tmpfstest'.
|
|
||||||
if os.path.basename(root_from_cwdu).startswith(u'tmp'):
|
|
||||||
root_from_cwdu = os.path.dirname(root_from_cwdu)
|
|
||||||
|
|
||||||
if not isinstance(root_from_cwd, unicode) and root_from_cwd.decode(get_filesystem_encoding(), 'replace') != root_from_cwdu:
|
|
||||||
msg += ("However, this may be a false alarm because the current directory path\n"
|
|
||||||
"is not representable in the filesystem encoding. Please run the tests\n"
|
|
||||||
"from the root of the Tahoe-LAFS distribution at a non-Unicode path.")
|
|
||||||
raise unittest.SkipTest(msg)
|
raise unittest.SkipTest(msg)
|
||||||
else:
|
else:
|
||||||
msg += "Please run the tests from the root of the Tahoe-LAFS distribution."
|
msg += "Please run the tests in a virtualenv that includes both the Tahoe-LAFS library and the 'tahoe' executable."
|
||||||
self.fail(msg)
|
self.fail(msg)
|
||||||
|
|
||||||
def test_the_right_code(self):
|
|
||||||
self._check_right_code(srcfile)
|
|
||||||
|
|
||||||
def test_import_in_repl(self):
|
|
||||||
d = self.run_bintahoe(["debug", "repl"],
|
|
||||||
stdin="import allmydata; print; print allmydata.__file__")
|
|
||||||
def _cb(res):
|
|
||||||
out, err, rc_or_sig = res
|
|
||||||
self.failUnlessEqual(rc_or_sig, 0, str(res))
|
|
||||||
lines = out.splitlines()
|
|
||||||
self.failUnlessIn('>>>', lines[0], str(res))
|
|
||||||
self._check_right_code(lines[1])
|
|
||||||
d.addCallback(_cb)
|
|
||||||
return d
|
|
||||||
# The timeout was exceeded on FreeStorm's CentOS5-i386.
|
|
||||||
test_import_in_repl.timeout = 480
|
|
||||||
|
|
||||||
def test_path(self):
|
def test_path(self):
|
||||||
d = self.run_bintahoe(["--version-and-path"])
|
d = self.run_bintahoe(["--version-and-path"])
|
||||||
def _cb(res):
|
def _cb(res):
|
||||||
|
|
13
tox.ini
13
tox.ini
|
@ -11,14 +11,7 @@ passenv = USERPROFILE HOMEDRIVE HOMEPATH
|
||||||
commands =
|
commands =
|
||||||
# remove this after we move to Versioneer
|
# remove this after we move to Versioneer
|
||||||
python setup.py update_version
|
python setup.py update_version
|
||||||
# This step should be removed after we get rid of bin/tahoe. It's
|
trial --rterrors {posargs:allmydata}
|
||||||
# currently needed because test_runner.(BinTahoe,RunNode) and part
|
|
||||||
# of test_system.SystemTest depends upon $checkout/bin/tahoe . In
|
|
||||||
# the future, users will just use 'tahoe' from $PATH (which, in the
|
|
||||||
# virtualenv, will be venv/bin/tahoe), and those tests will probably
|
|
||||||
# be deleted.
|
|
||||||
python setup.py make_executable
|
|
||||||
trial --rterrors allmydata
|
|
||||||
|
|
||||||
[testenv:deprecations]
|
[testenv:deprecations]
|
||||||
passenv = USERPROFILE HOMEDRIVE HOMEPATH
|
passenv = USERPROFILE HOMEDRIVE HOMEPATH
|
||||||
|
@ -26,13 +19,11 @@ setenv =
|
||||||
PYTHONWARNINGS=default::DeprecationWarnings
|
PYTHONWARNINGS=default::DeprecationWarnings
|
||||||
commands =
|
commands =
|
||||||
python setup.py update_version
|
python setup.py update_version
|
||||||
python setup.py make_executable
|
trial --rterrors {posargs:allmydata}
|
||||||
trial --rterrors allmydata
|
|
||||||
|
|
||||||
[testenv:checkmemory]
|
[testenv:checkmemory]
|
||||||
commands =
|
commands =
|
||||||
python setup.py update_version
|
python setup.py update_version
|
||||||
python setup.py make_executable
|
|
||||||
rm -rf _test_memory
|
rm -rf _test_memory
|
||||||
python src/allmydata/test/check_memory.py upload
|
python src/allmydata/test/check_memory.py upload
|
||||||
python src/allmydata/test/check_memory.py upload-self
|
python src/allmydata/test/check_memory.py upload-self
|
||||||
|
|
Loading…
Reference in New Issue