o bc@sdZddlZddlZddlZddlmZddlmZddlm Z m Z ddl m Z ddl mZmZddlmZdd lmZdd lmZeed deed deed ddZGdddeZdS)zm distutils.command.upload Implements the Distutils 'upload' subcommand (upload package to a package index). N)standard_b64encode) HTTPError)urlopenRequest)urlparse)DistutilsErrorDistutilsOptionError) PyPIRCCommand)spawn)logmd5sha256blake2b) md5_digest sha256_digestblake2_256_digestc@sJeZdZdZejddgZejdgZddZddZd d Z d d Z d S)uploadzupload binary package to PyPI)signszsign files to upload using gpg)z identity=izGPG identity used to sign filesrcCs,t|d|_d|_d|_d|_d|_dS)NrF)r initialize_optionsusernamepassword show_responseridentity)selfr//usr/lib/python3.10/distutils/command/upload.pyr*s  zupload.initialize_optionscCszt||jr|jstd|}|ikr+|d|_|d|_|d|_|d|_ |js9|j jr;|j j|_dSdSdS)Nz.Must use --sign for --identity to have meaningrr repositoryrealm) r finalize_optionsrrr _read_pypircrrrr distribution)rconfigrrrr!2s      zupload.finalize_optionscCs:|jjs d}t||jjD] \}}}||||qdS)NzHMust create and upload files in one command (e.g. setup.py sdist upload))r# dist_filesr upload_file)rmsgcommand pyversionfilenamerrrrunDs z upload.runc" Cs>t|j\}}}}}} |s|s| rtd|j|dvr"td||jr>ddd|g} |jr7d|jg| dd<t| |jd t|d } z | } W| n| w|j j } id d d dd| d| dtj|| fd|d|ddd| d| d| d| d| d| d| d| d| | | | | d}d |d!<tD]\}}|durqz ||  ||<Wqt!yYqw|jrt|d"d } tj|d"| f|d#<Wdn 1swY|j"d$|j#$d%}d&t%|&d%}d'}d(|$d%}|d)}t'(}|D]J\}}d*|}t)|t*s@|g}|D]5}t+|t,urX|d+|d,7}|d-}nt-|$d.}|.||.|$d.|.d/|.|qBq/|.||/}d0||jf}|0|t1j2d1|t-t3||d2}t4|j||d3}z t5|}|6}|j7}Wn/t8y} z | j9}| j7}WYd} ~ nd} ~ wt:y} z |0t-| t1j;d} ~ ww|d4kr|0d5||ft1j2|j<r |=|}!d6>d7|!d7f}|0|t1j2dSdSd8||f}|0|t1j;t?|)9NzIncompatible url %s)httphttpszunsupported schema gpgz --detach-signz-az --local-user)dry_runrbz:action file_uploadprotocol_version1nameversioncontentfiletyper)metadata_versionz1.0summary home_pageauthor author_emaillicense descriptionkeywordsplatform classifiers) download_urlprovidesrequires obsoletesrcommentz.asc gpg_signature:asciizBasic z3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --s-- z+ Content-Disposition: form-data; name="%s"z; filename="%s"rzutf-8s zSubmitting %s to %sz multipart/form-data; boundary=%s)z Content-typezContent-length Authorization)dataheaderszServer response (%s): %s zK---------------------------------------------------------------------------zUpload failed (%s): %s)@rrAssertionErrorrrr r0openreadcloser#metadataget_name get_versionospathbasenameget_descriptionget_url get_contactget_contact_email get_licenceget_long_description get_keywords get_platformsget_classifiersget_download_url get_provides get_requires get_obsoletes_FILE_CONTENT_DIGESTSitems hexdigest ValueErrorrrencoderdecodeioBytesIO isinstancelisttypetuplestrwritegetvalueannouncer INFOlenrrgetcoder'rcodeOSErrorERRORr_read_pypi_responsejoinr)"rr(r)r*schemanetlocurlparamsquery fragmentsgpg_argsfr7metarM digest_name digest_cons user_passauthboundary sep_boundary end_boundarybodykeyvaluetitler'rNrequestresultstatusreasonetextrrrr&Ls                     zupload.upload_fileN) __name__ __module__ __qualname__r?r user_optionsboolean_optionsrr!r+r&rrrrrs  r)__doc__rXrnhashlibbase64r urllib.errorrurllib.requestrr urllib.parserdistutils.errorsrrdistutils.corer distutils.spawnr distutilsr getattrrhrrrrrs"