U
    :û<i8  ã                   @   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
 d dl	mZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZ erÐd dlmZmZ d dlm Z  d dlm!Z!m"Z" e
j#Z#e
j$Z$e %e&¡Z'e (d¡Z)dd„ Z*G dd„ deƒZ+e ,e+¡ dS )é    )Úabsolute_importN)Úparse)Úrequest)Ú
BadCommand)Údisplay_pathÚhide_url)Úmake_command)ÚTempDirectory)ÚMYPY_CHECK_RUNNING)ÚRemoteNotFoundErrorÚVersionControlÚ!find_path_to_setup_from_repo_rootÚvcs)ÚOptionalÚTuple)Ú
HiddenText)ÚAuthInfoÚ
RevOptionsz^[a-fA-F0-9]{40}$c                 C   s   t t | ¡ƒS ©N)ÚboolÚ
HASH_REGEXÚmatch)Úsha© r   úU/var/www/html/mysite/school/venv/lib/python3.8/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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 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)r   zgit+httpz	git+httpszgit+sshzgit+gitzgit+file)ZGIT_DIRZGIT_WORK_TREEÚHEADc                 C   s   | gS r   r   ©Úrevr   r   r   Úget_base_rev_args:   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_optionsZis_tag_or_branchr   r   r   Úis_immutable_rev_checkout>   s    ÿzGit.is_immutable_rev_checkoutc                 C   s\   d}| j dgdd�}| |¡r8|t|ƒd …  ¡ d }nd}d | d¡d d… ¡}t|ƒS )	Nzgit version ÚversionF)Úshow_stdoutr   Ú Ú.é   )Úrun_commandÚ
startswithÚlenÚsplitÚjoinÚparse_version)r&   ZVERSION_PFXr,   r   r   r   Úget_git_versionO   s    
zGit.get_git_versionc                 C   sB   dddg}| j |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   ©é   F©Úextra_ok_returncodesr-   Úcwdzrefs/heads/N)r1   Ústripr2   r3   )ÚclsÚlocationÚargsÚoutputÚrefr   r   r   Úget_current_branch\   s    

   ÿ
zGit.get_current_branchc              	   C   sX   |  d¡s|d }tdd��2}| j|j|d� | jdddd|gd	|jd
� W 5 Q R X dS )z@Export the Git repository at the url to the destination locationú/Úexport)Úkind)r'   zcheckout-indexz-az-fz--prefixF©r-   r=   N)Úendswithr	   ÚunpackÚpathr1   )r&   r@   r'   Útemp_dirr   r   r   rF   q   s    
 þz
Git.exportc           
   	   C   sÀ   | j d|g|ddd�}i }| ¡  d¡D ]V}| d¡}|s<q(z|jddd	�\}}W n" tk
