U
    +|jG<  ã                   @   sî   d dl Z d dlZ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 d dlmZ d dlmZmZ d dlmZmZmZ d dlmZ d dlmZmZmZmZmZmZ ejjZejj Z e  !e"¡Z#e $d	¡Z%d
d„ Z&G dd„ deƒZ'e (e'¡ dS )é    N)ÚListÚOptionalÚTuple)Ú_BaseVersion)Úparse)Ú
BadCommandÚInstallationError)Ú
HiddenTextÚdisplay_pathÚhide_url)Úmake_command)ÚAuthInfoÚRemoteNotFoundErrorÚ
RevOptionsÚVersionControlÚ!find_path_to_setup_from_repo_rootÚvcsz^[a-fA-F0-9]{40}$c                 C   s   t t | ¡ƒS ©N)ÚboolÚ
HASH_REGEXÚmatch)Úsha© r   ú]C:\Users\snmko\Desktop\web_content\django_cbt\venv\Lib\site-packages\pip/_internal/vcs/git.pyÚlooks_like_hash!   s    r   c                       sö   e Zd ZdZdZdZdZdZdZe	dd„ ƒZ
d	d
„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zedd„ ƒZedd „ ƒZed,d"d#„ƒZed$d%„ ƒZe‡ fd&d'„ƒZed(d)„ ƒZe‡ fd*d+„ƒZ‡  ZS )-ÚGitÚgitz.gitÚclone)zgit+httpz	git+httpszgit+sshzgit+gitzgit+file)ÚGIT_DIRÚGIT_WORK_TREEÚHEADc                 C   s   | gS r   r   ©Úrevr   r   r   Úget_base_rev_args2   s    zGit.get_base_rev_argsc                 C   sJ   |   t|ƒ¡\}}|jsdS |  ||j¡s.dS t|  ||j¡d ƒ}| S )NFr   )Úget_url_rev_optionsr   r"   Úis_commit_id_equalr   Úget_revision_sha)ÚselfÚurlÚdestÚ_Úrev_optionsÚis_tag_or_branchr   r   r   Úis_immutable_rev_checkout7   s    ÿzGit.is_immutable_rev_checkoutc                 C   s^   d}| j dgddd�}| |¡r:|t|ƒd …  ¡ d }nd}d | d¡d d	… ¡}t|ƒS )
Nzgit version ÚversionFT)Úshow_stdoutÚstdout_onlyr   Ú Ú.é   )Úrun_commandÚ
startswithÚlenÚsplitÚjoinÚparse_version)r'   ÚVERSION_PFXr.   r   r   r   Úget_git_versionH   s      ÿ
zGit.get_git_versionc                 C   sD   dddg}| j |ddd|d�}| ¡ }| d¡r@|tdƒd	… S d	S )
zl
        Return the current branch, or None if HEAD isn't at a branch
        (e.g. detached HEAD).
        zsymbolic-refú-qr    ©é   FT©Úextra_ok_returncodesr/   r0   Úcwdzrefs/heads/N)r4   Ústripr5   r6   )ÚclsÚlocationÚargsÚoutputÚrefr   r   r   Úget_current_branchX   s    
û
zGit.get_current_branchc              	   C   sÂ   | j d|g|dddd�}i }| ¡  d¡D ]V}| d¡}|s>q*z|jdd	d
�\}}W n" tk
rv   td|›�ƒ‚Y nX |||< q*d|› �}d|› �}	| |¡}
|
dk	r°|
dfS | |	¡}
|
dfS )zö
        Return (sha_or_none, is_branch), where sha_or_none is a commit hash
        if the revision names a remote branch or tag, otherwise None.

        Args:
          dest: the repository directory.
          rev: the revision name.
        zshow-refFTÚignore)rA   r/   r0   Úon_returncodeÚ
úú é   )Úmaxsplitzunexpected show-ref line: zrefs/remotes/origin/z
refs/tags/N)r4   rB   r7   ÚrstripÚ
ValueErrorÚget)rC   r)   r"   rF   ÚrefsÚlineÚref_shaÚref_nameÚ
branch_refÚtag_refr   r   r   r   r&   r   s0    û





