
    dhJ                       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>                  jB                  Z! ejD                  e#      Z$ ejJ                  d	      Z& ejJ                  d
      Z' ejJ                  dejP                        Z)ddZ* G d de      Z+ ejX                  e+       y)    )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[^:]*)
    $c                >    t        t        j                  |             S N)bool
HASH_REGEXmatch)shas    W/var/www/html/vivango/api/ia/venv/lib/python3.12/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	dd       Z
ed f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%dZ	 d&	 	 	 	 	 	 	 	 	 d%dZed'd       Ze	d(d       Zed)d       Zed*d+d       Zed d       Zed, fd       Zed&d-d       Zed  fd       Ze	d.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HEADc                    | gS r    revs    r   get_base_rev_argszGit.get_base_rev_argsN   s	    ur   c                    t         j                  j                  d      r!|j                  di       }d|d<   d|d<   ||d<   t        |   |i |S )NPIP_NO_INPUTextra_environ0GIT_TERMINAL_PROMPTzssh -oBatchMode=yesGIT_SSH_COMMAND)osenvirongetsuperrun_command)clsargskwargsr*   	__class__s       r   r2   zGit.run_commandR   sX    ::>>.)"JJ;M36M/0/DM+,&3F?#w"D3F33r   c                    | j                  t        |            \  }}|j                  sy| j                  ||j                        syt	        | j                  ||j                        d         }| S )NFr   )get_url_rev_optionsr
   r&   is_commit_id_equalr   get_revision_sha)selfurldest_rev_optionsis_tag_or_branchs         r   is_immutable_rev_checkoutzGit.is_immutable_rev_checkout[   si    11(3-@;&&t[__=    5 5dKOO LQ OP###r   c                    | j                  dgddd      }t        j                  |      }|st        j	                  d|       yt        |j                  d            t        |j                  d	            fS )
Nversionzgit versionFT)command_descshow_stdoutstdout_onlyzCan't parse git version: %sr$         )r2   GIT_VERSION_REGEXr   loggerwarningintgroup)r;   rC   r   s      r   get_git_versionzGit.get_git_versioni   sq    ""K&	 # 
 "''0NN8'BEKKN#SQ%899r   c                    g d}| j                  |ddd|      }|j                         }|j                  d      r|t        d      d S y)zl
        Return the current branch, or None if HEAD isn't at a branch
        (e.g. detached HEAD).
        )zsymbolic-ref-qr"   rG   FTextra_ok_returncodesrE   rF   cwdzrefs/heads/N)r2   strip
startswithlen)r3   locationr4   outputrefs        r   get_current_branchzGit.get_current_branchv   sZ     .!% ! 
 lln>>-(s=)+,,r   c                   | j                  d|g|ddd      }i }|j                         j                  d      D ]2  }|j                  d      }|s	 |j                  dd	
      \  }}|||<   4 d| }d| }	|j                  |      }
|
|
dfS |j                  |	      }
|
dfS # t        $ r t	        d|      w xY w)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)rT   rE   rF   on_returncode
 rH   )maxsplitzunexpected show-ref line: zrefs/remotes/origin/z
refs/tags/)r2   rU   splitrstrip
ValueErrorr0   )r3   r=   r&   rY   refslineref_sharef_name
branch_reftag_refr   s              r   r:   zGit.get_revision_sha   s    " ! 
  LLN((. 	%D;;t$DH$(JJsQJ$?! %DN	% ,C51
se$hhz"?;hhwU|!  H !#=dX!FGGHs   B%%B=c                f    |j                  d      ryt        |      sy| j                  ||      ryy)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)rV   r   
has_commit)r3   r=   r&   s      r   _should_fetchzGit._should_fetch   s2     >>'"s#>>$$r   c           	        |j                   }|J | j                  ||      \  }}|$|j                  |      }t        ||r|nd      }|S t	        |      st
        j                  d|       | j                  ||      s|S | j                  t        dd||j                               |       | j                  |d      }|j                  |      }|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.fetchrP   rT   
