o
    iJ                      @   s\  d 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 eeZdZdZd	Zd
ZdZdZdZdZdZdZedZdee dee fddZdZdZddgZddgZ edZ!de"e fddZ#dedee fd d!Z$d"e"e dee fd#d$Z%d%eeef dee fd&d'Z&d%eeef de'eee f fd(d)Z(dS )*z'GitHub Actions CI provider integration.    N)MutableMapping)Optional)git)
get_loggerz	ci.job.idzci.job.namez
ci.job.urlzci.pipeline.idzci.pipeline.namezci.pipeline.numberzci.pipeline.urlzci.provider.namezci.workspace_pathz_dd.ci.env_varsz(https?://|ssh://)[^/]*@urlreturnc                 C   s   | d ur
t d| S d S )Nz\1)_RE_URLsub)r    r
   Q/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/ext/ci/github_actions.py_filter_sensitive_info!   s   r   JOB_CHECK_RUN_IDi   z(/home/runner/actions-runner/cached/_diagz!/home/runner/actions-runner/_diagz)/Users/runner/actions-runner/cached/_diagz"/Users/runner/actions-runner/_diagz9"k"\s*:\s*"check_run_id"\s*,\s*"v"\s*:\s*([0-9]+)(?:\.0)?c                  C   s   t  } | dkrUg }tjd}|r&|tj|dddtj|ddg tjd}|rB|tj|dddtj|ddg |ddg tt	
d	d
 |D S | dkr[tS tS )z,Get OS-specific diagnostics directory paths.WindowsProgramFileszactions-runnercached_diagzProgramFiles(x86)zC:\actions-runner\cached\_diagzC:\actions-runner\_diagc                 s   s    | ]}|r|V  qd S Nr
   ).0cr
   r
   r   	<genexpr>S   s    z!_get_diag_dirs.<locals>.<genexpr>Darwin)platformsystemosenvirongetextendpathjoinlistdictfromkeysDIAG_DIRS_DARWINDIAG_DIRS_LINUX)r   
candidatesprogram_filesprogram_files_x86r
   r
   r   _get_diag_dirs8   s4   r'   	file_pathc           
   
   C   s  zt | }|jtkrtd| |j W dS t| dddd}| }W d   n1 s-w   Y  zVt	|}|
di 
dg D ]D}|
d	d
kr|
d}t|ttfrjt|trc|t|krcqBtt|}nt|trt| }nqB| rtd||  |  W W S qBW n tttfy   Y nw t|}|r|d}td||  |W S W dS  ty }	 ztd| |	 W Y d}	~	dS d}	~	ww )zTExtract job ID from a single Worker log file using JSON parsing with regex fallback.z1Skipping oversized diagnostics file %s (%d bytes)Nrzutf-8replace)encodingerrorsjobdkcheck_run_idvz4Extracted github actions job id via JSON: %s from %s   z5Extracted github actions job id via regex: %s from %szError reading file %s: %s)r   statst_sizeMAX_DIAG_FILE_SIZElogdebugopenreadjsonloadsr   
isinstanceintfloatstrstripisdigit
ValueErrorKeyError	TypeErrorCHECK_RUN_ID_REGEXsearchgroupOSError)
r(   	file_statfcontentdataitemvaluejob_idmatcher
   r
   r   _try_extract_job_id_from_fileZ   sP   








rR   	diag_dirsc                 C   s   | D ]X}t j|sqztt j|d}W n ty0 } ztd|| W Y d}~qd}~ww |s4qz|jdd dd W n	 t	yH   Y nw |D ]}t
|}|rY|    S qKqdS )z@Attempt to extract job ID from GitHub Actions diagnostics files.zWorker_*.logz$Error globbing worker logs in %s: %sNc                 S   s   t j| S r   )r   r   getmtime)rJ   r
   r
   r   <lambda>   s    z/_try_extract_job_id_from_diag.<locals>.<lambda>T)keyreverse)r   r   isdirglobr   	Exceptionr6   r7   sortrH   rR   )rS   diag_dirworker_filesrQ   worker_filerO   r
   r
   r   _try_extract_job_id_from_diag   s0   r_   envc                 C   s6   |  td }|r| r|S tt }|r|S dS )zGet the numeric job ID for GitHub Actions.

    Checks JOB_CHECK_RUN_ID env var first, then falls back to diagnostics files.
     N)r   JOB_CHECK_RUN_ID_ENVr@   rA   r_   r'   )r`   rO   diag_job_idr
   r
   r   _get_job_id   s   
rd   c                 C   s  t | d}| d}| d}| d}| d}d|||}d}d| v rkz*t| d }t|}	|	d	i d
i d}W d   n1 sLw   Y  W n tyj }
 ztd|
 W Y d}
~
nd}
~
ww |||d}|r}||d< d||}| d}t	| }t
j| dp| dt
j|t
jd||t
j|t|t| dt| dt|t|tdt| dttj|ddi}|r|r||t< d|||||t< td|t  |S d||||t< |S )z0Extract CI tags from Github Actions environment.GITHUB_SERVER_URLGITHUB_REPOSITORY
GITHUB_SHAGITHUB_RUN_IDGITHUB_RUN_ATTEMPTz{0}/{1}/actions/runs/{2}NGITHUB_EVENT_PATHpull_requestheadshaz-Failed to read or parse GITHUB_EVENT_PATH: %s)re   rf   rh   z{0}/attempts/{1}
GITHUB_JOBGITHUB_HEAD_REF
GITHUB_REFz{0}/{1}.gitGITHUB_WORKFLOWGITHUB_RUN_NUMBERgithubGITHUB_WORKSPACE),:)
separatorsz {0}/{1}/actions/runs/{2}/job/{3}z.GitHub Actions job URL with numeric job ID: %sz{0}/{1}/commit/{2}/checks)r   r   formatr8   r:   loadrZ   r6   errorrd   r   BRANCH
COMMIT_SHAREPOSITORY_URLCOMMIT_HEAD_SHA_PIPELINE_ID_PIPELINE_NAME_PIPELINE_NUMBER_PIPELINE_URL	_JOB_NAME_PROVIDER_NAME_WORKSPACE_PATH_CI_ENV_VARSdumps_JOB_ID_JOB_URLr7   )r`   github_server_urlgithub_repositorygit_commit_shagithub_run_idrun_attemptpipeline_urlgit_commit_head_sharJ   github_event_datarQ   env_varsjob_namenumeric_job_idtagsr
   r
   r   extract_github_actions   sj   








r   ))__doc__rY   r:   r   r   retypingr   r   ddtrace.extr   ddtrace.internal.loggerr   __name__r6   r   r   r   r   r   r   r   r   r   r   compiler   r?   r   rb   r5   r#   r"   rE   r   r'   rR   r_   rd   r    r   r
   r
   r
   r   <module>   sJ    

",*