3 ”ReJRã @sÈddlZddlZddlZddlZddlZddlZyddlmZWn ek r`ddl mZYnXddl m Z ddl m Z mZmZmZmZmZddlmZmZmZejeƒZdZdZGd d „d eƒZdS) éN)ÚThreadé)ÚDistlibException)ÚHTTPBasicAuthHandlerÚRequestÚHTTPPasswordMgrÚurlparseÚ build_openerÚ string_types)Úcached_propertyÚ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|_|jƒt|jƒ\}}}}}}|s<|s<|s<|d krJtd|jƒ‚d|_d|_d|_d|_t t j dƒ�R}xJd D]B} y(t j | dg||d �} | d kr | |_PWqvtk r¶YqvXqvWWdQRXdS) z” Initialise an instance. :param url: The URL of the index. If not specified, the URL for PyPI is used. ÚhttpÚhttpszinvalid repository: %sNÚwÚgpgÚgpg2z --version)ÚstdoutÚstderrr)rr)rr)Ú DEFAULT_INDEXÚurlÚread_configurationrrÚpassword_handlerÚ ssl_verifierrÚgpg_homeÚopenÚosÚdevnullÚ subprocessÚ check_callÚOSError) ÚselfrÚschemeÚnetlocÚpathÚparamsÚqueryÚfragZsinkÚsÚrc©r,úˆ/builddir/build/BUILDROOT/alt-python36-pip-20.2.4-5.el8.x86_64/opt/alt/python36/lib/python3.6/site-packages/pip/_vendor/distlib/index.pyÚ__init__$s&   zPackageIndex.__init__cCs&ddlm}ddlm}|ƒ}||ƒS)zs Get the distutils command for interacting with PyPI configurations. :return: the command. r)Ú Distribution)Ú PyPIRCCommand)Údistutils.corer/Údistutils.configr0)r#r/r0Údr,r,r-Ú_get_pypirc_commandAs  z PackageIndex._get_pypirc_commandcCsR|jƒ}|j|_|jƒ}|jdƒ|_|jdƒ|_|jddƒ|_|jd|jƒ|_dS)zç Read the PyPI access configuration as supported by distutils, getting PyPI to do the actual work. This populates ``username``, ``password``, ``realm`` and ``url`` attributes from the configuration. ÚusernameÚpasswordÚrealmrÚ repositoryN)r4rr8Ú _read_pypircÚgetr5r6r7)r#ÚcÚcfgr,r,r-rKs  zPackageIndex.read_configurationcCs$|jƒ|jƒ}|j|j|jƒdS)zÍ Save the PyPI access configuration. You must have set ``username`` and ``password`` attributes before calling this method. Again, distutils is used to do the actual work. N)Úcheck_credentialsr4Ú _store_pypircr5r6)r#r;r,r,r-Úsave_configurationZszPackageIndex.save_configurationcCs\|jdks|jdkrtdƒ‚tƒ}t|jƒ\}}}}}}|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) r5r6rrrrÚ add_passwordr7rr)r#ZpmÚ_r%r,r,r-r=fs zPackageIndex.check_credentialscCs\|jƒ|jƒ|jƒ}d|d<|j|jƒgƒ}|j|ƒ}d|d<|j|jƒgƒ}|j|ƒ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. Úverifyz:actionZsubmit)r=ÚvalidateÚtodictÚencode_requestÚitemsÚ send_request)r#Úmetadatar3ÚrequestÚresponser,r,r-Úregisterrs  zPackageIndex.registercCsJx<|jƒ}|sP|jdƒjƒ}|j|ƒtjd||fƒqW|jƒ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-Ú_reader†s  zPackageIndex._readercCsš|jdddg}|dkr|j}|r.|jd|gƒ|dk rF|jdddgƒtjƒ}tjj|tjj|ƒd ƒ}|jd d d |d ||gƒt j ddj|ƒƒ||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ÚtempfileÚmkdtemprr&ÚjoinÚbasenamerPrQ)r#ÚfilenameÚsignerÚ sign_passwordÚkeystoreÚcmdÚtdZsfr,r,r-Úget_sign_command˜s zPackageIndex.get_sign_commandc Cs´tjtjdœ}|dk r tj|d<g}g}tj|f|Ž}t|jd|j|fd�}|jƒt|jd|j|fd�}|jƒ|dk r�|jj |ƒ|jj ƒ|j ƒ|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ÚPopenrrUrÚstartrreÚwriterRÚwaitr\Ú returncode) r#rbZ input_dataÚkwargsrrÚpÚt1Út2r,r,r-Ú run_commandµs$     zPackageIndex.run_commandc CsD|j||||ƒ\}}|j||jdƒƒ\}}} |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)rdrrÚencoder) r#r^r_r`rarbÚsig_filer+rrr,r,r-Ú sign_fileØs  zPackageIndex.sign_fileÚsdistÚsourcecCs(|jƒtjj|ƒs td|ƒ‚|jƒ|jƒ}d} |rZ|jsJtj dƒn|j ||||ƒ} t |dƒ�} | j ƒ} WdQRXt j| ƒjƒ} t j| ƒjƒ} |jdd||| | dœƒdtjj|ƒ| fg}| �rt | dƒ�} | j ƒ}WdQRX|jd tjj| ƒ|fƒtjtjj| ƒƒ|j|jƒ|ƒ}|j|ƒ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)r=rr&ÚexistsrrCrDrrPÚwarningrurÚreadÚhashlibÚmd5Ú hexdigestÚsha256Úupdater]rOÚshutilÚrmtreeÚdirnamerErFrG)r#rHr^r_r`rzr{rar3rtÚfZ file_datar|r}ÚfilesZsig_datarIr,r,r-Ú upload_fileïs>       zPackageIndex.upload_filec Csœ|jƒtjj|ƒs td|ƒ‚tjj|dƒ}tjj|ƒsFtd|ƒ‚|jƒ|j|j }}t |ƒj ƒ}d d|fd|fg}d||fg}|j ||ƒ} |j | ƒ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ú:actionÚ doc_uploadrSÚversionr~)r�rŽ)r=rr&Úisdirrr\rrCrSr�r ÚgetvaluerErG) r#rHZdoc_dirÚfnrSr�Úzip_dataÚfieldsr‹rIr,r,r-Úupload_documentation(s        z!PackageIndex.upload_documentationcCsT|jdddg}|dkr|j}|r.|jd|gƒ|jd||gƒtjddj|ƒƒ|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-fdrVz--no-ttyNz --homedirz--verifyz invoking: %srX)rrrYrPrQr\)r#Úsignature_filenameÚ data_filenamerarbr,r,r-Úget_verify_commandDszPackageIndex.get_verify_commandcCsH|jstdƒ‚|j|||ƒ}|j|ƒ\}}}|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 unavailablerrz(verify command failed with error code %s)rr)rrr˜rr)r#r–r—rarbr+rrr,r,r-Úverify_signature\szPackageIndex.verify_signaturecCsp|dkrd}tjdƒn6t|ttfƒr0|\}}nd}tt|ƒƒ}tjd|ƒt|dƒ�²}|jt |ƒƒ}z’|j ƒ} d} d} d} d} d | kr–t | d ƒ} |r¦|| | | ƒxP|j | ƒ}|s¸P| t |ƒ7} |j|ƒ|rÜ|j|ƒ| d7} |r¨|| | | ƒq¨WWd|jƒXWdQRX| dk�r4| | k�r4td | | fƒ‚|�rl|jƒ}||k�r`td ||||fƒ‚tjd |ƒ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 specifiedrƒzDigest specified: %sÚwbi rrzcontent-lengthzContent-Lengthz1retrieval incomplete: got only %d out of %d bytesz.%s digest mismatch for %s: expected %s, got %szDigest verified: %séÿÿÿÿ)rPrQÚ isinstanceÚlistÚtupleÚgetattrr‚rrGrÚinfoÚintr�Úlenrkr†rRrr„)r#rÚdestfileÚdigestÚ reporthookZdigesterZhasherZdfpZsfpÚheadersÚ blocksizeÚsizer�ÚblocknumÚblockÚactualr,r,r-Ú download_fileusV             zPackageIndex.download_filecCs:g}|jr|j|jƒ|jr(|j|jƒt|Ž}|j|ƒ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). )rrOrr r)r#ÚreqÚhandlersÚopenerr,r,r-rGÂs  zPackageIndex.send_requestcCsäg}|j}xX|D]P\}}t|ttfƒs,|g}x2|D]*}|jd|d|jdƒd|jdƒfƒq2WqWx6|D].\}} } |jd|d|| fjdƒd| fƒqjW|jd|ddfƒdj|ƒ} 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žrYrsr\Ústrr¢rr)r#r”r‹Úpartsr±ÚkÚvaluesÚvÚkeyr^ÚvalueÚbodyÚctr¦r,r,r-rEÒs2     zPackageIndex.encode_requestc CsBt|tƒrd|i}t|jdd�}z|j||p.dƒS|dƒƒXdS)NrSg@)ÚtimeoutÚandrR)rœr r rÚsearch)r#ZtermsÚoperatorZ rpc_proxyr,r,r-r½ýs  zPackageIndex.search)N)N)N)N)NNrvrwN)N)N)NN)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__r±r.r4rr?r=rKrUrdrrrurŒr•r˜r™r¬rGrEr½r,r,r,r-rs*      #  8   M+r)r‚Úloggingrr‡r rZÚ threadingrÚ ImportErrorÚdummy_threadingÚrÚcompatrrrrr r Úutilr r r Ú getLoggerr¿rPrÚ DEFAULT_REALMÚobjectrr,r,r,r-Ús