zGit.get_revision_shac                 C   s.   |  d¡rdS t|ƒsdS |  ||¡r*dS dS )a$  
        Return true if rev is a ref or is a commit that we don't have locally.

        Branches and tags are not considered in this method because they are
        assumed to be always available locally (which is a normal outcome of
        ``git clone`` and ``git fetch --tags``).
        zrefs/TF)r5   r   Ú
has_commit)rC   r)   r"   r   r   r   Ú_should_fetch¡   s    

zGit._should_fetchc                 C   s¢   |j }|dk	st‚|  ||¡\}}|dk	rF| |¡}|r<|nd|_|S t|ƒsZt d|¡ |  ||¡sj|S | j	t
dd|| ¡ ƒ|d� | j|dd�}| |¡}|S )zµ
        Resolve a revision to a new RevOptions object with the SHA1 of the
        branch, tag, or ref if found.

        Args:
          rev_options: a RevOptions object.
        Nz:Did not find branch or tag '%s', assuming revision or ref.Úfetchr<   ©rA   Ú
FETCH_HEADr!   )Úarg_revÚAssertionErrorr&   Úmake_newÚbranch_namer   ÚloggerÚwarningrZ   r4   r   Úto_argsÚget_revision)rC   r)   r(   r+   r"   r   Ú	is_branchr   r   r   Úresolve_revision¹   s*    

þþ
zGit.resolve_revisionc                 C   s   |sdS |   |¡|kS )z§
        Return whether the current commit hash equals the given name.

        Args:
          dest: the repository directory.
          name: a string name.
        F)re   )rC   r)   Únamer   r   r   r%   æ   s    
zGit.is_commit_id_equalc                 C   sÈ   |  ¡ }t d||t|ƒ¡ |  tdd||ƒ¡ |jrº|  |||¡}t|dd ƒ}|d kr†|  	||j¡sºtdd| 
¡ ƒ}| j||d� n4|  |¡|krºd|› �}dd|d	|g}| j||d� |  |¡ d S )
NzCloning %s%s to %sr   r<   ra   Úcheckoutr\   zorigin/z-bz--track)Ú
to_displayrb   Úinfor
   r4   r   r"   rg   Úgetattrr%   rd   rH   Úupdate_submodules)r'   r)   r(   r+   Úrev_displayra   Úcmd_argsÚtrack_branchr   r   r   Ú	fetch_newö   s0      ÿ
    ÿzGit.fetch_newc                 C   sB   | j tdd|ƒ|d� tdd| ¡ ƒ}| j ||d� |  |¡ d S )NÚconfigzremote.origin.urlr\   ri   r<   )r4   r   rd   rm   ©r'   r)   r(   r+   ro   r   r   r   Úswitch  s    
þz
Git.switchc                 C   st   |   ¡ tdƒkr&| jdddg|d� n| jddg|d� |  |||¡}tddd| ¡ ƒ}| j||d� |  |¡ d S )Nz1.9.0r[   r<   z--tagsr\   Úresetz--hard)r;   r9   r4   rg   r   rd   rm   rs   r   r   r   Úupdate  s    z
Git.updatec                 C   sz   | j dddgddd|d�}| ¡ }z|d }W n tk
rF   t‚Y nX |D ]}| d	¡rL|} qdqL| d
¡d }| ¡ S )z¢
        Return URL of the first remote encountered.

        Raises RemoteNotFoundError if the repository does not have a remote
        url configured.
        rr   z--get-regexpzremote\..*\.urlr=   FTr?   r   zremote.origin.url rM   r>   )r4   Ú
splitlinesÚ
IndexErrorr   r5   r7   rB   )rC   rD   ÚstdoutÚremotesÚfound_remoteÚremoter(   r   r   r   Úget_remote_url.  s$    û

zGit.get_remote_urlc                 C   s@   z | j dddd| g|dd� W n tk
r6   Y dS X dS dS )	zU
        Check if rev is a commit that is available in the local repository.
        ú	rev-parser<   z--verifyzsha^F)rA   Úlog_failed_cmdTN)r4   r   )rC   rD   r"   r   r   r   rY   M  s    ý
