Commit f31130ae authored by Reinout van Rees's avatar Reinout van Rees

Fixes #24. Distutils scripts in dev eggs are detected now

parent e57e1ff8
...@@ -86,6 +86,7 @@ buildout_and_setuptools_path = [ ...@@ -86,6 +86,7 @@ buildout_and_setuptools_path = [
] ]
FILE_SCHEME = re.compile('file://', re.I).match FILE_SCHEME = re.compile('file://', re.I).match
DUNDER_FILE_PATTERN = re.compile(r"__file__ = '(?P<filename>.+)'$")
class _Monkey(object): class _Monkey(object):
def __init__(self, module, **kw): def __init__(self, module, **kw):
...@@ -859,7 +860,6 @@ def build(spec, dest, build_ext, ...@@ -859,7 +860,6 @@ def build(spec, dest, build_ext,
return installer.build(spec, build_ext) return installer.build(spec, build_ext)
def _rm(*paths): def _rm(*paths):
for path in paths: for path in paths:
if os.path.isdir(path): if os.path.isdir(path):
...@@ -867,6 +867,7 @@ def _rm(*paths): ...@@ -867,6 +867,7 @@ def _rm(*paths):
elif os.path.exists(path): elif os.path.exists(path):
os.remove(path) os.remove(path)
def _copyeggs(src, dest, suffix, undo): def _copyeggs(src, dest, suffix, undo):
result = [] result = []
undo.append(lambda : _rm(*result)) undo.append(lambda : _rm(*result))
...@@ -882,6 +883,45 @@ def _copyeggs(src, dest, suffix, undo): ...@@ -882,6 +883,45 @@ def _copyeggs(src, dest, suffix, undo):
return result[0] return result[0]
_develop_distutils_scripts = {}
def _detect_distutils_scripts(directory):
"""Record detected distutils scripts from develop eggs
``setup.py develop`` doesn't generate metadata on distutils scripts, in
contrast to ``setup.py install``. So we have to store the information for
later.
"""
dir_contents = os.listdir(directory)
egginfo_filenames = [filename for filename in dir_contents
if filename.endswith('.egg-link')]
if not egginfo_filenames:
return
egg_name = egginfo_filenames[0].replace('.egg-link', '')
marker = 'EASY-INSTALL-DEV-SCRIPT'
scripts_found = []
for filename in dir_contents:
dev_script_content = open(os.path.join(directory, filename)).read()
if marker in dev_script_content:
# The distutils bin script points at the actual file we need.
for line in dev_script_content.splitlines():
match = DUNDER_FILE_PATTERN.search(line)
if match:
actual_script_filename = match.group('filename')
actual_script_content = open(
actual_script_filename).read()
scripts_found.append([filename, actual_script_content])
if scripts_found:
logger.debug(
"Distutils scripts found for develop egg %s: %s",
egg_name, scripts_found)
_develop_distutils_scripts[egg_name] = scripts_found
def develop(setup, dest, def develop(setup, dest,
build_ext=None, build_ext=None,
executable=sys.executable): executable=sys.executable):
...@@ -924,7 +964,7 @@ def develop(setup, dest, ...@@ -924,7 +964,7 @@ def develop(setup, dest,
tmp3 = tempfile.mkdtemp('build', dir=dest) tmp3 = tempfile.mkdtemp('build', dir=dest)
undo.append(lambda : shutil.rmtree(tmp3)) undo.append(lambda : shutil.rmtree(tmp3))
args = [executable, tsetup, '-q', 'develop', '-mxN', '-d', tmp3] args = [executable, tsetup, '-q', 'develop', '-mN', '-d', tmp3]
log_level = logger.getEffectiveLevel() log_level = logger.getEffectiveLevel()
if log_level <= 0: if log_level <= 0:
...@@ -936,7 +976,7 @@ def develop(setup, dest, ...@@ -936,7 +976,7 @@ def develop(setup, dest,
logger.debug("in: %r\n%s", directory, ' '.join(args)) logger.debug("in: %r\n%s", directory, ' '.join(args))
call_subprocess(args) call_subprocess(args)
_detect_distutils_scripts(tmp3)
return _copyeggs(tmp3, dest, '.egg-link', undo) return _copyeggs(tmp3, dest, '.egg-link', undo)
finally: finally:
...@@ -957,6 +997,7 @@ def working_set(specs, executable, path=None, ...@@ -957,6 +997,7 @@ def working_set(specs, executable, path=None,
return install(specs, None, path=path) return install(specs, None, path=path)
def scripts(reqs, working_set, executable, dest=None, def scripts(reqs, working_set, executable, dest=None,
scripts=None, scripts=None,
extra_paths=(), extra_paths=(),
...@@ -1002,12 +1043,20 @@ def scripts(reqs, working_set, executable, dest=None, ...@@ -1002,12 +1043,20 @@ def scripts(reqs, working_set, executable, dest=None,
# distutils/setuptools, except by placing the original scripts in # distutils/setuptools, except by placing the original scripts in
# /EGG-INFO/scripts/. # /EGG-INFO/scripts/.
if dist.metadata_isdir('scripts'): if dist.metadata_isdir('scripts'):
# egg-info metadata from installed egg.
for name in dist.metadata_listdir('scripts'): for name in dist.metadata_listdir('scripts'):
if dist.metadata_isdir('scripts/' + name): if dist.metadata_isdir('scripts/' + name):
# Probably Python 3 __pycache__ directory. # Probably Python 3 __pycache__ directory.
continue continue
contents = dist.get_metadata('scripts/' + name) contents = dist.get_metadata('scripts/' + name)
distutils_scripts.append((name, contents)) distutils_scripts.append((name, contents))
elif dist.key in _develop_distutils_scripts:
# Development eggs don't have metadata about scripts, so we
# collected it ourselves in develop()/ and
# _detect_distutils_scripts().
for name, contents in _develop_distutils_scripts[dist.key]:
distutils_scripts.append((name, contents))
else: else:
entry_points.append(req) entry_points.append(req)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment