o
    Á¿iÝI  ã                   @   s¦  U 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jejeef geeeje f f Zg Zeeeef  ed< ded	ejegef fd
d„Zdejeef d	eeeje f fdd„Zedƒdejeef d	eeeje f fdd„ƒZedƒdejeef d	eeeje f fdd„ƒZedƒdejeef d	eeeje f fdd„ƒZedƒdejeef d	eeeje f fdd„ƒZedƒdejeef d	eeeje f fdd„ƒZedƒdejeef d	eeeje f fdd „ƒZ ed!ƒdejeef d	eeeje f fd"d#„ƒZ!ed$ƒdejeef d	eeeje f fd%d&„ƒZ"ed'ƒdejeef d	eeeje f fd(d)„ƒZ#ed*ƒdejeef d	eeeje f fd+d,„ƒZ$ed-ƒdejeef d	eeeje f fd.d/„ƒZ%ed0ƒdejeef d	eeeje f fd1d2„ƒZ&ed3ƒdejeef d	eeeje f fd4d5„ƒZ'ed6ƒdejeef d	eeeje f fd7d8„ƒZ(dS )9é    N)Úgithub_actions)Úgit)ÚGitTagc                   @   s@   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S )ÚCITagzci.stage.namez	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.node.namezci.node.labelszci.workspace_pathz_dd.ci.env_varsN)Ú__name__Ú
__module__Ú__qualname__Ú
STAGE_NAMEÚJOB_IDÚJOB_NAMEÚJOB_URLÚPIPELINE_IDÚPIPELINE_NAMEÚPIPELINE_NUMBERÚPIPELINE_URLÚPROVIDER_NAMEÚ	NODE_NAMEÚNODE_LABELSÚWORKSPACE_PATHÚ_CI_ENV_VARS© r   r   úO/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/testing/internal/ci.pyr      s    r   Ú	PROVIDERSÚkeyÚreturnc                    s   dt dt f‡ fdd„}|S )z¼
    Register a handler to extract tags from the environment for a given CI provider.

    The handler will be used if the environment contains an environment variable named by `key`.
    Úfr   c                    s   t  ˆ | f¡ | S )N)r   Úappend)r   ©r   r   r   Ú	decoratorB   s   z$register_provider.<locals>.decorator)ÚTProviderFunction)r   r   r   r   r   Úregister_provider;   s   r    Úenvc                 C   s&   t D ]\}}|| v r|| ƒ  S qi S )z5Extract tags from CI  provider environment variables.)r   )r!   r   Úextractr   r   r   Úget_ci_tagsI   s
   ÿr#   ÚAPPVEYORc                 C   s  d  |  d¡|  d¡¡}|  d¡dkr0d  |  d¡¡}|  d¡}|  d¡p)|  d	¡}|  d
¡}nd } } }}|  d¡}|rL|  d¡}|rL|d| 7 }tjdtj|tj|tj|  d¡tj|  d¡tj	|  d¡tj
|  d¡tj|tj|tj|tj|tj|tj|  d¡tj|  d¡iS )z&Extract CI tags from Appveyor environ.z.https://ci.appveyor.com/project/{0}/builds/{1}ÚAPPVEYOR_REPO_NAMEÚAPPVEYOR_BUILD_IDÚAPPVEYOR_REPO_PROVIDERÚgithubúhttps://github.com/{0}.gitÚAPPVEYOR_REPO_COMMITÚ&APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCHÚAPPVEYOR_REPO_BRANCHÚAPPVEYOR_REPO_TAG_NAMENÚAPPVEYOR_REPO_COMMIT_MESSAGEÚ%APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDEDÚ
ÚappveyorÚAPPVEYOR_BUILD_FOLDERÚAPPVEYOR_BUILD_NUMBERÚAPPVEYOR_REPO_COMMIT_AUTHORÚ!APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL)ÚformatÚgetr   r   r   ÚREPOSITORY_URLÚ
COMMIT_SHAr   r   r   r   r   r   ÚBRANCHÚTAGÚCOMMIT_MESSAGEÚCOMMIT_AUTHOR_NAMEÚCOMMIT_AUTHOR_EMAIL)r!   ÚurlÚ
repositoryÚcommitÚbranchÚtagÚcommit_messageÚextendedr   r   r   Úextract_appveyorR   s:   ÿ


