
(h              	   @   s  d  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 d
 e e d d  d e e d d  d e e d d  i Z Gd d   d e  Z d S)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)spawn)logZ
md5_digestmd5Zsha256_digestsha256Zblake2_256_digestZblake2bc               @   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   J/tmp/pip-build-kmztzv_d/setuptools/setuptools/_distutils/command/upload.pyr   )   s    				zupload.initialize_optionsc             C   s   t  j |   |  j r, |  j r, t d   |  j   } | i  k rx | d |  _ | d |  _ | d |  _ | d |  _	 |  j r |  j
 j r |  j
 j |  _ d  S)Nz.Must use --sign for --identity to have meaningr   r   
repositoryrealm)r	   finalize_optionsr   r   r   _read_pypircr   r   r   r   distribution)r   configr   r   r   r    1   s    	zupload.finalize_optionsc             C   sU   |  j  j s d } t |   x0 |  j  j D]" \ } } } |  j | | |  q+ Wd  S)NzHMust create and upload files in one command (e.g. setup.py sdist upload))r"   
dist_filesr   upload_file)r   msgcommand	pyversionfilenamer   r   r   runC   s
    z
upload.runc       "   2   C   s  t  |  j  \ } } } } } }	 | s3 | s3 |	 rF t d |  j   | dA k rb t d |   |  j r d d d | g }
 |  j r d |  j g |
 d	 d	  <t |
 d
 |  j t | d  } z | j   } Wd  | j	   X|  j
 j } d d d d d | j   d | j   d t j j |  | f d | d | d d d | j   d | j   d | j   d | j   d | j   d | j   d | j   d | j   d | j   d  | j   d! | j   d" | j   d# | j   i } d$ | d% <xX t j   D]J \ } } | d  k rqy | |  j    | | <Wqt! k
 r;YqXqW|  j rt | d& d  - } t j j |  d& | j   f | d' <Wd  QRX|  j" d( |  j# j$ d)  } d* t% |  j& d)  } d+ } d, | j$ d)  } | d- } t' j(   } x | j   D] \ } } d. | } t) | t*  s,| g } x | D] } t+ |  t, k rj| d/ | d0 7} | d1 } n t- |  j$ d2  } | j. |  | j. | j$ d2   | j. d3  | j. |  q3WqW| j. |  | j/   } d4 | |  j f } |  j0 | t1 j2  d5 d6 | d7 t- t3 |   d8 | i } t4 |  j d9 | d: | } y% t5 |  } | j6   } | j7 } Wnw t8 k
 r}  z |  j9 } |  j7 } WYd  d  }  ~  XnA t: k
 r}  z! |  j0 t- |   t1 j;    WYd  d  }  ~  Xn X| d; k r\|  j0 d< | | f t1 j2  |  j< r|  j= |  }! d= j> d> d? |! d> d? f  } |  j0 | t1 j2  n/ d@ | | f } |  j0 | t1 j;  t? |   d  S)BNzIncompatible url %shttphttpszunsupported schema Zgpgz--detach-signz-az--local-user   dry_runrbz:actionZfile_uploadZprotocol_version1nameversioncontentZfiletyper(   metadata_versionz1.0summaryZ	home_pageauthorauthor_emaillicensedescriptionkeywordsplatformclassifiersdownload_urlprovidesrequires	obsoletesr   commentz.ascZgpg_signature:asciizBasic z3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s   
--s   --
z+
Content-Disposition: form-data; name="%s"z; filename="%s"r      zutf-8s   

zSubmitting %s to %szContent-typez multipart/form-data; boundary=%szContent-lengthAuthorizationdataheaders   zServer response (%s): %s
-K   zUpload failed (%s): %s)zhttpzhttps)@r   r   AssertionErrorr   r   r
   r.   openreadcloser"   metadataget_nameget_versionospathbasenameget_descriptionget_urlget_contactget_contact_emailget_licenceget_long_descriptionget_keywordsget_platformsget_classifiersget_download_urlget_providesget_requiresget_obsoletes_FILE_CONTENT_DIGESTSitems	hexdigest
ValueErrorr   r   encoder   decodeioBytesIO
isinstancelisttypetuplestrwritegetvalueannouncer   INFOlenr   r   getcoder&   r   codeOSErrorERRORr   _read_pypi_responsejoinr   )"r   r'   r(   r)   ZschemanetlocurlparamsqueryZ	fragmentsZgpg_argsfr3   metarF   Zdigest_namedigest_cons	user_passauthboundaryZsep_boundaryZend_boundarybodykeyvaluetitler&   rG   requestresultstatusreasonetextr   r   r   r%   K   s    !			

		

	
		
	 zupload.upload_fileN)zsignr   r   )r   r   r   )__name__
__module____qualname__r9   r	   user_optionsboolean_optionsr   r    r*   r%   r   r   r   r   r      s    
r   )__doc__rS   ri   hashlibbase64r   urllib.requestr   r   r   urllib.parser   Zdistutils.errorsr   r   distutils.corer	   distutils.spawnr
   	distutilsr   getattrrc   r   r   r   r   r   <module>   s   