3
zYði†$  ã               @   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G d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‡  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id�}tj|ƒ}|sft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ÚinfoFÚLANGÚC)Úshow_stdoutÚextra_environz'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-ue6tjl93/pip/pip/vcs/subversion.pyÚget_info   s,    




zSubversion.get_infoc             C   st   | j ƒ \}}t||ƒ}| j|ƒ}tjd||ƒ tƒ �6 tjj|ƒrJt	|ƒ | j
dg| ||g dd� W d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   | 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   st   | j ƒ \}}t||ƒ}| j|ƒ}|r.d| }nd}| j||||ƒrpt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   sf   x`|D ]X}t |ƒj}|sqd|kr@dj|jdƒd d… ƒjƒ }n|}||jkr|jddƒd S qW 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}x¦t j|ƒD ]˜\}}}| j|kr2g |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ƒr$d| }||fS )Nzssh://zsvn+)Úsuperr
   r.   rL   )r%   r)   r4   )Ú	__class__r*   r+   r.   Š   s    
zSubversion.get_url_revc             C   sV   |}xBt jjt jj|dƒƒsF|}t jj|ƒ}||krtjd|ƒ d S q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   sp  ddl m} tjj|| jdƒ}tjj|ƒrHt|ƒ�}|jƒ }W d Q R X nd}|j	dƒsj|j	dƒsj|j	dƒr¬t
ttj|jdƒƒƒ}|d d= |d d	 }d
d„ |D ƒdg }n¨|j	dƒrötj|ƒ}|sÐtd| ƒ‚|jdƒ}dd„ tj|ƒD ƒdg }n^y<| jdd|gdd�}	tj|	ƒjdƒ}dd„ tj|	ƒ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 |jd ƒƒ‘qS )r   )rc   r"   )rd   Úmr*   r*   r+   rf   »   s    r   z--xmlF)r   c             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   sB   | 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   s>   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   Ú__classcell__r*   r*   )rX   r+   r
      s"   ,	r
   c             C   s¦   |rd|g}ng }t j| ƒ}t|dƒr6|j|j }}nL|d }d|krz|jdƒd }d|krn|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&   






 Y