mirror of https://github.com/pypa/pip
Fix #1657 - Explicitly close the requests session
This commit is contained in:
parent
889f13ddc2
commit
2298e4ce53
|
@ -256,89 +256,96 @@ class InstallCommand(Command):
|
|||
"cache."
|
||||
)
|
||||
|
||||
session = self._build_session(options)
|
||||
with self._build_session(options) as session:
|
||||
|
||||
finder = self._build_package_finder(options, index_urls, session)
|
||||
finder = self._build_package_finder(options, index_urls, session)
|
||||
|
||||
requirement_set = RequirementSet(
|
||||
build_dir=options.build_dir,
|
||||
src_dir=options.src_dir,
|
||||
download_dir=options.download_dir,
|
||||
upgrade=options.upgrade,
|
||||
as_egg=options.as_egg,
|
||||
ignore_installed=options.ignore_installed,
|
||||
ignore_dependencies=options.ignore_dependencies,
|
||||
force_reinstall=options.force_reinstall,
|
||||
use_user_site=options.use_user_site,
|
||||
target_dir=temp_target_dir,
|
||||
session=session,
|
||||
pycompile=options.compile,
|
||||
)
|
||||
for name in args:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_line(name, None))
|
||||
for name in options.editables:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_editable(
|
||||
name,
|
||||
default_vcs=options.default_vcs
|
||||
)
|
||||
requirement_set = RequirementSet(
|
||||
build_dir=options.build_dir,
|
||||
src_dir=options.src_dir,
|
||||
download_dir=options.download_dir,
|
||||
upgrade=options.upgrade,
|
||||
as_egg=options.as_egg,
|
||||
ignore_installed=options.ignore_installed,
|
||||
ignore_dependencies=options.ignore_dependencies,
|
||||
force_reinstall=options.force_reinstall,
|
||||
use_user_site=options.use_user_site,
|
||||
target_dir=temp_target_dir,
|
||||
session=session,
|
||||
pycompile=options.compile,
|
||||
)
|
||||
for filename in options.requirements:
|
||||
for req in parse_requirements(
|
||||
filename, finder=finder, options=options, session=session):
|
||||
requirement_set.add_requirement(req)
|
||||
if not requirement_set.has_requirements:
|
||||
opts = {'name': self.name}
|
||||
if options.find_links:
|
||||
msg = ('You must give at least one requirement to %(name)s '
|
||||
'(maybe you meant "pip %(name)s %(links)s"?)' %
|
||||
dict(opts, links=' '.join(options.find_links)))
|
||||
else:
|
||||
msg = ('You must give at least one requirement '
|
||||
'to %(name)s (see "pip help %(name)s")' % opts)
|
||||
logger.warn(msg)
|
||||
return
|
||||
|
||||
try:
|
||||
if not options.no_download:
|
||||
requirement_set.prepare_files(finder)
|
||||
else:
|
||||
requirement_set.locate_files()
|
||||
|
||||
if not options.no_install:
|
||||
requirement_set.install(
|
||||
install_options,
|
||||
global_options,
|
||||
root=options.root_path,
|
||||
for name in args:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_line(name, None))
|
||||
for name in options.editables:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_editable(
|
||||
name,
|
||||
default_vcs=options.default_vcs
|
||||
)
|
||||
)
|
||||
installed = ' '.join([req.name for req in
|
||||
requirement_set.successfully_installed])
|
||||
if installed:
|
||||
logger.notify('Successfully installed %s' % installed)
|
||||
else:
|
||||
downloaded = ' '.join([
|
||||
req.name for req in requirement_set.successfully_downloaded
|
||||
])
|
||||
if downloaded:
|
||||
logger.notify('Successfully downloaded %s' % downloaded)
|
||||
except PreviousBuildDirError:
|
||||
options.no_clean = True
|
||||
raise
|
||||
finally:
|
||||
# Clean up
|
||||
if ((not options.no_clean)
|
||||
and ((not options.no_install) or options.download_dir)):
|
||||
requirement_set.cleanup_files()
|
||||
for filename in options.requirements:
|
||||
for req in parse_requirements(
|
||||
filename,
|
||||
finder=finder, options=options, session=session):
|
||||
requirement_set.add_requirement(req)
|
||||
if not requirement_set.has_requirements:
|
||||
opts = {'name': self.name}
|
||||
if options.find_links:
|
||||
msg = ('You must give at least one requirement to %(name)s'
|
||||
' (maybe you meant "pip %(name)s %(links)s"?)' %
|
||||
dict(opts, links=' '.join(options.find_links)))
|
||||
else:
|
||||
msg = ('You must give at least one requirement '
|
||||
'to %(name)s (see "pip help %(name)s")' % opts)
|
||||
logger.warn(msg)
|
||||
return
|
||||
|
||||
if options.target_dir:
|
||||
if not os.path.exists(options.target_dir):
|
||||
os.makedirs(options.target_dir)
|
||||
lib_dir = distutils_scheme('', home=temp_target_dir)['purelib']
|
||||
for item in os.listdir(lib_dir):
|
||||
shutil.move(
|
||||
os.path.join(lib_dir, item),
|
||||
os.path.join(options.target_dir, item),
|
||||
)
|
||||
shutil.rmtree(temp_target_dir)
|
||||
return requirement_set
|
||||
try:
|
||||
if not options.no_download:
|
||||
requirement_set.prepare_files(finder)
|
||||
else:
|
||||
requirement_set.locate_files()
|
||||
|
||||
if not options.no_install:
|
||||
requirement_set.install(
|
||||
install_options,
|
||||
global_options,
|
||||
root=options.root_path,
|
||||
)
|
||||
installed = ' '.join([
|
||||
req.name for req in
|
||||
requirement_set.successfully_installed
|
||||
])
|
||||
if installed:
|
||||
logger.notify('Successfully installed %s' % installed)
|
||||
else:
|
||||
downloaded = ' '.join([
|
||||
req.name
|
||||
for req in requirement_set.successfully_downloaded
|
||||
])
|
||||
if downloaded:
|
||||
logger.notify(
|
||||
'Successfully downloaded %s' % downloaded
|
||||
)
|
||||
except PreviousBuildDirError:
|
||||
options.no_clean = True
|
||||
raise
|
||||
finally:
|
||||
# Clean up
|
||||
if ((not options.no_clean)
|
||||
and ((not options.no_install)
|
||||
or options.download_dir)):
|
||||
requirement_set.cleanup_files()
|
||||
|
||||
if options.target_dir:
|
||||
if not os.path.exists(options.target_dir):
|
||||
os.makedirs(options.target_dir)
|
||||
lib_dir = distutils_scheme('', home=temp_target_dir)['purelib']
|
||||
for item in os.listdir(lib_dir):
|
||||
shutil.move(
|
||||
os.path.join(lib_dir, item),
|
||||
os.path.join(options.target_dir, item),
|
||||
)
|
||||
shutil.rmtree(temp_target_dir)
|
||||
return requirement_set
|
||||
|
|
|
@ -115,35 +115,35 @@ class ListCommand(Command):
|
|||
)
|
||||
index_urls += options.mirrors
|
||||
|
||||
session = self._build_session(options)
|
||||
with self._build_session(options) as session:
|
||||
finder = self._build_package_finder(options, index_urls, session)
|
||||
|
||||
finder = self._build_package_finder(options, index_urls, session)
|
||||
installed_packages = get_installed_distributions(
|
||||
local_only=options.local,
|
||||
include_editables=False,
|
||||
)
|
||||
for dist in installed_packages:
|
||||
req = InstallRequirement.from_line(dist.key, None)
|
||||
try:
|
||||
link = finder.find_requirement(req, True)
|
||||
|
||||
installed_packages = get_installed_distributions(
|
||||
local_only=options.local,
|
||||
include_editables=False,
|
||||
)
|
||||
for dist in installed_packages:
|
||||
req = InstallRequirement.from_line(dist.key, None)
|
||||
try:
|
||||
link = finder.find_requirement(req, True)
|
||||
|
||||
# If link is None, means installed version is most up-to-date
|
||||
if link is None:
|
||||
# If link is None, means installed version is most
|
||||
# up-to-date
|
||||
if link is None:
|
||||
continue
|
||||
except DistributionNotFound:
|
||||
continue
|
||||
except DistributionNotFound:
|
||||
continue
|
||||
except BestVersionAlreadyInstalled:
|
||||
remote_version = req.installed_version
|
||||
else:
|
||||
# It might be a good idea that link or finder had a public
|
||||
# method that returned version
|
||||
remote_version = finder._link_package_versions(
|
||||
link, req.name
|
||||
)[0]
|
||||
remote_version_raw = remote_version[2]
|
||||
remote_version_parsed = remote_version[0]
|
||||
yield dist, remote_version_raw, remote_version_parsed
|
||||
except BestVersionAlreadyInstalled:
|
||||
remote_version = req.installed_version
|
||||
else:
|
||||
# It might be a good idea that link or finder had a public
|
||||
# method that returned version
|
||||
remote_version = finder._link_package_versions(
|
||||
link, req.name
|
||||
)[0]
|
||||
remote_version_raw = remote_version[2]
|
||||
remote_version_parsed = remote_version[0]
|
||||
yield dist, remote_version_raw, remote_version_parsed
|
||||
|
||||
def run_listing(self, options):
|
||||
installed_packages = get_installed_distributions(
|
||||
|
|
|
@ -39,26 +39,26 @@ class UninstallCommand(Command):
|
|||
self.parser.insert_option_group(0, self.cmd_opts)
|
||||
|
||||
def run(self, options, args):
|
||||
session = self._build_session(options)
|
||||
with self._build_session(options) as session:
|
||||
|
||||
requirement_set = RequirementSet(
|
||||
build_dir=None,
|
||||
src_dir=None,
|
||||
download_dir=None,
|
||||
session=session,
|
||||
)
|
||||
for name in args:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_line(name))
|
||||
for filename in options.requirements:
|
||||
for req in parse_requirements(
|
||||
filename,
|
||||
options=options,
|
||||
session=session):
|
||||
requirement_set.add_requirement(req)
|
||||
if not requirement_set.has_requirements:
|
||||
raise InstallationError(
|
||||
'You must give at least one requirement to %(name)s (see "pip '
|
||||
'help %(name)s")' % dict(name=self.name)
|
||||
requirement_set = RequirementSet(
|
||||
build_dir=None,
|
||||
src_dir=None,
|
||||
download_dir=None,
|
||||
session=session,
|
||||
)
|
||||
requirement_set.uninstall(auto_confirm=options.yes)
|
||||
for name in args:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_line(name))
|
||||
for filename in options.requirements:
|
||||
for req in parse_requirements(
|
||||
filename,
|
||||
options=options,
|
||||
session=session):
|
||||
requirement_set.add_requirement(req)
|
||||
if not requirement_set.has_requirements:
|
||||
raise InstallationError(
|
||||
'You must give at least one requirement to %(name)s (see '
|
||||
'"pip help %(name)s")' % dict(name=self.name)
|
||||
)
|
||||
requirement_set.uninstall(auto_confirm=options.yes)
|
||||
|
|
|
@ -152,75 +152,75 @@ class WheelCommand(Command):
|
|||
"cache."
|
||||
)
|
||||
|
||||
session = self._build_session(options)
|
||||
with self._build_session(options) as session:
|
||||
|
||||
finder = PackageFinder(
|
||||
find_links=options.find_links,
|
||||
index_urls=index_urls,
|
||||
use_wheel=options.use_wheel,
|
||||
allow_external=options.allow_external,
|
||||
allow_unverified=options.allow_unverified,
|
||||
allow_all_external=options.allow_all_external,
|
||||
allow_all_prereleases=options.pre,
|
||||
session=session,
|
||||
)
|
||||
finder = PackageFinder(
|
||||
find_links=options.find_links,
|
||||
index_urls=index_urls,
|
||||
use_wheel=options.use_wheel,
|
||||
allow_external=options.allow_external,
|
||||
allow_unverified=options.allow_unverified,
|
||||
allow_all_external=options.allow_all_external,
|
||||
allow_all_prereleases=options.pre,
|
||||
session=session,
|
||||
)
|
||||
|
||||
options.build_dir = os.path.abspath(options.build_dir)
|
||||
requirement_set = RequirementSet(
|
||||
build_dir=options.build_dir,
|
||||
src_dir=options.src_dir,
|
||||
download_dir=None,
|
||||
ignore_dependencies=options.ignore_dependencies,
|
||||
ignore_installed=True,
|
||||
session=session,
|
||||
wheel_download_dir=options.wheel_dir
|
||||
)
|
||||
options.build_dir = os.path.abspath(options.build_dir)
|
||||
requirement_set = RequirementSet(
|
||||
build_dir=options.build_dir,
|
||||
src_dir=options.src_dir,
|
||||
download_dir=None,
|
||||
ignore_dependencies=options.ignore_dependencies,
|
||||
ignore_installed=True,
|
||||
session=session,
|
||||
wheel_download_dir=options.wheel_dir
|
||||
)
|
||||
|
||||
# make the wheelhouse
|
||||
if not os.path.exists(options.wheel_dir):
|
||||
os.makedirs(options.wheel_dir)
|
||||
# make the wheelhouse
|
||||
if not os.path.exists(options.wheel_dir):
|
||||
os.makedirs(options.wheel_dir)
|
||||
|
||||
# parse args and/or requirements files
|
||||
for name in args:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_line(name, None))
|
||||
for name in options.editables:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_editable(
|
||||
name,
|
||||
default_vcs=options.default_vcs
|
||||
# parse args and/or requirements files
|
||||
for name in args:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_line(name, None))
|
||||
for name in options.editables:
|
||||
requirement_set.add_requirement(
|
||||
InstallRequirement.from_editable(
|
||||
name,
|
||||
default_vcs=options.default_vcs
|
||||
)
|
||||
)
|
||||
)
|
||||
for filename in options.requirements:
|
||||
for req in parse_requirements(
|
||||
filename,
|
||||
finder=finder,
|
||||
options=options,
|
||||
session=session):
|
||||
requirement_set.add_requirement(req)
|
||||
for filename in options.requirements:
|
||||
for req in parse_requirements(
|
||||
filename,
|
||||
finder=finder,
|
||||
options=options,
|
||||
session=session):
|
||||
requirement_set.add_requirement(req)
|
||||
|
||||
# fail if no requirements
|
||||
if not requirement_set.has_requirements:
|
||||
opts = {'name': self.name}
|
||||
msg = ('You must give at least one requirement '
|
||||
'to %(name)s (see "pip help %(name)s")' % opts)
|
||||
logger.error(msg)
|
||||
return
|
||||
# fail if no requirements
|
||||
if not requirement_set.has_requirements:
|
||||
opts = {'name': self.name}
|
||||
msg = ('You must give at least one requirement '
|
||||
'to %(name)s (see "pip help %(name)s")' % opts)
|
||||
logger.error(msg)
|
||||
return
|
||||
|
||||
try:
|
||||
# build wheels
|
||||
wb = WheelBuilder(
|
||||
requirement_set,
|
||||
finder,
|
||||
options.wheel_dir,
|
||||
build_options=options.build_options or [],
|
||||
global_options=options.global_options or [],
|
||||
)
|
||||
if not wb.build():
|
||||
raise CommandError("Failed to build one or more wheels")
|
||||
except PreviousBuildDirError:
|
||||
options.no_clean = True
|
||||
raise
|
||||
finally:
|
||||
if not options.no_clean:
|
||||
requirement_set.cleanup_files()
|
||||
try:
|
||||
# build wheels
|
||||
wb = WheelBuilder(
|
||||
requirement_set,
|
||||
finder,
|
||||
options.wheel_dir,
|
||||
build_options=options.build_options or [],
|
||||
global_options=options.global_options or [],
|
||||
)
|
||||
if not wb.build():
|
||||
raise CommandError("Failed to build one or more wheels")
|
||||
except PreviousBuildDirError:
|
||||
options.no_clean = True
|
||||
raise
|
||||
finally:
|
||||
if not options.no_clean:
|
||||
requirement_set.cleanup_files()
|
||||
|
|
Loading…
Reference in New Issue