Skip to content

Commit

Permalink
Vendor pip 23.3.1
Browse files Browse the repository at this point in the history
  • Loading branch information
matteius committed Oct 22, 2023
1 parent 565bc44 commit ebc3883
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 7 deletions.
2 changes: 1 addition & 1 deletion pipenv/patched/patched.txt
@@ -1,2 +1,2 @@
pip==23.3
pip==23.3.1
safety==2.3.2
2 changes: 1 addition & 1 deletion pipenv/patched/pip/__init__.py
@@ -1,6 +1,6 @@
from typing import List, Optional

__version__ = "23.3"
__version__ = "23.3.1"


def main(args: Optional[List[str]] = None) -> int:
Expand Down
28 changes: 24 additions & 4 deletions pipenv/patched/pip/_internal/network/cache.py
Expand Up @@ -33,6 +33,18 @@ class SafeFileCache(SeparateBodyBaseCache):
"""
A file based cache which is safe to use even when the target directory may
not be accessible or writable.
There is a race condition when two processes try to write and/or read the
same entry at the same time, since each entry consists of two separate
files (https://github.com/psf/cachecontrol/issues/324). We therefore have
additional logic that makes sure that both files to be present before
returning an entry; this fixes the read side of the race condition.
For the write side, we assume that the server will only ever return the
same data for the same URL, which ought to be the case for files pip is
downloading. PyPI does not have a mechanism to swap out a wheel for
another wheel, for example. If this assumption is not true, the
CacheControl issue will need to be fixed.
"""

def __init__(self, directory: str) -> None:
Expand All @@ -49,9 +61,13 @@ def _get_cache_path(self, name: str) -> str:
return os.path.join(self.directory, *parts)

def get(self, key: str) -> Optional[bytes]:
path = self._get_cache_path(key)
# The cache entry is only valid if both metadata and body exist.
metadata_path = self._get_cache_path(key)
body_path = metadata_path + ".body"
if not (os.path.exists(metadata_path) and os.path.exists(body_path)):
return None
with suppressed_cache_errors():
with open(path, "rb") as f:
with open(metadata_path, "rb") as f:
return f.read()

def _write(self, path: str, data: bytes) -> None:
Expand All @@ -77,9 +93,13 @@ def delete(self, key: str) -> None:
os.remove(path + ".body")

def get_body(self, key: str) -> Optional[BinaryIO]:
path = self._get_cache_path(key) + ".body"
# The cache entry is only valid if both metadata and body exist.
metadata_path = self._get_cache_path(key)
body_path = metadata_path + ".body"
if not (os.path.exists(metadata_path) and os.path.exists(body_path)):
return None
with suppressed_cache_errors():
return open(path, "rb")
return open(body_path, "rb")

def set_body(self, key: str, body: bytes) -> None:
path = self._get_cache_path(key) + ".body"
Expand Down
11 changes: 10 additions & 1 deletion pipenv/patched/pip/_internal/self_outdated_check.py
Expand Up @@ -39,6 +39,15 @@ def _get_statefile_name(key: str) -> str:
return name


def _convert_date(isodate: str) -> datetime.datetime:
"""Convert an ISO format string to a date.
Handles the format 2020-01-22T14:24:01Z (trailing Z)
which is not supported by older versions of fromisoformat.
"""
return datetime.datetime.fromisoformat(isodate.replace("Z", "+00:00"))


class SelfCheckState:
def __init__(self, cache_dir: str) -> None:
self._state: Dict[str, Any] = {}
Expand Down Expand Up @@ -73,7 +82,7 @@ def get(self, current_time: datetime.datetime) -> Optional[str]:
return None

# Determine if we need to refresh the state
last_check = datetime.datetime.fromisoformat(self._state["last_check"])
last_check = _convert_date(self._state["last_check"])
time_since_last_check = current_time - last_check
if time_since_last_check > _WEEK:
return None
Expand Down

0 comments on commit ebc3883

Please sign in to comment.