o
    i                     @   sn  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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 G dd dZG dd	 d	Zd
ZdZdaeje ed< deje defddZdefddZdeeje eje f fddZdedefddZdededdfddZ defddZ!dedefddZ"dededefd d!Z#deje fd"d#Z$dS )$    N)Path)gitmetadata)Distribution) _package_for_root_module_mappingc                
   @   sF   e Zd Zdedededee ddf
ddZdeeejf fd	d
Z	dS )LibrarykindnameversionpathsreturnNc                 C   s   || _ || _|| _|| _d S Nr   r   r	   r
   )selfr   r   r	   r
    r   f/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/datadog/profiling/code_provenance.py__init__   s   
zLibrary.__init__c                 C   s   | j | j| jt| jdS )Nr   )r   r   r	   listr
   r   r   r   r   to_dict   s   zLibrary.to_dict)
__name__
__module____qualname__strsetr   dicttAnyr   r   r   r   r   r      s    
r   c                   @   s.   e Zd ZdddZdeeejf fddZdS )CodeProvenancer   Nc              	   C   s  g | _ tddt ttddddgd}tjdkrDtj	D ]%}zt
j|}|r9|jdkr9|jd	|j d
 W q tyC   Y qw | j | t pNi }i }ttd}| D ]G\}}|j}|drw|tdd  dd d }||}	|	d u rtd||jt d}	|	||< || }
|ds|
 r|	jt|
 q\t \}}}||d  }rd|_ | j !|"  d S )Nzstandard librarystdlibz<frozen importlib._bootstrap>z&<frozen importlib._bootstrap_external>z<frozen importlib.util>r   )   
   frozenz<frozen >purelibz__pycache__/.r   z.pylibrary )#	librariesr   platformpython_versionr   	sysconfigget_pathsysversion_infostdlib_module_names	importlibutil	find_specoriginr
   addr   	Exceptionappendr   r   items
startswithlensplitgetr	   endswithis_dirr   r   get_git_tagsr   extendvalues)r   python_stdlibr   specmodule_to_distributionr'   site_packagesmoduledistlibmodule_path_main_packageinfor   r   r   r   #   sV   




zCodeProvenance.__init__c                 C   s   ddd | j D iS )Nv1c                 S   s   g | ]}|  qS r   )r   ).0rF   r   r   r   
<listcomp>j   s    z*CodeProvenance.to_dict.<locals>.<listcomp>)r'   r   r   r   r   r   i   s   zCodeProvenance.to_dict)r   N)	r   r   r   r   r   r   r   r   r   r   r   r   r   r   "   s    
Fr   zddtrace-code-provenancerK   _code_provenance_file_pathpathr   c                 C   s2   | sdS z
t t|  jW S  ty   Y dS w )Nr&   )r   r   statst_mtime_nsOSError)rO   r   r   r   _safe_mtime_nsr   s   rS   c                  C   sV   t d} tdd}dtt tj	|t
| f}t|d }t d| S )Nr#   DD_MAIN_PACKAGEr&    utf-8-)r*   r+   osgetenvjoin_CODE_PROVENANCE_CACHE_VERSIONr(   r)   r,   prefixrS   hashlibsha256encode	hexdigest_CODE_PROVENANCE_CACHE_PREFIX)r#   rI   datadigestr   r   r   _cache_basename{   s   
	rd   c               	   C   sJ   zt  } tt }||  d ||  d fW S  ttfy$   Y dS w )Nz.jsonz.lock)NN)rd   r   tempfile
gettempdirFileNotFoundErrorrR   )basetmpdirr   r   r   _cache_file_and_lock   s   rj   
cache_filec              	   C   sX   z| j dd}W n
 ty   Y dS w |sdS zt| W dS  ttfy+   Y dS w )NrV   encodingFT)	read_textrR   jsonloads	TypeError
ValueError)rk   rb   r   r   r   _is_valid_cache_file   s   rs   rb   c                 C   s   |  | j dt  d}z@|jddd}|| |  t|  W d    n1 s1w   Y  t	||  W z|
  W d S  tyN   Y d S w z|
  W w  ty^   Y w w )Nr$   z.tmpwrV   rl   )with_suffixsuffixrX   getpidopenwriteflushfsyncfilenoreplaceunlinkrR   )rk   rb   tmp_pathfr   r   r   _write_cached_json   s$   
r   c                  C   s   t  } t|  S r   )r   ro   dumpsr   )cpr   r   r   _compute_json_str   s   r   c                 C   s4   t  }|sdS zt| | W dS  ty   Y dS w )NFT)r   r   rR   )rk   computedr   r   r   _compute_and_write   s   
r   lock_filenamec              	   C   s   zMt |d=}dd l}z|||j|jB  W n ty(   Y W d    W dS w t| r7	 W d    W dS t| W  d    W S 1 sFw   Y  W d S  tyW   Y dS w )Nza+br   FT)rx   fcntllockfLOCK_EXLOCK_NBrR   rs   r   )rk   r   r   r   r   r   r   _ensure_cache_file   s"   (r   c                  C   sL   t rt S t \} }| d u s|d u rd S t| st| t|r$t| a t S d S r   )rN   rj   rs   r   r   )rk   	lock_filer   r   r   get_code_provenance_file   s   
r   )%r]   importlib.utilr/   ro   rX   pathlibr   r(   r,   r*   re   typingr   ddtrace.internalr   ddtrace.internal.packagesr   r   r   r   ra   r[   rN   Optionalr   __annotations__rS   rd   tuplerj   boolrs   r   r   r   r   r   r   r   r   r   <module>   s6   
 K	"	