U
    "Iƒb0  ã                   @   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m	Z	m
Z
mZ d dl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rÔd dlmZmZ d dlmZ d dlmZ d dlmZmZ e e ¡Z!G dd„ deƒZ"e #e"¡ dS )é    )Úabsolute_importN)Ú
indent_log)Údisplay_pathÚis_console_interactiveÚrmtreeÚsplit_auth_from_netloc)Úmake_command)ÚMYPY_CHECK_RUNNING)ÚVersionControlÚvcszurl="([^"]+)"zcommitted-rev="(\d+)"z\s*revision="(\d+)"z<url>(.*)</url>)ÚOptionalÚTuple)ÚCommandArgs)Ú
HiddenText)ÚAuthInfoÚ
RevOptionsc                       sÚ   e Zd ZdZdZdZdZedd„ ƒZe	dd„ ƒZ
ed	d
„ ƒZe‡ fdd„ƒZe‡ fdd„ƒZe	dd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZd(‡ fdd„	Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Z‡  ZS ))Ú
SubversionÚsvnz.svnÚcheckout)r   zsvn+sshzsvn+httpz	svn+httpszsvn+svnc                 C   s   dS )NT© )ÚclsÚ
remote_urlr   r   ú@/tmp/pip-unpacked-wheel-fcn5djv6/pip/_internal/vcs/subversion.pyÚshould_add_vcs_url_prefix+   s    z$Subversion.should_add_vcs_url_prefixc                 C   s   d| gS )Nz-rr   )Úrevr   r   r   Úget_base_rev_args/   s    zSubversion.get_base_rev_argsc           	      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Úentriesú/)
ÚosÚwalkÚdirnameÚremoveÚpathÚjoinÚexistsÚ_get_svn_url_revÚ
startswithÚmax)	r   ÚlocationÚrevisionÚbaseÚdirsÚfilesÚ
entries_fnÚdirurlÚlocalrevr   r   r   Úget_revision3   s"    

zSubversion.get_revisionc                    s"   |dkrt t| ƒ ||¡S t|ƒS )z™
        This override allows the auth information to be passed to svn via the
        --username and --password options instead of via the URL.
        Ússh)Úsuperr   Úget_netloc_and_authr   )r   ÚnetlocÚscheme©Ú	__class__r   r   r3   O   s    zSubversion.get_netloc_and_authc                    s2   t t| ƒ |¡\}}}| d¡r(d| }|||fS )Nzssh://zsvn+)r2   r   Úget_url_rev_and_authr&   )r   Úurlr   Ú	user_passr6   r   r   r8   \   s    
zSubversion.get_url_rev_and_authc                 C   s(   g }| r|d| g7 }|r$|d|g7 }|S )Nz
--usernamez
--passwordr   )ÚusernameÚpasswordÚ
extra_argsr   r   r   Úmake_rev_argse   s    zSubversion.make_rev_argsc                 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   r"   r$   r#   r    ÚloggerÚwarningr%   )r   r(   Úorig_locationÚlast_locationr   r   r   Úget_remote_urlp   s    ýzSubversion.get_remote_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   )ÚInstallationErrorr   Ú Ú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: %ré   c                 S   s   g | ]}t | d ¡ƒ‘qS ©rP   ©rL   Úgroup©rM   Úmr   r   r   rO   œ   s     Úinfoz--xmlF©Úshow_stdoutc                 S   s   g | ]}t | d ¡ƒ‘qS rQ   rR   rT   r   r   r   rO   ª   s    )Úpip._internal.exceptionsrD   r   r"   r#   r    r$   ÚopenÚreadr&   ÚlistÚmapÚstrÚ
splitlinesÚsplitÚ_svn_xml_url_reÚsearchÚ
ValueErrorrS   Ú_svn_rev_reÚfinditerÚrun_commandÚ_svn_info_xml_url_reÚ_svn_info_xml_rev_rer'   )r   r(   rD   Úentries_pathÚfÚdatar9   ÚrevsÚmatchÚxmlr   r   r   r   r%   …   sH    

ÿþ



þÿ