rt   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-refFÚignore)r=   r-   Úon_returncodeÚ
úú é   )Úmaxsplitzunexpected show-ref line: {!r}zrefs/remotes/origin/{}zrefs/tags/{}NT)r1   r>   r4   ÚrstripÚ
ValueErrorÚformatÚget)
r?   r(   r!   rB   ÚrefsÚliner   rC   Z
branch_refZtag_refr   r   r   r%   ~   s*     ÿ





zGit.get_revision_shac                 C   s    |j }|dk	st‚|  ||¡\}}|dk	rF| |¡}|r<|nd|_|S t|ƒsZt d|¡ | d¡sh|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.zrefs/Úfetchr8   ©r=   Z
FETCH_HEADr    )Úarg_revÚAssertionErrorr%   Úmake_newÚbranch_namer   ÚloggerÚwarningr2   r1   r   Úto_argsÚget_revision)r?   r(   r'   r*   r!   r   Z	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)rc   )r?   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   r8   r_   Úcheckoutr[   z	origin/{}z-bz--track)Ú
to_displayr`   Úinfor   r1   r   r!   rd   Úgetattrr$   rb   rD   rV   Úupdate_submodules)r&   r(   r'   r*   Úrev_displayr_   Úcmd_argsZ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[   rf   r8   )r1   r   rb   rj   ©r&   r(   r'   r*   rl   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.0rZ   r8   z--tagsr[   Úresetz--hard)r7   r6   r1   rd   r   rb   rj   ro   r   r   r   Úupdate  s    z
Git.updatec                 C   sx   | j dddgdd|d�}| ¡ }z|d }W n tk
rD   t‚Y nX |D ]}| d¡rJ|} qbqJ| d	¡d
 }| ¡ S )z¢
        Return URL of the first remote encountered.

        Raises RemoteNotFoundError if the repository does not have a remote
        url configured.
        rn   z--get-regexpzremote\..*\.urlr9   Fr;   r   zremote.origin.url rQ   r:   )r1   Ú
splitlinesÚ
IndexErrorr   r2   r4   r>   )r?   r@   ÚstdoutZremotesZfound_remoteZremoter'   r   r   r   Úget_remote_url  s"    
  þ

zGit.get_remote_urlNc                 C   s(   |d krd}| j d|gd|d�}| ¡ S )Nr   ú	rev-parseFrH   )r1   r>   )r?   r@   r!   Zcurrent_revr   r   r   rc   6  s      ÿzGit.get_revisionc                 C   sR   | j ddgd|d� ¡ }tj |¡s2t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.
        rw   z	--git-dirFrH   z..)r1   r>   ÚosrK   Úisabsr5   Úabspathr   )r?   r@   Zgit_dirÚ	repo_rootr   r   r   Úget_subdirectory?  s     þ
zGit.get_subdirectoryc                    sú   t |ƒ\}}}}}| d¡r–|dt| d¡ƒ … }|t |¡ dd¡ d¡ }t|||||fƒ}| d¡d }	|d|	… t||	d… ||||fƒ }d|krÚd|ksªt	‚| d	d
¡}t
t| ƒ |¡\}}
}| dd¡}nt
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.
        ÚfileNrE   ú\ú+r:   z://zfile:zgit+z
git+ssh://zssh://r.   )ÚurlsplitrI   r3   ÚlstripÚurllib_requestÚurl2pathnameÚreplaceÚ
urlunsplitÚfindr]   Úsuperr   Úget_url_rev_and_auth)r?   r'   ÚschemeÚnetlocrK   ÚqueryÚfragmentÚinitial_slashesÚnewpathZ
after_plusr!   Ú	user_pass©Ú	__class__r   r   rˆ   N  s0    

 ÿÿÿÿÿ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.gitmodulesZ	submodulerr   z--initz--recursiver8   r[   )rx   rK   Úexistsr5   r1   )r?   r@   r   r   r   rj   q  s    þzGit.update_submodulesc                    sZ   t t| ƒ |¡rdS z| jdg|dddd�}| W S  tk
rT   t d|¡ Y dS X d S )NTrw   FrM   )r=   r-   rN   Úlog_failed_cmdzKcould not determine if %s is under git control because git is not available)r‡   r   Úcontrols_locationr1   r   r`   Údebug)r?   r@   Úrr�   r   r   r”   z  s    üÿzGit.controls_location)N)Ú__name__Ú
__module__Ú__qualname__re   ÚdirnameÚ	repo_nameÚschemesÚunset_environÚdefault_arg_revÚstaticmethodr"   r+   r7   ÚclassmethodrD   rF   r%   rd   r$   rm   rp   rr   rv   rc   r|   rˆ   rj   r”   Ú__classcell__r   r   r�   r   r   .   sD   


(
,


"
r   )-Ú
__future__r   ÚloggingÚos.pathrx   ÚreÚpip._vendor.packaging.versionr   r6   Úpip._vendor.six.moves.urllibÚurllib_parser   r‚   Úpip._internal.exceptionsr   Úpip._internal.utils.miscr   r   Úpip._internal.utils.subprocessr   Úpip._internal.utils.temp_dirr	   Úpip._internal.utils.typingr
   Ú pip._internal.vcs.versioncontrolr   r   r   r   Útypingr   r   r   r   r   r€   r…   Ú	getLoggerr—   r`   Úcompiler   r   r   Úregisterr   r   r   r   Ú<module>   s2   

  _