òrF   ÚTF_BUILDc                 C   sŽ  |   d¡r0|   d¡r0|   d¡r0d |   d¡|   d¡|   d¡¡}|}|d |   d¡|   d¡¡ }nd }}i tjd	“tj|   d
¡“tj|   d¡“tj|   d¡“tj|   d¡“tj|“tj	|“t
j|   d¡ph|   d¡“t
j|   d¡pt|   d¡“t
j|   d¡p…|   d¡p…|   d¡“t
j|   d¡“t
j|   d¡“t
j|   d¡“tj|   d¡“tj|   d¡“tj|   d¡“tjtj|   d¡|   d¡|   d¡dœdd“S )z-Extract CI tags from Azure pipelines environ.ÚSYSTEM_TEAMFOUNDATIONSERVERURIÚSYSTEM_TEAMPROJECTIDÚBUILD_BUILDIDz!{0}{1}/_build/results?buildId={2}z&view=logs&j={0}&t={1}ÚSYSTEM_JOBIDÚSYSTEM_TASKINSTANCEIDNÚazurepipelinesÚBUILD_SOURCESDIRECTORYÚBUILD_DEFINITIONNAMEÚ&SYSTEM_PULLREQUEST_SOURCEREPOSITORYURIÚBUILD_REPOSITORY_URIÚ!SYSTEM_PULLREQUEST_SOURCECOMMITIDÚBUILD_SOURCEVERSIONÚSYSTEM_PULLREQUEST_SOURCEBRANCHÚBUILD_SOURCEBRANCHÚBUILD_SOURCEBRANCHNAMEÚBUILD_SOURCEVERSIONMESSAGEÚBUILD_REQUESTEDFORIDÚBUILD_REQUESTEDFOREMAILÚSYSTEM_STAGEDISPLAYNAMEÚSYSTEM_JOBDISPLAYNAME)rI   rJ   rK   ©ú,ú:©Ú
separators)r7   r6   r   r   r   r   r   r   r   r   r   r8   r9   r:   r<   r=   r>   r	   r
   r   r   ÚjsonÚdumps)r!   Úbase_urlÚpipeline_urlÚjob_urlr   r   r   Úextract_azure_pipelinesx   sj   ÿÿÿþýüûúùø	÷
