3 öLÖj÷ã@s”ddlZddlZddlZddlZddlmZddlmZmZm Z ddl m Z ddl m Z mZddlmZddlmZddlmZGd d „d eƒZdS) éN)Ústandard_b64encode)ÚurlopenÚRequestÚ HTTPError)Úurlparse)ÚDistutilsErrorÚDistutilsOptionError)Ú PyPIRCCommand)Úspawn)Úlogc@sJeZdZdZejddgZejdgZdd „Zd d „Zd d „Z dd„Z dS)Úuploadzupload binary package to PyPIÚsignÚsúsign files to upload using gpgú identity=ÚiúGPG identity used to sign filescCs,tj|ƒd|_d|_d|_d|_d|_dS)NÚrF)r Úinitialize_optionsÚusernameÚpasswordÚ show_responser Úidentity)Úself©rú0/usr/lib64/python3.6/distutils/command/upload.pyr s  zupload.initialize_optionscCsvtj|ƒ|jr |j r tdƒ‚|jƒ}|ikrX|d|_|d|_|d|_|d|_ |j rr|j jrr|j j|_dS)Nz.Must use --sign for --identity to have meaningrrÚ repositoryÚrealm) r Úfinalize_optionsrr rZ _read_pypircrrrrÚ distribution)rÚconfigrrrr(s     zupload.finalize_optionscCs>|jjsd}t|ƒ‚x$|jjD]\}}}|j|||ƒqWdS)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ƒ‚|d2krDtd|ƒ‚|jr|ddd|g} |jrnd|jg| d d …<t| |jd �t|d ƒ} z | jƒ} Wd| j ƒX|j j } d d | j ƒ| j ƒtjj|ƒ| f||tj| ƒjƒd| jƒ| jƒ| jƒ| jƒ| jƒ| jƒ| jƒ| jƒ| jƒ| jƒ| jƒ| jƒ| j ƒdœ}ytj!| ƒjƒ}WnPt"k �rŒ}z2d|}|j#|t$j%ƒddl&m'}|ƒ�s|‚WYdd}~Xn X||d<d}|dk�rÆt(j)ƒ\}}}|�ràd||f}n|dk�ràdt(j(dd�}||d<|j�rtjj|ƒdt|dd ƒjƒf|d<|j*d|j+j,dƒ}d t-|ƒj.dƒ}d!}d"|j,dƒ}|d#}t/j0ƒ}x¤|j1ƒD]˜\}}d$|}t2|t3ƒ�sŒ|g}xr|D]j}t4|ƒt5k�r¾|d%|d7}|d}nt6|ƒj,d&ƒ}|j7|ƒ|j7|j,d&ƒƒ|j7d'ƒ|j7|ƒ�q’W�qjW|j7|ƒ|j8ƒ}d(||jf}|j#|t$j%ƒd)|t6t9|ƒƒ|d*œ} t:|j|| d+�}!yt;|!ƒ}"|"j<ƒ}#|"j=}$Wnft>k �r¦}z|j?}#|j=}$WYdd}~Xn8t@k �rÜ}z|j#t6|ƒt$jAƒ‚WYdd}~XnX|#d,k�r8|j#d-|#|$ft$j%ƒ|jB�rZ|jC|"ƒ}%d.jDd/d0|%d/d0fƒ}|j#|t$j%ƒn"d1|#|$f}|j#|t$jAƒtE|ƒ‚dS)3NzIncompatible url %sÚhttpÚhttpszunsupported schema Zgpgz --detach-signz-az --local-useré)Údry_runÚrbZ file_uploadÚ1z1.0)z:actionZprotocol_versionÚnameÚversionÚcontentZfiletyper$Z sha256_digestZmetadata_versionZsummaryZ home_pageZauthorZ author_emailÚlicenseÚ descriptionÚkeywordsÚplatformZ classifiersZ download_urlZprovidesZrequiresZ obsoletesz#calculating md5 checksum failed: %sr)Ú get_fips_modeZ md5_digestrZ bdist_rpmzbuilt for %s %sZ bdist_dumbz built for %sé)ZterseÚcommentz.ascZ gpg_signatureú:ÚasciizBasic z3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --s-- z+ Content-Disposition: form-data; name="%s"z; filename="%s"zutf-8s zSubmitting %s to %sz multipart/form-data; boundary=%s)z Content-typezContent-lengthZ Authorization)ÚdataÚheaderséÈzServer response (%s): %sÚ ú-éKzUpload failed (%s): %s)r'r()FrrÚAssertionErrorr rr r*ÚopenÚreadÚcloserZmetadataZget_nameZ get_versionÚosÚpathÚbasenameÚhashlibZsha256Z hexdigestZget_descriptionZget_urlZ get_contactZget_contact_emailZ get_licenceZget_long_descriptionZ get_keywordsZ get_platformsZget_classifiersZget_download_urlZ get_providesZ get_requiresZ get_obsoletesZmd5Ú ValueErrorZannouncer ÚINFOZ_hashlibr4r3ÚdistrrÚencoderÚdecodeÚioÚBytesIOÚitemsÚ isinstanceÚlistÚtypeÚtupleÚstrÚwriteÚgetvalueÚlenrrZgetcoder"rÚcodeÚOSErrorZERRORrZ_read_pypi_responseÚjoinr)&rr#r$r%ZschemaZnetlocZurlZparamsZqueryZ fragmentsZgpg_argsÚfr/Úmetar9ZdigestÚer"r4r6rIr.ÚidZ user_passZauthÚboundaryZ sep_boundaryZ end_boundaryZbodyÚkeyÚvalueÚtitler:ZrequestÚresultZstatusÚreasonÚtextrrrr!BsÔ                       zupload.upload_fileN)r rr)rrr) Ú__name__Ú __module__Ú __qualname__r1r Z user_optionsZboolean_optionsrrr&r!rrrrr s r )rCrLr3rFÚbase64rZurllib.requestrrrZ urllib.parserZdistutils.errorsrrZdistutils.corer Zdistutils.spawnr Z distutilsr r rrrrÚs