
    жvgG                        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 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)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    R/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/pip/_internal/vcs/git.pylooks_like_hashr   8   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_argsL   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_checkoutP   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'         )run_commandGIT_VERSION_REGEXr   loggerwarningintgroup)r0   r6   r   s      r   get_git_versionzGit.get_git_version^   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$   r:   FTextra_ok_returncodesr8   r9   cwdzrefs/heads/N)r<   strip
startswithlen)clsrC   argsoutputrefs        r   get_current_branchzGit.get_current_branchk   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)rI   r8   r9   on_returncode
 r;   )maxsplitzunexpected show-ref line: zrefs/remotes/origin/z
refs/tags/)r<   rJ   splitrstrip
ValueErrorget)rM   r+   r%   rO   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)rK   r   
has_commit)rM   r+   r%   s      r   _should_fetchzGit._should_fetch   sR     >>'"" 	4s## 	5>>$$$ 	5tr   r2   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.fetchrE   rI   
FETCH_HEADr(   )arg_revr/   make_newr   r   r>   r?   re   r<   r   to_argsget_revision)rM   r+   r*   r2   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)rn   )rM   r+   rq   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--quietr:   r'   )z	--verbosez
--progress)r;      r!   z--filter=blob:nonerg   zRev options %s, branch_name %scheckoutrE   ri   zorigin/z-bz--trackzResolved %s to commit %s)
to_displayr>   infor
   rB   r<   r   r%   rp   getattrdebugr.   rm   rQ   rn   rl   update_submodules)r0   r+   r*   r2   rs   rev_displayflagsrg   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.urlri   rv   rE   )r<   r   rm   r{   r0   r+   r*   r2   r~   s        r   switchz
Git.switchE  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)r:   	   )rh   rE   z--tagsri   rh   rE   resetz--hard)rB   r<   rp   r   rm   r{   r   s        r   updatez
Git.updateO  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\..*\.urlrF   FTrG   r   zremote.origin.url rW   r:   )r<   
splitlines
IndexErrorr   rK   rY   _git_remote_to_pip_urlrJ   )rM   rC   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_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-parserE   z--verifyzsha^F)rI   log_failed_cmdT)r<   r   )rM   rC   r%   s      r   rd   zGit.has_commit  sc    
		OOdJ=$     4 ! 	 	 	55	s   # 
11c                 h    |d}|                      d|gdd|          }|                                S )Nr$   r   FTr8   r9   rI   )r<   rJ   )rM   rC   r%   current_revs       r   rn   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<   rJ   r   r   isabsjoinabspathr   )rM   rC   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/\+r:   z://zfile:zgit+z
git+ssh://zssh:// )urlsplitendswithrL   lstripurllibrequesturl2pathnamer   find
urlunsplitsuperget_url_rev_and_auth)rM   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--recursiverE   ri   )r   r   r   r   r<   )rM   rC   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)rI   r8   r9   rT   r   zKcould not determine if %s is under git control because git is not availablez
)r   get_repository_rootr<   r   r>   rz   r   r   r   normpathrZ   )rM   rC   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__rq   dirname	repo_nameschemesunset_environdefault_arg_revstaticmethodstrr   r)   r   r4   r   r@   rB   classmethodr   rQ   r/   re   r	   r   rp   r.   r   r   r   r   r   rd   rn   r   r   r   r{   r   r   __classcell__)r   s   @r   r   r   <   sf       DGIG 1MOs tCy    \$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   )/loggingos.pathr   r   r   urllib.parser   urllib.requestdataclassesr   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   