3 ig&@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.ej/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@seZdZeddddZdS)_PrefixN)pathreturncCs@||_d|_ttjdkrdnd||ddd|_t||_dS)NFnt posix_prefix)baseplatbase)varsscripts)rsetuprosnamebin_dirrlib_dirs)selfrr)6/tmp/pip-build-88gy_88q/pip/pip/_internal/build_env.py__init__"s z_Prefix.__init__)__name__ __module__ __qualname__strr+r)r)r)r*r!sr)rccstjtjj}|js&t|VdStdd}tj j |j d}i}t j d krXd|d<t j|d f|2}x*|jd D]}|j||j|jjqvWWdQRXtj j |d VWdQRXdS) 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__.zipFZstrict_timestampsw*pip)r1r2)pathlibPath pip_locationresolveparentis_dirr/rr$rjoinsys version_infozipfileZipFileZrglobwriteZ relative_toZas_posix)sourceZtmp_dirZpip_zipkwargszfchildr)r)r*_create_standalone_pip,s   &rFc@seZdZdZddddZddddZeeeeeee ddd d Z e e e ee e e fee fd d d Zde e e e ddddZee de e ee ddddZdS)BuildEnvironmentzACreates and manages an isolated environment to install build depsN)rc sttjddtfdddD|_g|_g|_x6tt|jj D] }|jj |j |jj |j qFWddttfD}tjjjd |_tjj|jstj|jttjj|jd d "}|jtjd j||jd WdQRXdS)NT)r0Zglobally_managedc3s&|]}|ttjjj|fVqdS)N)rr$rr<).0r%)temp_dirr)r* Msz,BuildEnvironment.__init__..normaloverlaycSsh|]}tjj|qSr))r$rnormcase)rHsiter)r)r* Zsz,BuildEnvironment.__init__..rNzsitecustomize.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')rKrL)rrZ BUILD_ENVr _prefixes _bin_dirs _lib_dirsreversedlistvaluesappendr&extendr'rrr$rr< _site_direxistsmkdiropenrAtextwrapdedentformat)r(prefixrPfpr))rIr*r+Is&   zBuildEnvironment.__init__cCsndddD|_|jdd}|jd}|r>|j|jtj|jg}tjjtjj |dtjj |ddS) NcSsi|]}tjj|d|qS)N)r$environget)rHr%r)r)r* sz.BuildEnvironment.__enter__..PATHPYTHONNOUSERSITE PYTHONPATH1)rerfrg)rerfrg) _save_envrRrXsplitr$pathseprYrbupdater<)r(rZold_pathZ pythonpathr)r)r* __enter__~s   zBuildEnvironment.__enter__)exc_typeexc_valexc_tbrcCs>x8|jjD]*\}}|dkr,tjj|dq |tj|<q WdS)N)riitemsr$rbpop)r(rnrorpZvarname old_valuer)r)r*__exit__szBuildEnvironment.__exit__)reqsrc Cst}t}|rt|j}x||D]t}t|}|j|j}|sH|j|q t|jt rh|jd|j}n|jd|j}|j|j kr |j||fq W||fS)zReturn 2 sets: - conflicting requirements: set of (installed, wanted) reqs tuples - missing requirements: set of reqs z==z===) setrrSrget_distributionr%add isinstanceversionr specifier) r(rumissingZ conflictingenvZreq_strreqdistZinstalled_req_strr)r)r*check_requirementss       z#BuildEnvironment.check_requirementsr)finder requirementsprefix_as_stringmessagerc Csr|j|}|j std|_|s$dStj<}tjdkrFtjj t }n |j t }|j |||||WdQRXdS)NTr1)r1r)rQr#AssertionError contextlib ExitStackr=r>r$rdirnamer8 enter_contextrF_install_requirements)r(rrrrr`ctx pip_runnabler)r)r*install_requirementss     z%BuildEnvironment.install_requirements)rrrr`rrc Csdtj|dddd|jdg}tjtjkr0|jdxBdD]:}t|j |}|j d |j d d d j t |pfd hfq6W|j}|r|j d|dgx.|ddD]} |j d| gqWn |jdx|jD]} |j d| gqWx|jD]} |j d| gqW|jr|jd|jr |jd|jd |j |dti} t|} t|| | dWdQRXdS)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)rr)r= executablerloggergetEffectiveLevelloggingDEBUGrWgetattrformat_controlrXreplacer<sorted index_urls find_links trusted_hostsallow_all_prereleasesZ prefer_binaryr rr)rrrr`rargsrformatsrZ extra_indexlinkhostrrr)r)r*rsD             z&BuildEnvironment._install_requirements)r,r-r.__doc__r+rmr r BaseExceptionrrtrr/r r rr staticmethodrrr)r)r)r*rGFs*5 &rGc@sxeZdZdZddddZddddZeeeeeee ddd d Z ddd d Z d e e e e ddddZdS)NoOpBuildEnvironmentz0A no-op drop-in replacement for BuildEnvironmentN)rcCsdS)Nr))r(r)r)r*r+ szNoOpBuildEnvironment.__init__cCsdS)Nr))r(r)r)r*rmszNoOpBuildEnvironment.__enter__)rnrorprcCsdS)Nr))r(rnrorpr)r)r*rtszNoOpBuildEnvironment.__exit__cCsdS)Nr))r(r)r)r*cleanupszNoOpBuildEnvironment.cleanupr)rrrrrcCs tdS)N)NotImplementedError)r(rrrrr)r)r*rsz)NoOpBuildEnvironment.install_requirements)r,r-r.rr+rmr r rrrtrrr/rr)r)r)r*r s r)8rrrr$r6r=r]r? collectionsr sysconfigrtypesrZtypingrrrrr r r r pip._vendor.certifir Z"pip._vendor.packaging.requirementsrZpip._vendor.packaging.versionrr5rr8Zpip._internal.cli.spinnersrZpip._internal.locationsrrrZpip._internal.metadatarZpip._internal.utils.subprocessrZpip._internal.utils.temp_dirrrZ"pip._internal.index.package_finderr getLoggerr,rrcontextmanagerr/rFrGrr)r)r)r*s:   (          E