a „oeCã@s°dZddlZddlZddlZddlZddlmZddlmZm Z m Z ddl m Z ddl mZmZddlmZdd lmZeed dƒeed dƒeed dƒd œZGdd„deƒZdS)zm distutils.command.upload Implements the Distutils 'upload' subcommand (upload package to a package index). éN)Ústandard_b64encode)ÚurlopenÚRequestÚ HTTPError)Úurlparseé)ÚDistutilsErrorÚDistutilsOptionError)Ú PyPIRCCommand)ÚspawnZmd5Zsha256Zblake2b)Z md5_digestZ sha256_digestZblake2_256_digestc@sJeZdZdZejddgZejdgZdd„Zdd„Zd d „Z d d „Z d S)Úuploadzupload binary package to PyPI)ÚsignÚszsign files to upload using gpg)z identity=ÚizGPG identity used to sign filesr cCs,t |¡d|_d|_d|_d|_d|_dS)NÚrF)r Úinitialize_optionsÚusernameÚpasswordÚ show_responser Úidentity)Úself©rúEC:\Program Files\Certbot\pkgs\setuptools\_distutils\command\upload.pyr's  zupload.initialize_optionscCsrt |¡|jr|jstdƒ‚| ¡}|ikrV|d|_|d|_|d|_|d|_ |jsn|j jrn|j j|_dS)Nz.Must use --sign for --identity to have meaningrrÚ repositoryÚrealm) r Úfinalize_optionsrr r Z _read_pypircrrrrÚ distribution)rZconfigrrrr/s      zupload.finalize_optionscCs:|jjsd}t|ƒ‚|jjD]\}}}| |||¡qdS)NzHMust create and upload files in one command (e.g. setup.py sdist upload))rZ dist_filesr Ú upload_file)rÚmsgÚcommandÚ pyversionÚfilenamerrrÚrun?s ÿz upload.runc"Cs t|jƒ\}}}}}} |s"|s"| r0td|jƒ‚|dvrDtd|ƒ‚|jr|ddd|g} |jrnd|jg| dd…<t| |jd �t|d ƒ} z|  ¡} W|   ¡n |   ¡0|j j } d d |   ¡|   ¡tj |¡| f||d |  ¡|  ¡|  ¡|  ¡|  ¡|  ¡|  ¡|  ¡|  ¡|  ¡|  ¡|  ¡|  ¡dœ}d|d<t ¡D]B\}}|du�rL�q6z|| ƒ  ¡||<Wnt!�ytYn0�q6|j�rÎt|dd ƒ�,} tj |¡d|  ¡f|d<Wdƒn1�sÄ0Y|j"d|j# $d¡}dt%|ƒ &d¡}d}d| $d¡}|d}t' (¡}| ¡D]”\}}d|}t)|t*ƒ�sB|g}|D]j}t+|ƒt,u�rr|d|d7}|d}nt-|ƒ $d¡}| .|¡| .| $d¡¡| .d¡| .|¡�qF�q | .|¡| /¡}d 0||j¡}| 1|t2j3¡d |t-t4|ƒƒ|d!œ}t5|j||d"�}zt6|ƒ}| 7¡}|j8}Wnjt9�yX} z| j:}| j8}WYd} ~ nBd} ~ 0t;�y�} z | 1t-| ƒt2j<¡‚WYd} ~ n d} ~ 00|d#k�rä| 1d$ 0||¡t2j3¡|j=�r| >|¡}!d% ?d&|!d&f¡}| 1|t2j3¡n"d' 0||¡}| 1|t2j<¡t@|ƒ‚dS)(NzIncompatible url %s)ÚhttpÚhttpszunsupported schema Zgpgz --detach-signz-az --local-userr)Údry_runÚrbZ file_uploadÚ1z1.0)z:actionZprotocol_versionÚnameÚversionÚcontentZfiletyper Zmetadata_versionZsummaryZ home_pageZauthorZ author_emailÚlicenseÚ descriptionÚkeywordsÚplatformZ classifiersZ download_urlZprovidesZrequiresZ obsoletesrZcommentz.ascZ gpg_signatureú:ÚasciizBasic z3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --s-- z+ Content-Disposition: form-data; name="%s"z; filename="%s"rézutf-8s zSubmitting {} to {}z multipart/form-data; boundary=%s)z Content-typezContent-lengthZ Authorization)ÚdataÚheaderséÈzServer response ({}): {}Ú zK---------------------------------------------------------------------------zUpload failed ({}): {})ArrÚAssertionErrorr rr r%ÚopenÚreadÚcloserÚmetadataZget_nameZ get_versionÚosÚpathÚbasenameZget_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_DIGESTSÚitemsZ hexdigestÚ ValueErrorrrÚencoderÚdecodeÚioÚBytesIOÚ isinstanceÚlistÚtypeÚtupleÚstrÚwriteÚgetvalueÚformatZannounceÚloggingÚINFOÚlenrrZgetcoderrÚcodeÚOSErrorZERRORrZ_read_pypi_responseÚjoinr)"rrr r!ZschemaÚnetlocÚurlÚparamsÚqueryZ fragmentsZgpg_argsÚfr*Úmetar2Z digest_nameZ digest_consZ user_passZauthÚboundaryZ sep_boundaryZ end_boundaryÚbodyÚkeyÚvalueÚtitlerr3ZrequestÚresultÚstatusÚreasonÚeÚtextrrrrIs     æ  <      ý  ÿ  zupload.upload_fileN) Ú__name__Ú __module__Ú __qualname__r,r Z user_optionsZboolean_optionsrrr"rrrrrr sþ  r )Ú__doc__r;rCZhashlibrMÚbase64rZurllib.requestrrrÚ urllib.parserÚerrorsrr Zcorer r Úgetattrr>r rrrrÚs       ý