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
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.
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)
shutil.copytree(link_path,
location,
symlinks=True,
ignore=ignore)

if download_dir:
logger.info('Link is a directory, ignoring download_dir')
return
Expand Down
46 changes: 45 additions & 1 deletion tests/unit/test_download.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from pip._internal.exceptions import HashMismatch
from pip._internal.models.link import Link
from pip._internal.utils.hashes import Hashes
from pip._internal.utils.misc import path_to_url
from pip._internal.utils.misc import ensure_dir, path_to_url
from tests.lib import create_file


Expand Down 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
ensure_dir(src_excluded_dir)
ensure_dir(src_included_dir)
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