You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.8 KiB
63 lines
1.8 KiB
"""Stuff that differs in different Python versions and platform |
|
distributions.""" |
|
|
|
import logging |
|
import os |
|
import sys |
|
|
|
__all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"] |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
def has_tls() -> bool: |
|
try: |
|
import _ssl # noqa: F401 # ignore unused |
|
|
|
return True |
|
except ImportError: |
|
pass |
|
|
|
from pip._vendor.urllib3.util import IS_PYOPENSSL |
|
|
|
return IS_PYOPENSSL |
|
|
|
|
|
def get_path_uid(path: str) -> int: |
|
""" |
|
Return path's uid. |
|
|
|
Does not follow symlinks: |
|
https://github.com/pypa/pip/pull/935#discussion_r5307003 |
|
|
|
Placed this function in compat due to differences on AIX and |
|
Jython, that should eventually go away. |
|
|
|
:raises OSError: When path is a symlink or can't be read. |
|
""" |
|
if hasattr(os, "O_NOFOLLOW"): |
|
fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) |
|
file_uid = os.fstat(fd).st_uid |
|
os.close(fd) |
|
else: # AIX and Jython |
|
# WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW |
|
if not os.path.islink(path): |
|
# older versions of Jython don't have `os.fstat` |
|
file_uid = os.stat(path).st_uid |
|
else: |
|
# raise OSError for parity with os.O_NOFOLLOW above |
|
raise OSError(f"{path} is a symlink; Will not return uid for symlinks") |
|
return file_uid |
|
|
|
|
|
# packages in the stdlib that may have installation metadata, but should not be |
|
# considered 'installed'. this theoretically could be determined based on |
|
# dist.location (py27:`sysconfig.get_paths()['stdlib']`, |
|
# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may |
|
# make this ineffective, so hard-coding |
|
stdlib_pkgs = {"python", "wsgiref", "argparse"} |
|
|
|
|
|
# windows detection, covers cpython and ironpython |
|
WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt")
|
|
|