B
    žHeÑ-  ã               @   sÄ   d dl Z d dlZd dlZd dlmZmZmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZ d dlmZmZmZmZmZ e  e¡Ze d¡Ze d¡Ze d¡Ze d	¡ZG d
d„ deƒZe e¡ dS )é    N)ÚListÚOptionalÚTuple)Ú
HiddenTextÚdisplay_pathÚis_console_interactiveÚis_installable_dirÚsplit_auth_from_netloc)ÚCommandArgsÚmake_command)ÚAuthInfoÚRemoteNotFoundErrorÚ
RevOptionsÚVersionControlÚvcszurl="([^"]+)"zcommitted-rev="(\d+)"z\s*revision="(\d+)"z<url>(.*)</url>c            	       s¶  e Zd ZdZdZdZdZeee	dœdd„ƒZ
eeee dœd	d
„ƒZeeedœdd„ƒZeeeeeeee ee f f dœ‡ fdd„ƒZeeeeee ef dœ‡ fdd„ƒZeee ee edœdd„ƒZeeedœdd„ƒZeeeee ef dœdd„ƒZeeee e	dœdd„ƒZd2ee	 ddœ‡ fd d!„Zeed"f d#œd$d%„Zeed"f d#œd&d'„Zed#œd(d)„Zeeeedd*œd+d,„Z eeedd-œd.d/„Z!eeedd-œd0d1„Z"‡  Z#S )3Ú
SubversionÚsvnz.svnÚcheckout)zsvn+sshzsvn+httpz	svn+httpszsvn+svnzsvn+file)Ú
remote_urlÚreturnc             C   s   dS )NT© )Úclsr   r   r   úp/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.pyÚshould_add_vcs_url_prefix$   s    z$Subversion.should_add_vcs_url_prefix)Úrevr   c             C   s   d| gS )Nz-rr   )r   r   r   r   Úget_base_rev_args(   s    zSubversion.get_base_rev_args)Úlocationr   c       	      C   s¼   d}x®t  |¡D ] \}}}| j|kr2g |dd…< q| | j¡ t j || jd¡}t j |¡s^q|  |¡\}}||krŠ|dk	s€t‚|d }n|r˜| 	|¡s¦g |dd…< qt
||ƒ}qW t|ƒ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ÚAssertionErrorÚ
startswithÚmaxÚstr)	r   r   ÚrevisionÚbaseÚdirsÚ_Ú
entries_fnÚdirurlÚlocalrevr   r   r   Úget_revision,   s$    