zSubversion._get_svn_url_revc                 C   s   dS )z&Always assume the versions don't matchFr   )r   ÚdestÚnamer   r   r   Úis_commit_id_equal·   s    zSubversion.is_commit_id_equalNc                    s,   |d krt ƒ }|| _d | _tt| ƒ ¡  d S )N)r   Úuse_interactiveÚ_vcs_versionr2   r   Ú__init__)Úselfrr   r6   r   r   rt   ¼   s
    zSubversion.__init__c                 C   sr   d}| j dgdd}| |¡s"dS |t|ƒd…  ¡ d }| d¡}zttt|ƒƒ}W n tk
rl   Y dS X |S )	a  Query the version of the currently installed Subversion client.

        :return: A tuple containing the parts of the version information or
            ``()`` if the version returned from ``svn`` could not be parsed.
        :raises: BadCommand: If ``svn`` is not installed.
        zsvn, version z	--versionFrW   r   Nr   Ú.)rf   r&   rK   r`   Útupler]   rL   rc   )ru   Úversion_prefixÚversionÚversion_listÚparsed_versionr   r   r   Úcall_vcs_versionË   s    

zSubversion.call_vcs_versionc                 C   s"   | j dk	r| j S |  ¡ }|| _ |S )a  Return the version of the currently installed Subversion client.

        If the version of the Subversion client has already been queried,
        a cached value will be used.

        :return: A tuple containing the parts of the version information or
            ``()`` if the version returned from ``svn`` could not be parsed.
        :raises: BadCommand: If ``svn`` is not installed.
        N)rs   r|   )ru   Úvcs_versionr   r   r   Úget_vcs_versionæ   s
    
zSubversion.get_vcs_versionc                 C   s&   | j sdgS |  ¡ }|dkr"dgS g S )aX  Return options to be used on calls to Subversion that contact the server.

        These options are applicable for the following ``svn`` subcommands used
        in this class.

            - checkout
            - export
            - switch
            - update

        :return: A list of command line arguments to pass to ``svn``.
        z--non-interactive)rP   é   z--force-interactive)rr   r~   )ru   Úsvn_versionr   r   r   Úget_remote_call_optionsû   s    	z"Subversion.get_remote_call_optionsc              	   C   sl   |   |¡\}}t d||¡ tƒ @ tj |¡r8t|ƒ td|  	¡ | 
¡ ||ƒ}| j|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ÚexportFrW   N)Úget_url_rev_optionsr?   rV   r   r   r"   r$   r   r   r   Úto_argsrf   )ru   r(   r9   Úrev_optionsÚcmd_argsr   r   r   r‚     s       þzSubversion.exportc                 C   sD   |  ¡ }t d||t|ƒ¡ tdd|  ¡ | ¡ ||ƒ}|  |¡ d S )NzChecking out %s%s to %sr   z-q)Ú
to_displayr?   rV   r   r   r   r„   rf   )ru   ro   r9   r…   Úrev_displayr†   r   r   r   Ú	fetch_new-  s     ü    þzSubversion.fetch_newc                 C   s&   t d|  ¡ | ¡ ||ƒ}|  |¡ d S )NÚswitch©r   r   r„   rf   ©ru   ro   r9   r…   r†   r   r   r   rŠ   <  s       þzSubversion.switchc                 C   s$   t d|  ¡ | ¡ |ƒ}|  |¡ d S )NÚupdater‹   rŒ   r   r   r   r   D  s      þzSubversion.update)N)Ú__name__Ú
__module__Ú__qualname__rp   r    Ú	repo_nameÚschemesÚclassmethodr   Ústaticmethodr   r0   r3   r8   r>   rC   r%   rq   rt   r|   r~   r   r‚   r‰   rŠ   r   Ú__classcell__r   r   r6   r   r   %   s<   






1
!r   )$Ú
__future__r   Úloggingr   ÚreÚpip._internal.utils.loggingr   Úpip._internal.utils.miscr   r   r   r   Úpip._internal.utils.subprocessr   Úpip._internal.utils.typingr	   Ú pip._internal.vcs.versioncontrolr
   r   Úcompilera   rd   rh   rg   Útypingr   r   r   r   r   r   Ú	getLoggerrŽ   r?   r   Úregisterr   r   r   r   Ú<module>   s,   




  *