
    v.gF                        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	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)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    c/var/www/html/ws.service.destra.net.br/ws_env/lib/python3.11/site-packages/pip/_internal/vcs/git.pylooks_like_hashr   7   s    
  %%&&&    c            
       0    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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_argsK   s	    ur   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_checkoutO   s    11(3--@@; 	5&&t[_== 	 5   5 5dKO L LQ OPP###r   .c                     |                      dgddd          }t                              |          }|st                              d|           dS t          d |                                D                       S )	Nversionzgit versionFT)command_descshow_stdoutstdout_onlyzCan't parse git version: %sr&   c              3   4   K   | ]}t          |          V  d S r   )int).0cs     r   	<genexpr>z&Git.get_git_version.<locals>.<genexpr>h   s(      44SVV444444r   )run_commandGIT_VERSION_REGEXr   loggerwarningtuplegroups)r/   r5   r   s      r   get_git_versionzGit.get_git_version]   s    ""K&	 # 
 
 "''00 	NN8'BBB244U\\^^444444r   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#      FTextra_ok_returncodesr7   r8   cwdzrefs/heads/N)r>   strip
startswithlen)clsrE   argsoutputrefs        r   get_current_branchzGit.get_current_branchj   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)rL   r7   r8   on_returncode
    )maxsplitzunexpected show-ref line: zrefs/remotes/origin/z
refs/tags/)r>   rM   splitrstrip
ValueErrorget)rP   r*   r$   rR   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)rN   r   
has_commit)rP   r*   r$   s      r   _should_fetchzGit._should_fetch   sR     >>'"" 	4s## 	5>>$$$ 	5tr   r1   c           	         |j         }|J |                     ||          \  }}|"|                    |          }|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.
        Nz:Did not find branch or tag '%s', assuming revision or ref.fetchrG   rL   
FETCH_HEADr'   )arg_revr.   make_newbranch_namer   r@   rA   ri   r>   r   to_argsget_revision)rP   r*   r)   r1   r$   r   	is_branchs          r   resolve_revisionzGit.resolve_revision   s    ! --dC88Y?%..s33K-6&@ccDK# 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)rr   )rP   r*   ru   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--quietrI   r&   )z	--verbosez
--progress)r[      r    z--filter=blob:nonerp   zRev options %s, branch_name %scheckoutrG   rl   zorigin/z-bz--trackzResolved %s to commit %s)
to_displayr@   infor	   rD   r>   r   r$   rt   getattrdebugr-   rq   rT   rr   ro   update_submodules)r/   r*   r)   r1   rw   rev_displayflagsrp   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.urlrl   rz   rG   )r>   r   rq   r   r/   r*   r)   r1   r   s        r   switchz
Git.switchD  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)rI   	   )rk   rG   z--tagsrl   rk   rG   resetz--hard)rD   r>   rt   r   rq   r   r   s        r   updatez
Git.updateN  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\..*\.urlrH   FTrJ   r   zremote.origin.url rZ   rI   )r>   
splitlines
IndexErrorr   rN   r]   _git_remote_to_pip_urlrM   )rP   rE   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   ospathexistspathlibPurePathas_uri	SCP_REGEXexpandr   )r)   	scp_matchs     r   r   zGit._git_remote_to_pip_urlz  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-parserG   z--verifyzsha^F)rL   log_failed_cmdT)r>   r   )rP   rE   r$   s      r   rh   zGit.has_commit  sc    
		OOdJ=$     4 ! 	 	 	55	s   # 
11c                 h    |d}|                      d|gdd|          }|                                S )Nr#   r   FTr7   r8   rL   )r>   rM   )rP   rE   r$   current_revs       r   rr   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..)r>   rM   r   r   isabsjoinabspathr   )rP   rE   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/\+rI   z://zfile:zgit+z
git+ssh://zssh:// )urlsplitendswithrO   lstripurllibrequesturl2pathnamereplacefind
urlunsplitsuperget_url_rev_and_auth)rP   r)   schemenetlocr   queryfragmentinitial_slashesnewpath
after_plusr$   	user_pass	__class__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--recursiverG   rl   )r   r   r   r   r>   )rP   rE   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)rL   r7   r8   rW   r   zKcould not determine if %s is under git control because git is not availablez
)r   get_repository_rootr>   r   r@   r~   r   r   r   normpathr^   )rP   rE   locrr   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__ru   dirname	repo_nameschemesunset_environdefault_arg_revstaticmethodstrr   r(   r   r3   r   r:   rD   classmethodr   rT   r.   ri   r   r   rt   r-   r   r   r   r   r   rh   rr   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   ;   sf       DGIG 1MOs tCy    \$S $ $ $ $ $ $5sCx 5 5 5 5 # (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   )-loggingos.pathr   r   r   urllib.parser   urllib.requesttypingr   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   r@   compiler?   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 	' ' ' ' ' 'P P P P P. P P Pf S     r   