
     hH                        d dl Z 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	 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 d dlmZ d dlmZmZmZmZmZmZmZ ej         j!        Z!ej         j"        Z" e j#        e$          Z% ej&        d          Z' ej&        d	          Z( ej&        d
ej)                  Z*de+de,fdZ- G d de          Z. ej/        e.           dS )    N)replace)AnyListOptionalTuple)
BadCommandInstallationError)
HiddenTextdisplay_pathhide_url)make_command)AuthInfoRemoteNotFoundErrorRemoteNotValidError
RevOptionsVersionControl(find_path_to_project_root_from_repo_rootvcsz(^git version (\d+)\.(\d+)(?:\.(\d+))?.*$z^[a-fA-F0-9]{40}$a/  ^
    # Optional user, e.g. 'git@'
    (\w+@)?
    # Server, e.g. 'github.com'.
    ([^/:]+):
    # The server-side path. e.g. 'user/project.git'. Must start with an
    # alphanumeric character so as not to be confusable with a Windows paths
    # like 'C:/foo/bar' or 'C:\foo\bar'.
    (\w[^:]*)
    $shareturnc                 P    t          t                              |                     S N)bool
HASH_REGEXmatch)r   s    T/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/pip/_internal/vcs/git.pylooks_like_hashr   8   s    
  %%&&&    c            
       X    e Zd ZdZdZdZdZdZdZe	de
dee
         fd	            Zed
edede
f fd            Zde
de
defdZdeedf         fdZede
dee
         fd            Zede
de
deee
         ef         fd            Zede
de
defd            Zede
dededefd            Zede
dee
         defd            Zde
dedededdf
dZde
dededdfdZde
dededdfdZede
de
fd            Z e	de
de
fd             Z!ede
de
defd!            Z"ed)de
dee
         de
fd"            Z#ede
dee
         fd#            Z$ede
dee
ee
         e%f         f fd$            Z&ede
ddfd%            Z'ede
dee
         f fd&            Z(e	d'e
defd(            Z) xZ*S )*Gitgitz.gitclone)zgit+httpz	git+httpszgit+sshzgit+gitzgit+file)GIT_DIRGIT_WORK_TREEHEADrevr   c                     | gS r    r&   s    r   get_base_rev_argszGit.get_base_rev_argsL   s	    ur   argskwargsc                     t           j                            d          r%|                    di           }d|d<   d|d<   ||d<    t                      j        |i |S )NPIP_NO_INPUTextra_environ0GIT_TERMINAL_PROMPTzssh -oBatchMode=yesGIT_SSH_COMMAND)osenvirongetsuperrun_command)clsr+   r,   r/   	__class__s       r   r7   zGit.run_commandP   sh    :>>.)) 	4"JJ;;M36M/0/DM+,&3F?#"uww"D3F333r   urldestc                     |                      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)selfr:   r;   _rev_optionsis_tag_or_branchs         r   is_immutable_rev_checkoutzGit.is_immutable_rev_checkoutY   s    11(3--@@; 	5&&t[_== 	 5   5 5dKO L LQ OPP###r   .c                 0   |                      dgddd          }t                              |          }|st                              d|           dS t          |                    d                    t          |                    d	                    fS )
Nversionzgit versionFT)command_descshow_stdoutstdout_onlyzCan't parse git version: %sr(         )r7   GIT_VERSION_REGEXr   loggerwarningintgroup)r@   rF   r   s      r   get_git_versionzGit.get_git_versiong   s    ""K&	 # 
 
 "''00 	NN8'BBB2EKKNN##SQ%8%899r   locationc                     g 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%   rJ   FTextra_ok_returncodesrH   rI   cwdzrefs/heads/N)r7   strip
startswithlen)r8   rR   r+   outputrefs        r   get_current_branchzGit.get_current_brancht   sw     .--!% ! 
 
 llnn>>-(( 	-s=))++,,tr   c                    |                      d|g|ddd          }i }|                                                    d          D ][}|                    d          }|s	 |                    dd	
          \  }}n # t          $ r t	          d|          w xY w|||<   \d| }d| }	|                    |          }
|
|
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)rX   rH   rI   on_returncode
 rK   )maxsplitzunexpected show-ref line: zrefs/remotes/origin/z
refs/tags/)r7   rY   splitrstrip
ValueErrorr5   )r8   r;   r&   r\   refslineref_sharef_name
branch_reftag_refr   s              r   r?   zGit.get_revision_sha   s6    " ! 
 
  LLNN((.. 	% 	%D;;t$$D H$(JJsQJ$?$?! H H H !!Fd!F!FGGGH
 %DNN1C11
$s$$hhz""?;hhwU|s   !A<<Bc                     |                     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)rZ   r   
has_commit)r8   r;   r&   s      r   _should_fetchzGit._should_fetch   sR     >>'"" 	4s## 	5>>$$$ 	5tr   rB   c           	         |j         }|J |                     ||          \  }}|,|                    |          }t          ||r|nd          }|S t	          |          st
                              d|           |                     ||          s|S |                     t          d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.
        N)branch_namez:Did not find branch or tag '%s', assuming revision or ref.fetchrT   rX   
