From ca8a16c2ac2e4907377543b7cc15fa053b46defc Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Thu, 29 Oct 2020 12:03:40 +0800 Subject: [PATCH] Skip venv dir when searching for metadata --- news/4480.bugfix.rst | 1 + .../vendor/requirementslib/models/setup_info.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 news/4480.bugfix.rst diff --git a/news/4480.bugfix.rst b/news/4480.bugfix.rst new file mode 100644 index 00000000..78896328 --- /dev/null +++ b/news/4480.bugfix.rst @@ -0,0 +1 @@ +Fix a bug that dist-info inside ``venv`` directory will be mistaken as the editable package's metadata. diff --git a/pipenv/vendor/requirementslib/models/setup_info.py b/pipenv/vendor/requirementslib/models/setup_info.py index 4a5fe771..324a714b 100644 --- a/pipenv/vendor/requirementslib/models/setup_info.py +++ b/pipenv/vendor/requirementslib/models/setup_info.py @@ -465,6 +465,18 @@ class ScandirCloser(object): pass +def _is_venv_dir(path): + # type: (AnyStr) -> bool + if os.name == "nt": + return os.path.isfile(os.path.join(path, "Scripts/python.exe")) or os.path.isfile( + os.path.join(path, "Scripts/activate") + ) + else: + return os.path.isfile(os.path.join(path, "bin/python")) or os.path.isfile( + os.path.join(path, "bin/activate") + ) + + def iter_metadata(path, pkg_name=None, metadata_type="egg-info"): # type: (AnyStr, Optional[AnyStr], AnyStr) -> Generator if pkg_name is not None: @@ -472,6 +484,9 @@ def iter_metadata(path, pkg_name=None, metadata_type="egg-info"): dirs_to_search = [path] while dirs_to_search: p = dirs_to_search.pop(0) + # Skip when the directory is like a venv + if _is_venv_dir(p): + continue with contextlib.closing(ScandirCloser(p)) as path_iterator: for entry in path_iterator: if entry.is_dir():