
§|j†$  ã               @   s,  d  d l  m 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 d  d l m Z d  d l m Z m Z e j d ƒ Z e j d	 ƒ Z e j d
 ƒ Z e j d ƒ Z e j d ƒ Z e j d ƒ Z e j e ƒ Z Gd d „  d e ƒ Z d d „  Z e j e ƒ d S)é    )Úabsolute_importN)Úparse)ÚLink)ÚrmtreeÚdisplay_path)Ú
indent_log)ÚvcsÚVersionControlzurl="([^"]+)"zcommitted-rev="(\d+)"z	URL: (.+)zRevision: (.+)z\s*revision="(\d+)"z<url>(.*)</url>c                   sÐ   e  Z d  Z d Z d Z d Z d" Z d d	 „  Z d
 d „  Z d d „  Z	 d d „  Z
 d d „  Z d d „  Z d d „  Z ‡  f d d †  Z d d „  Z d d „  Z d d „  Z d d „  Z e d  d! „  ƒ Z ‡  S)#Ú
SubversionÚsvnz.svnÚcheckoutúsvn+sshúsvn+httpú	svn+httpsúsvn+svnc             C   sÿ   | j  d ƒ j |  j ƒ s, t d | ƒ ‚ |  j d | g d d d d d i ƒ} t j | ƒ } | s’ t j d	 t	 | ƒ ƒ t j
 d
 | ƒ d S| j d ƒ j ƒ  } t j | ƒ } | sì t j d t	 | ƒ ƒ t j
 d
 | ƒ | d f S| | j d ƒ f S)z/Returns (url, revision), where both are stringsú/zBad directory: %sÚinfoÚshow_stdoutFÚextra_environÚLANGÚCz'Cannot determine URL of svn checkout %sz!Output that cannot be parsed: 
%sNé   z,Cannot determine revision of svn checkout %s)NN)ÚrstripÚendswithÚdirnameÚAssertionErrorÚrun_commandÚ_svn_url_reÚsearchÚloggerÚwarningr   ÚdebugÚgroupÚstripÚ_svn_revision_re)ÚselfÚlocationÚoutputÚmatchÚurl© r*   ú1/tmp/pip-build-5c7ija6t/pip/pip/vcs/subversion.pyÚget_info   s,    
zSubversion.get_infoc             C   s˜   |  j  ƒ  \ } } t | | ƒ } |  j | ƒ } t j d | | ƒ t ƒ  �E t j j | ƒ ri t	 | ƒ |  j
 d g | | | g d d ƒWd QRXd S)z@Export the svn repository at the url to the destination locationz!Exporting svn repository %s to %sÚexportr   FN)Úget_url_revÚget_rev_optionsÚremove_auth_from_urlr   r   r   ÚosÚpathÚexistsr   r   )r%   r&   r)   ÚrevÚrev_optionsr*   r*   r+   r-   ;   s    

zSubversion.exportc             C   s"   |  j  d g | | | g ƒ d  S)NÚswitch)r   )r%   Údestr)   r5   r*   r*   r+   r6   J   s    zSubversion.switchc             C   s   |  j  d g | | g ƒ d  S)NÚupdate)r   )r%   r7   r5   r*   r*   r+   r8   M   s    zSubversion.updatec             C   s¢   |  j  ƒ  \ } } t | | ƒ } |  j | ƒ } | rC d | } n d } |  j | | | | ƒ rž t j d | | t | ƒ ƒ |  j d d g | | | g ƒ d  S)Nz (to revision %s)Ú zChecking out %s%s to %sr   z-q)r.   r/   r0   Úcheck_destinationr   r   r   r   )r%   r7   r)   r4   r5   Úrev_displayr*   r*   r+   ÚobtainP   s    zSubversion.obtainc             C   s�   x† | D]~ } t  | ƒ j } | s% q d | k r\ d j | j d ƒ d  d … ƒ j ƒ  } n | } | | j k r | j d d ƒ d Sq Wd  S)Nú-r   ú#r   éÿÿÿÿ)r   Úegg_fragmentÚjoinÚsplitÚlowerÚkey)r%   ÚdistÚdependency_linksr)   r@   rD   r*   r*   r+   Úget_locationa   s    +zSubversion.get_locationc       
      C   sö   d } xé t  j | ƒ D]Ø \ } } } |  j | k rG g  | d d … <q | j |  j ƒ t  j j | |  j d ƒ } t  j j | ƒ s‡ q |  j | ƒ \ } } | | k rµ | d }	 n* | sÌ | j |	 ƒ rß g  | d d … <q t	 | | ƒ } q W| S)zR
        Return the maximum revision for all files under a given location
        r   NÚentriesr   )
r1   Úwalkr   Úremover2   rA   r3   Ú_get_svn_url_revÚ
startswithÚmax)
r%   r&   ÚrevisionÚbaseÚdirsÚfilesÚ
entries_fnÚdirurlÚlocalrevÚbase_urlr*   r*   r+   Úget_revisiono   s"    zSubversion.get_revisionc                s>   t  t |  ƒ j ƒ  \ } } | j d ƒ r4 d | } | | f S)Nzssh://zsvn+)Úsuperr
   r.   rL   )r%   r)   r4   )Ú	__class__r*   r+   r.   Š   s    
