3

g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jdZejd	Zejd
ZejdZerd dlmZmZ d dlmZ d dlmZ d dlmZmZ eje Z!G dd deZ"ej#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svn+sshsvn+http	svn+httpssvn+svnc             C   s   dS )NT )cls
remote_urlr   r   @/tmp/pip-unpacked-wheel-v59g9nu1/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}xt 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| rg |dd< qt	||}qW |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| j||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   r7   O   s    zSubversion.get_netloc_and_authc                s2   t t| j|\}}}|jdr(d| }|||fS )Nzssh://zsvn+)r6   r   get_url_rev_and_authr*   )r   urlr   	user_pass)r:   r   r   r;   \   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   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   )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|| jd}tjj|rHt|}|j }W d Q R X nd}|j	dsj|j	dsj|j	drt
ttj|jd}|d d= |d d	 }d
d |D dg }n|j	drtj|}|st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   )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 |jd qS )rS   )rO   group)rP   mr   r   r   rR      s    infoz--xmlF)show_stdoutc             S   s   g | ]}t |jd qS )rS   )rO   rT   )rP   rU   r   r   r   rR      s    )pip._internal.exceptionsrG   r"   r&   r'   r$   r(   openreadr*   listmapstr
splitlinessplit_svn_xml_url_research
ValueErrorrT   _svn_rev_refinditerrun_command_svn_info_xml_url_re_svn_info_xml_rev_rer+   )r   r,   rG   entries_pathfdatar<   revsmatchxmlr   r   r   r   r)      s>    








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| j  d S )N)r   use_interactive_vcs_versionr6   r   __init__)selfrq   )r:   r   r   rs      s
    zSubversion.__init__c             C   sp   d}| j dgdd}|j|s"f S |t|d j d }|jd}yttt|}W n tk
rj   f 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	--versionF)rW   Nr   .)re   r*   rN   r_   tupler\   rO   rb   )rt   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 | j }|| _ |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)rr   r{   )rt   vcs_versionr   r   r   get_vcs_version   s
    
zSubversion.get_vcs_versionc             C   s&   | j sdgS | j }|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-interactiverS      z--force-interactive)rS   r~   )rq   r}   )rt   svn_versionr   r   r   get_remote_call_options   s    	z"Subversion.get_remote_call_optionsc             C   sl   | j |\}}tjd|| t @ tjj|r8t| td| j	 |j
 ||}| j|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)rW   N)get_url_rev_optionsrB   rV   r   r"   r&   r(   r   r   r   to_argsre   )rt   r,   r<   rev_optionscmd_argsr   r   r   r     s    zSubversion.exportc             C   sD   |j  }tjd||t| tdd| j |j ||}| j| d S )NzChecking out %s%s to %sr   z-q)
to_displayrB   rV   r   r   r   r   re   )rt   rn   r<   r   rev_displayr   r   r   r   	fetch_new-  s    

zSubversion.fetch_newc             C   s&   t d| j |j ||}| j| d S )Nswitch)r   r   r   re   )rt   rn   r<   r   r   r   r   r   r   <  s    zSubversion.switchc             C   s$   t d| j |j |}| j| d S )Nupdate)r   r   r   re   )rt   rn   r<   r   r   r   r   r   r   D  s    zSubversion.update)r   r   r   r   r   )N)__name__
__module____qualname__ro   r$   	repo_nameschemesclassmethodr   staticmethodr   r4   r7   r;   rA   rF   r)   rp   rs   r{   r}   r   r   r   r   r   __classcell__r   r   )r:   r   r   %   s*   	2!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   compiler`   rc   rg   rf   typingr   r   r   r   r   r   	getLoggerr   rB   r   registerr   r   r   r   <module>   s,   




  *