ÿôóòñðïîýúírf   ÚBITBUCKET_COMMITc                 C   s¤   d  |  d¡|  d¡¡}tj|  d¡tj|  d¡tj|  d¡p#|  d¡tj|  d¡tj|tj	|  d	d
¡ 
d¡p8dtj|  d¡tj|  d¡tj|tjdtj|  d¡iS )z'Extract CI tags from Bitbucket environ.z<https://bitbucket.org/{0}/addon/pipelines/home#!/results/{1}ÚBITBUCKET_REPO_FULL_NAMEÚBITBUCKET_BUILD_NUMBERÚBITBUCKET_BRANCHrg   ÚBITBUCKET_GIT_SSH_ORIGINÚBITBUCKET_GIT_HTTP_ORIGINÚBITBUCKET_TAGÚBITBUCKET_PIPELINE_UUIDÚ z{}}NÚ	bitbucketÚBITBUCKET_CLONE_DIR)r6   r7   r   r:   r9   r8   r;   r   r   r   Ústripr   r   r   r   r   )r!   r?   r   r   r   Úextract_bitbucket¤   s   ÿõrs   Ú	BUILDKITEc              	   C   s„  g }d}| D ]}|  |¡r#| |d¡ ¡ }|  |¡}| d ||¡¡ qi tj|  d¡“tj|  d¡“tj	|  d¡“tj
|  d¡“tj|  d¡“tj|  d	¡“tj|  d
¡“tj|  d¡“tj|  d¡“tjd |  d¡|  d¡¡“tjd“tj|  d¡“tj|  d¡“tj|  d¡“tj|  d¡“tj|  d¡“tj|  d¡“tjtj|  d¡|  d¡dœddtjtj|ddtj|  d¡i¥S )z'Extract CI tags from Buildkite environ.ÚBUILDKITE_AGENT_META_DATA_ro   z{}:{}ÚBUILDKITE_BRANCHÚBUILDKITE_COMMITÚBUILDKITE_REPOÚBUILDKITE_TAGÚBUILDKITE_BUILD_IDÚBUILDKITE_PIPELINE_SLUGÚBUILDKITE_BUILD_NUMBERÚBUILDKITE_BUILD_URLÚBUILDKITE_JOB_IDz{0}#{1}Ú	buildkiteÚBUILDKITE_BUILD_CHECKOUT_PATHÚBUILDKITE_MESSAGEÚBUILDKITE_BUILD_AUTHORÚBUILDKITE_BUILD_AUTHOR_EMAILÚBUILDKITE_BUILD_CREATORÚBUILDKITE_BUILD_CREATOR_EMAIL)rz   r~   r\   r_   ÚBUILDKITE_AGENT_ID)Ú
startswithÚreplaceÚlowerr7   r   r6   r   r:   r9   r8   r;   r   r   r   r   r   r
   r   r   r   r<   r=   r>   ÚCOMMIT_COMMITTER_NAMEÚCOMMIT_COMMITTER_EMAILr   ra   rb   r   r   )r!   Únode_label_listÚ buildkite_agent_meta_data_prefixÚenv_variabler   Úvaluer   r   r   Úextract_buildkite¹   sh   

€ÿþýüûúùø	÷
öõôóòñðïþûær   ÚCIRCLECIc                 C   s¶   t j|  d¡t j|  d¡t j|  d¡t j|  d¡tj|  d¡tj|  d¡tj	|  d¡tj
d |  d¡¡tj|  d	¡tj|  d
¡tjdtj|  d¡tjtj|  d¡|  d¡dœddiS )z&Extract CI tags from CircleCI environ.ÚCIRCLE_BRANCHÚCIRCLE_SHA1ÚCIRCLE_REPOSITORY_URLÚ
CIRCLE_TAGÚCIRCLE_WORKFLOW_IDÚCIRCLE_PROJECT_REPONAMEÚCIRCLE_BUILD_NUMz0https://app.circleci.com/pipelines/workflows/{0}ÚCIRCLE_BUILD_URLÚ
CIRCLE_JOBÚcircleciÚCIRCLE_WORKING_DIRECTORY)r–   r˜   r\   r_   )r   r:   r7   r9   r8   r;   r   r   r   r   r   r6   r   r   r   r   r   ra   rb   ©r!   r   r   r   Úextract_circle_ciâ   s&   þûórž   ÚCF_BUILD_IDc                 C   s^   |   d¡}tj|   d¡tj|tj|   d¡tj|   d¡tj|   d¡tjdtj	t
jd|iddiS )	z'Extract CI tags from Codefresh environ.rŸ   Ú	CF_BRANCHÚCF_PIPELINE_NAMEÚCF_BUILD_URLÚCF_STEP_NAMEÚ	codefreshr\   r_   )r7   r   r:   r   r   r   r   r   r   r   ra   rb   )r!   Úbuild_idr   r   r   Úextract_codefreshü   s   
þùr¦   Ú
GITHUB_SHAc                 C   s
   t  | ¡S )z0Extract CI tags from Github Actions environment.)r   Úextract_github_actionsr   r   r   r   r¨     s   
