U ja(@sddZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z ddlmZmZmZmZmZmZmZmZddlmZddlmZdd lmZdd lmZdd l m!Z!dd l"m#Z#m$Z$m%Z%dd l&m'Z'ddl(m)Z)ddl*m+Z+m,Z,erddl-m.Z.e/e0Z1GdddZ2ej3ee4dddZ5GdddZ6Gddde6Z7dS)z;Build Environment used for isolation during sdist building N) OrderedDict) get_paths) TracebackType) TYPE_CHECKINGIterableIteratorListOptionalSetTupleType)where) Requirement)Version)__file__) open_spinner) get_platlibget_prefixed_libs get_purelib)get_environment)call_subprocess) TempDirectory tempdir_kinds) PackageFinderc@seZdZddZdS)_PrefixcCs@||_d|_ttjdkrdnd||ddd|_t||_dS)NFnt posix_prefix)baseplatbase)varsscripts)pathsetuprosnamebin_dirrlib_dirs)selfr!r(o/private/var/folders/k6/_7fsz4ts3b78x3b3xwrxjh_c8s8xv7/T/pip-unpacked-wheel-bug3gbve/pip/_internal/build_env.py__init__#sz_Prefix.__init__N)__name__ __module__ __qualname__r*r(r(r(r)r!sr)returnc csttj}|s&t|VdStdd}tj |j d}i}t j dkrXd|d<t j|df|.}|d D]}||||jqtW5QRXtj |d VW5QRXdS) zCreate a "standalone pip" zip file. The zip file's content is identical to the currently-running pip. It will be used to install requirements into the build environment. Nzstandalone-pip)kindz__env_pip__.zip)Fstrict_timestampsw*pip)pathlibPath pip_locationresolveparentis_dirstrrr#r!joinsys version_infozipfileZipFilerglobwrite relative_toas_posix)sourceZtmp_dirZpip_zipkwargszfchildr(r(r)_create_standalone_pip.s   $rJc@sXeZdZdZddZddZddZdd Zd d Ze e d e e e e d dddZ d S)BuildEnvironmentzFCreates and manages an isolated environment to install build deps c sttjddtfdddD|_g|_g|_tt|j D] }|j |j |j |j qDddttfD}tjjd|_tj|jst|jttj|jd d "}|td j||jd W5QRXdS) NT)r/globally_managedc3s&|]}|ttjj|fVqdSN)rr#r!r=.0r$temp_dirr(r) Rsz,BuildEnvironment.__init__..)normaloverlaycSsh|]}tj|qSr()r#r!normcase)rOsiter(r(r) `sz,BuildEnvironment.__init__..rVzsitecustomize.pyr3a import os, site, sys # First, drop system-sites related paths. original_sys_path = sys.path[:] known_paths = set() for path in {system_sites!r}: site.addsitedir(path, known_paths=known_paths) system_paths = set( os.path.normcase(path) for path in sys.path[len(original_sys_path):] ) original_sys_path = [ path for path in original_sys_path if os.path.normcase(path) not in system_paths ] sys.path = original_sys_path # Second, add lib directories. # ensuring .pth file are processed. for path in {lib_dirs!r}: assert not path in sys.path site.addsitedir(path) ) system_sitesr&)rr BUILD_ENVr _prefixes _bin_dirs _lib_dirsreversedlistvaluesappendr%extendr&rrr#r!r= _site_direxistsmkdiropenrCtextwrapdedentformat)r'prefixrXfpr(rPr)r*Ls2    zBuildEnvironment.__init__cCsndddD|_|jdd}|jd}|r>||tj|jg}tjtj |dtj |ddS)NcSsi|]}|tj|dqSrM)r#environgetrNr(r(r) sz.BuildEnvironment.__enter__..)PATHPYTHONNOUSERSITE PYTHONPATHrn1) _save_envr[rasplitr#pathseprbrkupdater=)r'r!old_path pythonpathr(r(r) __enter__s   zBuildEnvironment.__enter__cCs:|jD]*\}}|dkr*tj|dq |tj|<q dSrM)rritemsr#rkpop)r'exc_typeexc_valexc_tbvarname old_valuer(r(r)__exit__szBuildEnvironment.__exit__c Cst}t}|rt|j}|D]t}t|}||j}|sF||qt|jt rf|jd|j}n|jd|j}|j|j kr|||fq||fS)zReturn 2 sets: - conflicting requirements: set of (installed, wanted) reqs tuples - missing requirements: set of reqs z==z===) setrr\rget_distributionr$add isinstanceversionr specifier) r'reqsmissing conflictingenvZreq_strreqdistZinstalled_req_strr(r(r)check_requirementss      z#BuildEnvironment.check_requirementsc Csp|j|}|jrtd|_|s"dSt<}tjdkrDtj t }n | t }| |||||W5QRXdS)NT)r0)rZr"AssertionError contextlib ExitStackr>r?r#r!dirnamer8 enter_contextrJ_install_requirements)r'finder requirementsprefix_as_stringmessagerictx pip_runnabler(r(r)install_requirementss      z%BuildEnvironment.install_requirementsrN)rrrrirr.c CsRtj|dddd|jdg}ttjkr0|ddD]:}t|j |}| d| d d d t |pdd hfq4|j}|r| d |dg|ddD]} | d| gqn |d|jD]} | d| gq|jD]} | d| gq|jr|d|jr|d|d| |dti} t|} t|| | dW5QRXdS)Ninstallz--ignore-installedz --no-userz--prefixz--no-warn-script-locationz-v) no_binary only_binaryz--_-,z:none:z-irz--extra-index-urlz --no-indexz --find-linksz--trusted-hostz--prez--prefer-binaryZ_PIP_STANDALONE_CERT)spinner extra_environ)r> executabler!loggergetEffectiveLevelloggingDEBUGr`getattrformat_controlrareplacer=sorted index_urls find_links trusted_hostsallow_all_prereleases prefer_binaryr rr)rrrrirargsrformatsr extra_indexlinkhostrrr(r(r)rsF            z&BuildEnvironment._install_requirements)r+r,r-__doc__r*rxrrr staticmethodr<rrrr(r(r(r)rKHs6 rKc@s8eZdZdZddZddZddZdd Zd d Zd S) NoOpBuildEnvironmentz5A no-op drop-in replacement for BuildEnvironment cCsdSrMr(r'r(r(r)r* szNoOpBuildEnvironment.__init__cCsdSrMr(rr(r(r)rx szNoOpBuildEnvironment.__enter__cCsdSrMr()r'r{r|r}r(r(r)rszNoOpBuildEnvironment.__exit__cCsdSrMr(rr(r(r)cleanupszNoOpBuildEnvironment.cleanupcCs tdSrM)NotImplementedError)r'rrrrr(r(r)rsz)NoOpBuildEnvironment.install_requirementsN) r+r,r-rr*rxrrrr(r(r(r)rs  r)8rrrr#r6r>rfr@ collectionsr sysconfigrtypesrtypingrrrrr r r r pip._vendor.certifir Z"pip._vendor.packaging.requirementsrpip._vendor.packaging.versionrr5rr8pip._internal.cli.spinnersrpip._internal.locationsrrrZpip._internal.metadatarpip._internal.utils.subprocessrpip._internal.utils.temp_dirrr"pip._internal.index.package_finderr getLoggerr+rrcontextmanagerr<rJrKrr(r(r(r)s:   (          >