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.
		
		
		
		
		
			
		
			
				
					64 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					64 lines
				
				1.8 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"""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")
							 |