r¨   Ú	GITLAB_CIc                 C   s`  |   d¡}d}d}|r| d¡ d¡\}}|   d¡}i tj|   d¡“tj|   d¡“tj|   d¡“tj|   d	¡“tj	|   d
¡“tj
|   d¡“tj|   d¡“tj|   d¡“tj|   d¡“tj|   d¡“tj|   d¡“tj|   d¡“tjd“tj|   d¡“tj|   d¡“tj|“tj|“tj|tjtj|   d¡|   d¡|   d¡dœddtj|   d¡tj|   d¡i¥S )z$Extract CI tags from Gitlab environ.ÚCI_COMMIT_AUTHORNz> z <ÚCI_COMMIT_TIMESTAMPÚCI_COMMIT_REF_NAMEÚCI_COMMIT_SHAÚCI_REPOSITORY_URLÚCI_COMMIT_TAGÚCI_JOB_STAGEÚ	CI_JOB_IDÚCI_JOB_NAMEÚ
CI_JOB_URLÚCI_PIPELINE_IDÚCI_PROJECT_PATHÚCI_PIPELINE_IIDÚCI_PIPELINE_URLÚgitlabÚCI_PROJECT_DIRÚCI_COMMIT_MESSAGEÚCI_PROJECT_URL)r»   r´   r±   r\   r_   ÚCI_RUNNER_TAGSÚCI_RUNNER_ID)r7   rr   Úsplitr   r:   r9   r8   r;   r   r	   r
   r   r   r   r   r   r   r   r   r<   r=   r>   ÚCOMMIT_AUTHOR_DATEr   ra   rb   r   r   )r!   ÚauthorÚauthor_nameÚauthor_emailÚcommit_timestampr   r   r   Úextract_gitlab  sh   

ÿþýüûúùø	÷
öõôóòñðïýúärÄ   ÚJENKINS_URLc                 C   s  |   dd¡}|   d¡}|r|rt d t |¡¡d|¡}|r+d dd„ | d¡D ƒ¡}g }|   d¡}|r8| ¡ }tj	|   d¡tj
|   d	¡tj|   d
|   d¡¡tj|   d¡tj|tj|   d¡tj|   d¡tjdtj|   d¡tjtjd|   d¡iddtjtj|ddtj|   d¡iS )z%Extract CI tags from Jenkins environ.Ú
GIT_BRANCHro   r   z/{0}ú/c                 s   s     | ]}|rd |vr|V  qdS )ú=Nr   )Ú.0Úvr   r   r   Ú	<genexpr>F  s   € z"extract_jenkins.<locals>.<genexpr>r   Ú
GIT_COMMITÚGIT_URLÚ	GIT_URL_1Ú	BUILD_TAGÚBUILD_NUMBERÚ	BUILD_URLÚjenkinsÚ	WORKSPACEÚDD_CUSTOM_TRACE_IDr\   r_   r   )r7   ÚreÚsubr6   r   Únormalize_refÚjoinr¾   r   r:   r9   r8   r   r   r   r   r   r   r   r   ra   rb   r   r   )r!   rB   ÚnameÚnode_labels_listÚnode_labels_envr   r   r   Úextract_jenkins>  s6   


ÿüïrÜ   ÚTEAMCITY_VERSIONc                 C   s"   t j|  d¡t j|  d¡t jdiS )z&Extract CI tags from Teamcity environ.rÑ   ÚTEAMCITY_BUILDCONF_NAMEÚteamcity)r   r   r7   r   r   r   r   r   r   Úextract_teamcity`  s   ýrà   ÚTRAVISc                 C   sž   t j|  d¡p|  d¡t j|  d¡t jd |  d¡¡t j|  d¡tj|  d¡tj	|  d¡tj
|  d¡tj|  d	¡tj|  d
¡tjdtj|  d¡t j|  d¡iS )z$Extract CI tags from Travis environ.ÚTRAVIS_PULL_REQUEST_BRANCHÚTRAVIS_BRANCHÚTRAVIS_COMMITr)   ÚTRAVIS_REPO_SLUGÚ
TRAVIS_TAGÚTRAVIS_JOB_WEB_URLÚTRAVIS_BUILD_IDÚTRAVIS_BUILD_NUMBERÚTRAVIS_BUILD_WEB_URLÚtravisciÚTRAVIS_BUILD_DIRÚTRAVIS_COMMIT_MESSAGE)r   r:   r7   r9   r8   r6   r;   r   r   r   r   r   r   r   r   r<   r   r   r   r   Úextract_travisj  s   ôrî   ÚBITRISE_BUILD_SLUGc                  C   s  |   d¡p	|   d¡}|   d¡p|   d¡}|   d¡r|   d¡}n|   d¡s)|   d¡r6d |   d¡|   d¡¡}nd	}tjd
tj|   d¡tj|   d¡tj|   d¡tj|   d¡tj|   d¡t	j
|   d¡t	j|t	j|t	j|   d¡t	j|t	j|   d¡t	j|   d¡t	j|   d¡t	j|   d¡iS )z%Extract CI tags from Bitrise environ.ÚBITRISE_GIT_COMMITÚGIT_CLONE_COMMIT_HASHÚBITRISEIO_GIT_BRANCH_DESTÚBITRISE_GIT_BRANCHÚBITRISE_GIT_MESSAGEÚ GIT_CLONE_COMMIT_MESSAGE_SUBJECTÚGIT_CLONE_COMMIT_MESSAGE_BODYz{0}:
{1}NÚbitriserï   ÚBITRISE_TRIGGERED_WORKFLOW_IDÚBITRISE_BUILD_NUMBERÚBITRISE_BUILD_URLÚBITRISE_SOURCE_DIRÚGIT_REPOSITORY_URLÚBITRISE_GIT_TAGÚGIT_CLONE_COMMIT_AUTHOR_NAMEÚGIT_CLONE_COMMIT_AUTHOR_EMAILÚGIT_CLONE_COMMIT_COMMITER_NAME)r7   r6   r   r   r   r   r   r   r   r   r8   r9   r:   r;   r<   r=   r>   rŠ   r‹   )r!   rA   rB   Úmessager   r   r   Úextract_bitrise}  s2   
ÿñr  ÚBUDDYc                 C   sœ   t jdt jd |  d¡|  d¡¡t j|  d¡t j|  d¡t j|  d¡tj	|  d¡tj
|  d¡tj|  d	¡tj|  d
¡tj|  d¡tj|  d¡tj|  d¡iS )z#Extract CI tags from Buddy environ.Úbuddyz{0}/{1}ÚBUDDY_PIPELINE_IDÚBUDDY_EXECUTION_IDÚBUDDY_PIPELINE_NAMEÚBUDDY_EXECUTION_URLÚBUDDY_SCM_URLÚBUDDY_EXECUTION_REVISIONÚBUDDY_EXECUTION_BRANCHÚBUDDY_EXECUTION_TAGÚ BUDDY_EXECUTION_REVISION_MESSAGEÚ'BUDDY_EXECUTION_REVISION_COMMITTER_NAMEÚ(BUDDY_EXECUTION_REVISION_COMMITTER_EMAIL)r   r   r   r6   r7   r   r   r   r   r8   r9   r:   r;   r<   rŠ   r‹   r   r   r   r   Úextract_buddyž  s   ôr  ÚCODEBUILD_INITIATORc                 C   sn   i }d| v r5|   d¡}|r5| d¡r5| tjdtj|   d¡tjtj|   d¡|   d¡|   d¡dœdd	i¡ |S )
z,Extract CI tags from codebuild environments.r  ÚcodepipelineÚawscodepipelineÚDD_PIPELINE_EXECUTION_IDÚCODEBUILD_BUILD_ARNÚDD_ACTION_EXECUTION_ID)r  r  r  r\   r_   )	r7   r‡   Úupdater   r   r   r   ra   rb   )r!   ÚtagsÚcodebuild_initiatorr   r   r   Úextract_codebuild±  s"   
ýúýÿr  ))ra   ÚloggingrÕ   ÚtypingÚtÚddtrace.ext.cir   Úddtrace.testing.internalr   Úddtrace.testing.internal.gitr   Ú	getLoggerr   Úlogr   ÚCallableÚMutableMappingÚstrÚdictÚOptionalr   r   ÚlistÚtupleÚ__annotations__r    r#   rF   rf   rs   r   rž   r¦   r¨   rÄ   rÜ   rà   rî   r  r  r  r   r   r   r   Ú<module>   sR   
 
()*	,%,+,,(,,,,),!,	,, ,0