o
    i7                     @   s  d dl mZ d dlZ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 eeZG dd dZeG d	d
 d
ZeG dd dZG dd dZdeeeje f fddZdedeeeje f fddZdefddZedZedZ edZ!deje deje fddZ"deje de#fddZ$d ej%eef deeeje f fd!d"Z&dS )#    )	dataclassN)Path)GitTelemetry)TelemetryAPI)	StopWatchc                   @   sX   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdS )GitTagzgit.repository_urlzgit.commit.shaz
git.branchzgit.tagzgit.commit.messagezgit.commit.author.namezgit.commit.author.emailzgit.commit.author.datezgit.commit.committer.namezgit.commit.committer.emailzgit.commit.committer.datezgit.commit.head.shazgit.commit.head.messagezgit.commit.head.author.datezgit.commit.head.author.emailzgit.commit.head.author.namezgit.commit.head.committer.datezgit.commit.head.committer.emailzgit.commit.head.committer.nameN)__name__
__module____qualname__REPOSITORY_URL
COMMIT_SHABRANCHTAGCOMMIT_MESSAGECOMMIT_AUTHOR_NAMECOMMIT_AUTHOR_EMAILCOMMIT_AUTHOR_DATECOMMIT_COMMITTER_NAMECOMMIT_COMMITTER_EMAILCOMMIT_COMMITTER_DATECOMMIT_HEAD_SHACOMMIT_HEAD_MESSAGECOMMIT_HEAD_AUTHOR_DATECOMMIT_HEAD_AUTHOR_EMAILCOMMIT_HEAD_AUTHOR_NAMECOMMIT_HEAD_COMMITTER_DATECOMMIT_HEAD_COMMITTER_EMAILCOMMIT_HEAD_COMMITTER_NAME r   r   P/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/testing/internal/git.pyr      s(    r   c                   @   s.   e Zd ZU eed< eed< eed< eed< dS )_GitSubprocessDetailsstdoutstderrreturn_codeelapsed_secondsN)r   r	   r
   str__annotations__intfloatr   r   r   r   r    N   s
   
 r    c                   @   s>   e Zd ZU eed< eed< eed< eed< eed< eed< dS )GitUserInfoauthor_nameauthor_emailauthor_datecommitter_namecommitter_emailcommitter_dateN)r   r	   r
   r%   r&   r   r   r   r   r)   V   s   
 r)   c                   @   s  e Zd Zd9deje fddZd9dee deje defdd	Z	d9dee d
eje
 defddZdeedf fddZdefddZdefddZdefddZdefddZd9deje defddZd9deje deje fddZdefddZdefdd Zdee fd!d"Zd#ee d$ee dee fd%d&Zdefd'd(Zd:d*eje d+edefd,d-Zdefd.d/Zdefd0d1Zdefd2d3Zdefd4d5Z d6ee dej!e" fd7d8Z#dS );GitNcwdc                 C   s&   t d}|std|| _|| _d S )Ngitz`git` command not found)shutilwhichRuntimeErrorgit_commandr1   )selfr1   r6   r   r   r   __init__a   s
   

zGit.__init__argsinput_stringreturnc              
   C   s   | j g|}td| t  }tj|tjtjtj| jddd}|j|d\}}W d    n1 s2w   Y  t	|
 |
 |j| dS )NzRunning git command: %rzutf-8surrogateescape)r!   r"   stdinr1   encodingerrors)input)r!   r"   r#   r$   )r6   logdebugr   
subprocessPopenPIPEr1   communicater    strip
returncodeelapsed)r7   r9   r:   git_cmdswprocessr!   r"   r   r   r   	_call_gitk   s(   	zGit._call_gittelemetry_typec                 C   sN   |  |}|rt ||j|j |jdkr$tdd||j	 dS |j
S )Nr   zError calling git %s: %s  )rM   r   getrecord_git_commandr$   r#   rA   warningjoinr"   r!   )r7   r9   rN   resultr   r   r   _git_output   s   

zGit._git_output.c              	   C   s\   |  dg}z| d }tdd |dD }|W S  ttfy-   td| Y dS w )Nz	--version   c                 s   s    | ]}t |V  qd S N)r'   ).0partr   r   r   	<genexpr>   s    z&Git.get_git_version.<locals>.<genexpr>.z(Could not parse git --version output: %s)r   r   r   )rV   splittuple
IndexError
ValueErrorrA   rS   )r7   outputversion_stringversion_tupler   r   r   get_git_version   s   zGit.get_git_versionc                 C   s   |  ddgtjS )Nz	ls-remotez	--get-url)rV   r   GET_REPOSITORYr7   r   r   r   get_repository_url      zGit.get_repository_urlc                 C      |  ddgS )N	rev-parseHEADrV   rf   r   r   r   get_commit_sha      zGit.get_commit_shac                 C   ri   )Nrj   z@{upstream})rM   rf   r   r   r   get_upstream_sha   rn   zGit.get_upstream_shac                 C   s   |  g dtjS )N)rj   z--abbrev-refrk   )rV   r   
GET_BRANCHrf   r   r   r   
get_branch   rh   zGit.get_branch
commit_shac                 C   s    g d}|r| | | |S )N)show-sz--format=%s)appendrV   )r7   rr   commandr   r   r   get_commit_message   s   

zGit.get_commit_messagec           
      C   sR   g d}|r| | | |}|sd S |d\}}}}}}	t||||||	dS )N)rs   rt   z*--format=%an|||%ae|||%ad|||%cn|||%ce|||%cdz!--date=format:%Y-%m-%dT%H:%M:%S%zz|||)r*   r+   r,   r-   r.   r/   )ru   rV   r]   r)   )
r7   rr   rv   ra   r*   r+   r,   r-   r.   r/   r   r   r   get_user_info   s   

zGit.get_user_infoc                 C   ri   )Nrj   z--show-toplevelrl   rf   r   r   r   get_workspace_path   rn   zGit.get_workspace_pathc                 C   s   |  g dS )N)configz	--defaultoriginz--getzclone.defaultRemoteNamerl   rf   r   r   r   get_remote_name   rn   zGit.get_remote_namec                 C   s$   |  g dtj}|r|dS g S )N)rA   z--format=%Hz-n1000--since="1 month ago"
)rV   r   GET_LOCAL_COMMITSr]   r7   ra   r   r   r   get_latest_commits   s   
zGit.get_latest_commitsexcluded_commitsincluded_commitsc                 C   s:   dd |D }|  ddddddg||tj}|d	S )
Nc                 S   s   g | ]}d | qS )^r   )rY   shar   r   r   
<listcomp>   s    z.Git.get_filtered_revisions.<locals>.<listcomp>zrev-listz	--objects--filter=blob:noner~   z--no-object-namesrk   r   )rV   r   GET_OBJECTSr]   )r7   r   r   
exclusionsra   r   r   r   get_filtered_revisions   s    

zGit.get_filtered_revisionsc                 C   s   |  ddgtj}|dkS )Nrj   z--is-shallow-repositorytrue)rV   r   CHECK_SHALLOWr   r   r   r   is_shallow_repository   s   zGit.is_shallow_repositoryFrefspecparent_onlyc                 C   sX   |   }d|r	dnddddd|g}|r|| | |}|jdkr*td	||j |S )
Nfetchz
--deepen=1z--shallow-since="1 month ago"z--update-shallowr   z--recurse-submodules=noz	--no-tagsr   z*Error unshallowing repo for refspec %s: %s)r|   ru   rM   r#   rA   rS   r"   )r7   r   r   remote_namerv   rU   r   r   r   unshallow_repository   s   
	


zGit.unshallow_repositoryc                 C   s   |  |  S rX   )r   rm   rf   r   r   r   "unshallow_repository_to_local_head   rn   z&Git.unshallow_repository_to_local_headc                 C   s4   |   }|j}|jdks|std |S | |S )Nr   z4Error unshallowing repo to upstream: no upstream sha)ro   r!   r#   rA   rS   r   )r7   upstream_sha_resultupstream_shar   r   r    unshallow_repository_to_upstream   s   

z$Git.unshallow_repository_to_upstreamc                 C   s
   |  d S rX   )r   rf   r   r   r   unshallow_repository_to_default   s   
z#Git.unshallow_repository_to_defaultc                 C   s  d}t  }|  zo|  }|jdkr&W |  t tj	|
 | dS |  }|jdkrBW |  t tj	|
 | dS |  }|jdkr^W |  t tj	|
 | dS td |j}W |  t tj	|
 | dS |  t tj	|
 | w )Nr   TzUnshallow failedF)r   startr   r#   stopr   rQ   rR   r   	UNSHALLOWrI   r   r   rA   rB   )r7   r#   rK   rU   r   r   r   $try_all_unshallow_repository_methods   s4   



z(Git.try_all_unshallow_repository_methods	revisionsc           
      c   s   t tdd}d|}| jd urt| jnt }tt }| j	| j	kr.|}tj
|dK}| d| }| ddd|g|}t tj|j|j |jd	krgtd
|j 	 W d    d S t|| dD ]}	|	V  qqW d    d S 1 sw   Y  d S )N   i@B r   )dir/zpack-objectsz--compression=9z--max-pack-size=3mr   z"Error calling git pack-objects: %sz*.pack)r%   randomrandintrT   r1   r   tempfile
gettempdirstatst_devTemporaryDirectoryrM   r   rQ   rR   r   PACK_OBJECTSr$   r#   rA   rS   r"   glob)
r7   r   	base_namerevisions_textr1   temp_dir_base
output_dirprefixrU   packfiler   r   r   pack_objects  s&   


"zGit.pack_objectsrX   )NF)$r   r	   r
   tOptionalr%   r8   listr    rM   r   rV   r^   r'   rd   rg   rm   ro   rq   rw   r)   rx   ry   r|   r   r   boolr   r   r   r   r   r   Iterabler   r   r   r   r   r   r0   `   s,    "
"
 "	 r0   r;   c                  C   s   zt  } W n ty } ztd| i W  Y d }~S d }~ww tj|  tj|  tj	| 
 tj|  i}|   }rY|tj|jtj|jtj|jtj|jtj|jtj|ji |S )NError getting git data: %s)r0   r5   rA   rS   r   r   rg   r   rm   r   rq   r   rw   rx   updater   r*   r   r+   r   r,   r   r-   r   r.   r   r/   )r2   etags	user_infor   r   r   get_git_tags_from_git_command3  s.   




r   head_shac                 C   s   zt  }W n ty } ztd| i W  Y d }~S d }~ww | r*|jdd tj|| i}|	|  }rV|
tj|jtj|jtj|jtj|jtj|jtj|ji |S )Nr   T)r   )r0   r5   rA   rS   r   r   r   r   rw   rx   r   r   r*   r   r+   r   r,   r   r-   r   r.   r   r/   )r   r2   r   r   r   r   r   r   "get_git_head_tags_from_git_commandP  s,   
r   c                   C   s0   z
t t   W S  ty   t   Y S w rX   )r   r0   ry   absoluter5   r1   r   r   r   r   ry   m  s
   ry   z^refs/(heads/)?z^origin/z^tags/namec              
   C   s(   | d urt dtdtd| S d S )NrP   )_RE_TAGSsub
_RE_ORIGIN_RE_REFS)r   r   r   r   normalize_refy  s   (r   refc                 C   s   | rd| v S dS )Nztags/Fr   )r   r   r   r   is_ref_a_tag}  s   r   envc                 C   s   t | d}t | d}t| dr|}d}tj| dp$| dtj| dtj|tj|tj| dtj	| dtj
| d	tj| d
tj| dtj| dtj| di}|S )z8Extract git commit metadata from user-provided env vars.DD_GIT_BRANCH
DD_GIT_TAGN_CI_DD_GIT_REPOSITORY_URLDD_GIT_REPOSITORY_URLDD_GIT_COMMIT_SHADD_GIT_COMMIT_MESSAGEDD_GIT_COMMIT_AUTHOR_DATEDD_GIT_COMMIT_AUTHOR_EMAILDD_GIT_COMMIT_AUTHOR_NAMEDD_GIT_COMMIT_COMMITTER_DATEDD_GIT_COMMIT_COMMITTER_EMAILDD_GIT_COMMIT_COMMITTER_NAME)r   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   branchtagr   r   r   r   get_git_tags_from_dd_variables  s$   r   )'dataclassesr   loggingpathlibr   r   rer3   rC   r   typingr   "ddtrace.testing.internal.telemetryr   r   #ddtrace.testing.internal.tracer_apir   	getLoggerr   rA   r   r    r)   r0   dictr%   r   r   r   ry   compiler   r   r   r   r   r   MutableMappingr   r   r   r   r   <module>   s:    
;	 T 


.