Skip to content

exclude '.tox', '.nox' from being copied during 'pip install .' #6770

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Aug 5, 2019
1 change: 1 addition & 0 deletions news/6770.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Skip copying .tox and .nox directories to temporary build directories
15 changes: 13 additions & 2 deletions src/pip/_internal/download.py
Original file line number Diff line number Diff line change
Expand Up @@ -934,12 +934,23 @@ def unpack_file_url(
of the link file inside download_dir.
"""
link_path = url_to_path(link.url_without_fragment)

# If it's a url to a local directory
if is_dir_url(link):

def ignore(d, names):
# Pulling in those directories can potentially
# be very slow.
# see discussion at:
# https://github.com/pypa/pip/pull/6770
return ['.tox', '.nox'] if d == link_path else []

if os.path.isdir(location):
rmtree(location)
shutil.copytree(link_path, location, symlinks=True)
shutil.copytree(link_path,
location,
symlinks=True,
ignore=ignore)

if download_dir:
logger.info('Link is a directory, ignoring download_dir')
return
Expand Down
44 changes: 44 additions & 0 deletions tests/unit/test_download.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,50 @@ def test_unpack_file_url_thats_a_dir(self, tmpdir, data):
assert os.path.isdir(os.path.join(self.build_dir, 'fspkg'))


@pytest.mark.parametrize('exclude_dir', [
'.nox',
'.tox'
])
def test_unpack_file_url_with_excluded_dirs(exclude_dir):

def touch(path):
with open(path, 'a'):
os.utime(path, None)

src_dir = mkdtemp()
src_included_file = os.path.join(src_dir, 'file.txt')
src_excluded_dir = os.path.join(src_dir, exclude_dir)
src_excluded_file = os.path.join(src_dir, exclude_dir, 'file.txt')
src_included_dir = os.path.join(src_dir, 'subdir', exclude_dir)

# set up source directory
os.makedirs(src_excluded_dir, exist_ok=True)
os.makedirs(src_included_dir, exist_ok=True)
touch(src_included_file)
touch(src_excluded_file)

dst_dir = mkdtemp()
dst_included_file = os.path.join(dst_dir, 'file.txt')
dst_excluded_dir = os.path.join(dst_dir, exclude_dir)
dst_excluded_file = os.path.join(dst_dir, exclude_dir, 'file.txt')
dst_included_dir = os.path.join(dst_dir, 'subdir', exclude_dir)

try:
src_link = Link(path_to_url(src_dir))
unpack_file_url(
src_link,
dst_dir,
download_dir=None
)
assert not os.path.isdir(dst_excluded_dir)
assert not os.path.isfile(dst_excluded_file)
assert os.path.isfile(dst_included_file)
assert os.path.isdir(dst_included_dir)
finally:
rmtree(src_dir)
rmtree(dst_dir)


class TestSafeFileCache:
"""
The no_perms test are useless on Windows since SafeFileCache uses
Expand Down