U
    +|jd.  ã                   @   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 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Ú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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‡  ZS )'Ú
SubversionÚsvnz.svnÚcheckout)zsvn+sshzsvn+httpz	svn+httpszsvn+svnzsvn+filec                 C   s   dS )NT© )ÚclsÚ
remote_urlr   r   údC:\Users\snmko\Desktop\web_content\django_cbt\venv\Lib\site-packages\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k	s~t‚|d }n|r–| 	|¡s¤g |dd…< qt
||ƒ}q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   ÚlocationÚrevisionÚbaseÚdirsÚ_Ú
entries_fnÚdirurlÚlocalrevr   r   r   Úget_revision/   s$    

zSubversion.get_revisionc                    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   ÚnetlocÚscheme©Ú	__class__r   r   r3   M   s    zSubversion.get_netloc_and_authc                    s.   t ƒ  |¡\}}}| d¡r$d| }|||fS )Nzssh://zsvn+)r2   Ú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_argsd   s    zSubversion.make_rev_argsc                 C   sb   |}t j t j |d¡¡sD|}t j |¡}||krt d|¡ t‚q|  |¡\}}|d kr^t‚|S )Nzsetup.pyzGCould not find setup.py for directory %s (tried all parent directories))	r   r    r"   r!   r   ÚloggerÚwarningr   r#   )r   r(   Úorig_locationÚlast_locationr9   Ú_revr   r   r   Úget_remote_urlo   s    ýzSubversion.get_remote_urlc              	   C   sŠ  ddl m} tj || jd¡}tj |¡rHt|ƒ�}| ¡ }W 5 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 }nrzP| 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 ©rQ   ©rM   Úgroup©rN   Úmr   r   r   rP   ¢   s     Úinfoz--xmlFT©Úshow_stdoutÚstdout_onlyc                 S   s   g | ]}t | d ¡ƒ‘qS rR   rS   rU   r   r   r   rP   ³   s    )Úpip._internal.exceptionsrE   r   r    r!   r   r"   ÚopenÚreadr%   ÚlistÚmapr'   Ú
splitlinesÚsplitÚ_svn_xml_url_reÚsearchÚ
ValueErrorrT   Ú_svn_rev_reÚfinditerÚrun_commandÚ_svn_info_xml_url_rer$   Ú_svn_info_xml_rev_rer&   )r   r(   rE   Úentries_pathÚfÚdatar9   r   ÚrevsÚmatchÚxmlr   r   r   r   r#   ‰   sP    

ÿþ



ý

ÿ

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ƒ  ¡  d S )N)r   Úuse_interactiveÚ_vcs_versionr2   Ú__init__)Úselfrs   r6   r   r   ru   Æ   s
    zSubversion.__init__c                 C   s~   d}| j dgddd�}| |¡s$dS |t|ƒd…  ¡ d }| d	¡d  d
¡}zttt|ƒƒ}W n tk
rx   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	--versionFTrX   r   Nr   ú-Ú.)	rg   r%   rL   ra   Ú	partitionÚtupler_   rM   rd   )rv   Ú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)rt   r   )rv   Ú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)rQ   é   z--force-interactive)rs   r�   )rv   Úsvn_versionr   r   r   Úget_remote_call_options	  s    	z"Subversion.get_remote_call_optionsc                 C   sD   |  ¡ }t d||t|ƒ¡ tdd|  ¡ | ¡ ||ƒ}|  |¡ d S )NzChecking out %s%s to %sr   z-q)Ú
to_displayr?   rW   r   r
   r„   Úto_argsrg   )rv   rp   r9   Úrev_optionsÚrev_displayÚcmd_argsr   r   r   Ú	fetch_new)  s     ü    þzSubversion.fetch_newc                 C   s&   t d|  ¡ | ¡ ||ƒ}|  |¡ d S )NÚswitch©r
   r„   r†   rg   ©rv   rp   r9   r‡   r‰   r   r   r   r‹   8  s       þzSubversion.switchc                 C   s$   t d|  ¡ | ¡ |ƒ}|  |¡ d S )NÚupdaterŒ   r�   r   r   r   rŽ   @  s      þzSubversion.update)N)Ú__name__Ú
__module__Ú__qualname__rq   r   Ú	repo_nameÚschemesÚclassmethodr   Ústaticmethodr   r0   r3   r8   r>   rD   r#   rr   ru   r   r�   r„   rŠ   r‹   rŽ   Ú__classcell__r   r   r6   r   r      s:   






6
 r   )Úloggingr   ÚreÚtypingr   r   r   Úpip._internal.utils.miscr   r   r   r   Úpip._internal.utils.subprocessr	   r
   Ú pip._internal.vcs.versioncontrolr   r   r   r   r   Ú	getLoggerr�   r?   Úcompilerb   re   ri   rh   r   Úregisterr   r   r   r   Ú<module>   s   




  .