3 Õì2a]ã@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ú+/opt/alt/python36/lib64/python3.6/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ƒ‚|d/krDtd|ƒ‚|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œ}d}|dk�rZt!j"ƒ\}}}|�rtd||f}n|dk�rtdt!j!dd�}||d<|j�rªtjj|ƒdt|dd ƒjƒf|d<|j#d|j$j%dƒ}dt&|ƒj'dƒ}d}d|j%dƒ}|d}t(j)ƒ}x¤|j*ƒD]˜\}}d |}t+|t,ƒ�s |g}xr|D]j}t-|ƒt.k�rR|d!|d"7}|d}nt/|ƒj%d#ƒ}|j0|ƒ|j0|j%d#ƒƒ|j0d$ƒ|j0|ƒ�q&W�qþW|j0|ƒ|j1ƒ}d%||jf}|j2|t3j4ƒd&|t/t5|ƒƒ|d'œ}t6|j||d(�}yt7|ƒ}|j8ƒ} |j9}!Wnft:k �r:}"z|"j;} |"j9}!WYdd}"~"Xn8t�rî|j?|ƒ}#d+j@d,d-|#d,d-fƒ}|j2|t3j4ƒn"d.| |!f}|j2|t3j=ƒtA|ƒ‚dS)0NzIncompatible 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 md5_digestZmetadata_versionZsummaryZ home_pageZauthorZ author_emailÚlicenseÚ descriptionÚkeywordsÚplatformZ classifiersZ download_urlZprovidesZrequiresZ obsoletesrZ 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"rzutf-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()BrrÚAssertionErrorr rr r*ÚopenÚreadÚcloserZmetadataZget_nameZ get_versionÚosÚpathÚbasenameÚhashlibZmd5Z hexdigestZget_descriptionZget_urlZ get_contactZget_contact_emailZ get_licenceZget_long_descriptionZ get_keywordsZ get_platformsZget_classifiersZget_download_urlZ get_providesZ get_requiresZ get_obsoletesr3ÚdistrrÚencoderÚdecodeÚioÚBytesIOÚitemsÚ isinstanceÚlistÚtypeÚtupleÚstrÚwriteÚgetvalueZannouncer ÚINFOÚlenrrZgetcoder"rÚcodeÚOSErrorZERRORrZ_read_pypi_responseÚjoinr)$rr#r$r%ZschemaZnetlocZurlÚparamsZqueryZ fragmentsZgpg_argsÚfr/Úmetar8r5rFr.ÚidZ user_passZauthÚboundaryZ sep_boundaryZ end_boundaryZbodyÚkeyÚvalueÚtitler"r9ZrequestÚresultÚstatusÚreasonÚeÚtextrrrr!Bs                      zupload.upload_fileN)r rr)rrr) Ú__name__Ú __module__Ú __qualname__r1r Z user_optionsZboolean_optionsrrr&r!rrrrr s r )rBrIr3rEÚbase64rZurllib.requestrrrZ urllib.parserZdistutils.errorsrrZdistutils.corer Zdistutils.spawnr Z distutilsr r rrrrÚs