mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
Cleaned up the installer output behavior.
This change also makes sure the logger handlers are not alterated after an installation. That also fixes the remaining environment alteration issue in test_packaging.
This commit is contained in:
parent
43f289ad88
commit
b1b6e1384c
6 changed files with 86 additions and 67 deletions
|
@ -118,15 +118,15 @@ def install_local_project(path):
|
|||
"""
|
||||
path = os.path.abspath(path)
|
||||
if os.path.isdir(path):
|
||||
logger.info('installing from source directory: %s', path)
|
||||
logger.info('Installing from source directory: %s', path)
|
||||
_run_install_from_dir(path)
|
||||
elif _is_archive_file(path):
|
||||
logger.info('installing from archive: %s', path)
|
||||
logger.info('Installing from archive: %s', path)
|
||||
_unpacked_dir = tempfile.mkdtemp()
|
||||
shutil.unpack_archive(path, _unpacked_dir)
|
||||
_run_install_from_archive(_unpacked_dir)
|
||||
else:
|
||||
logger.warning('no projects to install')
|
||||
logger.warning('No projects to install.')
|
||||
|
||||
|
||||
def _run_install_from_archive(source_dir):
|
||||
|
@ -174,16 +174,16 @@ def install_dists(dists, path, paths=sys.path):
|
|||
|
||||
installed_dists = []
|
||||
for dist in dists:
|
||||
logger.info('installing %s %s', dist.name, dist.version)
|
||||
logger.info('Installing %r %s...', dist.name, dist.version)
|
||||
try:
|
||||
_install_dist(dist, path)
|
||||
installed_dists.append(dist)
|
||||
except Exception as e:
|
||||
logger.info('failed: %s', e)
|
||||
logger.info('Failed: %s', e)
|
||||
|
||||
# reverting
|
||||
for installed_dist in installed_dists:
|
||||
logger.info('reverting %s', installed_dist)
|
||||
logger.info('Reverting %s', installed_dist)
|
||||
_remove_dist(installed_dist, paths)
|
||||
raise e
|
||||
return installed_dists
|
||||
|
@ -292,7 +292,7 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
|
|||
# or remove
|
||||
|
||||
if not installed:
|
||||
logger.info('reading installed distributions')
|
||||
logger.debug('Reading installed distributions')
|
||||
installed = list(get_distributions(use_egg_info=True))
|
||||
|
||||
infos = {'install': [], 'remove': [], 'conflict': []}
|
||||
|
@ -306,7 +306,7 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
|
|||
if predicate.name.lower() != installed_project.name.lower():
|
||||
continue
|
||||
found = True
|
||||
logger.info('found %s %s', installed_project.name,
|
||||
logger.info('Found %s %s', installed_project.name,
|
||||
installed_project.metadata['version'])
|
||||
|
||||
# if we already have something installed, check it matches the
|
||||
|
@ -316,7 +316,7 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
|
|||
break
|
||||
|
||||
if not found:
|
||||
logger.info('project not installed')
|
||||
logger.debug('Project not installed')
|
||||
|
||||
if not index:
|
||||
index = wrapper.ClientWrapper()
|
||||
|
@ -331,7 +331,7 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
|
|||
raise InstallationException('Release not found: "%s"' % requirements)
|
||||
|
||||
if release is None:
|
||||
logger.info('could not find a matching project')
|
||||
logger.info('Could not find a matching project')
|
||||
return infos
|
||||
|
||||
metadata = release.fetch_metadata()
|
||||
|
@ -348,7 +348,7 @@ def get_infos(requirements, index=None, installed=None, prefer_final=True):
|
|||
# Get what the missing deps are
|
||||
dists = depgraph.missing[release]
|
||||
if dists:
|
||||
logger.info("missing dependencies found, retrieving metadata")
|
||||
logger.info("Missing dependencies found, retrieving metadata")
|
||||
# we have missing deps
|
||||
for dist in dists:
|
||||
_update_infos(infos, get_infos(dist, index, installed))
|
||||
|
@ -401,7 +401,7 @@ def remove(project_name, paths=sys.path, auto_confirm=True):
|
|||
finally:
|
||||
shutil.rmtree(tmp)
|
||||
|
||||
logger.info('removing %r: ', project_name)
|
||||
logger.info('Removing %r: ', project_name)
|
||||
|
||||
for file_ in rmfiles:
|
||||
logger.info(' %s', file_)
|
||||
|
@ -444,20 +444,20 @@ def remove(project_name, paths=sys.path, auto_confirm=True):
|
|||
if os.path.exists(dist.path):
|
||||
shutil.rmtree(dist.path)
|
||||
|
||||
logger.info('success: removed %d files and %d dirs',
|
||||
logger.info('Success: removed %d files and %d dirs',
|
||||
file_count, dir_count)
|
||||
|
||||
|
||||
def install(project):
|
||||
logger.info('getting information about %r', project)
|
||||
logger.info('Getting information about %r...', project)
|
||||
try:
|
||||
info = get_infos(project)
|
||||
except InstallationException:
|
||||
logger.info('cound not find %r', project)
|
||||
logger.info('Cound not find %r', project)
|
||||
return
|
||||
|
||||
if info['install'] == []:
|
||||
logger.info('nothing to install')
|
||||
logger.info('Nothing to install')
|
||||
return
|
||||
|
||||
install_path = get_config_var('base')
|
||||
|
|
|
@ -118,9 +118,10 @@ class Crawler(BaseClient):
|
|||
def __init__(self, index_url=DEFAULT_SIMPLE_INDEX_URL, prefer_final=False,
|
||||
prefer_source=True, hosts=DEFAULT_HOSTS,
|
||||
follow_externals=False, mirrors_url=None, mirrors=None,
|
||||
timeout=SOCKET_TIMEOUT, mirrors_max_tries=0):
|
||||
timeout=SOCKET_TIMEOUT, mirrors_max_tries=0, verbose=False):
|
||||
super(Crawler, self).__init__(prefer_final, prefer_source)
|
||||
self.follow_externals = follow_externals
|
||||
self.verbose = verbose
|
||||
|
||||
# mirroring attributes.
|
||||
parsed = urllib.parse.urlparse(index_url)
|
||||
|
@ -184,7 +185,7 @@ class Crawler(BaseClient):
|
|||
if predicate.name.lower() in self._projects and not force_update:
|
||||
return self._projects.get(predicate.name.lower())
|
||||
prefer_final = self._get_prefer_final(prefer_final)
|
||||
logger.info('reading info on PyPI about %s', predicate.name)
|
||||
logger.debug('Reading info on PyPI about %s', predicate.name)
|
||||
self._process_index_page(predicate.name)
|
||||
|
||||
if predicate.name.lower() not in self._projects:
|
||||
|
@ -321,6 +322,7 @@ class Crawler(BaseClient):
|
|||
infos = get_infos_from_url(link, project_name,
|
||||
is_external=not self.index_url in url)
|
||||
except CantParseArchiveName as e:
|
||||
if self.verbose:
|
||||
logger.warning(
|
||||
"version has not been parsed: %s", e)
|
||||
else:
|
||||
|
|
|
@ -5,6 +5,7 @@ import re
|
|||
import sys
|
||||
import getopt
|
||||
import logging
|
||||
from copy import copy
|
||||
|
||||
from packaging import logger
|
||||
from packaging.dist import Distribution
|
||||
|
@ -227,12 +228,13 @@ def _install(dispatcher, args, **kw):
|
|||
logger.warning('no project to install')
|
||||
return
|
||||
|
||||
target = args[1]
|
||||
# installing from a source dir or archive file?
|
||||
if os.path.isdir(args[1]) or _is_archive_file(args[1]):
|
||||
install_local_project(args[1])
|
||||
if os.path.isdir(target) or _is_archive_file(target):
|
||||
install_local_project(target)
|
||||
else:
|
||||
# download from PyPI
|
||||
install(args[1])
|
||||
install(target)
|
||||
|
||||
|
||||
@action_help(metadata_usage)
|
||||
|
@ -399,6 +401,17 @@ class Dispatcher:
|
|||
msg = 'Unrecognized action "%s"' % self.action
|
||||
raise PackagingArgError(msg)
|
||||
|
||||
self._set_logger()
|
||||
|
||||
# for display options we return immediately
|
||||
option_order = self.parser.get_option_order()
|
||||
|
||||
self.args = args
|
||||
|
||||
if self.help or self.action is None:
|
||||
self._show_help(self.parser, display_options_=False)
|
||||
|
||||
def _set_logger(self):
|
||||
# setting up the logging level from the command-line options
|
||||
# -q gets warning, error and critical
|
||||
if self.verbose == 0:
|
||||
|
@ -416,13 +429,11 @@ class Dispatcher:
|
|||
else: # -vv and more for debug
|
||||
level = logging.DEBUG
|
||||
|
||||
# for display options we return immediately
|
||||
option_order = self.parser.get_option_order()
|
||||
|
||||
self.args = args
|
||||
|
||||
if self.help or self.action is None:
|
||||
self._show_help(self.parser, display_options_=False)
|
||||
# setting up the stream handler
|
||||
handler = logging.StreamHandler(sys.stderr)
|
||||
handler.setLevel(level)
|
||||
logger.addHandler(handler)
|
||||
logger.setLevel(level)
|
||||
|
||||
def _parse_command_opts(self, parser, args):
|
||||
# Pull the current command from the head of the command line
|
||||
|
@ -635,11 +646,17 @@ class Dispatcher:
|
|||
|
||||
|
||||
def main(args=None):
|
||||
old_level = logger.level
|
||||
old_handlers = copy(logger.handlers)
|
||||
try:
|
||||
dispatcher = Dispatcher(args)
|
||||
if dispatcher.action is None:
|
||||
return
|
||||
|
||||
return dispatcher()
|
||||
finally:
|
||||
logger.setLevel(old_level)
|
||||
logger.handlers[:] = old_handlers
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
|
|
|
@ -150,8 +150,7 @@ class TestTest(TempdirManager,
|
|||
cmd.tests_require = [phony_project]
|
||||
cmd.ensure_finalized()
|
||||
logs = self.get_logs(logging.WARNING)
|
||||
self.assertEqual(1, len(logs))
|
||||
self.assertIn(phony_project, logs[0])
|
||||
self.assertIn(phony_project, logs[-1])
|
||||
|
||||
def prepare_a_module(self):
|
||||
tmp_dir = self.mkdtemp()
|
||||
|
|
|
@ -818,51 +818,51 @@ class PackagingLibChecks(support.TempdirManager,
|
|||
|
||||
def test_is_setuptools_logs_setup_py_text_found(self):
|
||||
is_setuptools(self._setuptools_setup_py_pkg())
|
||||
expected = ['setup.py file found', 'found setuptools text in setup.py']
|
||||
self.assertEqual(expected, self.get_logs(logging.INFO))
|
||||
expected = ['setup.py file found.',
|
||||
'No egg-info directory found.',
|
||||
'Found setuptools text in setup.py.']
|
||||
self.assertEqual(expected, self.get_logs(logging.DEBUG))
|
||||
|
||||
def test_is_setuptools_logs_setup_py_text_not_found(self):
|
||||
directory = self._random_setup_py_pkg()
|
||||
is_setuptools(directory)
|
||||
info_expected = ['setup.py file found']
|
||||
warn_expected = ['no egg-info directory found',
|
||||
'no setuptools text found in setup.py']
|
||||
self.assertEqual(info_expected, self.get_logs(logging.INFO))
|
||||
self.assertEqual(warn_expected, self.get_logs(logging.WARN))
|
||||
expected = ['setup.py file found.', 'No egg-info directory found.',
|
||||
'No setuptools text found in setup.py.']
|
||||
self.assertEqual(expected, self.get_logs(logging.DEBUG))
|
||||
|
||||
def test_is_setuptools_logs_egg_info_dir_found(self):
|
||||
is_setuptools(self._setuptools_egg_info_pkg())
|
||||
expected = ['setup.py file found', 'found egg-info directory']
|
||||
self.assertEqual(expected, self.get_logs(logging.INFO))
|
||||
expected = ['setup.py file found.', 'Found egg-info directory.']
|
||||
self.assertEqual(expected, self.get_logs(logging.DEBUG))
|
||||
|
||||
def test_is_distutils_logs_setup_py_text_found(self):
|
||||
is_distutils(self._distutils_setup_py_pkg())
|
||||
expected = ['setup.py file found', 'found distutils text in setup.py']
|
||||
self.assertEqual(expected, self.get_logs(logging.INFO))
|
||||
expected = ['setup.py file found.',
|
||||
'No PKG-INFO file found.',
|
||||
'Found distutils text in setup.py.']
|
||||
self.assertEqual(expected, self.get_logs(logging.DEBUG))
|
||||
|
||||
def test_is_distutils_logs_setup_py_text_not_found(self):
|
||||
directory = self._random_setup_py_pkg()
|
||||
is_distutils(directory)
|
||||
info_expected = ['setup.py file found']
|
||||
warn_expected = ['no PKG-INFO file found',
|
||||
'no distutils text found in setup.py']
|
||||
self.assertEqual(info_expected, self.get_logs(logging.INFO))
|
||||
self.assertEqual(warn_expected, self.get_logs(logging.WARN))
|
||||
expected = ['setup.py file found.', 'No PKG-INFO file found.',
|
||||
'No distutils text found in setup.py.']
|
||||
self.assertEqual(expected, self.get_logs(logging.DEBUG))
|
||||
|
||||
def test_is_distutils_logs_pkg_info_file_found(self):
|
||||
is_distutils(self._distutils_pkg_info())
|
||||
expected = ['setup.py file found', 'PKG-INFO file found']
|
||||
self.assertEqual(expected, self.get_logs(logging.INFO))
|
||||
expected = ['setup.py file found.', 'PKG-INFO file found.']
|
||||
self.assertEqual(expected, self.get_logs(logging.DEBUG))
|
||||
|
||||
def test_is_packaging_logs_setup_cfg_found(self):
|
||||
is_packaging(self._valid_setup_cfg_pkg())
|
||||
expected = ['setup.cfg file found']
|
||||
self.assertEqual(expected, self.get_logs(logging.INFO))
|
||||
expected = ['setup.cfg file found.']
|
||||
self.assertEqual(expected, self.get_logs(logging.DEBUG))
|
||||
|
||||
def test_is_packaging_logs_setup_cfg_not_found(self):
|
||||
is_packaging(self._empty_dir)
|
||||
expected = ['no setup.cfg file found']
|
||||
self.assertEqual(expected, self.get_logs(logging.WARN))
|
||||
expected = ['No setup.cfg file found.']
|
||||
self.assertEqual(expected, self.get_logs(logging.DEBUG))
|
||||
|
||||
def _write_setuptools_setup_py(self, directory):
|
||||
self.write_file((directory, 'setup.py'),
|
||||
|
|
|
@ -1224,9 +1224,9 @@ def _has_egg_info(srcdir):
|
|||
for item in os.listdir(srcdir):
|
||||
full_path = os.path.join(srcdir, item)
|
||||
if item.endswith('.egg-info') and os.path.isdir(full_path):
|
||||
logger.info("found egg-info directory")
|
||||
logger.debug("Found egg-info directory.")
|
||||
return True
|
||||
logger.warning("no egg-info directory found")
|
||||
logger.debug("No egg-info directory found.")
|
||||
return False
|
||||
|
||||
|
||||
|
@ -1243,9 +1243,9 @@ def _has_text(setup_py, installer):
|
|||
with open(setup_py, 'r', encoding='utf-8') as setup:
|
||||
for line in setup:
|
||||
if re.search(installer_pattern, line):
|
||||
logger.info("found %s text in setup.py", installer)
|
||||
logger.debug("Found %s text in setup.py.", installer)
|
||||
return True
|
||||
logger.warning("no %s text found in setup.py", installer)
|
||||
logger.debug("No %s text found in setup.py.", installer)
|
||||
return False
|
||||
|
||||
|
||||
|
@ -1261,15 +1261,16 @@ def _has_pkg_info(srcdir):
|
|||
pkg_info = os.path.join(srcdir, 'PKG-INFO')
|
||||
has_pkg_info = os.path.isfile(pkg_info)
|
||||
if has_pkg_info:
|
||||
logger.info("PKG-INFO file found")
|
||||
logger.warning("no PKG-INFO file found")
|
||||
logger.debug("PKG-INFO file found.")
|
||||
else:
|
||||
logger.debug("No PKG-INFO file found.")
|
||||
return has_pkg_info
|
||||
|
||||
|
||||
def _has_setup_py(srcdir):
|
||||
setup_py = os.path.join(srcdir, 'setup.py')
|
||||
if os.path.isfile(setup_py):
|
||||
logger.info('setup.py file found')
|
||||
logger.debug('setup.py file found.')
|
||||
return True
|
||||
return False
|
||||
|
||||
|
@ -1277,9 +1278,9 @@ def _has_setup_py(srcdir):
|
|||
def _has_setup_cfg(srcdir):
|
||||
setup_cfg = os.path.join(srcdir, 'setup.cfg')
|
||||
if os.path.isfile(setup_cfg):
|
||||
logger.info('setup.cfg file found')
|
||||
logger.debug('setup.cfg file found.')
|
||||
return True
|
||||
logger.warning("no setup.cfg file found")
|
||||
logger.debug("No setup.cfg file found.")
|
||||
return False
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue