U
    KQh†$  ã                   @   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 d¡Ze d	¡Ze d
¡Ze d¡Ze d¡Ze d¡Ze e¡ZG dd„ deƒZdd„ Ze 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‡  ZS )Ú
SubversionÚsvnz.svnÚcheckout)r   zsvn+sshzsvn+httpz	svn+httpszsvn+svnc                 C   s²   |  d¡ | j¡rtd| ƒ‚| jd|gdddid}t |¡}|sdt dt	|ƒ¡ t 
d	|¡ d
S | d¡ ¡ }t |¡}|s¤t dt	|ƒ¡ t 
d	|¡ |dfS || d¡fS )z/Returns (url, revision), where both are stringsú/zBad directory: %sÚinfoFÚLANGÚC)Úshow_stdoutÚextra_environz'Cannot determine URL of svn checkout %sz!Output that cannot be parsed: 
%s©NNé   z,Cannot determine revision of svn checkout %sN)Ú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-tlro1kwj/pip/pip/vcs/subversion.pyÚget_info   s4    ÿý
þ
þzSubversion.get_infoc              	   C   st   |   ¡ \}}t||ƒ}|  |¡}t d||¡ tƒ 6 tj |¡rJt	|ƒ | j
dg| ||g dd W 5 Q R X dS )z@Export the svn repository at the url to the destination locationz!Exporting svn repository %s to %sÚexportF©r   N)Ú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   |   dg| ||g ¡ d S )NÚswitch©r   )r"   Údestr&   r3   r'   r'   r(   r4   J   s    zSubversion.switchc                 C   s   |   dg| |g ¡ d S )NÚupdater5   ©r"   r6   r3   r'   r'   r(   r7   M   s    zSubversion.updatec                 C   st   |   ¡ \}}t||ƒ}|  |¡}|r.d| }nd}|  ||||¡rpt d||t|ƒ¡ |  ddg| ||g ¡ d S )Nz (to revision %s)Ú zChecking out %s%s to %sr   z-q)r,   r-   r.   Úcheck_destinationr   r   r   r   )r"   r6   r&   r2   r3   Úrev_displayr'   r'   r(   ÚobtainP   s    


üzSubversion.obtainc                 C   sf   |D ]\}t |ƒj}|sqd|kr>d | d¡d d… ¡ ¡ }n|}||jkr| dd¡d   S qd 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}t  |¡D ]”\}}}| j|kr0g |dd…< q| | j¡ t j || jd¡}t j |¡s\q|  |¡\}}||kr||d }	n|rŠ| |	¡s˜g |dd…< qt	||ƒ}q|S )zR
        Return the maximum revision for all files under a given location
        r   NÚentriesr   )
r/   Úwalkr   Úremover0   rA   r1   Ú_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| ƒ ¡ \}}| d¡r$d| }||fS )Nzssh://zsvn+)Úsuperr
   r,   rL   )r"   r&   r2   ©Ú	__class__r'   r(   r,   Š   s    
zSubversion.get_url_revc                 C   sR   |}t j t j |d¡¡sD|}t j |¡}||krt d|¡ d S q|  |¡d S )Nzsetup.pyzGCould not find setup.py for directory %s (tried all parent directories)r   )r/   r0   r1   rA   r   r   r   rK   )r"   r#   Úorig_locationÚlast_locationr'   r'   r(   Úget_url‘   s    ýzSubversion.get_urlc              	   C   sp  ddl m} tj || jd¡}tj |¡rHt|ƒ}| ¡ }W 5 Q R X nd}| 	d¡sj| 	d¡sj| 	d¡r¬t
ttj| d¡ƒƒ}|d d= |d d	 }d
d„ |D ƒdg }n¨| 	d¡röt |¡}|sÐtd| ƒ‚| d¡}dd„ t |¡D ƒdg }n^z<| jdd|gdd}	t |	¡ d¡}dd„ t |	¡D ƒ}W n  |k
rR   d g  }}Y nX |rdt|ƒ}
nd}
||
fS )Nr   )ÚInstallationErrorrH   r9   Ú8Ú9Ú10z

é   c                 S   s,   g | ]$}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 | d ¡ƒ‘qS ©r   ©rd   r   ©re   Úmr'   r'   r(   rg   »   s     r   z--xmlFr+   c                 S   s   g | ]}t | d ¡ƒ‘qS rh   ri   rj   r'   r'   r(   rg   Ä   s    )Úpip.exceptionsr]   r/   r0   rA   r   r1   Ú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%   Úxmlr2   r'   r'   r(   rK   ¥   sH    

ÿþ



þÿ

zSubversion._get_svn_url_revc                 C   sB   |   |¡}|d krd S | ¡  dd¡d }|  |¡}d|||f S )Nr=   r   r   zsvn+%s@%s#egg=%s)r\   Úegg_namerB   rV   )r"   rE   r#   ÚrepoÚegg_project_namer2   r'   r'   r(   Úget_src_requirementÑ   s    

zSubversion.get_src_requirementc                 C   s   dS )z&Always assume the versions don't matchFr'   r8   r'   r'   r(   Úcheck_versionÚ   s    zSubversion.check_versionc                 C   s>   t  | ¡}|j d¡d }|j||j|j|jf}t  |¡}|S )Nú@r>   )	Úurllib_parseÚurlsplitÚnetlocrB   Úschemer0   ÚqueryÚfragmentÚ
urlunsplit)r&   ÚpurlÚstripped_netlocÚ
url_piecesÚsurlr'   r'   r(   r.   Þ   s    
ÿ    ÿ
zSubversion.remove_auth_from_url)Ú__name__Ú
__module__Ú__qualname__Únamer   Ú	repo_nameÚschemesr)   r*   r4   r7   r<   rG   rV   r,   r\   rK   r   r‚   Ústaticmethodr.   Ú__classcell__r'   r'   rX   r(   r
      s$   ,	r
   c                 C   s¦   |rd|g}ng }t  | ¡}t|dƒr6|j|j }}nL|d }d|krz| d¡d }d|krn| dd¡\}}q‚|d  }}nd\}}|r’|d|g7 }|r¢|d	|g7 }|S )
Nz-rÚusernamer   rƒ   r   ú:r   z
--usernamez
--password)r„   r…   Úhasattrr—   ÚpasswordrB   )r&   r2   r3   Úrr—   rš   r†   Úauthr'   r'   r(   r-   ñ   s$    


r-   )Ú
__future__r   Úloggingr/   ÚreZpip._vendor.six.moves.urllibr   r„   Ú	pip.indexr   Ú	pip.utilsr   r   Úpip.utils.loggingr   Úpip.vcsr   r	   Úcompilers   ru   r   r!   rx   rw   Ú	getLoggerr   r   r
   r-   Úregisterr'   r'   r'   r(   Ú<module>   s&   






 Y