o
    8)it:                     @  sF  U 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Zd dl	m
Z
 d dl	m	Z	 d dl	mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z! ddl"m#Z# ddl$m%Z% ddl$m&Z& ddl'm(Z( ddl'm)Z) ddl'm*Z* erddlm+Z+ e,e-Z.e/dZ0dZ1g dZ2G dd deZ3ddd d\d+d,Z4G d-d. d.e%Z5d]d1d2Z6d]d3d4Z7d]d5d6Z8d]d7d8Z9e3j:e6e3j;e8e3j<e7e3j=e9iZ>d9e?d:< d^d@dAZ@		d_d`dGdHZAdadKdLZB		d_dbdOdPZCdcdTdUZDdddXdYZEdedZd[ZFdS )f    )annotationsN)date)datetime)timezone)Enum)samefile)Path)TYPE_CHECKING)Callable)Sequence   )Configuration)_types)discover)CompletedProcess)require_command)run)data_from_mime)Workdir)get_latest_file_mtime)
ScmVersion)meta)tag_to_version)hg_gitz(?<=\btag: )([^,]+)\bz
%(describe)gitZdescribez--dirtyz--tagsz--longz--abbrev=40z--matchz*[0-9]*c                   @  s    e Zd ZdZdZdZdZdZdS )GitPreParsez!Available git pre-parse functionswarn_on_shallowfail_on_shallowfetch_on_shallowfail_on_missing_submodulesN)__name__
__module____qualname____doc__WARN_ON_SHALLOWFAIL_ON_SHALLOWFETCH_ON_SHALLOWFAIL_ON_MISSING_SUBMODULES r(   r(   M/home/app/PyTorch/.pytorch/lib/python3.10/site-packages/setuptools_scm/git.pyr   8   s    r   Fchecktimeoutargs Sequence[str | os.PathLike[str]]repor   r+   boolr,   
int | Nonereturn_CompletedProcessc                C  s   t dd|d g| |||dS )Nr   z	--git-dirz.git)cwdr+   r,   )_run)r-   r/   r+   r,   r(   r(   r)   run_gitA   s   r6   c                   @  sx   e Zd ZdZed!ddZd"d	d
Zd#ddZd$ddZd$ddZ	d"ddZ
d%ddZd#ddZd&ddZd'ddZd S )(
GitWorkdir$experimental, may change at any timewd_t.PathTr2   GitWorkdir | Nonec                 C  s   t | }tddg|jtd}|d u rd S |d d }|s%t|}nt|}ddlm} |||}t	
d| t||sBd S | t |S )N	rev-parsez--show-prefixparser   )strip_path_suffixzreal root %s)r   resolver6   parse_successstrosfspathZ_compatr@   logdebugr   )clsr9   Zreal_wdZstr_wdr@   r(   r(   r)   from_potential_worktreeS   s   


z"GitWorkdir.from_potential_worktreer0   c                 C  s   t g d| jjtddS )N)statusz--porcelainz--untracked-files=noF)r>   default)r6   pathrB   r0   selfr(   r(   r)   is_dirtyi   s   
zGitWorkdir.is_dirty
str | Nonec                 C  s4   t g d| jjtddpt g d| jjtddS )N)r<   z--abbrev-refHEADzbranch err (abbrev-err)r>   	error_msg)zsymbolic-refz--shortrQ   zbranch err (symbolic-ref)r6   rL   rB   rC   rM   r(   r(   r)   
get_branchq   s"   zGitWorkdir.get_branchdate | Nonec                 C  s0   ddd}t g ddd	| j}|j|d
dS )Ntimestamp_textrC   r2   rV   c                 S  sr   d| v rt d|  d S tjdk r| dr| d d d } t| }t d| |t	j
 }t d| |S )	Nz%czgit too old -> timestamp is %r)      Zr?   z+00:00zdt: %sz
dt utc: %s)rF   warningsysversion_infoendswithr   fromisoformatrG   
astimezoner   utcr   )rW   dtZdt_utcr(   r(   r)   parse_timestamp   s   
z1GitWorkdir.get_head_date.<locals>.parse_timestamp)z-czlog.showSignature=false)rF   z-n1rQ   z--format=%cIz$logging the iso date for head failedrR   )rW   rC   r2   rV   )r6   rL   rB   )rN   rc   resr(   r(   r)   get_head_date   s   
zGitWorkdir.get_head_datec              
   C  s~   |   sdS ztddg| j}|jdkrW dS |j d}t|| jW S  ty> } zt	
d| W Y d}~dS d}~ww )zGet the latest modification time of changed files in the working directory.

        Returns the date of the most recently modified file that has changes,
        or None if no files are changed or if an error occurs.
        Ndiffz--name-onlyr   
z Failed to get dirty tag date: %s)rO   r6   rL   
returncodestdoutstripsplitr   	ExceptionrF   rG   )rN   Zchanged_files_resZchanged_fileser(   r(   r)   get_dirty_tag_date   s   
zGitWorkdir.get_dirty_tag_datec                 C  s   | j d S )Nz.git/shallow)rL   joinpathis_filerM   r(   r(   r)   
is_shallow   s   zGitWorkdir.is_shallowNonec                 C  s   t ddg| jddd d S )Nfetchz--unshallowT   r*   )r6   rL   rM   r(   r(   r)   fetch_shallow   s   zGitWorkdir.fetch_shallowc                 C  s   t g d| jjtdS )N)r<   z--verifyz--quietrQ   r=   rT   rM   r(   r(   r)   node   s   
zGitWorkdir.nodeintc                 C  s    t ddg| j}|jdd S )Nzrev-listrQ   rh   r   )r6   rL   rj   count)rN   re   r(   r(   r)   count_all_nodes   s   zGitWorkdir.count_all_nodesr3   c                 C  s   t tdd  | jS )Nr   )r6   DEFAULT_DESCRIBErL   rM   r(   r(   r)   default_describe   s   zGitWorkdir.default_describeN)r9   r:   r2   r;   )r2   r0   )r2   rP   )r2   rV   )r2   rs   )r2   rx   )r2   r3   )r    r!   r"   r#   classmethodrI   rO   rU   rf   ro   rr   rv   rw   rz   r|   r(   r(   r(   r)   r7   P   s    







r7   r9   rs   c                 C  s$   |   rtd| j d dS dS )r8   "z!" is shallow and may cause errorsN)rr   warningswarnrL   r9   r(   r(   r)   r      s   r   c                 C  s,   |   rtd| j d |   dS dS )r8   r~   z," was shallow, git fetch was used to rectifyN)rr   r   r   rL   rv   r   r(   r(   r)   r      s   r   c                 C  s   |   rt| j ddS )r8   z8 is shallow, please correct with "git fetch --unshallow"N)rr   
ValueErrorrL   r   r(   r(   r)   r      s
   
r   c           	      C  s   | j d }| sdS tddg| j }|jdkr!td|j dS |j r.|j 	dng }g }|D ]}| }|
drR|	 }t|d	krR|d
 }|| q4|sb| rbtd| j  d|rud|}td| j  d| ddS )a*  
    Fail if submodules are defined but not initialized/cloned.

    This pre_parse function checks if there are submodules defined in .gitmodules
    but not properly initialized (cloned). This helps prevent packaging incomplete
    projects when submodules are required for a complete build.
    z.gitmodulesN	submodulerJ   r   z$Failed to check submodule status: %srh   -   r   z=Submodules are defined in .gitmodules but not initialized in zJ. Please run 'git submodule update --init --recursive' to initialize them.z, z"Submodules are not initialized in z: )rL   existsr6   ri   rF   rG   stderrrj   rk   rl   
startswithlenappendr   join)	r9   Zgitmodules_pathZstatus_resultZstatus_linesZuninitialized_submoduleslinepartsZsubmodule_pathZsubmodule_listr(   r(   r)   r      s8   




r   z/dict[GitPreParse, Callable[[GitWorkdir], None]]_GIT_PRE_PARSE_FUNCTIONSconfigr   rootr:   r;   c                 C  sL   | j r	t| j S tj|| jdD ]}t|}|dur |  S qt|S )z8
    Return the working directory (``GitWorkdir``).
    )Zsearch_parentsN)parentr7   rI   r   Zwalk_potential_rootsZsearch_parent_directories)r   r   Zpotential_rootZpotential_wdr(   r(   r)   get_working_directory  s   


r   describe_commandstr | list[str] | None	pre_parse#Callable[[GitWorkdir], None] | NoneScmVersion | Nonec                 C  sJ   t d t|| }|r#|dur|}n	t|jjjt}t||||dS dS )z
    :param pre_parse: experimental pre_parse action, may change at any time.
                     Takes precedence over config.git_pre_parse if provided.
    r   N)r   r   )	_require_commandr   r   getscmr   r   r   _git_parse_inner)r   r   r   r   r9   Zeffective_pre_parser(   r(   r)   r>   )  s   


