Commit 49aaad3c authored by Benjamin Peterson's avatar Benjamin Peterson

merge heads

parents ae10b320 df55334d
...@@ -13,7 +13,7 @@ import errno ...@@ -13,7 +13,7 @@ import errno
import shutil import shutil
import logging import logging
import tempfile import tempfile
from sysconfig import get_config_var, get_path from sysconfig import get_config_var, get_path, is_python_build
from packaging import logger from packaging import logger
from packaging.dist import Distribution from packaging.dist import Distribution
...@@ -488,20 +488,31 @@ def install(project): ...@@ -488,20 +488,31 @@ def install(project):
Returns True on success, False on failure Returns True on success, False on failure
""" """
if is_python_build():
# Python would try to install into the site-packages directory under
# $PREFIX, but when running from an uninstalled code checkout we don't
# want to create directories under the installation root
message = ('installing third-party projects from an uninstalled '
'Python is not supported')
logger.error(message)
return False
logger.info('Checking the installation location...') logger.info('Checking the installation location...')
purelib_path = get_path('purelib') purelib_path = get_path('purelib')
# trying to write a file there # trying to write a file there
try: try:
with tempfile.NamedTemporaryFile(suffix=project, with tempfile.NamedTemporaryFile(suffix=project,
dir=purelib_path) as testfile: dir=purelib_path) as testfile:
testfile.write(b'test') testfile.write(b'test')
except OSError: except OSError:
# was unable to write a file # FIXME this should check the errno, or be removed altogether (race
# condition: the directory permissions could be changed between here
# and the actual install)
logger.info('Unable to write in "%s". Do you have the permissions ?' logger.info('Unable to write in "%s". Do you have the permissions ?'
% purelib_path) % purelib_path)
return False return False
logger.info('Getting information about %r...', project) logger.info('Getting information about %r...', project)
try: try:
info = get_infos(project) info = get_infos(project)
...@@ -520,7 +531,7 @@ def install(project): ...@@ -520,7 +531,7 @@ def install(project):
except InstallationConflict as e: except InstallationConflict as e:
if logger.isEnabledFor(logging.INFO): if logger.isEnabledFor(logging.INFO):
projects = ['%s %s' % (p.name, p.version) for p in e.args[0]] projects = ['%r %s' % (p.name, p.version) for p in e.args[0]]
logger.info('%r conflicts with %s', project, ','.join(projects)) logger.info('%r conflicts with %s', project, ','.join(projects))
return True return True
......
...@@ -162,7 +162,7 @@ class InstallDistinfoTestCase(support.TempdirManager, ...@@ -162,7 +162,7 @@ class InstallDistinfoTestCase(support.TempdirManager,
expected = [] expected = []
for f in install.get_outputs(): for f in install.get_outputs():
if (f.endswith('.pyc') or f == os.path.join( if (f.endswith(('.pyc', '.pyo')) or f == os.path.join(
install_dir, 'foo-1.0.dist-info', 'RECORD')): install_dir, 'foo-1.0.dist-info', 'RECORD')):
expected.append([f, '', '']) expected.append([f, '', ''])
else: else:
......
...@@ -35,7 +35,7 @@ class DistributionTestCase(support.TempdirManager, ...@@ -35,7 +35,7 @@ class DistributionTestCase(support.TempdirManager,
support.EnvironRestorer, support.EnvironRestorer,
unittest.TestCase): unittest.TestCase):
restore_environ = ['HOME'] restore_environ = ['HOME', 'PLAT']
def setUp(self): def setUp(self):
super(DistributionTestCase, self).setUp() super(DistributionTestCase, self).setUp()
......
"""Tests for the packaging.install module.""" """Tests for the packaging.install module."""
import os import os
import logging
from sysconfig import is_python_build
from tempfile import mkstemp from tempfile import mkstemp
from packaging import install from packaging import install
...@@ -357,9 +359,17 @@ class TestInstall(LoggingCatcher, TempdirManager, unittest.TestCase): ...@@ -357,9 +359,17 @@ class TestInstall(LoggingCatcher, TempdirManager, unittest.TestCase):
install._install_dist = old_install_dist install._install_dist = old_install_dist
def test_install_permission_denied(self): def test_install_permission_denied(self):
# if we don't have the access to the installation # if we don't have access to the installation path, we should abort
# path, we should abort immediatly # immediately
project = os.path.join(os.path.dirname(__file__), 'package.tgz') project = os.path.join(os.path.dirname(__file__), 'package.tgz')
# when running from an uninstalled build, a warning is emitted and the
# installation is not attempted
if is_python_build():
self.assertFalse(install.install(project))
self.assertEqual(1, len(self.get_logs(logging.ERROR)))
return
install_path = self.mkdtemp() install_path = self.mkdtemp()
old_get_path = install.get_path old_get_path = install.get_path
install.get_path = lambda path: install_path install.get_path = lambda path: install_path
......
...@@ -950,7 +950,7 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) ...@@ -950,7 +950,7 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR)
else true; \ else true; \
fi; \ fi; \
done done
@for i in $(srcdir)/Lib/*.py $(srcdir)/Lib/*.egg-info $(srcdir)/Lib/*.cfg ; \ @for i in $(srcdir)/Lib/*.py $(srcdir)/Lib/*.cfg ; \
do \ do \
if test -x $$i; then \ if test -x $$i; then \
$(INSTALL_SCRIPT) $$i $(DESTDIR)$(LIBDEST); \ $(INSTALL_SCRIPT) $$i $(DESTDIR)$(LIBDEST); \
......
...@@ -550,6 +550,7 @@ Joerg Lehmann ...@@ -550,6 +550,7 @@ Joerg Lehmann
Robert Lehmann Robert Lehmann
Petri Lehtinen Petri Lehtinen
Luke Kenneth Casson Leighton Luke Kenneth Casson Leighton
Tshepang Lekhonkhobe
Marc-Andre Lemburg Marc-Andre Lemburg
John Lenton John Lenton
Christopher Tur Lesniewski-Laas Christopher Tur Lesniewski-Laas
......
...@@ -189,6 +189,10 @@ Library ...@@ -189,6 +189,10 @@ Library
- Issue #12009: Fixed regression in netrc file comment handling. - Issue #12009: Fixed regression in netrc file comment handling.
- Issue #12246: Warn and fail when trying to install a third-party project from
an uninstalled Python (built in a source checkout). Original patch by
Tshepang Lekhonkhobe.
- Issue #10694: zipfile now ignores garbage at the end of a zipfile. - Issue #10694: zipfile now ignores garbage at the end of a zipfile.
- Issue #12283: Fixed regression in smtplib quoting of leading dots in DATA. - Issue #12283: Fixed regression in smtplib quoting of leading dots in DATA.
......
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