diff --git a/mesonpy/__init__.py b/mesonpy/__init__.py index 5c581c242..396b1588b 100644 --- a/mesonpy/__init__.py +++ b/mesonpy/__init__.py @@ -869,45 +869,13 @@ def sdist(self, directory: Path) -> pathlib.Path: with tarfile.open(meson_dist_path, 'r:gz') as meson_dist, mesonpy._util.create_targz(sdist) as tar: for member in meson_dist.getmembers(): - # calculate the file path in the source directory - assert member.name, member.name - member_parts = member.name.split('/') - if len(member_parts) <= 1: - continue - path = self._source_dir.joinpath(*member_parts[1:]) - - if not path.exists() and member.isfile(): - # File doesn't exists on the source directory but exists on - # the Meson dist, so it is generated file, which we need to - # include. - # See https://mesonbuild.com/Reference-manual_builtin_meson.html#mesonadd_dist_script - - # MESON_DIST_ROOT could have a different base name - # than the actual sdist basename, so we need to rename here + if member.isfile(): file = meson_dist.extractfile(member.name) - member.name = str(pathlib.Path(dist_name, *member_parts[1:]).as_posix()) + # rewrite the path to match the sdist distribution name + member.name = '/'.join((dist_name, *member.name.split('/')[1:])) tar.addfile(member, file) continue - if not path.is_file(): - continue - - info = tarfile.TarInfo(member.name) - file_stat = os.stat(path) - info.mtime = member.mtime - info.size = file_stat.st_size - info.mode = int(oct(file_stat.st_mode)[-3:], 8) - - # rewrite the path if necessary, to match the sdist distribution name - if dist_name != meson_dist_name: - info.name = pathlib.Path( - dist_name, - path.relative_to(self._source_dir) - ).as_posix() - - with path.open('rb') as f: - tar.addfile(info, fileobj=f) - # add PKG-INFO to dist file to make it a sdist pkginfo_info = tarfile.TarInfo(f'{dist_name}/PKG-INFO') pkginfo_info.mtime = time.time() # type: ignore[assignment] diff --git a/tests/test_sdist.py b/tests/test_sdist.py index 6e3376179..80141cae7 100644 --- a/tests/test_sdist.py +++ b/tests/test_sdist.py @@ -3,6 +3,7 @@ # SPDX-License-Identifier: MIT import os +import pathlib import stat import sys import tarfile @@ -117,37 +118,35 @@ def test_contents_subdirs(sdist_subdirs): def test_contents_unstaged(package_pure, tmp_path): - new_data = textwrap.dedent(''' - def bar(): + new = textwrap.dedent(''' + def bar(): return 'foo' ''').strip() - with open('pure.py', 'r') as f: - old_data = f.read() - - try: - with in_git_repo_context(): - with open('pure.py', 'w') as f, open('crap', 'x'): - f.write(new_data) + old = pathlib.Path('pure.py').read_text() + with in_git_repo_context(): + try: + pathlib.Path('pure.py').write_text(new) + pathlib.Path('other.py').touch() sdist_path = mesonpy.build_sdist(os.fspath(tmp_path)) - finally: - with open('pure.py', 'w') as f: - f.write(old_data) - os.unlink('crap') + finally: + pathlib.Path('pure.py').write_text(old) + pathlib.Path('other.py').unlink() with tarfile.open(tmp_path / sdist_path, 'r:gz') as sdist: names = {member.name for member in sdist.getmembers()} mtimes = {member.mtime for member in sdist.getmembers()} - read_data = sdist.extractfile('pure-1.0.0/pure.py').read().replace(b'\r\n', b'\n') + data = sdist.extractfile('pure-1.0.0/pure.py').read().replace(b'\r\n', b'\n') + # Verify that uncommitted changes are not included in the sdist. assert names == { 'pure-1.0.0/PKG-INFO', 'pure-1.0.0/meson.build', 'pure-1.0.0/pure.py', 'pure-1.0.0/pyproject.toml', } - assert read_data == new_data.encode() + assert data == old.encode() # All the archive members have a valid mtime. assert 0 not in mtimes