FETCH_HEADr)   )arg_revr?   make_newr   r   rM   rN   rq   r7   r   to_argsget_revision)r8   r;   r:   rB   r&   r   	is_branchs          r   resolve_revisionzGit.resolve_revision   s(    ! --dC88Y?%..s33K!+9<VCCRVXXXK s## 	NNL  
   s++ 	 	$[-@-@-B-BCC 	 	
 	
 	

 t66!**3//r   namec                 <    |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)rz   )r8   r;   r}   s      r   r>   zGit.is_commit_id_equal   s*      	5%%--r   	verbosityNc                    |                                 }t                              d||t          |                     |dk    rd}n|dk    rd}nd}|                                 dk    r&|                     t          dd	g|||R             n$|                     t          dg|||R             |j        r|                     |||          }t          |d
d           }t          
                    d||           |V|                     ||j                  s:t          dd|                                          }|                     ||           ng|                     |          |k    r#d| }	dd|d|	g}|                     ||           n*|                     |          }
|                    |
          }t                              d||j                   |                     |           d S )NzCloning %s%s to %sr   )z--quietrJ   r(   )z	--verbosez
--progress)rK      r"   z--filter=blob:noners   zRev options %s, branch_name %scheckoutrT   ru   zorigin/z-bz--trackzResolved %s to commit %s)
to_displayrM   infor   rQ   r7   r   r&   r|   getattrdebugr>   ry   r^   rz   rx   update_submodules)r@   r;   r:   rB   r   rev_displayflagsrs   cmd_argstrack_branchr   s              r   	fetch_newzGit.fetch_new  sW    ",,..(#{L<N<NOOO>>%1EE!^^EE/E!!W,, (  	
       \'EEE3EEEEFFF? 	4//c;GGK!+}dCCKLL9;TTT" ..t[_EE 9+"#++--   H
 $$X4$888((..+==  766    t 444##D))C%..s33K.[_EEE 	t$$$$$r   c                     |                      t          dd|          |           t          dd|                                          }|                      ||           |                     |           d S )Nconfigzremote.origin.urlru   r   rT   )r7   r   ry   r   r@   r;   r:   rB   r   s        r   switchz
Git.switchN  s    #6<< 	 	
 	
 	
  
D+2E2E2G2GHHt,,,t$$$$$r   c                 j   |                                  dk    r|                     g d|           n|                     ddg|           |                     |||          }t          ddd|                                          }|                     ||           |                     |           d S )N)rJ   	   )rt   rT   z--tagsru   rt   rT   resetz--hard)rQ   r7   r|   r   ry   r   r   s        r   updatez
Git.updateX  s    !!V++666DAAAAgt_$777++D#{CC49L9L9N9NOOt,,,t$$$$$r   c                 `   |                      g dddd|          }|                                }	 |d         }n# t          $ r t          w xY w|D ]}|                    d          r|} n|                    d          d	         }|                     |                                          S )
z
        Return URL of the first remote encountered.

        Raises RemoteNotFoundError if the repository does not have a remote
        url configured.
        )r   z--get-regexpzremote\..*\.urlrU   FTrV   r   zremote.origin.url rd   rJ   )r7   
splitlines
IndexErrorr   rZ   rf   _git_remote_to_pip_urlrY   )r8   rR   stdoutremotesfound_remoteremoter:   s          r   get_remote_urlzGit.get_remote_urlf  s     :::!% ! 
 
 ##%%	&"1:LL 	& 	& 	&%%	&  	 	F  !566 %   %%a())#))++666s	   ; Ac                 :   t          j        d|           r| S t          j                            |           r&t          j        |                                           S t                              |           }|r|	                    d          S t          |           )a8  
        Convert a remote url from what git uses to what pip accepts.

        There are 3 legal forms **url** may take:

            1. A fully qualified url: ssh://git@example.com/foo/bar.git
            2. A local project.git folder: /path/to/bare/repository.git
            3. SCP shorthand for form 1: git@example.com:foo/bar.git

        Form 1 is output as-is. Form 2 must be converted to URI and form 3 must
        be converted to form 1.

        See the corresponding test test_git_remote_url_to_pip() for examples of
        sample inputs/outputs.
        z\w+://zssh://\1\2/\3)rer   r3   pathexistspathlibPurePathas_uri	SCP_REGEXexpandr   )r:   	scp_matchs     r   r   zGit._git_remote_to_pip_url  s    " 8Is## 	J7>># 	2 #C((//111OOC((	 	6##$4555!#&&&r   c                 h    	 |                      dddd|z   g|d           dS # t          $ r Y dS w xY w)zU
        Check if rev is a commit that is available in the local repository.
        	rev-parserT   z--verifyzsha^F)rX   log_failed_cmdT)r7   r	   )r8   rR   r&   s      r   rp   zGit.has_commit  sc    
		OOdJ=$     4 ! 	 	 	55	s   # 
