
    uj,                         d dl Z d dlZd dlmZmZ d dlmZmZ d dlm	Z	 ddl
mZ ddlmZ  e	            Z G d	 d
e          Z G d de          ZdS )    N)ListOptional)urlparse
urlunparse)
get_logger   )MASTER_MODEL_BRANCH   )GitErrorc                   "     e Zd Zi Z fdZ xZS )	Singletonc                     | | j         vr( t          t          |           j        |i || j         | <   | j         |          S N)
_instancessuperr   __call__)clsargskwargs	__class__s      b/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/modelscope/hub/git.pyr   zSingleton.__call__   sV    cn$$#6%	(+#- #--5t#G?E#G #GCN3~c""    )__name__
__module____qualname__r   r   __classcell__)r   s   @r   r   r      s=        J# # # # # # # # #r   r   c                      e Zd ZdZdZd-defdZdej        fdZ	d Z
d	ed
efdZd
efdZd Zd Z	 d-ded	ed
ededee         f
dZd Z e            dfdedee         defdZdedefdZdedefdZdedefdZdefdZ	 	 d.ded!edefd"Z	 d/ded	ed
ed#ed$ed%efd&Zdefd'Zdefd(Zefded)eded*efd+Zdefd,Z dS )0GitCommandWrapperzSome git operation wrapper
    gitNpathc                 "    |p| j         | _        d S r   )default_git_pathgit_path)selfr    s     r   __init__zGitCommandWrapper.__init__   s    5 5r   returnc           	         t                               d                    |                     t          j                                        }d|d<   | j        g|}d |D             }t          j        |t          j	        t          j	        |          }	 |
                                 |S # t          j        $ r}|j                            dd          }|j                            dd          }d	|v r!t                               d
           |cY d}~S t                               d|d|d|           t#          |          d}~ww xY w)a^  Run git command, if command return 0, return subprocess.response
             otherwise raise GitError, message is stdout and stderr.

        Args:
            args: List of command args.

        Raises:
            GitError: Exception with stdout and stderr.

        Returns:
            subprocess.CompletedProcess: the command response
         0GIT_TERMINAL_PROMPTc                     g | ]}||S  r,   ).0items     r   
<listcomp>z6GitCommandWrapper._run_git_command.<locals>.<listcomp>2   s    444Dt44444r   )stdoutstderrenvzutf-8replace)errorsznothing to commitz;Nothing to commit, your local repo is upto date with remoteNzRunning git command: z failed 
 stdout: z 
 stderr: )loggerdebugjoinosenvironcopyr#   
subprocessrunPIPEcheck_returncodeCalledProcessErrorr0   decoder1   infoerrorr   )r$   r   git_envcommandresponserB   std_outstd_errs           r   _run_git_commandz"GitCommandWrapper._run_git_command!   si    	SXXd^^$$$*//##),%&=(4(44G444>??	
 
 
	(%%'''O, 	( 	( 	(o,,WY,GGGl))'))DDG"g--Q    ww23 3 3 w'''	(s%   B* *E9AEE2EEc                    |                      |          }d|vrq|                     ||          }d|d|}|                    d          } | j        | }t                              |j                            d                     d S d S )N//oauth2-C z remote set-url origin r(   utf8)get_repo_remote_url
_add_tokensplitrH   r5   r6   r0   r@   )r$   repo_dir
auth_tokenurlauth_urlcmd_argsrsps          r   config_auth_tokenz#GitCommandWrapper.config_auth_tokenJ   s    &&x00S  z377HH;C88XXNH~~c**H'$'2CLL**62233333 ! r   tokenrR   c                 <   |s|S |                     d          r|S 	 t          |          }n# t          $ r |cY S w xY w|j        dvr|S |j        dk    r|S |j        pd}|j        r| d|j         }d| d| }t          |                    |                    S )	a  Inject OAuth2 token into an HTTP(S) git URL.

        Uses ``urllib.parse`` for reliable URL component handling,
        avoiding naive string replacement that can corrupt URLs
        containing multiple ``://`` sequences.

        Args:
            token: OAuth2 access token.
            url:   Remote URL (HTTP, HTTPS, or SSH).

        Returns:
            URL with ``oauth2:<token>@`` injected into the *netloc*,
            or the original *url* unchanged when:

            * *token* is falsy,
            * the URL already carries an ``oauth2`` credential,
            * the scheme is not HTTP/HTTPS (e.g. ``ssh://``, ``git@``).
        zgit@)httphttpsoauth2 :zoauth2:@)netloc)	
