î
]á[\ã  ã               @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l m Z d d l m	 Z	 m
 Z
 m Z d d l m Z d d l m Z m Z d d l m Z d d l m Z d d	 l m Z e j d
 k  ræ d d l m Z n d d l m Z Gd d „  d e ƒ Z d S)z`distutils.command.upload

Implements the Distutils 'upload' subcommand (upload package to PyPI).é    N)Ústandard_b64encode)ÚurlopenÚRequestÚ	HTTPError)Úurlparse)ÚDistutilsErrorÚDistutilsOptionError)ÚPyPIRCCommand)Úspawn)Úlogz2.5)Úmd5c               @   si   e  Z d  Z d Z e j d d g Z e j d g Z d d	 „  Z d
 d „  Z d d „  Z	 d d „  Z
 d S)Úuploadzupload binary package to PyPIÚsignÚsúsign files to upload using gpgú	identity=ÚiúGPG identity used to sign filesc             C   s>   t  j |  ƒ d |  _ d |  _ d |  _ d |  _ d  |  _ d  S)NÚ r   F)r	   Úinitialize_optionsÚusernameÚpasswordÚshow_responser   Úidentity)Úself© r   ú./usr/lib/python3.4/distutils/command/upload.pyr   #   s    				zupload.initialize_optionsc             C   sª   t  j |  ƒ |  j r/ |  j r/ t d ƒ ‚ n  |  j ƒ  } | i  k r~ | d |  _ | d |  _ | d |  _ | d |  _	 n  |  j r¦ |  j
 j r¦ |  j
 j |  _ n  d  S)Nz.Must use --sign for --identity to have meaningr   r   Ú
repositoryÚrealm)r	   Úfinalize_optionsr   r   r   Z_read_pypircr   r   r   r   Údistribution)r   Zconfigr   r   r   r   +   s    zupload.finalize_optionsc             C   sR   |  j  j s t d ƒ ‚ n  x0 |  j  j D]" \ } } } |  j | | | ƒ q( Wd  S)Nz'No dist file created in earlier command)r    Z
dist_filesr   Úupload_file)r   ÚcommandÚ	pyversionÚfilenamer   r   r   Úrun=   s    z
upload.runc       $      C   sû  t  |  j ƒ \ } } } } } }	 | s3 | s3 |	 rI t d |  j ƒ ‚ n  | dI k rh t d | ƒ ‚ n  |  j r¾ d d d | g }
 |  j r¨ d |  j g |
 d	 d	 … <n  t |
 d
 |  j ƒn  t | d ƒ } z | j ƒ  } Wd  | j	 ƒ  X|  j
 j } i d d 6d d 6| j ƒ  d 6| j ƒ  d 6t j j | ƒ | f d 6| d 6| d 6t | ƒ j ƒ  d 6d d 6| j ƒ  d 6| j ƒ  d 6| j ƒ  d 6| j ƒ  d 6| j ƒ  d 6| j ƒ  d 6| j ƒ  d 6| j ƒ  d 6| j ƒ  d  6| j ƒ  d! 6| j ƒ  d" 6| j ƒ  d# 6| j ƒ  d$ 6} d% } | d& k rRt  j! ƒ  \ } } } | rwd' | | f } qwn% | d( k rwd) t  j  d* d+ ƒ } n  | | d, <|  j rÀt j j | ƒ d- t | d- d ƒ j ƒ  f | d. <n  |  j" d/ |  j# j$ d0 ƒ } d1 t% | ƒ j& d0 ƒ } d2 } d3 | j$ d0 ƒ } | d4 } t' j( ƒ  } x| j) ƒ  D]ú \ } } d5 | } t* | ƒ t* g  ƒ k rl| g } n  x½ | D]µ } t* | ƒ t+ k rª| d6 | d7 7} | d+ } n t, | ƒ j$ d8 ƒ } | j- | ƒ | j- | j$ d8 ƒ ƒ | j- d9 ƒ | j- | ƒ | rs| dJ d  … d: k rs| j- d; ƒ qsqsWq2W| j- | ƒ | j. ƒ  } |  j/ d< | |  j f t0 j1 ƒ i d= | d> 6t, t2 | ƒ ƒ d? 6| d@ 6} t3 |  j dA | dB | ƒ} y% t4 | ƒ } | j5 ƒ  } | j6 }  Wnw t7 k
 r}! z! |  j/ t, |! ƒ t0 j8 ƒ ‚  WYd  d  }! ~! Xn7 t9 k
 rM}! z |! j: } |! j6 }  WYd  d  }! ~! Xn X| dC k rz|  j/ dD | |  f t0 j1 ƒ n/ dE | |  f }" |  j/ |" t0 j8 ƒ t; |" ƒ ‚ |  j< r÷|  j= | ƒ }# dF j> dG dH |# dG dH f ƒ }" |  j/ |" t0 j1 ƒ n  d  S)KNzIncompatible url %sÚhttpÚhttpszunsupported schema Zgpgz--detach-signz-az--local-useré   Údry_runÚrbZfile_uploadz:actionÚ1Zprotcol_versionÚnameÚversionÚcontentZfiletyper#   Z
md5_digestz1.0Zmetadata_versionZsummaryZ	home_pageZauthorZauthor_emailZlicenseÚdescriptionÚkeywordsÚplatformZclassifiersZdownload_urlZprovidesZrequiresZ	obsoletesr   Z	bdist_rpmzbuilt for %s %sZ
bdist_dumbzbuilt for %sZterseé   Úcommentz.ascZgpg_signatureú:ÚasciizBasic z3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s   
--s   --
z+
Content-Disposition: form-data; name="%s"z; filename="%s"r   zutf-8s   

s   s   
zSubmitting %s to %sz multipart/form-data; boundary=%szContent-typezContent-lengthZAuthorizationÚdataÚheaderséÈ   zServer response (%s): %szUpload failed (%s): %sÚ
ú-éK   )r&   r'   éÿÿÿÿ)?r   r   ÚAssertionErrorr   r   r
   r)   ÚopenÚreadÚcloser    ZmetadataZget_nameZget_versionÚosÚpathÚbasenamer   Z	hexdigestZget_descriptionZget_urlZget_contactZget_contact_emailZget_licenceZget_long_descriptionZget_keywordsZget_platformsZget_classifiersZget_download_urlZget_providesZget_requiresZget_obsoletesr1   Údistr   r   Úencoder   ÚdecodeÚioÚBytesIOÚitemsÚtypeÚtupleÚstrÚwriteÚgetvalueZannouncer   ÚINFOÚlenr   r   ZgetcodeÚmsgÚOSErrorZERRORr   Úcoder   r   Z_read_pypi_responseÚjoin)$r   r"   r#   r$   ZschemaZnetlocZurlZparamsZqueryZ	fragmentsZgpg_argsÚfr.   Úmetar6   r3   rD   r-   ÚidZ	user_passZauthÚboundaryZsep_boundaryZend_boundaryZbodyÚkeyÚvalueÚtitler7   ZrequestÚresultZstatusÚreasonÚerQ   Útextr   r   r   r!   C   sÈ    !			
	#

 
			 zupload.upload_fileN)zsignr   r   )r   r   r   )Ú__name__Ú
__module__Ú__qualname__r/   r	   Zuser_optionsZboolean_optionsr   r   r%   r!   r   r   r   r   r      s    
r   )Ú__doc__ÚsysrA   rG   Zsocketr1   Úbase64r   Zurllib.requestr   r   r   Zurllib.parser   Zdistutils.errorsr   r   Zdistutils.corer	   Zdistutils.spawnr
   Z	distutilsr   r-   r   Zhashlibr   r   r   r   r   Ú<module>   s   