abc @@s dZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZddlmZddlmZddlZddlmZddlmZmZdd lmZmZm Z dd l!m"Z"m#Z#dd lm$Z$dd l%m&Z&m'Z'm(Z(m)Z)m*Z*dd l+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2ddl3m4Z4ddl5m6Z6ddl7m8Z8dZ9ddfZ:ej;e<Z=de>fdYZ?dZ@dZAddd>dZBdZCdZDe jEde jFZGd ZHd!ZIeJeKeKeLeKeJeKeKd"ZMd#ZNeNd$ZOd%ZPd&ZQd'e>fd(YZRd)e>fd*YZSdS(+sH Support for installing and building the "wheel" binary package format. i(tabsolute_importN(turlsafe_b64encode(tParser(tStringIO(t expanduser(t path_to_urlt unpack_url(tInstallationErrortInvalidWheelFilenametUnsupportedWheel(tdistutils_schemetPIP_DELETE_MARKER_FILENAME(t pep425tags(tcall_subprocesst ensure_dirtcaptured_stdouttrmtreet read_chunks(t open_spinner(t indent_log(tSETUPTOOLS_SHIM(t ScriptMaker(t pkg_resources(tcanonicalize_name(t configparsers.whlit WheelCachecB@s eZdZdZdZRS(s&A cache of wheels for future installs.cC@s(|rt|nd|_||_dS(sCreate a wheel cache. :param cache_dir: The root of the cache. :param format_control: A pip.index.FormatControl object to limit binaries being read from the cache. N(RtNonet _cache_dirt_format_control(tselft cache_dirtformat_control((s-/usr/lib/python2.7/site-packages/pip/wheel.pyt__init__8scC@st|j||j|S(N(t cached_wheelRR(Rtlinkt package_name((s-/usr/lib/python2.7/site-packages/pip/wheel.pyR!Bs(t__name__t __module__t__doc__R R!(((s-/usr/lib/python2.7/site-packages/pip/wheel.pyR5s cC@s|jg}|jdk rO|jdk rO|jdj|j|jgndj|}tj|jj }|d |dd!|dd!|dg}t j j|d|S(s Return a directory to store cached wheels in for link. Because there are M wheels for any one sdist, we provide a directory to cache them in, and then consult that directory when looking up cache hits. We only insert things into the cache if they have plausible version numbers, so that we don't contaminate the cache with things that were not unique. E.g. ./package might have dozens of installs done for it and build a version of 0.0...and if we built and cached a wheel, we'd end up using the same wheel even if the source has been edited. :param cache_dir: The cache_dir being used by pip. :param link: The link of the sdist for which this will cache wheels. t=t#iiitwheelsN( turl_without_fragmentt hash_nameRthashtappendtjointhashlibtsha224tencodet hexdigesttostpath(RR"t key_partstkey_urlthashedtparts((s-/usr/lib/python2.7/site-packages/pip/wheel.pyt_cache_for_linkGs %(c C@ss|s |S|s|S|jr!|S|js.|S|s8|St|}tjj||}d|kri|St||}ytj|}Wn5t k r}|j t j t j fkr|SnXg} x`|D]X} yt | } Wntk rqnX| jsqn| j| j| fqW| s6|S| jtjj|| dd} tjjt| S(Ntbinaryii(tis_wheelt is_artifactRtpiptindextfmt_ctl_formatsR9R3tlistdirtOSErrorterrnotENOENTtENOTDIRtWheelRt supportedR-tsupport_index_mintsortR4R.tLinkR( RR"RR#tcanonical_nametformatstroott wheel_namestet candidatest wheel_nametwheelR4((s-/usr/lib/python2.7/site-packages/pip/wheel.pyR!psF        tsha256icC@stj|}d}t|dA}x7t|d|D]#}|t|7}|j|q:WWdQXdt|jjdj d}||fS(s6Return (hash, length) for path using hashlib.new(algo)itrbtsizeNssha256=tlatin1R'( R/tnewtopenRtlentupdateRtdigesttdecodetrstrip(R4talgot blocksizethtlengthtftblockRZ((s-/usr/lib/python2.7/site-packages/pip/wheel.pytrehashscC@sItjddkr"i}d}nidd6}d}t||||S(Niitbttnewline(tsyst version_infoRW(tnametmodetnltbin((s-/usr/lib/python2.7/site-packages/pip/wheel.pyt open_for_csvs   cC@stjj|rt|dd}|j}|jdsCtStjj tj }d|tj j d}|j }WdQXt|d!}|j ||j |WdQXtSdS(sLReplace #!python with #!/path/to/python Return True if file was changed.RSs#!pythons#!tasciiNtwb(R3R4tisfileRWtreadlinet startswithtFalseRgt executableR1tgetfilesystemencodingtlineseptreadtwritetTrue(R4tscriptt firstlinetexenametrest((s-/usr/lib/python2.7/site-packages/pip/wheel.pyt fix_scripts  sZ^(?P(?P.+?)(-(?P\d.+?))?) \.dist-info$cC@s|jdd}xtj|D]}tj|}|r"|jd|kr"ttjj||d:}x0|D](}|j j }|dkrzt SqzWWdQXq"q"Wt S(sP Return True if the extracted wheel in wheeldir should go into purelib. t-t_RitWHEELsroot-is-purelib: trueN( treplaceR3R@t dist_info_retmatchtgroupRWR4R.tlowerR\RyRs(Ritwheeldirt name_foldedtitemRRQtline((s-/usr/lib/python2.7/site-packages/pip/wheel.pytroot_is_purelibs!  cC@stjj|siifSt|N}t}x.|D]&}|j|j|jdq;W|jdWdQXtj }d|_ |j |i}i}|j drt |jd}n|j drt |jd}n||fS(Ns icS@s|S(N((toption((s-/usr/lib/python2.7/site-packages/pip/wheel.pytRetconsole_scriptst gui_scripts(R3R4texistsRWRRxtstriptseekRtRawConfigParsert optionxformtreadfpt has_sectiontdicttitems(tfilenametfptdataRtcptconsoletgui((s-/usr/lib/python2.7/site-packages/pip/wheel.pytget_entrypointss$      c ,@s+|s3t|d|d|d|d|d| }nt| rO|dn |dgg jtjjtjj} itg} |rt@} tj +tj dt j | d t d t Wd QXWd QXtj| jnd t fd  d d  fd}|| t sktd tjjdd}t|\fd}xD]}d }d }xtjtjj |D]e}d }|dkrt}|}ntjj ||} ||}|| |td|d|qWqWtd |dt _td0_t _ fd}|_d_jdd }|rdtjkrd|}| j j!|ntjj"dddkr:dt#j$d |f}| j j!|ndt#j$d |f}| j j!|gD]}t%j&d |rn|^qn}x|D] }|=qWnjd!d }|rjdtjkrd"|}| j j!|nd#t#j$d |f}| j j!|gD]}t%j&d$|r+|^q+}x|D] }|=qVWnt'dkr| j j(gj)D]}d%|^qnt'dkr| j j(gj)D]}d%|^qit d&6ntjjdd'}tjjdd(}t*|d)} | j+d*Wd QXt,j-||| j.|tjjdd+}!tjjdd,}"t/|!d-\}#t/|"d.D}$t0j1|#}%t0j2|$}&xj|%D]b}'j|'d|'d|'d<|'dkrHt3|'d\|'d<|'d/j|ndS(s6Map archive RECORD paths to installation RECORD paths.N(tadd(tsrcfiletdestfiletmodifiedtoldpathtnewpath(tchangedt installedtlib_dirRR(s-/usr/lib/python2.7/site-packages/pip/wheel.pytrecord_installeds  c@st|xztj|D]i\}}}|t|jtjj}tjj||} |r|jtjjddj drqnx|D]} tjj||| } |r|dkr| j drj | qq|r| j drt | j t j r sBtd| ddjj | qqWx*|D]"} |r{|| r{q]ntjj|| } tjj||| }t| tj| |tj| }ttdrtj||j|jfntj| tjrTtj| }|jtjBtjBtjB}tj||nt}|ro||}n| ||q]WqWdS( Niis.dataRes .dist-infos!Multiple .dist-info directories: s, tutime(RR3twalkRXtlstripR4RR.tsplittendswithR-RRrRitAssertionErrortshutiltcopyfiletstatthasattrRtst_atimetst_mtimetaccesstX_OKtst_modetS_IXUSRtS_IXGRPtS_IXOTHtchmodRs(tsourcetdesttis_basetfixertfiltertdirtsubdirstfilestbasedirtdestdirtst destsubdirRaRRtstt permissionsR(t data_dirstinfo_dirRtreq(s-/usr/lib/python2.7/site-packages/pip/wheel.pytclobbersJ + !      s!%s .dist-info directory not foundisentry_points.txtc@s|jjdr"|d }nJ|jjdrD|d }n(|jjdrf|d }n|}|kp|kS(Ns.exeis -script.pyis.pya(RR(Rit matchname(RR(s-/usr/lib/python2.7/site-packages/pip/wheel.pytis_entrypoint_wrapperas   tscriptsRRRec@s^|jdkr(td|fnji|jd6|jjddd6|jd6S(NsInvalid script entry point: %s for req: %s - A callable suffix is required. Cf https://packaging.python.org/en/latest/distributing.html#console-scripts for more information.tmodulet.it import_nametfunc(tsuffixRRtscript_templateRR(tentry(tmakerR(s-/usr/lib/python2.7/site-packages/pip/wheel.pyt_get_script_texts  s# -*- coding: utf-8 -*- import re import sys from %(module)s import %(import_name)s if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit(%(func)s()) R=tENSUREPIP_OPTIONSspip = t altinstalls pip%s = %siispip(\d(\.\d)?)?$t easy_installseasy_install = seasy_install-%s = %sseasy_install(-\d\.\d)?$s%s = %sRt INSTALLERs INSTALLER.pipRospip tRECORDs RECORD.piptrsw+i(Re(7R RR\R3R4RtsetRtwarningstcatch_warningstfilterwarningst compileallt compile_dirRytloggertdebugtgetvalueRsRRR.RR@R~RRtvariantstset_modeRRtpoptenvirontextendtmaketgetRgtversiontreRRXt make_multipleRRWRxRtmoveR-RmtcsvtreadertwriterRctwriterowRrR(,RiRRRRRLt pycompiletschemeRRtstrip_file_prefixRt generatedtstdoutRtep_fileRtdatadirRRtsubdirRRt pip_scripttspectktpip_epteasy_install_scriptteasy_install_eptkvt installerttemp_installertinstaller_filetrecordt temp_recordt record_int record_outRRtrowRaR_tlt final_path(( RRRRRRRRRRRRs-/usr/lib/python2.7/site-packages/pip/wheel.pytmove_wheel_filess       % ; %   $   # +  + 0   !  *c@s"tjfd}|S(Nc?@sHt}x8||D]'}||kr|j||VqqWdS(N(RR(targstkwtseenR(tfn(s-/usr/lib/python2.7/site-packages/pip/wheel.pytuniques    (t functoolstwraps(R%R&((R%s-/usr/lib/python2.7/site-packages/pip/wheel.pyt_uniquescc@sddlm}tj||jd}x|D]y}tjj|j|d}|V|j dr5tjj |\}}|d }tjj||d}|Vq5q5WdS(s Yield all the uninstallation paths for dist based on RECORD-without-.pyc Yield paths to all the files in RECORD. For each .py file in RECORD, add the .pyc in the same directory. UninstallPathSet.add() takes care of the __pycache__ .pyc. i(tFakeFileRs.pyis.pycN( t pip.utilsR*RRtget_metadata_linesR3R4R.tlocationRR(tdistR*RRR4tdnR%tbase((s-/usr/lib/python2.7/site-packages/pip/wheel.pytuninstallation_paths"s   cC@sygtjd|D] }|^qd}|jd}tj|}|dj}ttt |j d}|SWnt SXdS(s Return the Wheel-Version of an extracted wheel, if possible. Otherwise, return False if we couldn't parse / extract it. iRs Wheel-VersionRN( Rt find_on_pathRt get_metadataRtparsestrRttupletmaptintRRs(t source_dirtdR.t wheel_dataR((s-/usr/lib/python2.7/site-packages/pip/wheel.pyt wheel_version8s)cC@s|std|n|dtdkrXtd|djtt|fn1|tkrtjddjtt|ndS(s Raises errors or warns if called with an incompatible Wheel-Version. Pip should refuse to install a Wheel-Version that's a major series ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when installing a version only minor version ahead (e.g 1.2 > 1.1). version: a 2-tuple representing a Wheel-Version (Major, Minor) name: name of wheel or package to raise exception about :raises UnsupportedWheel: when an incompatible Wheel-Version is given s(%s is in an unsupported or invalid wheelisB%s's Wheel-Version (%s) is not compatible with this version of pipRs*Installing from a newer Wheel-Version (%s)N(R tVERSION_COMPATIBLER.R6tstrRtwarning(RRi((s-/usr/lib/python2.7/site-packages/pip/wheel.pytcheck_compatibilityKs % REcB@sDeZdZejdejZdZddZ ddZ RS(s A wheel files^(?P(?P.+?)-(?P\d.*?)) ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) \.whl|\.dist-info)$c@sjj|}|s+td|n|_|jdjdd_|jdjdd_|jdjd_ |jdjd_ |jd jd_ t fd j D_ d S( sX :raises InvalidWheelFilename: when the filename is invalid for a wheel s!%s is not a valid wheel filename.RiRRtvertpyverRtabitplatc3@s>|]4}jD]$}jD]}|||fVqqqdS(N(tabistplats(t.0txtytz(R(s-/usr/lib/python2.7/site-packages/pip/wheel.pys sN(t wheel_file_reRRRRRRiRRt pyversionsRDRERt file_tags(RRt wheel_info((Rs-/usr/lib/python2.7/site-packages/pip/wheel.pyR ts cC@s]|dkrtj}ng|jD]!}||kr"|j|^q"}|rYt|SdS(s" Return the lowest index that one of the wheel's file_tag combinations achieves in the supported_tags list e.g. if there are 8 supported tags, and one of the file tags is first in the list, then return 0. Returns None is the wheel is not supported. N(RR tsupported_tagsRLR>tmin(Rttagstctindexes((s-/usr/lib/python2.7/site-packages/pip/wheel.pyRGs  1cC@s4|dkrtj}ntt|j|jS(s'Is this wheel supported on this system?N(RR RNtboolRt intersectionRL(RRP((s-/usr/lib/python2.7/site-packages/pip/wheel.pyRFs  N( R$R%R&RtcompiletVERBOSERJR RRGRF(((s-/usr/lib/python2.7/site-packages/pip/wheel.pyREhs   t WheelBuildercB@sSeZdZdddZddZdZddZdZe dZ RS(s#Build wheels from a RequirementSet.cC@sO||_||_|jj|_|j|_|p6g|_|pEg|_dS(N( trequirement_settfindert _wheel_cacheRt _cache_roottwheel_download_dirt _wheel_dirt build_optionstglobal_options(RRXRYR^R_((s-/usr/lib/python2.7/site-packages/pip/wheel.pyR s    cC@stjd}z|j||d|ry_tj|d}tjj||}tjtjj|||t j d||SWqqXn|j |dSWdt |XdS(siBuild one wheel. :return: The filename of the built wheel, or None if the build failed. s pip-wheel-t python_tagisStored in directory: %sN(ttempfiletmkdtempt_WheelBuilder__build_oneR3R@R4R.RRRtinfot _clean_oneRR(RRt output_dirR`ttempdRPt wheel_path((s-/usr/lib/python2.7/site-packages/pip/wheel.pyt _build_ones cC@s'tjddt|jgt|jS(Ns-us-c(RgRtRtsetup_pytlistR_(RR((s-/usr/lib/python2.7/site-packages/pip/wheel.pyt_base_setup_argss  c C@s|j|}d|jf}t|}tjd||dd|g|j}|dk rw|d|g7}ny't|d|jdt d|t SWn(|j d tj d |jt SXWdQXdS( Ns#Running setup.py bdist_wheel for %ssDestination directory: %st bdist_wheels-ds --python-tagtcwdt show_stdouttspinnerterrorsFailed building wheel for %s( RlRiRRRR^RR t setup_py_dirRsRytfinishRq(RRRgR`t base_argst spin_messageRpt wheel_args((s-/usr/lib/python2.7/site-packages/pip/wheel.pyt __build_ones   cC@su|j|}tjd|j|ddg}y!t|d|jdttSWntjd|jtSXdS(NsRunning setup.py clean for %stcleans--allRnRos Failed cleaning build dir for %s( RlRRdRiR R8RsRyRq(RRRtt clean_args((s-/usr/lib/python2.7/site-packages/pip/wheel.pyResc C@s|js|r|jst|jj|j|jjj}g}x!|D]}|jreqPn|j r|sit j d|j qiqP|r|j rqP|r|jr|jj rqP|r|j rqP|r\|j}|j\}}tjj|d |d krqPndtjj|jjt|j kr\t j d|j qPq\n|j|qPW|swtSt j ddjg|D]}|j ^qtgg}} x|D]{}d } |rAtj} t|j|j} yt | WqJt!k r=} t j"d|j | | j|qqJXn |j} |j#|| d| } | r2|j||r?|jrt$j%j&t$j%j|jt' rtdn|j(|j)|jj*|_tjj+t,| |_|jj stt-|j|jd t.d |jj/q?q| j|qWWd QX|rt j d d jg|D]}|j ^qen| rt j d d jg| D]}|j ^qnt0| dkS(sBuild wheels. :param unpack: If True, replace the sdist we built from with the newly built wheel, in preparation for installation. :return: True if all the wheels built correctly. s(Skipping %s, due to already being wheel.R:sCSkipping bdist_wheel for %s, due to binaries being disabled for it.s*Building wheels for collected packages: %ss, s Building wheel for %s failed: %sR`sbad source dir - missing markertsessionNsSuccessfully built %st sFailed to build %si(1R]R[RRXt prepare_filesRYt requirementstvaluest constraintR;RRdRiteditableR"R<R8tsplitextR=R>tegg_info_matchesRR?RRR-RyR.RR timplementation_tagR9RRAR>RiR3R4RR tremove_temporary_sourcetbuild_locationt build_dirRIRRRsRzRX(Rt autobuildingtreqsettbuildsetRR"R0textt build_successt build_failureR`RfRNt wheel_file((s-/usr/lib/python2.7/site-packages/pip/wheel.pytbuilds        &               ))N( R$R%R&RR RiRlRcReRsR(((s-/usr/lib/python2.7/site-packages/pip/wheel.pyRWs     (TR&t __future__RRRRBR'R/tloggingR3tos.pathRRRRgRaRtbase64Rt email.parserRtpip._vendor.sixRR=t pip.compatRt pip.downloadRRtpip.exceptionsRRR t pip.locationsR R R R+R RRRRt pip.utils.uiRtpip.utils.loggingRtpip.utils.setuptools_buildRtpip._vendor.distlib.scriptsRt pip._vendorRtpip._vendor.packaging.utilsRtpip._vendor.six.movesRt wheel_extR<t getLoggerR$RtobjectRR9R!RcRmR~RURVRRRRsRRyR!R)R1R;R?RERW(((s-/usr/lib/python2.7/site-packages/pip/wheel.pytsl               (  ) '    &   7