Fix error when wheels already exist in dist/
`build_meta.build_wheel` assumes that the only wheel in its output directory is the one it builds, but prior to this, it also used the `dist/` folder as its working output directory. This commit uses a temporary directory instead, preventing an error that was triggered when previously-generated wheel files were still sitting in `dist/`. Fixes GH #1671
This commit is contained in:
parent
ab79268c79
commit
901f7cc2a0
|
@ -35,6 +35,7 @@ import contextlib
|
|||
|
||||
import setuptools
|
||||
import distutils
|
||||
from setuptools.py31compat import TemporaryDirectory
|
||||
|
||||
from pkg_resources import parse_requirements
|
||||
|
||||
|
@ -182,14 +183,22 @@ class _BuildMetaBackend(object):
|
|||
metadata_directory=None):
|
||||
config_settings = self._fix_config(config_settings)
|
||||
wheel_directory = os.path.abspath(wheel_directory)
|
||||
sys.argv = sys.argv[:1] + ['bdist_wheel'] + \
|
||||
config_settings["--global-option"]
|
||||
self.run_setup()
|
||||
if wheel_directory != 'dist':
|
||||
shutil.rmtree(wheel_directory)
|
||||
shutil.copytree('dist', wheel_directory)
|
||||
|
||||
return _file_with_extension(wheel_directory, '.whl')
|
||||
# Build the wheel in a temporary directory, then copy to the target
|
||||
with TemporaryDirectory(dir=wheel_directory) as tmp_dist_dir:
|
||||
sys.argv = (sys.argv[:1] +
|
||||
['bdist_wheel', '--dist-dir', tmp_dist_dir] +
|
||||
config_settings["--global-option"])
|
||||
self.run_setup()
|
||||
|
||||
wheel_basename = _file_with_extension(tmp_dist_dir, '.whl')
|
||||
wheel_path = os.path.join(wheel_directory, wheel_basename)
|
||||
if os.path.exists(wheel_path):
|
||||
# os.rename will fail overwriting on non-unix env
|
||||
os.remove(wheel_path)
|
||||
os.rename(os.path.join(tmp_dist_dir, wheel_basename), wheel_path)
|
||||
|
||||
return wheel_basename
|
||||
|
||||
def build_sdist(self, sdist_directory, config_settings=None):
|
||||
config_settings = self._fix_config(config_settings)
|
||||
|
|
|
@ -17,9 +17,9 @@ except ImportError:
|
|||
errors on deletion.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, **kwargs):
|
||||
self.name = None # Handle mkdtemp raising an exception
|
||||
self.name = tempfile.mkdtemp()
|
||||
self.name = tempfile.mkdtemp(**kwargs)
|
||||
|
||||
def __enter__(self):
|
||||
return self.name
|
||||
|
|
|
@ -157,7 +157,6 @@ class TestBuildMetaBackend:
|
|||
|
||||
assert os.path.isfile(os.path.join(dist_dir, wheel_name))
|
||||
|
||||
@pytest.mark.xfail(reason="Known error, see GH #1671")
|
||||
def test_build_wheel_with_existing_wheel_file_present(self, tmpdir_cwd):
|
||||
# Building a wheel should still succeed if there's already a wheel
|
||||
# in the wheel directory
|
||||
|
@ -195,6 +194,12 @@ class TestBuildMetaBackend:
|
|||
assert os.path.isfile(os.path.join(dist_dir, wheel_one))
|
||||
assert wheel_one != wheel_two
|
||||
|
||||
# and if rebuilding the same wheel?
|
||||
open(os.path.join(dist_dir, wheel_two), 'w').close()
|
||||
wheel_three = self.get_build_backend().build_wheel(dist_dir)
|
||||
assert wheel_three == wheel_two
|
||||
assert os.path.getsize(os.path.join(dist_dir, wheel_three)) > 0
|
||||
|
||||
def test_build_sdist(self, build_backend):
|
||||
dist_dir = os.path.abspath('pip-sdist')
|
||||
os.makedirs(dist_dir)
|
||||
|
|
Loading…
Reference in New Issue