zSubversion.get_url_revc             C   sw   | } x] t  j j t  j j | d ƒ ƒ se | } t  j j | ƒ } | | k r	 t j d | ƒ d  Sq	 W|  j | ƒ d S)Nzsetup.pyzGCould not find setup.py for directory %s (tried all parent directories)r   )r1   r2   r3   rA   r   r   r    rK   )r%   r&   Úorig_locationÚlast_locationr*   r*   r+   Úget_url‘   s    $zSubversion.get_urlc             C   sò  d d l  m } t j j | |  j d ƒ } t j j | ƒ rb t | ƒ � } | j ƒ  } Wd  QRXn d } | j	 d ƒ s• | j	 d ƒ s• | j	 d ƒ rì t
 t t j | j d ƒ ƒ ƒ } | d d =| d d	 } d
 d „  | Dƒ d g } ná | j	 d ƒ rUt j | ƒ } | s t d | ƒ ‚ | j d ƒ } d d „  t j | ƒ Dƒ d g } nx yV |  j d d | g d d ƒ}	 t j |	 ƒ j d ƒ } d d „  t j |	 ƒ Dƒ } Wn | k
 rÌd  g  } } Yn X| rât | ƒ }
 n d }
 | |
 f S)Nr   )ÚInstallationErrorrH   r9   Ú8Ú9Ú10z

é   c             S   s<   g  |  ]2 } t  | ƒ d  k r | d  r t | d  ƒ ‘ q S)é	   )ÚlenÚint)Ú.0Údr*   r*   r+   ú
<listcomp>µ   s   	 z/Subversion._get_svn_url_rev.<locals>.<listcomp>z<?xmlzBadly formatted data: %rr   c             S   s%   g  |  ] } t  | j d  ƒ ƒ ‘ q S)r   )rc   r"   )rd   Úmr*   r*   r+   rf   »   s   	 r   z--xmlr   Fc             S   s%   g  |  ] } t  | j d  ƒ ƒ ‘ q S)r   )rc   r"   )rd   rg   r*   r*   r+   rf   Å   s   	 )Úpip.exceptionsr\   r1   r2   rA   r   r3   ÚopenÚreadrL   ÚlistÚmapÚstrÚ
splitlinesrB   Ú_svn_xml_url_rer   Ú
ValueErrorr"   Ú_svn_rev_reÚfinditerr   Ú_svn_info_xml_url_reÚ_svn_info_xml_rev_rerM   )r%   r&   r\   Úentries_pathÚfÚdatar)   Úrevsr(   Úxmlr4   r*   r*   r+   rK   ¥   s>    !&	 zSubversion._get_svn_url_revc             C   s[   |  j  | ƒ } | d  k r d  S| j ƒ  j d d ƒ d } |  j | ƒ } d | | | f S)Nr=   r   r   zsvn+%s@%s#egg=%s)r[   Úegg_namerB   rV   )r%   rE   r&   ÚrepoÚegg_project_namer4   r*   r*   r+   Úget_src_requirementÑ   s    zSubversion.get_src_requirementc             C   s   d S)z&Always assume the versions don't matchFr*   )r%   r7   r5   r*   r*   r+   Úcheck_versionÚ   s    zSubversion.check_versionc             C   sY   t  j |  ƒ } | j j d ƒ d } | j | | j | j | j f } t  j | ƒ } | S)Nú@r   r?   )	Úurllib_parseÚurlsplitÚnetlocrB   Úschemer2   ÚqueryÚfragmentÚ
urlunsplit)r)   ÚpurlÚstripped_netlocÚ
url_piecesÚsurlr*   r*   r+   r0   Þ   s
    !zSubversion.remove_auth_from_url)r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Únamer   Ú	repo_nameÚschemesr,   r-   r6   r8   r<   rG   rV   r.   r[   rK   r}   r~   Ústaticmethodr0   r*   r*   )rX   r+   r
      s"   ,	r
   c             C   së   | r d | g } n g  } t  j |  ƒ } t | d ƒ rO | j | j } } nl | d } d | k r¯ | j d ƒ d } d | k rŸ | j d d ƒ \ } } q» | d  } } n d	 \ } } | rÑ | d | g 7} | rç | d | g 7} | S)
Nz-rÚusernamer   r   r   ú:z
--usernamez
--password)NN)r€   r�   Úhasattrr’   ÚpasswordrB   )r)   r4   r5   Úrr’   r•   r‚   Úauthr*   r*   r+   r/   ñ   s$    
r/   )Ú
__future__r   Úloggingr1   ÚreZpip._vendor.six.moves.urllibr   r€   Ú	pip.indexr   Ú	pip.utilsr   r   Úpip.utils.loggingr   Úpip.vcsr   r	   Úcompilero   rq   r   r$   rt   rs   Ú	getLoggerr‹   r   r
   r/   Úregisterr*   r*   r*   r+   Ú<module>   s$   Ø