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
16 changes: 9 additions & 7 deletions src/pip/_internal/download.py
Original file line number Diff line number Diff line change
Expand Up @@ -936,18 +936,20 @@ def unpack_file_url(
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,
# Pulling in those directories can potentially
# be very slow.
# see discussion at:
# https://github.com/pypa/pip/pull/6770
# https://github.com/pypa/pip/issues/2195
# https://github.com/pypa/pip/pull/2196
ignore=shutil.ignore_patterns('.tox', '.nox'))
ignore=ignore)

if download_dir:
logger.info('Link is a directory, ignoring download_dir')
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