startswithr   	Exceptionschemeusernamehostnameportr   _replace)r$   rW   rR   parsedhostr_   s         r   rN   zGitCommandWrapper._add_tokenS   s    &  	J >>&!! 	J	c]]FF 	 	 	JJJ	 = 111J ?h&&J $"; 	+**V[**D)5))4))&///88999s   - <<c                     |rFd|v rB|                     d          }|                     d          }|d |         ||dz   d          z   }|S )NrJ   r[   r^   r
   )find)r$   rR   start_index	end_indexs       r   remove_token_from_urlz'GitCommandWrapper.remove_token_from_url   sY     	::$$((8,,KIl{l#c)a-..&99C
r   c                 F    ddg}	  | j         |  dS # t          $ r Y dS w xY w)Nlfsr2   TFrH   r   )r$   cmds     r   is_lfs_installedz"GitCommandWrapper.is_lfs_installed   sG    en	!D!3''4 	 	 	55	s   
 
  c                 L    d|dddg}	  | j         |  dS # t          $ r Y dS w xY w)N-Cro   installz--forceTFrp   )r$   rP   rq   s      r   git_lfs_installz!GitCommandWrapper.git_lfs_install   sN    Xui;	!D!3''4 	 	 	55	s   
 
##repo_base_dir	repo_namebranchc                 P   |                      ||          }|rd|d|d|d|}nd|d|}t                              |           |                    d          }	  | j        | }t                              |j                            d                     |S # t          $ r} t          j	        
                    ||          }t          j	                            t          j	        
                    |d                    rt                              d|           Y dS  w xY w)	a   git clone command wrapper.
        For public project, token can None, private repo, there must token.

        Args:
            repo_base_dir (str): The local base dir, the repository will be clone to local_dir/repo_name
            token (str): The git token, must be provided for private project.
            url (str): The remote url
            repo_name (str): The local repository path name.
            branch (str, optional): _description_. Defaults to None.

        Returns:
            The popen response.
        rK   z clone r(   z
 --branch rL   z.gitzgit clone exited with non-zero status but the repository was cloned successfully at %s. This is usually caused by a post-clone hook (e.g. core.hooksPath). Continuing.N)rN   r5   r6   rO   rH   r0   r@   r   r8   r    r7   isdirwarning)	r$   rw   rW   rR   rx   ry   
clone_argsrE   rP   s	            r   clonezGitCommandWrapper.clone   sH   & ooeS)) 	A 	A<IMM333<EIIvvOJJ	A .;]]CC@JZ   %%c**
	,t,j9HLL//77888O 	 	 	
 w||M9==Hw}}RW\\(F;;<< 9 ;C	D D D
 tt	s    =B BD%#D%c                    ddl m} |                                \  }}|r|rd|d|d|} | j        |                    d           }t
                              |j                            d                     d|d|d|} | j        |                    d           }t
                              |j                            d                     d S d S d S )	Nr   )ModelScopeConfigrK   /z config user.name r(   rL   z config user.email )	modelscope.hub.apir   get_user_inforH   rO   r5   r6   r0   r@   )	r$   rw   rx   r   	user_name
user_emailconfig_user_name_argsrE   config_user_email_argss	            r   add_user_infozGitCommandWrapper.add_user_info   s   777777 0 > > @ @	: 
	9 
	9 
	9 yyy))%5!,t,.C.I.I#.N.NOHLL//778888yyy**&6",t,'--c224HLL//7788888
	9 
	9 
	9 
	9r   FrP   files	all_filesc                    |rd|z  }n0t          |          dk    rd                    |          }d|d|}|                    d          } | j        | }t                              |j                            d                     |S )Nz-C %s add -Ar   r(   rK   z add rL   )lenr7   rO   rH   r5   r6   r0   r@   )r$   rP   r   r   add_args	files_strrU   s          r   addzGitCommandWrapper.add   s      	>%0HHZZ!^^II)199=H>>#&&#d#X.SZ&&v..///
r   messagec                     dd|z  ddd|z  g} | j         | }t                              |j                            d                     |S )zRun git commit command

        Args:
            repo_dir (str): the repository directory.
            message (str): commit message.

        Returns:
            The command popen response.
        rt   %scommit-mz'%s'rL   )rH   r5   rA   r0   r@   )r$   rP   r   commit_argsrU   s        r   r   zGitCommandWrapper.commit   sS     TH_hfw>NO#d#[1CJ%%f--...
