
!dV3                 @   sk  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
 d d l m Z m Z m Z m Z m Z d d l m Z d d	   Z d d l Z Gd
 d   d e  Z d d   Z e d d  Z d e d d  Z d d   Z d d   Z d d d  Z d d d d d d d  Z d d   Z d d   Z d  d!   Z d" d#   Z  d S)$z
Wheel command-line utility.
    N)iglob   )
signatures)urlsafe_b64decodeurlsafe_b64encodenativebinarymatches_requirement)	WheelFilec             C   s>   y d d  l  } Wn' t k
 r9 t d j |     Yn Xd  S)Nr   z/'{0}' needs pkg_resources (part of setuptools).)pkg_resourcesImportErrorRuntimeErrorformat)namer    r   4/tmp/pip-build-0jahl3lb/wheel/wheel/tool/__init__.pyrequire_pkgresources   s    r   c               @   s   e  Z d  Z d S)
WheelErrorN)__name__
__module____qualname__r   r   r   r   r      s    r   c              C   sN   y  d d l  m }  d d  l } Wn t k
 r@ t d   Yn X|  j | f S)Nr   )keysr   zCInstall wheel[signatures] (requires keyring, pyxdg) for signatures.)r   r   keyringr   r   	WheelKeys)r   r   r   r   r   get_keyring   s    r   c       
      C   sZ  |    \ } } t  j   } |   j   } | j   } t t | j   } t t | j   } | j   } | j	 d | |  t
 j j d j |   t | | j j j  r t
 j j d j | j   n t
 j j d | j  | j d |  }	 |	 | k rt d   n  t
 j j d j |   | j d |  | j d |  | j   d S)	z#Generate a public/private key pair.wheelz$Created Ed25519 keypair with vk={0}
zin {0}
zin %r
z1Keyring is broken. Could not retrieve secret key.z.Trusting {0} to sign and verify all packages.
+N)r   get_ed25519llloadZcrypto_sign_keypairr   r   vkskr   Zset_passwordsysstdoutwriter   
isinstancebackendsfileZBaseKeyring	file_path	__class__get_passwordr   Z
add_signertrustsave)
r   r   r   	ed25519llwkkeypairr   r    krZsk2r   r   r   keygen$   s&    r0   Fc             C   s  |   \ } } t  j   } t |  d d } |   j   } | j j d  } | j |  d }	 t j j	 d j
 | |	 d   |	 d }
 | j   } | j d |
  } | j t t |
   t t |    } | j d } | j d	 } | | j j   k rt d
   n  | j j |  } i d t t t j |  j     d 6} t  j | |  } | j j | t j | d d  | j j   d S)zSign a wheelappendTr   r   zSigning {0} with {1}
   r   z/RECORDz/RECORD.jwszWheel is already signed.zsha256=hash	sort_keysN)r   r   r
   r   parsed_filenamegroupZsignersr!   r"   r#   r   r   r)   ZKeypairr   r   distinfo_namezipfilenamelistr   readr   r   hashlibsha256digestsignwritestrjsondumpsclose)	wheelfilereplacer   r   r   r,   wfr-   r   Z	sign_withr   r/   r    r.   Zrecord_namesig_nameZrecord_datapayloadsigr   r   r   r>   @   s*     
,"r>   c             C   sv   d d l  } | j j |  d  } | j   } t |  oL | d j j d  s^ t d   n  | j   | j	   d S)a*  
    Remove RECORD.jws from a wheel by truncating the zip file.
    
    RECORD.jws must be at the end of the archive. The zip file must be an 
    ordinary archive, with the compressed files and the directory in the same 
    order, and without any non-zip content after the truncation point.
    r   Nar2   z/RECORD.jwsz'RECORD.jws not found at end of archive.)
Zwheel.installinstallZVerifyingZipFileinfolistlenfilenameendswithr   poprB   )rC   r   Zvzfinfor   r   r   unsign^   s    "
rR   c             C   s   t  |   } | j d } t j t | j j |  j     } t j	 |  } t
 j j d  t
 j j t j | d d  t
 j j d  d S)zVerify a wheel.
    
    The signature will be verified for internal consistency ONLY and printed. 
    Wheel's own unpack/install commands verify the manifest against the
    signature and file contents.
    z/RECORD.jwsz&Signatures are internally consistent.