11c                 h    |d}|                      d|gdd|          }|                                S )Nr%   r   FTrH   rI   rX   )r7   rY   )r8   rR   r&   current_revs       r   rz   zGit.get_revision  sI    ;Coo#	 & 
 
   """r   c                 t   |                      ddgdd|                                          }t          j                            |          s t          j                            ||          }t          j                            t          j                            |d                    }t          ||          S )z
        Return the path to Python project root, relative to the repo root.
        Return None if the project root is in the repo root.
        r   z	--git-dirFTr   z..)r7   rY   r3   r   isabsjoinabspathr   )r8   rR   git_dir	repo_roots       r   get_subdirectoryzGit.get_subdirectory  s     //+&	 " 
 

 %'' 	 w}}W%% 	6gll8W55GGOOBGLL$$?$?@@	7)LLLr   c                    t          |          \  }}}}}|                    d          r|dt          |                    d                              }|t          j                            |                              dd                              d          z   }|                    d          dz   }	|d|	         t          ||	d         ||||f          z   }d|vrXd|vsJ |                    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/\+rJ   z://zfile:zgit+z
git+ssh://zssh:// )urlsplitendswithr[   lstripurllibrequesturl2pathnamer   find
urlunsplitr6   get_url_rev_and_auth)r8   r:   schemenetlocr   queryfragmentinitial_slashesnewpath
after_plusr&   	user_passr9   s               r   r   zGit.get_url_rev_and_auth  so    19-eX??6"" 	"#;c$++c*:*:&;&;%;#;<O%(C(CD(I(I(Q(Qc) )fSkkG  S))A-J*%

$fguhG) ) C #%%%%++fl33C"'''">">s"C"CCi++h++CC"'''">">s"C"CCiC""r   c                     t           j                            t           j                            |d                    sd S |                     g d|           d S )Nz.gitmodules)	submoduler   z--initz--recursiverT   ru   )r3   r   r   r   r7   )r8   rR   s     r   r   zGit.update_submodules  s^    w~~bgll8]CCDD 	FBBB 	 	
 	
 	
 	
 	
r   c                 `   t                                          |          }|r|S 	 |                     ddg|dddd          }n8# t          $ r t                              d|           Y d S t          $ r Y d S w xY wt          j        	                    |
                    d                    S )	Nr   z--show-toplevelFTraise)rX   rH   rI   ra   r   zKcould not determine if %s is under git control because git is not availablez
)r6   get_repository_rootr7   r   rM   r   r	   r3   r   normpathrg   )r8   rR   locrr9   s       r   r   zGit.get_repository_root  s    gg))(33 	J	/0! %$    AA  	 	 	LL/  
 44  	 	 	44	w 0 0111s   A %A;.	A;:A;repo_urlc                     dS )zEIn either https or ssh form, requirements must be prefixed with git+.Tr(   )r   s    r   should_add_vcs_url_prefixzGit.should_add_vcs_url_prefix  s	     tr   r   )+__name__
__module____qualname__r}   dirname	repo_nameschemesunset_environdefault_arg_revstaticmethodstrr   r*   classmethodr   r7   r   rD   r   rO   rQ   r   r^   r?   rq   r
   r   r|   r>   r   r   r   r   r   rp   rz   r   r   r   r   r   r   __classcell__)r9   s   @r   r    r    <   s       DGIG 1MOs tCy    \ 4 4s 4s 4 4 4 4 4 [4$S $ $ $ $ $ $:sCx : : : : # (3-    [0 +C +c +eHSM4<O6P + + + [+Z  3 4    [, ++'+6@+	+ + + [+Z .c .# .4 . . . [.=%=%(=%7A=%NQ=%	=% =% =% =%~%3 %Z %j %T % % % %%3 %Z %j %T % % % % 7c 7c 7 7 7 [7: 'C 'C ' ' ' \'< # C D    [ 	# 	#C 	#hsm 	#s 	# 	# 	# [	# M M M M M [M" #s #uS(3-5Q/R # # # # # [#< 
 
 
 
 
 [
 23 28C= 2 2 2 2 2 [20 C D    \    r   r    )0loggingos.pathr3   r   r   urllib.parser   urllib.requestdataclassesr   typingr   r   r   r   pip._internal.exceptionsr   r	   pip._internal.utils.miscr
   r   r   pip._internal.utils.subprocessr    pip._internal.vcs.versioncontrolr   r   r   r   r   r   r   parser   r   	getLoggerr   rM   compilerL   r   VERBOSEr   r   r   r   r    registerr(   r   r   <module>r      s      				               - - - - - - - - - - - - B B B B B B B B G G G G G G G G G G 7 7 7 7 7 7                  < \$
 
	8	$	$ BJ   RZ+,,
 BJ		 J 	' ' ' ' ' 'Y Y Y Y Y. Y Y Yx S     r   