FETCH_HEADr%   )arg_revr:   make_newr   r   rJ   inforn   r2   r   to_argsget_revision)r3   r=   r<   r?   r&   r   	is_branchs          r   resolve_revisionzGit.resolve_revision   s     !! --dC8Y?%..s3K!+9CRVXK s#KKL
   s+ 	$[-@-@-BC 	 	

 t6!**3/r   c                0    |sy| j                  |      |k(  S )z
        Return whether the current commit hash equals the given name.

        Args:
          dest: the repository directory.
          name: a string name.
        F)rx   )r3   r=   names      r   r9   zGit.is_commit_id_equal  s      %--r   c                d   |j                         }t        j                  d||t        |             |dk  rd}n
|dk(  rd}nd}| j	                         dk\  r!| j                  t        dd	g|||        n| j                  t        dg|||        |j                  r| j                  |||      }t        |d
d       }t        j                  d||       |K| j                  ||j                        st        dd|j                               }| j                  ||       nV| j                  |      |k7  rBd| }	dd|d|	g}| j                  ||       n"| j                  |      }
|j                  |
      }t        j                  d||j                         | j!                  ||       y )NzCloning %s%s to %sr   )z--quietrG   r$   )z	--verbosez
--progress)rH      r   z--filter=blob:nonerp   zRev options %s, branch_name %scheckoutrP   rr   zorigin/z-bz--trackzResolved %s to commit %s	verbosity)
to_displayrJ   rv   r	   rN   r2   r   r&   rz   getattrdebugr9   rw   r[   rx   ru   update_submodules)r;   r=   r<   r?   r   rev_displayflagsrp   cmd_argstrack_branchr   s              r   	fetch_newzGit.fetch_new  s    ",,.(#{L<NO>%1E!^E/E!W, (  	
  \'EEE3EEF??//c;GK!+}dCKLL9;T" ..t[__E+"#++- H
 $$X4$8((.+= ")6    t 4##D)C%..s3K.[__E 	ty9r   c                    | j                  t        dd|      |       g }|dk  r|j                  d       t        dg||j                          }| j                  ||       | j	                  ||       y )Nconfigzremote.origin.urlrr   r   rP   r   r   )r2   r   appendrw   r   r;   r=   r<   r?   r   extra_flagsr   s          r   switchz
Git.switchP  s     	#6< 	 	

 >t$
P[P+:M:M:OPt,ty9r   c                b   g }|dk  r|j                  d       | j                         dk\  r| j                  ddg||       n| j                  dg||       | j                  |||      }t	        ddg||j                          }| j                  ||       | j                  ||	       y )
Nr   rP   )rG   	   rq   z--tagsrr   resetz--hardr   )r   rN   r2   rz   r   rw   r   r   s          r   updatez
Git.updatef  s     >t$ !V+gx>+>DIg44$?++D#{C
 
 !	
 	t,ty9r   c                "   | j                  g dddd|      }|j                         }	 |d   }|D ]  }|j	                  d      s|} n |j                  d      d	   }| j                  |j                               S # t        $ r t        w xY w)
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\..*\.urlrQ   FTrR   r   zremote.origin.url ra   rG   )r2   
splitlines
IndexErrorr   rV   rc   _git_remote_to_pip_urlrU   )r3   rX   stdoutremotesfound_remoteremoter<   s          r   get_remote_urlzGit.get_remote_url  s     :!% ! 
 ##%	&"1:L  	F  !56%	   %a())#))+66  	&%%	&s   A> >Bc                   t        j                  d|       r| S t        j                  j	                  |       r#t        j                  |       j                         S t        j                  |       }|r|j                  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   r.   pathexistspathlibPurePathas_uri	SCP_REGEXexpandr   )r<   	scp_matchs     r   r   zGit._git_remote_to_pip_url  sq    " 88Is#J77>># ##C(//11OOC(	##$455!#&&r   c                Z    	 | j                  dddd|z   g|d       y# t        $ r Y yw xY w)zU
        Check if rev is a commit that is available in the local repository.
        	rev-parserP   z--verifyzsha^F)rT   log_failed_cmdT)r2   r   )r3   rX   r&   s      r   rm   zGit.has_commit  sG    
		OOdJ=$    ! 		s    	**c                X    |d}| j                  d|gdd|      }|j                         S )Nr"   r   FTrE   rF   rT   )r2   rU   )r3   rX   r&   current_revs       r   rx   zGit.get_revision  sA    ;Coo#	 & 
   ""r   c                \   | j                  ddgdd|      j                         }t        j                  j	                  |      s t        j                  j                  ||      }t        j                  j                  t        j                  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..)r2   rU   r.   r   isabsjoinabspathr   )r3   rX   git_dir	repo_roots       r   get_subdirectoryzGit.get_subdirectory  s     //+&	 " 

 %' 	 ww}}W%ggll8W5GGGOOBGGLL$$?@	7)LLr   c                   t        |      \  }}}}}|j                  d      r|dt        |j                  d              }|t        j
                  j                  |      j                  dd      j                  d      z   }|j                  d      dz   }	|d|	 t        ||	d ||||f      z   }d|vr>d|vsJ |j                  d	d
      }t        | -  |      \  }}
}|j                  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/\+rG   z://zfile:zgit+z
git+ssh://zssh:// )urlsplitendswithrW   lstripurllibrequesturl2pathnamer   find
urlunsplitr1   get_url_rev_and_auth)r3   r<   schemenetlocr   queryfragmentinitial_slashesnewpath
after_plusr&   	user_passr6   s               r   r   zGit.get_url_rev_and_auth  s*    19-eX??6""#;c$++c*:&;%;<O%(C(CD(I(Q(Qc)fSkG  S)A-J*%

