From d0c42d3da30219ff154023745137411dd6f0c58e Mon Sep 17 00:00:00 2001 From: xoviat Date: Fri, 26 Jan 2018 10:57:42 -0600 Subject: [PATCH 01/18] Ignore .vscode --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1d842203ba8..6894e3376df 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ coverage.xml # Scratch Pad for experiments .scratch/ +.vscode \ No newline at end of file From 6a99774dd78317b13e0e9a64331c633e2d47eff3 Mon Sep 17 00:00:00 2001 From: xoviat Date: Fri, 26 Jan 2018 10:58:28 -0600 Subject: [PATCH 02/18] Add cleanup method to build_env --- src/pip/_internal/build_env.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 52a53392c5e..469a4f10c36 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -62,3 +62,6 @@ def __exit__(self, exc_type, exc_val, exc_tb): os.environ.pop('PYTHONPATH', None) else: os.environ['PYTHONPATH'] = self.save_pythonpath + + def cleanup(self): + self._temp_dir.cleanup() From 615de6a5718aa618b94f04f8b4b0f61c398bb5e9 Mon Sep 17 00:00:00 2001 From: xoviat Date: Fri, 26 Jan 2018 11:01:18 -0600 Subject: [PATCH 03/18] Pass through finder to prepare operation --- src/pip/_internal/operations/prepare.py | 14 +++++++------- src/pip/_internal/resolve.py | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index e1d8a2baa81..394e84eb6ef 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -64,7 +64,7 @@ def dist(self, finder): """Return a setuptools Dist object.""" raise NotImplementedError(self.dist) - def prep_for_dist(self): + def prep_for_dist(self, finder): """Ensure that we can get a Dist for this requirement.""" raise NotImplementedError(self.dist) @@ -75,7 +75,7 @@ def dist(self, finder): return list(pkg_resources.find_distributions( self.req.source_dir))[0] - def prep_for_dist(self): + def prep_for_dist(self, finder): # FIXME:https://github.com/pypa/pip/issues/1112 pass @@ -91,7 +91,7 @@ def dist(self, finder): ) return dist - def prep_for_dist(self): + def prep_for_dist(self, finder): self.req.run_egg_info() self.req.assert_source_matches_version() @@ -101,7 +101,7 @@ class Installed(DistAbstraction): def dist(self, finder): return self.req.satisfied_by - def prep_for_dist(self): + def prep_for_dist(self, finder): pass @@ -259,14 +259,14 @@ def prepare_linked_requirement(self, req, session, finder, (req, exc, req.link) ) abstract_dist = make_abstract_dist(req) - abstract_dist.prep_for_dist() + abstract_dist.prep_for_dist(finder) if self._download_should_save: # Make a .zip of the source_dir we already created. if req.link.scheme in vcs.all_schemes: req.archive(self.download_dir) return abstract_dist - def prepare_editable_requirement(self, req, require_hashes): + def prepare_editable_requirement(self, req, require_hashes, finder): """Prepare an editable requirement """ assert req.editable, "cannot prepare a non-editable req as editable" @@ -284,7 +284,7 @@ def prepare_editable_requirement(self, req, require_hashes): req.update_editable(not self._download_should_save) abstract_dist = make_abstract_dist(req) - abstract_dist.prep_for_dist() + abstract_dist.prep_for_dist(finder) if self._download_should_save: req.archive(self.download_dir) diff --git a/src/pip/_internal/resolve.py b/src/pip/_internal/resolve.py index 247c561c549..5fbf5b9b6ff 100644 --- a/src/pip/_internal/resolve.py +++ b/src/pip/_internal/resolve.py @@ -187,7 +187,7 @@ def _get_abstract_dist_for(self, req): if req.editable: return self.preparer.prepare_editable_requirement( - req, self.require_hashes + req, self.require_hashes, self.finder ) # satisfied_by is only evaluated by calling _check_skip_installed, From 08bec25c56768d10c5ca5b7cf30fa19b66293391 Mon Sep 17 00:00:00 2001 From: xoviat Date: Fri, 26 Jan 2018 11:02:41 -0600 Subject: [PATCH 04/18] More eagerly cleanup the requirement --- src/pip/_internal/resolve.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pip/_internal/resolve.py b/src/pip/_internal/resolve.py index 5fbf5b9b6ff..850af7a6f10 100644 --- a/src/pip/_internal/resolve.py +++ b/src/pip/_internal/resolve.py @@ -246,11 +246,12 @@ def _resolve_one(self, requirement_set, req_to_install): return [] req_to_install.prepared = True - abstract_dist = self._get_abstract_dist_for(req_to_install) # register tmp src for cleanup in case something goes wrong requirement_set.reqs_to_cleanup.append(req_to_install) + abstract_dist = self._get_abstract_dist_for(req_to_install) + # Parse and return dependencies dist = abstract_dist.dist(self.finder) try: From 958a9369f5fbb5be2723b0b53d5a0e17855c782c Mon Sep 17 00:00:00 2001 From: xoviat Date: Fri, 26 Jan 2018 11:06:00 -0600 Subject: [PATCH 05/18] Make BuildEnvironment a proprety of Requirement --- src/pip/_internal/req/req_install.py | 3 +++ src/pip/_internal/wheel.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index d25f17c958b..ed7e20b5476 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -22,6 +22,7 @@ from pip._vendor.pkg_resources import RequirementParseError, parse_requirements from pip._internal import wheel +from pip._internal.build_env import BuildEnvironment from pip._internal.compat import native_str from pip._internal.download import ( is_archive_file, is_url, path_to_url, url_to_path, @@ -128,6 +129,7 @@ def __init__(self, req, comes_from, source_dir=None, editable=False, self.prepared = False self.isolated = isolated + self.build_environment = BuildEnvironment(no_clean=True) @classmethod def from_editable(cls, editable_req, comes_from=None, isolated=False, @@ -880,6 +882,7 @@ def remove_temporary_source(self): rmtree(self.source_dir) self.source_dir = None self._temp_build_dir.cleanup() + self.build_environment.cleanup() def install_editable(self, install_options, global_options=(), prefix=None): diff --git a/src/pip/_internal/wheel.py b/src/pip/_internal/wheel.py index 03c1b22b99f..558270906b3 100644 --- a/src/pip/_internal/wheel.py +++ b/src/pip/_internal/wheel.py @@ -646,8 +646,8 @@ def _build_one(self, req, output_dir, python_tag=None): "it cannot build a wheel without setuptools. You may need to " "upgrade to a newer version of pip.") # Install build deps into temporary directory (PEP 518) - with BuildEnvironment(self.no_clean) as prefix: self._install_build_reqs(build_reqs, prefix) + with req.build_environment as prefix: return self._build_one_inside_env(req, output_dir, python_tag=python_tag, isolate=True) From 27cb7f36cc9185ee1aa22a7b2c7e1e88768fc1fe Mon Sep 17 00:00:00 2001 From: xoviat Date: Fri, 26 Jan 2018 12:11:00 -0600 Subject: [PATCH 06/18] Install build requirements in the prepare operation --- src/pip/_internal/build_env.py | 11 +++++++ src/pip/_internal/operations/prepare.py | 44 +++++++++++++++++++++++-- src/pip/_internal/wheel.py | 24 -------------- 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 469a4f10c36..97ec00aa6fb 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -65,3 +65,14 @@ def __exit__(self, exc_type, exc_val, exc_tb): def cleanup(self): self._temp_dir.cleanup() + + +class FakeBuildEnvironment(BuildEnvironment): + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def cleanup(self): + pass diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 394e84eb6ef..837c8f7a7d8 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -3,6 +3,10 @@ import logging import os +import sys +import itertools + +from copy import copy from pip._vendor import pkg_resources, requests @@ -16,8 +20,12 @@ ) from pip._internal.utils.hashes import MissingHashes from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import display_path, normalize_path +from pip._internal.utils.misc import display_path, normalize_path, call_subprocess +from pip._internal.utils.ui import open_spinner from pip._internal.vcs import vcs +from pip._internal.req.req_install import InstallRequirement +from pip._internal.index import FormatControl +from pip._internal.build_env import FakeBuildEnvironment logger = logging.getLogger(__name__) @@ -38,6 +46,19 @@ def make_abstract_dist(req): return IsSDist(req) +def _install_build_reqs(finder, prefix, build_requirements): + finder = copy(finder) + finder.format_control = FormatControl(set(), set([":all:"])) + urls = [finder.find_requirement(InstallRequirement.from_line(r), + upgrade=False).url + for r in build_requirements] + args = [sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--prefix', prefix] + list(urls) + + with open_spinner("Installing build dependencies") as spinner: + call_subprocess(args, show_stdout=False, spinner=spinner) + + class DistAbstraction(object): """Abstracts out the wheel vs non-wheel Resolver.resolve() logic. @@ -92,8 +113,25 @@ def dist(self, finder): return dist def prep_for_dist(self, finder): - self.req.run_egg_info() - self.req.assert_source_matches_version() + build_requirements, isolate = self.req.get_pep_518_info() + + if 'setuptools' not in build_requirements: + logger.warning( + "This version of pip does not implement PEP 516, so " + "it cannot build a wheel without setuptools. You may need to " + "upgrade to a newer version of pip.") + + if not isolate: + self.req.build_environment = FakeBuildEnvironment(no_clean=False) + + with self.req.build_environment as prefix: + # Ignore the --no-binary option when installing the build system, so + # we don't recurse trying to build a self-hosting build system. + if isolate: + _install_build_reqs(finder, prefix, build_requirements) + + self.req.run_egg_info() + self.req.assert_source_matches_version() class Installed(DistAbstraction): diff --git a/src/pip/_internal/wheel.py b/src/pip/_internal/wheel.py index 558270906b3..a5ac3b63642 100644 --- a/src/pip/_internal/wheel.py +++ b/src/pip/_internal/wheel.py @@ -617,36 +617,12 @@ def __init__(self, finder, preparer, wheel_cache, self.global_options = global_options or [] self.no_clean = no_clean - def _install_build_reqs(self, reqs, prefix): - # Local import to avoid circular import (wheel <-> req_install) - from pip._internal.req.req_install import InstallRequirement - from pip._internal.index import FormatControl - # Ignore the --no-binary option when installing the build system, so - # we don't recurse trying to build a self-hosting build system. - finder = copy.copy(self.finder) - finder.format_control = FormatControl(set(), set([":all:"])) - urls = [finder.find_requirement(InstallRequirement.from_line(r), - upgrade=False).url - for r in reqs] - - args = [sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--prefix', prefix] + list(urls) - with open_spinner("Installing build dependencies") as spinner: - call_subprocess(args, show_stdout=False, spinner=spinner) - def _build_one(self, req, output_dir, python_tag=None): """Build one wheel. :return: The filename of the built wheel, or None if the build failed. """ - build_reqs, isolate = req.get_pep_518_info() - if 'setuptools' not in build_reqs: - logger.warning( - "This version of pip does not implement PEP 516, so " - "it cannot build a wheel without setuptools. You may need to " - "upgrade to a newer version of pip.") # Install build deps into temporary directory (PEP 518) - self._install_build_reqs(build_reqs, prefix) with req.build_environment as prefix: return self._build_one_inside_env(req, output_dir, python_tag=python_tag, From 8dad780026ab70071c2247535e1df8007a40ed7a Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 11:04:43 -0600 Subject: [PATCH 07/18] Address review comments --- src/pip/_internal/build_env.py | 2 +- src/pip/_internal/operations/prepare.py | 11 ++++++----- src/pip/_internal/req/req_install.py | 4 ++-- src/pip/_internal/resolve.py | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 97ec00aa6fb..5a2abf6defa 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -67,7 +67,7 @@ def cleanup(self): self._temp_dir.cleanup() -class FakeBuildEnvironment(BuildEnvironment): +class NoOpBuildEnvironment(BuildEnvironment): def __enter__(self): pass diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 837c8f7a7d8..7b7b734d45c 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -25,7 +25,7 @@ from pip._internal.vcs import vcs from pip._internal.req.req_install import InstallRequirement from pip._internal.index import FormatControl -from pip._internal.build_env import FakeBuildEnvironment +from pip._internal.build_env import NoOpBuildEnvironment logger = logging.getLogger(__name__) @@ -113,6 +113,9 @@ def dist(self, finder): return dist def prep_for_dist(self, finder): + # Before calling "setup.py egg_info", we need to set-up the build + # environment. + build_requirements, isolate = self.req.get_pep_518_info() if 'setuptools' not in build_requirements: @@ -122,11 +125,9 @@ def prep_for_dist(self, finder): "upgrade to a newer version of pip.") if not isolate: - self.req.build_environment = FakeBuildEnvironment(no_clean=False) + self.req.build_env = NoOpBuildEnvironment(no_clean=False) - with self.req.build_environment as prefix: - # Ignore the --no-binary option when installing the build system, so - # we don't recurse trying to build a self-hosting build system. + with self.req.build_env as prefix: if isolate: _install_build_reqs(finder, prefix, build_requirements) diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index ed7e20b5476..c81a6ff3818 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -129,7 +129,7 @@ def __init__(self, req, comes_from, source_dir=None, editable=False, self.prepared = False self.isolated = isolated - self.build_environment = BuildEnvironment(no_clean=True) + self.build_env = BuildEnvironment(no_clean=True) @classmethod def from_editable(cls, editable_req, comes_from=None, isolated=False, @@ -882,7 +882,7 @@ def remove_temporary_source(self): rmtree(self.source_dir) self.source_dir = None self._temp_build_dir.cleanup() - self.build_environment.cleanup() + self.build_env.cleanup() def install_editable(self, install_options, global_options=(), prefix=None): diff --git a/src/pip/_internal/resolve.py b/src/pip/_internal/resolve.py index 850af7a6f10..22756fd3a44 100644 --- a/src/pip/_internal/resolve.py +++ b/src/pip/_internal/resolve.py @@ -187,7 +187,7 @@ def _get_abstract_dist_for(self, req): if req.editable: return self.preparer.prepare_editable_requirement( - req, self.require_hashes, self.finder + req, self.require_hashes, self.finder, ) # satisfied_by is only evaluated by calling _check_skip_installed, From d3d13eaab71be592e7da544939561c19ded2fdbe Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 11:07:19 -0600 Subject: [PATCH 08/18] :art: --- src/pip/_internal/build_env.py | 2 +- src/pip/_internal/operations/prepare.py | 16 ++++++++++------ src/pip/_internal/resolve.py | 4 +++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 5a2abf6defa..1819105fa83 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -73,6 +73,6 @@ def __enter__(self): def __exit__(self, exc_type, exc_val, exc_tb): pass - + def cleanup(self): pass diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 7b7b734d45c..ea4442847b3 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -49,11 +49,15 @@ def make_abstract_dist(req): def _install_build_reqs(finder, prefix, build_requirements): finder = copy(finder) finder.format_control = FormatControl(set(), set([":all:"])) - urls = [finder.find_requirement(InstallRequirement.from_line(r), - upgrade=False).url - for r in build_requirements] - args = [sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--prefix', prefix] + list(urls) + urls = [ + finder.find_requirement( + InstallRequirement.from_line(r), upgrade=False).url + for r in build_requirements + ] + args = [ + sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--prefix', prefix + ] + list(urls) with open_spinner("Installing build dependencies") as spinner: call_subprocess(args, show_stdout=False, spinner=spinner) @@ -115,7 +119,7 @@ def dist(self, finder): def prep_for_dist(self, finder): # Before calling "setup.py egg_info", we need to set-up the build # environment. - + build_requirements, isolate = self.req.get_pep_518_info() if 'setuptools' not in build_requirements: diff --git a/src/pip/_internal/resolve.py b/src/pip/_internal/resolve.py index 22756fd3a44..d7b5ab0eea3 100644 --- a/src/pip/_internal/resolve.py +++ b/src/pip/_internal/resolve.py @@ -187,7 +187,9 @@ def _get_abstract_dist_for(self, req): if req.editable: return self.preparer.prepare_editable_requirement( - req, self.require_hashes, self.finder, + req, + self.require_hashes, + self.finder, ) # satisfied_by is only evaluated by calling _check_skip_installed, From 3b88968f0da0b9cd4385b9af5c51ffc1bb30ccd4 Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 11:11:02 -0600 Subject: [PATCH 09/18] :art: --- src/pip/_internal/operations/prepare.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index ea4442847b3..6e0879df4c0 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -1,15 +1,15 @@ """Prepares a distribution for installation """ +import itertools import logging import os import sys -import itertools - from copy import copy from pip._vendor import pkg_resources, requests +from pip._internal.build_env import NoOpBuildEnvironment from pip._internal.compat import expanduser from pip._internal.download import ( is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path, @@ -18,14 +18,15 @@ DirectoryUrlHashUnsupported, HashUnpinned, InstallationError, PreviousBuildDirError, VcsHashUnsupported, ) +from pip._internal.index import FormatControl +from pip._internal.req.req_install import InstallRequirement from pip._internal.utils.hashes import MissingHashes from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import display_path, normalize_path, call_subprocess +from pip._internal.utils.misc import ( + call_subprocess, display_path, normalize_path, +) from pip._internal.utils.ui import open_spinner from pip._internal.vcs import vcs -from pip._internal.req.req_install import InstallRequirement -from pip._internal.index import FormatControl -from pip._internal.build_env import NoOpBuildEnvironment logger = logging.getLogger(__name__) From 74c086bd2b0f24af4ab66128271de069de31bb63 Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 11:14:04 -0600 Subject: [PATCH 10/18] :art: --- src/pip/_internal/wheel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pip/_internal/wheel.py b/src/pip/_internal/wheel.py index a5ac3b63642..9dca5baae76 100644 --- a/src/pip/_internal/wheel.py +++ b/src/pip/_internal/wheel.py @@ -623,7 +623,7 @@ def _build_one(self, req, output_dir, python_tag=None): :return: The filename of the built wheel, or None if the build failed. """ # Install build deps into temporary directory (PEP 518) - with req.build_environment as prefix: + with req.build_environment: return self._build_one_inside_env(req, output_dir, python_tag=python_tag, isolate=True) From 5bb4e7611936b92a7e7558f51007576f2070c9c0 Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 11:17:04 -0600 Subject: [PATCH 11/18] :news: --- news/4799.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/4799.bugfix diff --git a/news/4799.bugfix b/news/4799.bugfix new file mode 100644 index 00000000000..782f70a9301 --- /dev/null +++ b/news/4799.bugfix @@ -0,0 +1 @@ +Fix situation where build requirements are installed before calling setup.py. \ No newline at end of file From b2144259f0b3bea6d138ffa47ade39f9a27901ad Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 11:27:19 -0600 Subject: [PATCH 12/18] Add regression test --- tests/data/packages/pep518-3.0.tar.gz | Bin 832 -> 851 bytes tests/data/src/pep518-3.0/setup.py | 2 ++ 2 files changed, 2 insertions(+) diff --git a/tests/data/packages/pep518-3.0.tar.gz b/tests/data/packages/pep518-3.0.tar.gz index cfd03320375ad458026502c95660c407ff594098..08cc3887550e992da3bca1605c4e894303a19544 100644 GIT binary patch delta 848 zcmV-W1F!tR2Ga(AABzYG7q)C#0{>)bb97vAWpFhyI4v_SFfMdqascg`T~FIE6oz{p zssF(%7l1@sC(g%&)CB?I?|o z-{bc~TG+L1L&e`T9k+!r#J_eJ9|h@{qBx6_ z=sO+Bu8hJ!YXScU75$foT{@lWj8CH8O7;J={I61h0r~%h<3FY``Pz& zN)y2%zKx77ZfgTSq}!;R5pC_RkK}#BGz|SD+eT-D!@=>lL0kJ2g;bCIDXp~ar1C0C z9yI7Q^jT18{>(;{i|Umhs2C+ImgHn_YYkK`R9=!iCVgIiw{i|}%%geos zwkG|lSEK{fN9CDv22`Ek@=VOQm(Ur@y+GN23JdI;(|-+HD}VL>^ZMU(4X612!-DsJ zjj;Bvmx`o!$#{?Q8HzJy(s^5(BvFXwOFmLwAW9^fFh2HTe{`+9zSt@U}B7{;S_)f9(G6y#BKcVnF_HB>#`oFw7u- a0+S&F6O%9l1PuVdYvecbQGd_?Pyhg1eZdI; delta 826 zcmV-A1I7H)2EYb?ABzYGJF{k50{>)bb966oWpFhyI4v_SFfMdqascg`T~nJt6o$Fx zS8VNtIwQ%#^3ic77ml^9V~tLu?S z!XoF{bjfw;kQW=DS42;h-%~-;>k=eugFo@|ksy2jvyP`IUKFZ@bNQ-TBIy@L2eHrQ> zl9(DIn9_P`CzqE=x;Qpy9I&XK{m90YXLoLUOS5r*%7j$kW$Y$gQZ9{?Lj3-Udh$35 zkPCxDLjs809KUn{kw~+r?*d#9KzZ3n}hkkwG446@wi{5xLz3z!Z zUlt!H4*jv!Qsn$XN zT~H~13qmI7e|7o(zvut9O9<#6@_)$xyNv&h^shtxW3P_?mg&vwzqSMV?}W39oJFCL z6`7>*xt`K*IZJ6aI9sbSgYTD=Mr&JWtvmzBB#E;5sG2?psl6cm-=6onj{jK2{AT=j zh>Jo0o#^+}qr+&O4`&c^2T@+LTzC(?gaWYt>H|Kr{v z|8OwD@czfs*njm!_J`Gf@A`kwwBi4sZv20k$8iBJ7n3mq77qXb0G=a10kHeoRRB-` E07$X4iU0rr diff --git a/tests/data/src/pep518-3.0/setup.py b/tests/data/src/pep518-3.0/setup.py index f9d4c48913d..c44e35fdd06 100644 --- a/tests/data/src/pep518-3.0/setup.py +++ b/tests/data/src/pep518-3.0/setup.py @@ -1,6 +1,8 @@ #!/usr/bin/env python from setuptools import find_packages, setup +import simple # Test gh-4647 regression + setup(name='pep518', version='3.0', packages=find_packages() From 12202eecde9f4ac3c0109e27eb21fc63f60bbf98 Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 11:28:23 -0600 Subject: [PATCH 13/18] Fix regression --- src/pip/_internal/wheel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pip/_internal/wheel.py b/src/pip/_internal/wheel.py index 9dca5baae76..17d52911698 100644 --- a/src/pip/_internal/wheel.py +++ b/src/pip/_internal/wheel.py @@ -623,7 +623,7 @@ def _build_one(self, req, output_dir, python_tag=None): :return: The filename of the built wheel, or None if the build failed. """ # Install build deps into temporary directory (PEP 518) - with req.build_environment: + with req.build_env: return self._build_one_inside_env(req, output_dir, python_tag=python_tag, isolate=True) From 5c77300ce86232f9e756173f3655e3a2ad512a05 Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 11:41:56 -0600 Subject: [PATCH 14/18] Fix regression test --- tests/data/packages/pep518-3.0.tar.gz | Bin 851 -> 853 bytes tests/data/src/pep518-3.0/pyproject.toml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/data/packages/pep518-3.0.tar.gz b/tests/data/packages/pep518-3.0.tar.gz index 08cc3887550e992da3bca1605c4e894303a19544..f912e6d85a2e689bb46f266d6571fbbf8714a36a 100644 GIT binary patch delta 847 zcmV-V1F-zl2Gs_CABzYGvbk(p0{>)bb97vAWpFhyI4v_SFfMdqascg`TTk0C6vz7< zso%jX4}e6{IM)fO4~W5r7zM4cJs=c?)-4{1lf_QAeET^GkWkbOSQ7+0zn8|BD2 z?v)T%_CMMg9_;UpPBqF_Z-2*emfPQO3;P?E?%Fn%_BRa2?I0cO-#C zos5MhqA*Z8!2dx_|K+7dW;2ztY1Ch-{-5Umr7Lj3|G%*PCnP3pLfAO-0?MwrCVq)# z{J)NC_Rsx)ziVO({C^vOrw9MPME@s;AJv25{&C~^pJ}=a`nTi-=)Vn)i0~)A@YSy* z;WT2~2y1#*8TujFM&*j=DtBXMJ~m3j&`+{$bT&L39)BBll}}Mf)YzYqTHj78uA<~Y zhe|@92DR?bbW9kp-}!;?aYADupQ!FeOb{m2(=1+pGNsmg68K^oC1I@#1pa*ekB-m2 z?Cy=89rhosf5X)m^lxJmgZ^95e^vA=3pF4oB8|22barzUXUeh=q5NU(D38f2A50Qa z>;+^_f?|}@Fb+uH^C+Xj^WaQz=a(rBCMwUkAmN3QkRK^c z2p^pH%FN*B6(PZ3U}$=83-yXZKtxf%^Hwp|y8w~B4gKHMdu_*m{NVeKAsqndzZLz< za?i`ly^F3Q{Fzs{12jNoOJ)W{HuSQ^=gdog$eiZ6K-mic_RZ)bb97vAWpFhyI4v_SFfMdqascg`T~FIE6oz{p zssF(%7l1@sC(g%&)CB?I?|o z-{bc~TG+L1L&e`T9k+!r#J_eJ9|h@{qBx6_ z=sO+Bu8hJ!YXScU75$foT{@lWj8CH8O7;J={I61h0r~%h<3FY``Pz& zN)y2%zKx77ZfgTSq}!;R5pC_RkK}#BGz|SD+eT-D!@=>lL0kJ2g;bCIDXp~ar1C0C z9yI7Q^jT18{>(;{i|Umhs2C+ImgHn_YYkK`R9=!iCVgIiw{i|}%%geos zwkG|lSEK{fN9CDv22`Ek@=VOQm(Ur@y+GN23JdI;(|-+HD}VL>^ZMU(4X612!-DsJ zjj;Bvmx`o!$#{?Q8HzJy(s^5(BvFXwOFmLwAW9^fFh2HTe{`+9zSt@U}B7{;S_)f9(G6y#BKcVnF_HB>#`oFw7u- V0+TTV7!1H`008W8z-Ryf diff --git a/tests/data/src/pep518-3.0/pyproject.toml b/tests/data/src/pep518-3.0/pyproject.toml index 5e3bb233223..b51a1cec7c7 100644 --- a/tests/data/src/pep518-3.0/pyproject.toml +++ b/tests/data/src/pep518-3.0/pyproject.toml @@ -1,2 +1,2 @@ [build-system] -requires=["simple==3.0", "setuptools", "wheel"] +requires=["simplewheel==2.0", "setuptools", "wheel"] From 88105000f59624a38ce6dca86c08c6e623ba4850 Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 14:37:43 -0600 Subject: [PATCH 15/18] Address review --- news/4799.bugfix | 1 - news/4799.trivial | 0 src/pip/_internal/build_env.py | 3 +++ tests/data/src/pep518-3.0/setup.py | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) delete mode 100644 news/4799.bugfix create mode 100644 news/4799.trivial diff --git a/news/4799.bugfix b/news/4799.bugfix deleted file mode 100644 index 782f70a9301..00000000000 --- a/news/4799.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix situation where build requirements are installed before calling setup.py. \ No newline at end of file diff --git a/news/4799.trivial b/news/4799.trivial new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 1819105fa83..6364aacecda 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -68,6 +68,9 @@ def cleanup(self): class NoOpBuildEnvironment(BuildEnvironment): + def __init__(self, no_clean): + pass + def __enter__(self): pass diff --git a/tests/data/src/pep518-3.0/setup.py b/tests/data/src/pep518-3.0/setup.py index c44e35fdd06..84e7feb702d 100644 --- a/tests/data/src/pep518-3.0/setup.py +++ b/tests/data/src/pep518-3.0/setup.py @@ -1,7 +1,7 @@ #!/usr/bin/env python from setuptools import find_packages, setup -import simple # Test gh-4647 regression +import simple # ensure dependency is installed setup(name='pep518', version='3.0', From 1601ebb6f9e02c836103c9c7e2017bbef895172d Mon Sep 17 00:00:00 2001 From: xoviat Date: Sat, 27 Jan 2018 14:38:19 -0600 Subject: [PATCH 16/18] revert .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6894e3376df..1d842203ba8 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,3 @@ coverage.xml # Scratch Pad for experiments .scratch/ -.vscode \ No newline at end of file From 14ae49d6da69da1b4a475704f5992bd0bbb1853b Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Thu, 1 Mar 2018 12:12:26 +0530 Subject: [PATCH 17/18] :pencil2: Add a note + docstring --- src/pip/_internal/build_env.py | 5 ++++- src/pip/_internal/operations/prepare.py | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 6364aacecda..1989c8aad05 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -8,7 +8,7 @@ class BuildEnvironment(object): - """Manages a temporary environment to install build deps + """Creates and manages an isolated environment to install build deps """ def __init__(self, no_clean): @@ -68,6 +68,9 @@ def cleanup(self): class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + def __init__(self, no_clean): pass diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 6e0879df4c0..0fbc0ecd233 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -48,6 +48,9 @@ def make_abstract_dist(req): def _install_build_reqs(finder, prefix, build_requirements): + # NOTE: What follows is not a very good thing. + # Eventually, this should move into the BuildEnvironment class and + # that should handle all the isolation and sub-process invocation. finder = copy(finder) finder.format_control = FormatControl(set(), set([":all:"])) urls = [ From 5e16d5105eac107db5c8eca7ff776f754ce0262b Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Thu, 1 Mar 2018 12:12:31 +0530 Subject: [PATCH 18/18] :art: --- src/pip/_internal/operations/prepare.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 0fbc0ecd233..86e2e7b9954 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -60,7 +60,7 @@ def _install_build_reqs(finder, prefix, build_requirements): ] args = [ sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--prefix', prefix + '--prefix', prefix, ] + list(urls) with open_spinner("Installing build dependencies") as spinner: