o
    8)i                     @  s   d dl m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 eeZedddZG dd deeZdS )    )annotationsN)suppress)date)Path   )_types)CompletedProcess)
GitWorkdir)	HgWorkdir)run_hg)get_latest_file_mtimezfake git describe output for hgz<>hg git failed to describec                   @  s   e 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,d d!Zd-d#d$Zd%S ).GitWorkdirHgClientwd_t.PathTreturnGitWorkdirHgClient | Nonec                 C  s*   t dg|djtd}|d u rd S | |S )Nrootcwd)parse)r   parse_successr   )clsr   res r   P/home/app/PyTorch/.pytorch/lib/python3.10/site-packages/setuptools_scm/hg_git.pyfrom_potential_worktree   s   z*GitWorkdirHgClient.from_potential_worktreeboolc                 C  s   t g d| jdd}t|jS )N)id-Tz{dirty}T)r   check)r   pathr   stdoutselfr   r   r   r   is_dirty"   s   
zGitWorkdirHgClient.is_dirty
str | Nonec                 C  s.   t g d| jd}|jrtd| d S |jS )N)r   r   z{bookmarks}r   zbranch err %s)r   r    
returncodeloginfor!   r"   r   r   r   
get_branch&   s
   zGitWorkdirHgClient.get_branchdate | Nonec                 C  s   t g d| jdjtjddS )N)r'   -r.r   z{shortdate(date)}r   zhead date err)r   	error_msg)r   r    r   r   fromisoformatr#   r   r   r   get_head_date-   s
   
z GitWorkdirHgClient.get_head_datec              
   C  s   |   sdS z8tg d| jd}|jdkrW dS g }|j dD ]}|r7t|dkr7|dd }|| q"t	|| jW S  t
yW } 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)statusz-mz-ar+   r   r   
   z Failed to get dirty tag date: %s)r$   r   r    r&   r!   stripsplitlenappendr   	Exceptionr'   debug)r#   Z
status_resZchanged_fileslinefilepather   r   r   get_dirty_tag_date2   s$   

z%GitWorkdirHgClient.get_dirty_tag_datec                 C  s   dS )NFr   r/   r   r   r   
is_shallowO      zGitWorkdirHgClient.is_shallowNonec                 C  s   d S )Nr   r/   r   r   r   fetch_shallowR   r?   z GitWorkdirHgClient.fetch_shallowc                 C  s"   t g d| jd}|jrd S |jS )N)r'   r+   r,   r   z{node}r   )r   r    r&   r!   r"   r   r   r   get_hg_nodeU   s   zGitWorkdirHgClient.get_hg_nodehg_nodestrc              	   C  s   t tL ttj| jd)}|D ]}||v r0| \}}|  W  d    W  d    S qW d    n1 s;w   Y  W d    d S W d    d S 1 sSw   Y  d S )Nz.hg/git-mapfile)r   FileNotFoundErroropenosr    joinr5   )r#   rC   Z	map_itemsitemgit_noder   r   r   _hg2git\   s$   


zGitWorkdirHgClient._hg2gitc                 C  sp   |   }|d u r
d S | |}|d u r6tdg| jd | |}|d u r6td| |dt| kr4d S |S |S )NZgexportr   z(Cannot get git node so we use hg node %s0)rB   rK   r   r    r'   r9   r6   )r#   rC   rJ   r   r   r   nodee   s   

zGitWorkdirHgClient.nodeintc                 C  s   t g d| jd}t|jS )N)r'   r+   zancestors(.)r   r,   r   )r   r    r6   r!   r"   r   r   r   count_all_nodes|   s   
z"GitWorkdirHgClient.count_all_nodes_CompletedProcessc           
      C  s,  t g d| jd}|jrtS |j }|stS | jd }tdd |D }W d   n1 s3w   Y  |D ]
}||v rD|} n
q:t	
d|| tS t dd	d
| dddg| jd}|jrctS t|jd }|  }|dustJ | d| d| }	|  r|	d7 }	td|	 tg dd|	ddS )zu
        Tentative to reproduce the output of

        `git describe --dirty --tags --long --match *[0-9]*`

        )r'   r+   z0(reverse(ancestors(.)) and tag(r're:v?[0-9].*'))r   z{tags}{if(tags, ' ', '')}r   z.hg/git-tagsc                 s  s"    | ]}|  d d d V  qd S )N)r5   ).0r:   r   r   r   	<genexpr>   s     z6GitWorkdirHgClient.default_describe.<locals>.<genexpr>Nztag not found hg=%s git=%sr'   r+   'z'::.r   r,   r   -z-gz-dirtyzfaked describe %r)zsetuptools-scmZfakedZdescriber    )r&   r!   stderr)r   r    r&   _FAKE_GIT_DESCRIBE_ERRORr!   r5   joinpathrF   dictloggingwarningr6   rM   r$   r'   r9   rP   )
r#   r   Zhg_tagsfpZgit_tagsZhg_tagtagZdistancerM   Zdescr   r   r   default_describe   sF   

 z#GitWorkdirHgClient.default_describeN)r   r   r   r   )r   r   )r   r%   )r   r*   )r   r@   )rC   rD   r   r%   )r   rN   )r   rP   )__name__
__module____qualname__classmethodr   r$   r)   r0   r=   r>   rA   rB   rK   rM   rO   r_   r   r   r   r   r      s    








	
r   )
__future__r   r[   rG   
contextlibr   datetimer   pathlibr   rV   r   Z_tZ_run_cmdr   rP   gitr	   hgr
   r   Zscm_workdirr   	getLoggerr`   r'   rX   r   r   r   r   r   <module>   s&    