zSubversion.get_revision)ÚnetlocÚschemer   c                s   |dkr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)ÚsuperÚget_netloc_and_authr	   )r   r3   r4   )Ú	__class__r   r   r7   I   s    zSubversion.get_netloc_and_auth)Úurlr   c                s.   t ƒ  |¡\}}}| d¡r$d| }|||fS )Nzssh://zsvn+)r6   Úget_url_rev_and_authr(   )r   r9   r   Ú	user_pass)r8   r   r   r:   X   s    
zSubversion.get_url_rev_and_auth)ÚusernameÚpasswordr   c             C   s(   g }| r|d| g7 }|r$|d|g7 }|S )Nz
--usernamez
--passwordr   )r<   r=   Ú
extra_argsr   r   r   Úmake_rev_args`   s    zSubversion.make_rev_argsc             C   sX   |}x4t |ƒs8|}tj |¡}||krt d|¡ t‚qW |  |¡\}}|d krTt‚|S )NzMCould not find Python project for directory %s (tried all parent directories))r   r   r#   r!   ÚloggerÚwarningr   r&   )r   r   Úorig_locationÚlast_locationr9   Ú_revr   r   r   Úget_remote_urll   s    
zSubversion.get_remote_urlc          	   C   sŠ  ddl m} tj || jd¡}tj |¡rHt|ƒ}| ¡ }W d Q R X nd}d }| 	d¡sn| 	d¡sn| 	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 }nryP| jdd|gddd}
t |
¡}	|	d k	s,t‚|	 d¡}dd„ t |
¡D ƒ}W n  |k
rl   d g  }}Y nX |r~t|ƒ}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: é   c             S   s   g | ]}t | d ¡ƒ‘qS )rR   )rN   Úgroup)rO   Úmr   r   r   rQ   š   s    Úinfoz--xmlFT)Úshow_stdoutÚstdout_onlyc             S   s   g | ]}t | d ¡ƒ‘qS )rR   )rN   rS   )rO   rT   r   r   r   rQ   «   s    )Úpip._internal.exceptionsrF   r   r#   r$   r!   r%   ÚopenÚreadr(   ÚlistÚmapr*   Ú
splitlinesÚsplitÚ_svn_xml_url_reÚsearchÚ
ValueErrorrS   Ú_svn_rev_reÚfinditerÚrun_commandÚ_svn_info_xml_url_rer'   Ú_svn_info_xml_rev_rer)   )r   r   rF   Úentries_pathÚfÚdatar9   r   ÚrevsÚmatchÚxmlr   r   r   r   r&   „   sB    







zSubversion._get_svn_url_rev)ÚdestÚnamer   c             C   s   dS )z&Always assume the versions don't matchFr   )r   rm   rn   r   r   r   Úis_commit_id_equal¶   s    zSubversion.is_commit_id_equalN)Úuse_interactiver   c                s(   |d krt ƒ }|| _d | _tƒ  ¡  d S )N)r   rp   Ú_vcs_versionr6   Ú__init__)Úselfrp   )r8   r   r   rr   »   s
    zSubversion.__init__.)r   c             C   s|   d}| j dgddd}| |¡s$dS |t|ƒd…  ¡ d }| d	¡d  d
¡}yttt|ƒƒ}W n tk
rv   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	--versionFT)rV   rW   r   Nr   ú-Ú.)	rd   r(   rM   r^   Ú	partitionÚtupler\   rN   ra   )rs   Ú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)rq   r|   )rs   Ú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 )aC  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
            - switch
            - update

        :return: A list of command line arguments to pass to ``svn``.
        z--non-interactive)rR   é   z--force-interactive)rp   r~   )rs   Úsvn_versionr   r   r   Úget_remote_call_optionsù   s    	z"Subversion.get_remote_call_options)rm   r9   Úrev_optionsÚ	verbosityr   c             C   sV   |  ¡ }t d||t|ƒ¡ |dkr*d}nd}td||  ¡ | ¡ ||ƒ}|  |¡ d S )NzChecking out %s%s to %sr   z--quietrG   r   )Ú
to_displayr@   rU   r   r   r   Úto_argsrd   )rs   rm   r9   r‚   rƒ   Úrev_displayÚflagÚcmd_argsr   r   r   Ú	fetch_new  s"    
zSubversion.fetch_new)rm   r9   r‚   r   c             C   s&   t d|  ¡ | ¡ ||ƒ}|  |¡ d S )NÚswitch)r   r   r…   rd   )rs   rm   r9   r‚   rˆ   r   r   r   rŠ   0  s    zSubversion.switchc             C   s$   t d|  ¡ | ¡ |ƒ}|  |¡ d S )NÚupdate)r   r   r…   rd   )rs   rm   r9   r‚   rˆ   r   r   r   r‹   :  s    zSubversion.update)N)$Ú__name__Ú
__module__Ú__qualname__rn   r!   Ú	repo_nameÚschemesÚclassmethodr*   Úboolr   Ústaticmethodr   r   r2   r   r   r7   r   r:   r   r
   r?   rE   rN   r&   ro   rr   r|   r~   r   r   r‰   rŠ   r‹   Ú__classcell__r   r   )r8   r   r      s@   ,$	1 
r   ) Úloggingr   ÚreÚtypingr   r   r   Úpip._internal.utils.miscr   r   r   r   r	   Úpip._internal.utils.subprocessr
   r   Ú pip._internal.vcs.versioncontrolr   r   r   r   r   Ú	getLoggerrŒ   r@   Úcompiler_   rb   rf   re   r   Úregisterr   r   r   r   Ú<module>   s   




  (