zGit.has_commitNc                 C   s*   |d krd}| j d|gdd|d�}| ¡ S )Nr    r~   FT©r/   r0   rA   )r4   rB   )rC   rD   r"   Úcurrent_revr   r   r   re   ^  s    üzGit.get_revisionc                 C   sT   | j ddgdd|d� ¡ }tj |¡s4tj ||¡}tj tj |d¡¡}t||ƒS )z~
        Return the path to setup.py, relative to the repo root.
        Return None if setup.py is in the repo root.
        r~   z	--git-dirFTr€   z..)r4   rB   ÚosÚpathÚisabsr8   Úabspathr   )rC   rD   Úgit_dirÚ	repo_rootr   r   r   Úget_subdirectoryk  s    ü
zGit.get_subdirectoryc                    sâ   t |ƒ\}}}}}| d¡r†|dt| d¡ƒ … }|tj |¡ dd¡ d¡ }| d¡d }	|d|	… t	||	d… ||||fƒ }d|krÆd|ksšt
‚| d	d
¡}tƒ  |¡\}}
}| dd¡}ntƒ  |¡\}}
}||
|fS )a9  
        Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'.
        That's required because although they use SSH they sometimes don't
        work with a ssh:// scheme (e.g. GitHub). But we need a scheme for
        parsing. Hence we remove it again afterwards and return it as a stub.
        ÚfileNú/ú\ú+r>   z://zfile:zgit+z
git+ssh://zssh://r1   )ÚurlsplitÚendswithr6   ÚlstripÚurllibÚrequestÚurl2pathnameÚreplaceÚfindÚ
urlunsplitr_   ÚsuperÚget_url_rev_and_auth)rC   r(   ÚschemeÚnetlocrƒ   ÚqueryÚfragmentÚinitial_slashesÚnewpathÚ
after_plusr"   Ú	user_pass©Ú	__class__r   r   r—   ~  s.    
 ÿÿÿÿÿzGit.get_url_rev_and_authc                 C   s6   t j t j |d¡¡sd S | jdddddg|d� d S )Nz.gitmodulesÚ	submodulerv   z--initz--recursiver<   r\   )r‚   rƒ   Úexistsr8   r4   )rC   rD   r   r   r   rm      s    þzGit.update_submodulesc                    s|   t ƒ  |¡}|r|S z| jddg|ddddd�}W n6 tk
rT   t d|¡ Y d S  tk
rh   Y d S X tj 	| 
d¡¡S )	Nr~   z--show-toplevelFTÚraise)rA   r/   r0   rJ   r   zKcould not determine if %s is under git control because git is not availablez
)r–   Úget_repository_rootr4   r   rb   Údebugr   r‚   rƒ   ÚnormpathrP   )rC   rD   ÚlocÚrr    r   r   r¥   ª  s(    ú
ÿzGit.get_repository_root)N)Ú__name__Ú
__module__Ú__qualname__rh   ÚdirnameÚ	repo_nameÚschemesÚunset_environÚdefault_arg_revÚstaticmethodr#   r-   r;   ÚclassmethodrH   r&   rZ   rg   r%   rq   rt   rv   r}   rY   re   rˆ   r—   rm   r¥   Ú__classcell__r   r   r    r   r   &   sJ   


.

,



!
	r   ))ÚloggingÚos.pathr‚   ÚreÚurllib.parser�   Úurllib.requestÚtypingr   r   r   Zpip._vendor.packaging.versionr   r   r9   Úpip._internal.exceptionsr   r   Úpip._internal.utils.miscr	   r
   r   Úpip._internal.utils.subprocessr   Ú pip._internal.vcs.versioncontrolr   r   r   r   r   r   r�   r•   Ú	getLoggerrª   rb   Úcompiler   r   r   Úregisterr   r   r   r   Ú<module>   s*    	

   