r   revisionc                 .    dd|z  dd|z  g} | j         | S )Nrt   r   checkoutrH   r$   rP   r   cmdss       r   r   zGitCommandWrapper.checkout   s(    dXoz4(?C$t$d++r   c                 *    dd|z  dd|g} | j         | S )Nrt   r   r   z-br   r   s       r   
new_branchzGitCommandWrapper.new_branch   s&    dXoz4B$t$d++r   c                    dd|z  ddg} | j         | }d |j                            d                                                              t
          j                  D             }t          |          dk    r7d                    |d	                             d          dd                    gS d
 |dd          D             S )Nrt   r   ry   z-rc                 6    g | ]}|                                 S r,   )stripr-   lines     r   r/   z9GitCommandWrapper.get_remote_branches.<locals>.<listcomp>   s0     
 
 
 JJLL
 
 
r   rL   r
   r   r   c                 n    g | ]2}d                      |                    d           dd                   3S )r   r
   N)r7   rO   r   s     r   r/   z9GitCommandWrapper.get_remote_branches.<locals>.<listcomp>  s7    GGGdCHHTZZ__QRR011GGGr   )	rH   r0   r@   r   rO   r8   linesepr   r7   )r$   rP   r   rU   rA   s        r   get_remote_branchesz%GitCommandWrapper.get_remote_branches   s    dXox6#d#T*
 

))&117799??
KK
 
 
 t99>>HHT!W]]3//34455GGd122hGGGGr   originmasterremotec                 $    d|d||g} | j         | S )Nrt   pullr   )r$   rP   r   ry   r   s        r   r   zGitCommandWrapper.pull  s$     h7$t$d++r   local_branchremote_branchforcec                     |                      ||          }d|d|d|d|}|r|dz  }|                    d          } | j        | }t                              |j                            d                     |S )NrK   z push r(   r]   z -frL   )rN   rO   rH   r5   r6   r0   r@   )	r$   rP   rW   rR   r   r   r   	push_argsrU   s	            r   pushzGitCommandWrapper.push  s     ooeS))-5XXsssLLL-:]<	 	IOOC((	#d#Y/SZ&&v..///
r   c                     d|z  }|                     d          } | j        | }|j                            d          }|                                S )Nz$-C %s config --get remote.origin.urlr(   rL   )rO   rH   r0   r@   r   )r$   rP   rT   rU   rR   s        r   rM   z%GitCommandWrapper.get_repo_remote_url   sO    9HD>>#&&#d#X.j''yy{{r   c                 J   d|z  }|                     d          } | j        | }|j                            d                                          }g }|                     t
          j                  D ]0}|                    |                     d          d                    1|S )Nz-C %s lfs ls-filesr(   rL   )rO   rH   r0   r@   r   r8   r   append)r$   rP   rT   rU   outr   r   s          r   list_lfs_filesz GitCommandWrapper.list_lfs_files'  s    '(2>>#&&#d#X.j''--//IIbj)) 	. 	.DLLC,----r   tag_namerefc                     d|d|dd|z  |g} | j         | }t                              |j                            d                     |S )Nrt   tagr   z"%s"rL   rH   r5   r6   r0   r@   )r$   rP   r   r   r   rT   rU   s          r   r   zGitCommandWrapper.tag2  sX     (E8TWc
 $d#X.SZ&&v..///
r   c                     d|dd|g} | j         | }t                              |j                            d                     |S )Nrt   r   r   rL   r   )r$   rP   r   rT   rU   s        r   push_tagzGitCommandWrapper.push_tag?  sH    (FHh?#d#X.SZ&&v..///
r   r   )r   r   )F)!r   r   r   __doc__r"   strr%   r;   CompletedProcessrH   rV   rN   rm   rr   rv   r   r~   r   listr   boolr   r   r   r   r   r   r   rM   r   r	   r   r   r,   r   r   r   r      s        6 6S 6 6 6 6'()D '( '( '( '(R4 4 4-: -:# -: -: -: -:^         '+, , ,, , 	,
 sm, , , ,\9 9 9"  $tvv# 9    s S    , , , , , ,,3 ,# , , , ,
HC 
H 
H 
H 
H $#, ,,, , , , , !   	
      $C    	s 	 	 	 	 +	   	         r   r   )	metaclass)r8   r;   typingr   r   urllib.parser   r   modelscope.utils.loggerr   utils.constantr	   r4   r   r5   typer   r   r,   r   r   <module>r      s    
			     ! ! ! ! ! ! ! ! - - - - - - - - . . . . . . 0 0 0 0 0 0      	# # # # # # # #j j j j j) j j j j j jr   