
    WhJ                       d dl mZ 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 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dZ* G d de          Z+ ej,        e+           dS )    )annotationsN)replace)Any)
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strreturnboolc                P    t          t                              |                     S N)r   
HASH_REGEXmatch)r   s    g/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/pip/_internal/vcs/git.pylooks_like_hashr   :   s    
  %%&&&    c                      e Zd ZdZdZdZdZdZdZe	d5d            Z
ed6 fd            Zd7dZd8dZed9d            Zed:d            Zed;d            Zed<d            Zed=d!            Zd>d%Z	 d?d>d'Z	 d?d>d(Zed@d)            Ze	dAd*            ZedBd+            ZedCdDd-            Zed9d.            ZedE fd0            Zed?dFd1            Zed9 fd2            Ze	dGd4            Z xZ S )HGitgitz.gitclone)zgit+httpz	git+httpszgit+sshzgit+gitzgit+file)GIT_DIRGIT_WORK_TREEHEADrevr   r   	list[str]c                    | gS r    r%   s    r   get_base_rev_argszGit.get_base_rev_argsN   s	    ur   argsr   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_commandR   sh    :>>.)) 	4"JJ;;M36M/0/DM+,&3F?#"uww"D3F333r   urldestr   c                    |                      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_checkout[   s    11(3--@@; 	5&&t[_== 	 5   5 5dKO L LQ OPP###r   tuple[int, ...]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@   rG   r   s      r   get_git_versionzGit.get_git_versioni   s    ""K&	 # 
 
 "''00 	NN8'BBB2EKKNN##SQ%8%899r   location
str | Nonec                    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$   rK   FTextra_ok_returncodesrI   rJ   cwdzrefs/heads/N)r7   strip
startswithlen)r8   rS   r+   outputrefs        r   get_current_branchzGit.get_current_branchv   sw     .--!% ! 
 
 llnn>>-(( 	-s=))++,,tr   tuple[str | None, bool]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)rZ   rI   rJ   on_returncode
 rL   )maxsplitzunexpected show-ref line: zrefs/remotes/origin/z
refs/tags/)r7   r[   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)r\   r   
has_commit)r8   r;   r%   s      r   _should_fetchzGit._should_fetch   sR     >>'"" 	4s## 	5>>$$$ 	5tr   r   rB   r   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.fetchrV   rZ   
FETCH_HEADr)   )arg_revr?   make_newr   r   rN   infort   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## 	KK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)r~   )r8   r;   r   s      r   r>   zGit.is_commit_id_equal  s*      	5%%--r   	verbosityrP   Nonec                   |                                 }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--quietrK   r(   )z	--verbosez
--progress)rL      r!   z--filter=blob:nonerv   zRev options %s, branch_name %scheckoutrV   rx   zorigin/z-bz--trackzResolved %s to commit %sr   )
to_displayrN   r|   r	   rR   r7   r   r%   r   getattrdebugr>   r}   r`   r~   r{   update_submodules)r@   r;   r:   rB   r   rev_displayflagsrv   cmd_argstrack_branchr   s              r   	fetch_newzGit.fetch_new  s\    ",,..(#{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 	ty99999r   r   c                *   |                      t          dd|          |           g }|dk    r|                    d           t          dg||                                R  }|                      ||           |                     ||           d S )Nconfigzremote.origin.urlrx   r   rV   r   r   )r7   r   appendr}   r   r@   r;   r:   rB   r   extra_flagsr   s          r   switchz
Git.switchP  s     	#6<< 	 	
 	
 	

 >>t$$$
P[P+:M:M:O:OPPPt,,,ty99999r   c                   g }|dk    r|                     d           |                                 dk    r|                     ddg||           n|                     dg||           |                     |||          }t	          ddg||                                R  }|                     ||           |                     ||	           d S )
Nr   rV   )rK   	   rw   z--tagsrx   resetz--hardr   )r   rR   r7   r   r   r}   r   r   s          r   updatez
Git.updatef  s    >>t$$$ !!V++gx>+>DIIIIg44$???++D#{CC
 
 !!	
 
 
 	t,,,ty99999r   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\..*\.urlrW   FTrX   r   zremote.origin.url rg   rK   )r7   
splitlines
IndexErrorr   r\   ri   _git_remote_to_pip_urlr[   )r8   rS   stdoutremotesfound_remoteremoter:   s          r   get_remote_urlzGit.get_remote_url  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-parserV   z--verifyzsha^F)rZ   log_failed_cmdT)r7   r   )r8   rS   r%   s      r   rs   zGit.has_commit  sc    
		OOdJ=$     4 ! 	 	 	55	s   # 
11Nc                h    |d}|                      d|gdd|          }|                                S )Nr$   r   FTrI   rJ   rZ   )r7   r[   )r8   rS   r%   current_revs       r   r~   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   r[   r3   r   isabsjoinabspathr   )r8   rS   git_dir	repo_roots       r   get_subdirectoryzGit.get_subdirectory  s     //+&	 " 
 

 %'' 	 w}}W%% 	6gll8W55GGOOBGLL$$?$?@@	7)LLLr    tuple[str, str | None, AuthInfo]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/\+rK   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                    g d}|dk    r|                     d           t          j                            t          j                            |d                    sd S |                     ||           d S )N)	submoduler   z--initz--recursiver   rV   z.gitmodulesrx   )r   r3   r   r   r   r7   )r8   rS   r   argvs       r   r   zGit.update_submodules  s~    ???>>KKw~~bgll8]CCDD 	F 	 	
 	
 	
 	
 	
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)rZ   rI   rJ   rd   r   zKcould not determine if %s is under git control because git is not availablez
)r6   get_repository_rootr7   r   rN   r   r   r3   r   normpathrj   )r8   rS   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_prefix5  s	     tr   )r%   r   r   r&   )r+   r   r,   r   r   r   )r:   r   r;   r   r   r   )r   rE   )rS   r   r   rT   )r;   r   r%   r   r   ra   )r;   r   r%   r   r   r   )r;   r   r:   r   rB   r   r   r   )r;   r   r   rT   r   r   )
r;   r   r:   r   rB   r   r   rP   r   r   )r   )rS   r   r   r   )r:   r   r   r   )rS   r   r%   r   r   r   r   )rS   r   r%   rT   r   r   )r:   r   r   r   )rS   r   r   rP   r   r   )r   r   r   r   )!__name__
__module____qualname__r   dirname	repo_nameschemesunset_environdefault_arg_revstaticmethodr*   classmethodr7   rD   rR   r`   r?   rt   r   r>   r   r   r   r   r   rs   r~   r   r   r   r   r   __classcell__)r9   s   @r   r   r   >   s       DGIG 1MO   \ 4 4 4 4 4 [4$ $ $ $: : : :    [0 + + + [+Z    [, + + + [+Z . . . [.=: =: =: =:H : : : : :6 : : : : :< 7 7 7 [7: ' ' ' \'<    [ 	# 	# 	# 	# [	# M M M [M" # # # # # [#< 
 
 
 
 [
 2 2 2 2 2 [20    \    r   r   )r   r   r   r   )-
__future__r   loggingos.pathr3   r   r   urllib.parser   urllib.requestdataclassesr   typingr   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   rN   compilerM   r   VERBOSEr   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 	' ' ' 'z z z z z. z z zz S     r   