indentr   
N)r
   r7   r@   loadsr   r8   openr:   r   verifyr!   stderrr#   r"   rA   )rC   rE   rF   rH   Zverifiedr   r   r   rW   n   s    'rW   .c             C   sh   t  |   } | j j d  } t j j | |  } t j j d |  | j	 j
 |  | j	 j   d S)a  Unpack a wheel.

    Wheel content will be unpacked to {dest}/{name}-{ver}, where {name}
    is the package name and {ver} its version.

    :param wheelfile: The path to the wheel.
    :param dest: Destination directory (default to current directory).
    nameverzUnpacking to: %s
N)r
   r5   r6   ospathjoinr!   rX   r#   r8   
extractallrB   )rC   destrE   rZ   Zdestinationr   r   r   unpack}   s    	r`   c          
   C   s  | sB t  j d  } | r0 | j t  j  } qB t  j j g } n  g  } xn | D]f } x] t  j |  D]L }	 |	 j d  re t t  j j	 | |	   }
 |
 j
 r | j |
  q qe qe WqO W| r;t  j j |  sxB | D]7 } t  j j	 | |  } t  j j |  r | } Pq q Wn  t |   } |  j |  Wd QXn  g  } x |  D] } | j d  rt  j j |  rt |  }
 |
 j
 s| r| j |
  qd j |  } t |   qHt d j |    qHn  t | |  } | s t d j |    n  | j t |   qHW| r0t j j d  n  | r:d SxS | D]K }
 | rot j j d j |
 j   qAn  |
 j d	 |  |
 j j   qAWd S)
a  Install wheels.
    
    :param requirements: A list of requirements or wheel files to install.
    :param requirements_file: A file containing requirements to install.
    :param wheel_dirs: A list of directories to search for wheels.
    :param force: Install a wheel file even if it is not compatible.
    :param list_files: Only list the files to install, don't install them.
    :param dry_run: Do everything but the actual install.
    Z	WHEELPATHz.whlNzB{0} is not compatible with this Python. --force to install anyway.zNo such wheel file: {}zNo match for requirement {}zInstalling:
z    {0}
force)r[   getenvsplitpathsepr\   curdirlistdirrO   r
   r]   
compatibler1   existsrV   extendr   r   r	   maxr!   r"   r#   rN   rK   r8   rB   )requirementsrequirements_file
wheel_dirsra   
list_filesdry_runZ	wheelpathZ
all_wheelsdwrE   r   fd
to_installreqmsgmatchesr   r   r   rK      s^    		rK   c             C   s   y  d d l  m } d d l } Wn t k
 r@ t d   Yn Xxd |  D]\ } | j |  } t j j |  } | j | j	  } d g | _
 | j   | j |  qH Wd S)zQ
    Regenerate the entry_points console_scripts for the named distribution.
    r   )easy_installNz)'wheel install_scripts' needs setuptools.r   )Zsetuptools.commandrw   r   r   r   get_distributionr   pathsZget_install_commanddistributionargsfinalize_optionsZinstall_egg_scripts)distributionsrw   r   distZpkg_resources_distrK   commandr   r   r   install_scripts   s    
r   c             C   s   t  d  d d l m } d d l m } x |  D] } x t |  D] } t j j |  d d k ro | } n | } | r t j	 j
 d j |   t j	 j   n  | | |  | rD t j	 j
 d  qD qD Wq1 Wd  S)	Nzwheel convertr   )bdist_wininst2wheel)	egg2wheelr2   z.eggz{0}... zOK
)r   Zwininst2wheelr   r   r   r[   r\   splitextr!   r"   r#   r   flush)
installersdest_dirverboser   r   pat	installerconvr   r   r   convert   s    
	r   c                 s  t  j       j d d  }  d d   } |  j d d d } | j d |  d d	   } |  j d
 d d } | j d d d | j d |  d d   } |  j d d t j } | j d d d | j d |  d d   } |  j d d t j } | j d d d | j d |  d d   }	 |  j d d d }
 |
 j d d d d d d |
 j d d d |
 j d |	  d d   } |  j d d d  } | j d! d" d# d d$ | j d% d d& d' d( d d) | j d* d d' d+ d, d- d d. | j d/ d0 d d1 | j d2 d3 d d& d, d4 d' d( d d5 | j d |  d6 d7   } |  j d8 d d9 } | j d: d" d# d d; | j d |  d< d=   } |  j d> d d? } | j d@ d" d# d dA | j dB d d t	 j
 j d dC | j dD dE d' d( | j d |  dF dG   } |  j dH d dI } | j d |    f dJ dK   } |  j d d dL } | j d |    S)MNhelpcommandsc             S   s   t    d  S)N)r0   )r{   r   r   r   keygen_f  s    zparser.<locals>.keygen_fr0   zGenerate signing keyfuncc             S   s   t  |  j  d  S)N)r>   rC   )r{   r   r   r   sign_f  s    zparser.<locals>.sign_fr>   z
Sign wheelrC   z
Wheel filec             S   s   t  |  j  d  S)N)rR   rC   )r{   r   r   r   unsign_f  s    zparser.<locals>.unsign_frR   c             S   s   t  |  j  d  S)N)rW   rC   )r{   r   r   r   verify_f  s    zparser.<locals>.verify_frW   c             S   s   t  |  j |  j  d  S)N)r`   rC   r_   )r{   r   r   r   unpack_f#  s    zparser.<locals>.unpack_fr`   zUnpack wheelz--destz-dzDestination directorydefaultrY   c             S   s)   t  |  j |  j |  j |  j |  j  d  S)N)rK   rk   rl   rm   ra   rn   )r{   r   r   r   	install_f+  s    zparser.<locals>.install_frK   zInstall wheelsrk   nargs*zRequirements to install.z--forceFaction
store_truez!Install incompatible wheel files.z--wheel-dirr1   r_   rm   zDirectories containing wheels.z--requirements-filez-rz*A file containing requirements to install.z--listz-lrn   zJList wheels which would be installed, but don't actually install anything.c             S   s   t  |  j  d  S)N)r   r}   )r{   r   r   r   install_scripts_fA  s    z!parser.<locals>.install_scripts_fzinstall-scriptszInstall console_scriptsr}   z2Regenerate console_scripts for these distributionsc             S   s   t  |  j |  j |  j  d  S)N)r   r   r   r   )r{   r   r   r   	convert_fH  s    zparser.<locals>.convert_fr   zConvert egg or wininst to wheelr   zInstallers to convertz
--dest-dirz/Directory to store wheels (default %(default)s)z	--verbosez-vc             S   s(   d d l  m } t j j d |  d  S)Nr   )__version__z	wheel %s
) r   r!   r"   r#   )r{   r   r   r   r   	version_fQ  s    zparser.<locals>.version_fversionzPrint version and exitc                s     j    d  S)N)
print_help)r{   )pr   r   help_fW  s    zparser.<locals>.help_fzShow this help)argparseArgumentParserZadd_subparsersZ
add_parserset_defaultsadd_argumentrR   __doc__rW   r[   r\   re   )sr   Zkeygen_parserr   Zsign_parserr   Zunsign_parserr   Zverify_parserr   Zunpack_parserr   Zinstall_parserr   Zinstall_scripts_parserr   Zconvert_parserr   Zversion_parserr   Zhelp_parserr   )r   r   parser  sv    r   c              C   s   t    }  |  j   } t | d  s1 |  j   nT y | j |  d SWn< t k
 r } z t j j | j	 d  WYd  d  } ~ Xn Xd S)Nr   r   rT   r2   )
r   
parse_argshasattrr   r   r   r!   rX   r#   message)r   r{   er   r   r   main^  s    	*r   )!r   r[   r;   r!   r@   Zwheel.pathsr   globr   r   r   utilr   r   r   r   r	   rK   r
   r   r   	Exceptionr   r   r0   r>   rR   rW   r`   r   r   r   r   r   r   r   r   <module>   s2   (	SV