Move installation order code out of RequirementSet

This commit is contained in:
Pradyun Gedam 2017-12-16 18:32:52 +05:30
parent 1ea3f89ff9
commit 01b2b856b6
No known key found for this signature in database
GPG Key ID: DA17C4B29CB32E4B
3 changed files with 66 additions and 55 deletions

View File

@ -14,7 +14,7 @@ from pip._internal.exceptions import (
)
from pip._internal.locations import distutils_scheme, virtualenv_no_global
from pip._internal.operations.prepare import RequirementPreparer
from pip._internal.req import RequirementSet
from pip._internal.req import RequirementSet, install_given_reqs
from pip._internal.resolve import Resolver
from pip._internal.status_codes import ERROR
from pip._internal.utils.filesystem import check_path_owner
@ -292,7 +292,9 @@ class InstallCommand(RequirementCommand):
session=session, autobuilding=True
)
installed = requirement_set.install(
to_install = requirement_set.to_install()
installed = install_given_reqs(
to_install,
install_options,
global_options,
root=options.root_path,

View File

@ -1,10 +1,68 @@
from __future__ import absolute_import
import logging
from .req_install import InstallRequirement
from .req_set import RequirementSet
from .req_file import parse_requirements
from pip._internal.utils.logging import indent_log
__all__ = [
"RequirementSet", "InstallRequirement",
"parse_requirements",
"parse_requirements", "install_req_set",
]
logger = logging.getLogger(__name__)
def install_given_reqs(to_install, install_options, global_options=(),
*args, **kwargs):
"""
Install everything in the given list.
(to be called after having downloaded and unpacked the packages)
"""
if to_install:
logger.info(
'Installing collected packages: %s',
', '.join([req.name for req in to_install]),
)
with indent_log():
for requirement in to_install:
if requirement.conflicts_with:
logger.info(
'Found existing installation: %s',
requirement.conflicts_with,
)
with indent_log():
uninstalled_pathset = requirement.uninstall(
auto_confirm=True
)
try:
requirement.install(
install_options,
global_options,
*args,
**kwargs
)
except:
should_rollback = (
requirement.conflicts_with and
not requirement.install_succeeded
)
# if install did not succeed, rollback previous uninstall
if should_rollback:
uninstalled_pathset.rollback()
raise
else:
should_commit = (
requirement.conflicts_with and
requirement.install_succeeded
)
if should_commit:
uninstalled_pathset.commit()
requirement.remove_temporary_source()
return to_install

View File

@ -33,6 +33,7 @@ class RequirementSet(object):
self.target_dir = target_dir # set from --target option
self.pycompile = pycompile
# Maps from install_req -> dependencies_of_install_req
# XXX: Move into resolver
self._dependencies = defaultdict(list)
def __str__(self):
@ -169,7 +170,8 @@ class RequirementSet(object):
for req in self.reqs_to_cleanup:
req.remove_temporary_source()
def _to_install(self):
def to_install(self):
# XXX: Move into resolver
"""Create the installation order.
The installation order is topological - requirements are installed
@ -195,54 +197,3 @@ class RequirementSet(object):
for install_req in self.requirements.values():
schedule(install_req)
return order
def install(self, install_options, global_options=(), *args, **kwargs):
"""
Install everything in this set (after having downloaded and unpacked
the packages)
"""
to_install = self._to_install()
if to_install:
logger.info(
'Installing collected packages: %s',
', '.join([req.name for req in to_install]),
)
with indent_log():
for requirement in to_install:
if requirement.conflicts_with:
logger.info(
'Found existing installation: %s',
requirement.conflicts_with,
)
with indent_log():
uninstalled_pathset = requirement.uninstall(
auto_confirm=True
)
try:
requirement.install(
install_options,
global_options,
*args,
**kwargs
)
except:
should_rollback = (
requirement.conflicts_with and
not requirement.install_succeeded
)
# if install did not succeed, rollback previous uninstall
if should_rollback:
uninstalled_pathset.rollback()
raise
else:
should_commit = (
requirement.conflicts_with and
requirement.install_succeeded
)
if should_commit:
uninstalled_pathset.commit()
requirement.remove_temporary_source()
return to_install