r>   &GitWorkdir | hg_git.GitWorkdirHgClient_t.CMD_TYPE | Nonec                   s    j jjd ur j jj}|d ur2t|trt|}|d dkr+t|dd  | j}nt	|| j}n| 
 }d fdd	}|j|d
S )Nr   r   r   outputrC   r2   r   c                   s"   t | \}}}}t|||| dS )Ntagdistancedirtyrw   r   )_git_parse_describer   )r   r   r   rw   r   r   r(   r)   parse_describeY  s   z-version_from_describe.<locals>.parse_describer=   )r   rC   r2   r   )r   r   r   
isinstancerC   shlexrl   r6   rL   r5   r|   rB   )r9   r   r   Zdescribe_resr   r(   r   r)   version_from_describeF  s   


r   ?Callable[[GitWorkdir | hg_git.GitWorkdirHgClient], None] | Noner   c                 C  s   |r|| t || |}|d u r:| | jpd}| }|d u r%d}d}n| }d| }| }t||||| d}| }	| }
|
d u rT| rT|	 }|d urT|}
|
d u r`t
tj }
tj||	|
dS )N0.0r   Tgr   )branch	node_date)r   Zversion_clsZfallback_versionrw   rz   rO   r   rU   rf   ro   r   nowr   ra   r   dataclassesreplace)r   r9   r   r   versionr   rw   r   r   r   r   Z
dirty_dater(   r(   r)   r   `  s0   
r   describe_outputrC   !tuple[str, int, str | None, bool]c                 C  sd   |  drd}| d d } nd}| dd}t|dk r#| }d}d }n	|\}}}t|}||||fS )	Nz-dirtyTiFr   r   rX   r   )r^   rsplitr   rx   )r   r   rl   r   numberrw   Znumber_r(   r(   r)   r     s   

r   datadict[str, str]c           	      C  s   t d|  | dt}t|v rtd nt|\}}}}t||||dS t	| ddD ]}t
||}|d urBt||d  S q/| d}|d u rNd S d	| v r[td
 d S td||dS )Nzdata %szdescribe-namez+git archive did not support describe output)r   r   rw   z	ref-names r   rw   z$FORMATz8unprocessed git archival found (no export subst applied)r   )rw   r   )rF   rG   r   DESCRIBE_UNSUPPORTEDr   r   r   r   
REF_TAG_REfindallr   upper)	r   r   Zarchival_describer   r   rw   _refr   r(   r(   r)   archival_to_version  s.   


r   c                 C  s"   t j| d}t|}t||dS )Nz.git_archival.txtr   )rD   rL   r   r   r   )r   r   Zarchivalr   r(   r(   r)   parse_archival  s   r   )
r-   r.   r/   r   r+   r0   r,   r1   r2   r3   )r9   r7   r2   rs   )r   r   r   r:   r2   r;   )NN)
r   r:   r   r   r   r   r   r   r2   r   )r9   r   r   r   r   r   r2   r   )
r   r   r9   r   r   r   r   r   r2   r   )r   rC   r2   r   )r   r   r   r   r2   r   )r   r:   r   r   r2   r   )G
__future__r   r   loggingrD   rer   r\   r   r   r   r   enumr   Zos.pathr   pathlibr   typingr	   r
   r   r   r   r   Z_tr   Z_run_cmdr   r3   r   r   r   r5   Zintegrationr   Zscm_workdirr   r   r   r   r   r   r   	getLoggerr    rF   compiler   r   r{   r   r6   r7   r   r   r   r   r$   r%   r&   r'   r   __annotations__r   r>   r   r   r   r   r   r(   r(   r(   r)   <module>   sx    


w


4


+