$fguhG) C #%%%++fl3C"''">s"CCi++h+C"''">s"CCiC""r   c                    g d}|dk  r|j                  d       t        j                  j                  t        j                  j	                  |d            sy | j                  ||       y )N)	submoduler   z--initz--recursiver   rP   z.gitmodulesrr   )r   r.   r   r   r   r2   )r3   rX   r   argvs       r   r   zGit.update_submodules  sS    ?>KKww~~bggll8]CD 	 	
r   c                   t         |   |      }|r|S 	 | j                  ddg|dddd      }t        j                  j                  |j                  d            S # t        $ r t        j                  d|       Y y t        $ r Y y w xY w)	Nr   z--show-toplevelFTraise)rT   rE   rF   r^   r   zKcould not determine if %s is under git control because git is not availablez
)r1   get_repository_rootr2   r   rJ   r   r   r.   r   normpathrd   )r3   rX   locrr6   s       r   r   zGit.get_repository_root  s    g)(3J	/0! %$   A" ww 011  	LL/
   		s   A B	>B	B	c                     y)zEIn either https or ssh form, requirements must be prefixed with git+.Tr$   )repo_urls    r   should_add_vcs_url_prefixzGit.should_add_vcs_url_prefix5  s     r   )r&   strreturnz	list[str])r4   r   r5   r   r   r   )r<   r   r=   r   r   r   )r   ztuple[int, ...])rX   r   r   
str | None)r=   r   r&   r   r   ztuple[str | None, bool])r=   r   r&   r   r   r   )r=   r   r<   r   r?   r   r   r   )r=   r   r|   r   r   r   )
r=   r   r<   r   r?   r   r   rL   r   None)r   )rX   r   r   r   )r<   r   r   r   )rX   r   r&   r   r   r   r   )rX   r   r&   r   r   r   )r<   r   r   z tuple[str, str | None, AuthInfo])rX   r   r   rL   r   r   )r   r   r   r   )!__name__
__module____qualname__r|   dirname	repo_nameschemesunset_environdefault_arg_revstaticmethodr'   classmethodr2   rA   rN   r[   r:   rn   rz   r9   r   r   r   r   r   rm   rx   r   r   r   r   r   __classcell__)r6   s   @r   r   r   >   s3   DGIG 1MO  4 4$:  0 + +Z  , ++'+6@+	+ +Z . .=:=:(=:7A=:NQ=:	=:H :: :  	:
 : 
:6 :: :  	:
 : 
:< 7 7: ' '<   	# 	# M M" # #< 
 
 2 20  r   r   )r   r   r   r   )-
__future__r   loggingos.pathr.   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   rJ   compilerI   r   VERBOSEr   r   r   registerr$   r   r   <module>r      s    "    	     B G G 7   <<  \\$$
 
		8	$ BJJ  RZZ+,
 BJJ		 JJ	'z. zz S r   