o
    1c-                     @   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dede	fddZ
ed	edee fd
dZededefddZedededeeeee ee f f f fddZededeeee ef f fddZedee dee defddZededefddZededeee ef fddZededee de	fd d!Zd5d#e	dd"f fd$d%Zdeed&f fd'd(Zdeed&f fd)d*Zdefd+d,Zdeded-ed.edd"f
d/d0Z deded-edd"fd1d2Z!deded-edd"fd3d4Z"  Z#S )6
Subversionsvnz.svncheckout)zsvn+sshzsvn+httpz	svn+httpszsvn+svnzsvn+file
remote_urlreturnc                 C      dS )NT )clsr   r   r   U/var/www/html/django/env/lib/python3.10/site-packages/pip/_internal/vcs/subversion.pyshould_add_vcs_url_prefix$   s   z$Subversion.should_add_vcs_url_prefixrevc                 C   s   d| gS )Nz-rr   )r   r   r   r   get_base_rev_args(   s   zSubversion.get_base_rev_argslocationc           	      C   s   d}t |D ]P\}}}| j|vrg |dd< q|| j t j|| jd}t j|s.q| |\}}||krD|dus?J |d }n|rK||sRg |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
startswithmaxstr)	r   r   revisionbasedirs_Z
entries_fnZdirurlZlocalrevr   r   r   get_revision,   s$   

zSubversion.get_revisionnetlocschemec                    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   r0   r1   	__class__r   r   r4   I   s   zSubversion.get_netloc_and_authurlc                    s.   t  |\}}}|drd| }|||fS )Nzssh://zsvn+)r3   get_url_rev_and_authr(   )r   r7   r   	user_passr5   r   r   r8   X   s   

zSubversion.get_url_rev_and_authusernamepasswordc                 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   sZ   |}t |s|}tj|}||krtd| tt |r| |\}}|d u r+t|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_locationr7   Z_revr   r   r   get_remote_urll   s   zSubversion.get_remote_urlc                 C   s  ddl m} tj|| jd}tj|r.t|}| }W d    n1 s(w   Y  nd}d }|	dsA|	dsA|	drbt
ttj|d}|d d= |d d	 }d
d |D dg }n\|	drt|}	|	sutd||	d}dd t|D dg }n6z'| jdd|gddd}
t|
}	|	d usJ |	d}dd t|
D }W n |y   d g }}Y nw |rt|}||fS 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      g | ]	}t |d qS rO   rK   grouprL   mr   r   r   rN          infoz--xmlFTshow_stdoutstdout_onlyc                 S   rP   rQ   rR   rT   r   r   r   rN      rV   )pip._internal.exceptionsrC   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_re_svn_info_xml_rev_rer)   )r   r   rC   Zentries_pathfdatar7   r   Zrevsmatchxmlr   r   r   r   r'      sL   







zSubversion._get_svn_url_revdestnamec                 C   r   )z&Always assume the versions don't matchFr   )r   rn   ro   r   r   r   is_commit_id_equal   s   zSubversion.is_commit_id_equalNuse_interactivec                    s(   |d u rt  }|| _d | _t   d S N)r   rq   _vcs_versionr3   __init__)selfrq   r5   r   r   rt      s
   zSubversion.__init__.c                 C   sz   d}| j dgddd}||sdS |t|d  d }|d	d d
}z
ttt|}W |S  ty<   Y dS w )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(   rJ   ra   	partitiontupler_   rK   rd   )ru   Zversion_prefixversionZversion_listparsed_versionr   r   r   call_vcs_version   s   
zSubversion.call_vcs_versionc                 C   s"   | j du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   Z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)rO      z--force-interactive)rq   r}   )ru   Zsvn_versionr   r   r   get_remote_call_options   s   	z"Subversion.get_remote_call_optionsrev_options	verbosityc                 C   sV   |  }td||t| |dkrd}nd}td||  | ||}| | d S )NzChecking out %s%s to %sr   z--quietrD   r   )
to_displayr>   rW   r   r   r   to_argsrg   )ru   rn   r7   r   r   rev_displayflagcmd_argsr   r   r   	fetch_new  s&   zSubversion.fetch_newc                 C   s&   t d|  | ||}| | d S )Nswitchr   r   r   rg   ru   rn   r7   r   r   r   r   r   r   0  s   zSubversion.switchc                 C   s$   t d|  | |}| | d S )Nupdater   r   r   r   r   r   :  s   zSubversion.updaterr   )$__name__
__module____qualname__ro   r"   	repo_nameschemesclassmethodr*   boolr   staticmethodr   r   r/   r   r   r4   r   r8   r   r
   r=   rB   rK   r'   rp   rt   r|   r}   r   r   r   r   r   __classcell__r   r   r5   r   r      sh    & 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>   compilerb   re   ri   rh   r   registerr   r   r   r   <module>   s     




  (