o ?Og@s ddlZddlZddlZddlmZddlmZddlmZm Z ddl m Z ddl m Z mZddlmZddlmZdd lmZeed deed deed dd ZGdddeZdS)N)standard_b64encode) HTTPError)urlopenRequest)urlparse)DistutilsErrorDistutilsOptionError) PyPIRCCommand)spawn)logZmd5Zsha256Zblake2b)Z md5_digestZ sha256_digestZblake2_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 filesr cCs,t|d|_d|_d|_d|_d|_dS)NrF)r initialize_optionsusernamepassword show_responser identity)selfr?/opt/alt/python310/lib64/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_optionsrr rZ _read_pypircrrrr distribution)rZconfigrrrr2s      zupload.finalize_optionscCs:|jjs d}t||jjD] \}}}||||qdS)NzHMust create and upload files in one command (e.g. setup.py sdist upload))rZ 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)ZhttpZhttpszunsupported schema Zgpgz --detach-signz-az --local-user)dry_runrbz:actionZ file_uploadZprotocol_version1nameversioncontentZfiletyper Zmetadata_versionz1.0ZsummaryZ home_pageZauthorZ author_emaillicense descriptionkeywordsplatformZ classifiers)Z download_urlZprovidesZrequiresZ obsoletesrZcommentz.ascZ 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-lengthZ Authorization)dataheaderszServer response (%s): %s zK---------------------------------------------------------------------------zUpload failed (%s): %s)@rrAssertionErrorr rr r$openreadcloserZmetadataZget_nameZ get_versionospathbasenameZget_descriptionZget_urlZ get_contactZget_contact_emailZ get_licenceZget_long_descriptionZ get_keywordsZ get_platformsZget_classifiersZget_download_urlZ get_providesZ get_requiresZ get_obsoletes_FILE_CONTENT_DIGESTSitemsZ hexdigest ValueErrorrrencoderdecodeioBytesIO isinstancelisttypetuplestrwritegetvalueZannouncer INFOlenrrZgetcoderrcodeOSErrorZERRORrZ_read_pypi_responsejoinr)"rrr r!ZschemaZnetlocZurlparamsZqueryZ fragmentsZgpg_argsfr)metar1Z digest_nameZ digest_consZ user_passZauthboundaryZ sep_boundaryZ end_boundarybodykeyvaluetitlerr2ZrequestresultZstatusreasonetextrrrrLs                     zupload.upload_fileN) __name__ __module__ __qualname__r+r Z user_optionsZboolean_optionsrrr"rrrrrr s  r )r9rAZhashlibbase64rZ urllib.errorrZurllib.requestrrZ urllib.parserZdistutils.errorsrrZdistutils.corer Zdistutils.spawnr Z distutilsr getattrr<r rrrrs"