Skip to content
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

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

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.
omry marked this conversation as resolved.
Show resolved Hide resolved
# see discussion at:
omry marked this conversation as resolved.
Show resolved Hide resolved
# https://github.com/pypa/pip/pull/6770
return ['.tox', '.nox'] if d == link_path else []
omry marked this conversation as resolved.
Show resolved Hide resolved

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):
omry marked this conversation as resolved.
Show resolved Hide resolved

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

src_dir = mkdtemp()
omry marked this conversation as resolved.
Show resolved Hide resolved
src_included_file = os.path.join(src_dir, 'file.txt')
omry marked this conversation as resolved.
Show resolved Hide resolved
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)
omry marked this conversation as resolved.
Show resolved Hide resolved
os.makedirs(src_included_dir, exist_ok=True)
touch(src_included_file)
omry marked this conversation as resolved.
Show resolved Hide resolved
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