B :—°aQã@sÄddlZddlZddlZddlZddlZddlZyddlmZWn ek r`ddl mZYnXddl m Z ddl m Z mZmZmZmZmZddlmZmZe e¡ZdZdZGd d „d eƒZdS) éN)ÚThreadé)ÚDistlibException)ÚHTTPBasicAuthHandlerÚRequestÚHTTPPasswordMgrÚurlparseÚ build_openerÚ string_types)Úzip_dirÚ ServerProxyzhttps://pypi.org/pypiÚpypic@s¶eZdZdZdZd*dd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z d+dd„Z d,dd„Z d-dd„Zd.dd„Zdd„Zd/dd„Zd0d d!„Zd1d"d#„Zd$d%„Zd&d'„Zd2d(d)„ZdS)3Ú PackageIndexzc This class represents a package index compatible with PyPI, the Python Package Index. s.----------ThIs_Is_tHe_distlib_index_bouNdaRY_$Nc CsÊ|pt|_| ¡t|jƒ\}}}}}}|s<|s<|s<|dkrJtd|jƒ‚d|_d|_d|_d|_t t j dƒR}xJdD]B} y(t j | dg||d} | dkr | |_PWqvtk r¶YqvXqvWWdQRXdS) z” Initialise an instance. :param url: The URL of the index. If not specified, the URL for PyPI is used. )ZhttpZhttpszinvalid repository: %sNÚw)ÚgpgZgpg2z --version)ÚstdoutÚstderrr)Ú DEFAULT_INDEXÚurlÚread_configurationrrÚpassword_handlerÚ ssl_verifierrÚgpg_homeÚopenÚosÚdevnullÚ subprocessÚ check_callÚOSError) ÚselfrÚschemeÚnetlocÚpathZparamsZqueryZfragZsinkÚsÚrc©r%ú>/opt/alt/python37/lib/python3.7/site-packages/distlib/index.pyÚ__init__$s&   zPackageIndex.__init__cCsddlm}|ƒS)zs Get the distutils command for interacting with PyPI configurations. :return: the command. r)Ú_get_pypirc_command)Úutilr()rÚcmdr%r%r&r(As z PackageIndex._get_pypirc_commandcCsNddlm}||ƒ}| d¡|_| d¡|_| dd¡|_| d|j¡|_dS) zà Read the PyPI access configuration as supported by distutils. This populates ``username``, ``password``, ``realm`` and ``url`` attributes from the configuration. r)Ú _load_pypircÚusernameÚpasswordÚrealmr Ú repositoryN)r)r+Úgetr,r-r.r)rr+Zcfgr%r%r&rIs    zPackageIndex.read_configurationcCs | ¡ddlm}||ƒdS)z” Save the PyPI access configuration. You must have set ``username`` and ``password`` attributes before calling this method. r)Ú _store_pypircN)Úcheck_credentialsr)r1)rr1r%r%r&Úsave_configurationVs zPackageIndex.save_configurationcCs\|jdks|jdkrtdƒ‚tƒ}t|jƒ\}}}}}}| |j||j|j¡t|ƒ|_ dS)zp Check that ``username`` and ``password`` have been set, and raise an exception if not. Nz!username and password must be set) r,r-rrrrZ add_passwordr.rr)rZpmÚ_r!r%r%r&r2_s zPackageIndex.check_credentialscCs\| ¡| ¡| ¡}d|d<| | ¡g¡}| |¡}d|d<| | ¡g¡}| |¡S)aq Register a distribution on PyPI, using the provided metadata. :param metadata: A :class:`Metadata` instance defining at least a name and version number for the distribution to be registered. :return: The HTTP response received from PyPI upon submission of the request. Zverifyz:actionZsubmit)r2ÚvalidateÚtodictÚencode_requestÚitemsÚ send_request)rÚmetadataÚdÚrequestÚresponser%r%r&Úregisterks  zPackageIndex.registercCsJx<| ¡}|sP| d¡ ¡}| |¡t d||f¡qW| ¡dS)ar Thread runner for reading lines of from a subprocess into a buffer. :param name: The logical name of the stream (used for logging only). :param stream: The stream to read from. This will typically a pipe connected to the output stream of a subprocess. :param outbuf: The list to append the read lines to. zutf-8z%s: %sN)ÚreadlineÚdecodeÚrstripÚappendÚloggerÚdebugÚclose)rÚnameÚstreamZoutbufr#r%r%r&Ú_readers  zPackageIndex._readerc Csš|jdddg}|dkr|j}|r.| d|g¡|dk rF| dddg¡t ¡}tj |tj |¡d ¡}| d d d |d ||g¡t   dd |¡¡||fS)a‰ Return a suitable command for signing a file. :param filename: The pathname to the file to be signed. :param signer: The identifier of the signer of the file. :param sign_password: The passphrase for the signer's private key used for signing. :param keystore: The path to a directory which contains the keys used in verification. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The signing command as a list suitable to be passed to :class:`subprocess.Popen`. z --status-fdÚ2z--no-ttyNz --homedirz--batchz--passphrase-fdÚ0z.ascz --detach-signz--armorz --local-userz--outputz invoking: %sú ) rrÚextendÚtempfileZmkdtemprr"ÚjoinÚbasenamerCrD)rÚfilenameÚsignerÚ sign_passwordÚkeystorer*ZtdZsfr%r%r&Úget_sign_command‘s zPackageIndex.get_sign_commandc Cs´tjtjdœ}|dk r tj|d<g}g}tj|f|Ž}t|jd|j|fd}| ¡t|jd|j|fd}| ¡|dk r|j  |¡|j  ¡|  ¡|  ¡|  ¡|j ||fS)aæ Run a command in a child process , passing it any input data specified. :param cmd: The command to run. :param input_data: If specified, this must be a byte string containing data to be sent to the child process. :return: A tuple consisting of the subprocess' exit code, a list of lines read from the subprocess' ``stdout``, and a list of lines read from the subprocess' ``stderr``. )rrNÚstdinr)ÚtargetÚargsr)rÚPIPEÚPopenrrHrÚstartrrUÚwriterEÚwaitrNÚ returncode) rr*Z input_dataÚkwargsrrÚpZt1Zt2r%r%r&Ú run_command®s$     zPackageIndex.run_commandc CsD| ||||¡\}}| || d¡¡\}}} |dkr@td|ƒ‚|S)aR Sign a file. :param filename: The pathname to the file to be signed. :param signer: The identifier of the signer of the file. :param sign_password: The passphrase for the signer's private key used for signing. :param keystore: The path to a directory which contains the keys used in signing. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The absolute pathname of the file where the signature is stored. zutf-8rz&sign command failed with error code %s)rTr`Úencoder) rrPrQrRrSr*Úsig_filer$rrr%r%r&Ú sign_fileÑs  zPackageIndex.sign_fileÚsdistÚsourcec Cs(| ¡tj |¡s td|ƒ‚| ¡| ¡}d} |rZ|jsJt  d¡n|  ||||¡} t |dƒ} |   ¡} WdQRXt  | ¡ ¡} t  | ¡ ¡} | dd||| | dœ¡dtj |¡| fg}| rt | dƒ} |   ¡}WdQRX| d tj | ¡|f¡t tj | ¡¡| | ¡|¡}| |¡S) a´ Upload a release file to the index. :param metadata: A :class:`Metadata` instance defining at least a name and version number for the file to be uploaded. :param filename: The pathname of the file to be uploaded. :param signer: The identifier of the signer of the file. :param sign_password: The passphrase for the signer's private key used for signing. :param filetype: The type of the file being uploaded. This is the distutils command which produced that file, e.g. ``sdist`` or ``bdist_wheel``. :param pyversion: The version of Python which the release relates to. For code compatible with any Python, this would be ``source``, otherwise it would be e.g. ``3.2``. :param keystore: The path to a directory which contains the keys used in signing. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The HTTP response received from PyPI upon submission of the request. z not found: %sNz)no signing program available - not signedÚrbZ file_uploadÚ1)z:actionZprotocol_versionÚfiletypeÚ pyversionÚ md5_digestÚ sha256_digestÚcontentZ gpg_signature)r2rr"Úexistsrr5r6rrCÚwarningrcrÚreadÚhashlibÚmd5Ú hexdigestZsha256ÚupdaterOrBÚshutilÚrmtreeÚdirnamer7r8r9)rr:rPrQrRrhrirSr;rbÚfZ file_datarjrkÚfilesZsig_datar<r%r%r&Ú upload_fileès>       zPackageIndex.upload_filec Csœ| ¡tj |¡s td|ƒ‚tj |d¡}tj |¡sFtd|ƒ‚| ¡|j|j }}t |ƒ  ¡}dd|fd|fg}d||fg}|  ||¡} |  | ¡S)a2 Upload documentation to the index. :param metadata: A :class:`Metadata` instance defining at least a name and version number for the documentation to be uploaded. :param doc_dir: The pathname of the directory which contains the documentation. This should be the directory that contains the ``index.html`` for the documentation. :return: The HTTP response received from PyPI upon submission of the request. znot a directory: %rz index.htmlz not found: %r)z:actionZ doc_uploadrFÚversionrl)r2rr"ÚisdirrrNrmr5rFrzr Úgetvaluer7r9) rr:Zdoc_dirÚfnrFrzZzip_dataÚfieldsrxr<r%r%r&Úupload_documentation!s        z!PackageIndex.upload_documentationcCsT|jdddg}|dkr|j}|r.| d|g¡| d||g¡t dd |¡¡|S) a| Return a suitable command for verifying a file. :param signature_filename: The pathname to the file containing the signature. :param data_filename: The pathname to the file containing the signed data. :param keystore: The path to a directory which contains the keys used in verification. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The verifying command as a list suitable to be passed to :class:`subprocess.Popen`. z --status-fdrIz--no-ttyNz --homedirz--verifyz invoking: %srK)rrrLrCrDrN)rÚsignature_filenameÚ data_filenamerSr*r%r%r&Úget_verify_command=szPackageIndex.get_verify_commandcCsH|jstdƒ‚| |||¡}| |¡\}}}|dkr@td|ƒ‚|dkS)a6 Verify a signature for a file. :param signature_filename: The pathname to the file containing the signature. :param data_filename: The pathname to the file containing the signed data. :param keystore: The path to a directory which contains the keys used in verification. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: True if the signature was verified, else False. z0verification unavailable because gpg unavailable)rrz(verify command failed with error code %sr)rrr‚r`)rr€rrSr*r$rrr%r%r&Úverify_signatureUszPackageIndex.verify_signaturec Csp|dkrd}t d¡n6t|ttfƒr0|\}}nd}tt|ƒƒ}t d|¡t|dƒ²}| t |ƒ¡}z’|  ¡} d} d} d} d} d | kr–t | d ƒ} |r¦|| | | ƒxP|  | ¡}|s¸P| t |ƒ7} | |¡|rÜ| |¡| d 7} |r¨|| | | ƒq¨WWd| ¡XWdQRX| dkr4| | kr4td | | fƒ‚|rl| ¡}||kr`td ||||fƒ‚t d|¡dS)a This is a convenience method for downloading a file from an URL. Normally, this will be a file from the index, though currently no check is made for this (i.e. a file can be downloaded from anywhere). The method is just like the :func:`urlretrieve` function in the standard library, except that it allows digest computation to be done during download and checking that the downloaded data matched any expected value. :param url: The URL of the file to be downloaded (assumed to be available via an HTTP GET request). :param destfile: The pathname where the downloaded file is to be saved. :param digest: If specified, this must be a (hasher, value) tuple, where hasher is the algorithm used (e.g. ``'md5'``) and ``value`` is the expected value. :param reporthook: The same as for :func:`urlretrieve` in the standard library. NzNo digest specifiedrqzDigest specified: %sÚwbi éÿÿÿÿrzcontent-lengthzContent-Lengthrz1retrieval incomplete: got only %d out of %d bytesz.%s digest mismatch for %s: expected %s, got %szDigest verified: %s)rCrDÚ isinstanceÚlistÚtupleÚgetattrrprr9rÚinfoÚintroÚlenr[rsrErrr)rrZdestfileZdigestZ reporthookZdigesterZhasherZdfpZsfpÚheadersZ blocksizeÚsizeroZblocknumÚblockZactualr%r%r&Ú download_filensV             zPackageIndex.download_filecCs:g}|jr| |j¡|jr(| |j¡t|Ž}| |¡S)zÝ Send a standard library :class:`Request` to PyPI and return its response. :param req: The request to send. :return: The HTTP response from PyPI (a standard library HTTPResponse). )rrBrr r)rZreqÚhandlersÚopenerr%r%r&r9»s  zPackageIndex.send_requestc Csäg}|j}xX|D]P\}}t|ttfƒs,|g}x2|D]*}| d|d| d¡d| d¡f¡q2WqWx6|D].\}} } | d|d|| f d¡d| f¡qjW| d|ddf¡d |¡} d|} | tt| ƒƒdœ} t |j | | ƒS) a& Encode fields and files for posting to an HTTP server. :param fields: The fields to send as a list of (fieldname, value) tuples. :param files: The files to send as a list of (fieldname, filename, file_bytes) tuple. s--z)Content-Disposition: form-data; name="%s"zutf-8óz8Content-Disposition: form-data; name="%s"; filename="%s"s smultipart/form-data; boundary=)z Content-typezContent-length) Úboundaryr†r‡rˆrLrarNÚstrrŒrr)rr~rxÚpartsr”ÚkÚvaluesÚvÚkeyrPÚvalueZbodyÚctrr%r%r&r7Ës2     zPackageIndex.encode_requestcCsBt|tƒrd|i}t|jdd}z| ||p.d¡S|dƒƒXdS)NrFg@)ÚtimeoutÚandrE)r†r r rÚsearch)rZtermsÚoperatorZ rpc_proxyr%r%r&rŸös  zPackageIndex.search)N)N)N)N)NNrdreN)N)N)NN)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__r”r'r(rr3r2r>rHrTr`rcryrr‚rƒrr9r7rŸr%r%r%r&rs*      #  8   M+r)rpÚloggingrrtrrMÚ threadingrÚ ImportErrorZdummy_threadingÚrÚcompatrrrrr r r)r r Ú getLoggerr¡rCrÚ DEFAULT_REALMÚobjectrr%r%r%r&Ús