
    uYf7                        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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 ddlmZ ddlmZ 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# ejH                  d      Z% ejH                  d      Z& ejH                  d      Z' ee(      Z) edde*fde*fd e+fd!e,fg      Z-d" Z.d# Z/ddd$d%Z0dAd&Z1d' Z2d( Z3dBd)Z4dBd*Z5d+ Z6dCd,Z7dCd-Z8dBd.Z9dBd/Z:dBd0Z;dBd1Z<dBd2Z=dBd3Z>dBd4Z?dCd5Z@dCd6ZAdBd7ZBdBd8ZCdBd9ZDdBd:ZEdBd;ZFdBd<ZGdBd=ZHdBd>ZIej                  dDd?       ZKej                  dBd@       ZLy)Ez 
tags for common git attributes
    N)Dict)	Generator)List)MutableMapping)
NamedTuple)Optional)Tuple)Union)compat)
get_logger)	StopWatchz
git.branchzgit.commit.shazgit.repository_urlzgit.tagz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.messagepython_main_packagez^refs/(heads/)?z^origin/z^tags/_GitSubprocessDetailsstdoutstderrduration
returncodec           
          | >t         j                  dt        j                  dt        j                  d|                   S d S )N )_RE_TAGSsub
_RE_ORIGIN_RE_REFS)names    O/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/ddtrace/ext/git.pynormalize_refr   I   s4    KOK[8<<JNN2x||B/EFGeaee    c                     | rd| v S dS )Nztags/F )refs    r   is_ref_a_tagr!   N   s     7c>+e+r   cwdstd_inc                    dg}|j                  |       t        j                  d|       t               5 }t	        j
                  |t        j                  t        j                  t        j                  |       }|j                  |      \  }}ddd       t        t        j                        j                         t        j                        j                         j                         dz  j                        S # 1 sw Y   txY w)zHelper for invoking the git CLI binary

    Returns a tuple containing:
        - a str representation of stdout
        - a str representation of stderr
        - the time it took to execute the command, in milliseconds
        - the exit code
    gitzExecuting git command: %s)r   r   stdinr#   )inputNi  )extendlogdebugr   
subprocessPopenPIPEcommunicater   r   ensure_textstripelapsedr   )r#   r$   cmdgit_cmd	stopwatchprocessr   r   s           r    _git_subprocess_cmd_with_detailsr7   S   s     gGNN3II)73	 ;	""JOOJOO:??`c
 !,,6,:	; !6"((*6"((*d"	 ; ;s   ADDc                     t        | t              r| j                  d      } t        | |dd\  }}}}|dk(  r|S t	        |      )z'Helper for invoking the git CLI binary. Nr"   r   )
isinstancestrsplitr7   
ValueError)r3   r#   r$   r   r   _r   s          r   _git_subprocess_cmdr?   p   sJ     #siin$Dcs[_$`!FFAzQ
V
r   c                      	 t        d       y # t        $ r t        j                  d       Y y t        $ r t        j                  d       Y y w xY w)Nz&config --global --add safe.directory *6Git executable not found, cannot extract git metadata.zError setting safe directory)r?   GitNotFoundErrorr*   errorr=   r   r   r   _set_safe_directoryrD   }   sB    2DE L		JK 2		012s    AAAc                 $    t        ddddd|       S )Nconfigz	--defaultorigin--getzclone.defaultRemoteNamer#   r7   rI   s    r   -_extract_clone_defaultremotename_with_detailsrK      s    ++x2KQT r   c                      t        d|       }|S )Nzrev-parse @{upstream}rI   r?   )r#   outputs     r   _extract_upstream_sharO      s     !8cBFMr   c                 X    t        dd|       \  }}}}|j                         dk(  }|||fS )Nz	rev-parsez--is-shallow-repositoryrI   true)r7   r1   )r#   r   r>   r   r   
is_shallows         r   #_is_shallow_repository_with_detailsrS      s8    &F{Tmsv&w#FAx6)J*--r   c                 @    t        j                  |       j                  S N)osstatst_dev)paths    r   _get_device_for_pathrZ      s    774=r   c                 l    g d}||j                  |       ||j                  |       t        |d| iS )N)fetchz--shallow-since="1 month ago"z--update-shallow--filter=blob:nonez--recurse-submodules=nor#   )appendr7   )r#   reporefspecr3   s       r   "_unshallow_repository_with_detailsra      s?    C 

4

7+S:c::r   c                     t        | ||       y rU   )ra   )r#   r_   r`   s      r   _unshallow_repositoryrc      s    &sD':r   c                 b    t        d|       }|j                  d      \  }}}}}}|||f|||fdS )zhExtract commit author info from the git repository in the current directory or one specified by ``cwd``.zTshow -s --format=%an|||%ae|||%ad|||%cn|||%ce|||%cd --date=format:%Y-%m-%dT%H:%M:%S%zrI   z|||)author	committer)r?   r<   )r#   r   author_nameauthor_emailauthor_datecommitter_namecommitter_emailcommitter_dates           r   extract_user_inform      sT     !^dgF _e^j^jkp^q[K{NO^k:$o~F r   c                     t        d      }	 t        |j                         d   j                  d      D cg c]  }t        |       c}      }|S c c}w # t        $ r t
        j                  d|       Y yw xY w)Nz	--version   .zIGit version not found, it is not following the desired version format: %s)r   r   r   )r?   tupler<   intr=   r*   rC   )r#   rN   partversion_infos       r   extract_git_versionru      sp     -FFLLN14E4K4KC4PQDc$iQR 	 R 		]_efs"   )A AA A A87A8c                      t        ddd|       S )NrF   rH   zremote.origin.urlrI   rJ   rI   s    r    _extract_remote_url_with_detailsrw      s    +Hg?RX[\\r   c                 H    t        |       \  }}}}|dk(  r|S t        |      )NrI   r   )rw   r=   )r#   
remote_urlrC   r>   r   s        r   extract_remote_urlrz      s-    'GC'P$Jq*Q
U
r   c                 $    t        ddddd|       S )Nr*   z--format=%Hz-n1000--since="1 month ago"rI   rJ   rI   s    r   $_extract_latest_commits_with_detailsr~      s    +E=$Pgmpqqr   c                 n    t        |       \  }}}}|dk(  r|r|j                  d      S g S t        |      )NrI   r   
)r~   r<   r=   )r#   latest_commitsrC   r>   r   s        r   extract_latest_commitsr      s@    +OTW+X(NE1jQ-;~##D)CC
U
r   c                 "    t        | |      d   S )N)excluded_commit_shasr#   r   _get_rev_list_with_details)commit_shasr#   s     r   get_rev_list_excluding_commitsr      s    %;CPQRSSr   c                 L   g d}t        |      dk\  r"|j                  d       |j                  d       |j                  d       | r#| D cg c]  }d|z  	 }}|j                  |       |r#|D cg c]  }d|z  	 }}|j                  |       t        |d	|iS c c}w c c}w )
N)zrev-listz	--objectsr]   rI   )ro      r   r}   z--no-object-namesHEADz^%sz%sr#   )ru   r^   r)   r7   )r   included_commit_shasr#   commandsha
exclusions
inclusionss          r   r   r      s    =Gs#z1./*+NN6-ABceckB
Bz",@ASdSjA
Az"+W>#>> C Bs   B2B!c                 $    t        | ||      d   S )Nr   r   r#   r   r   r   s      r   _get_rev_listr      s     %1H\be	 	r   c                     t        dd|       S )hExtract the repository url from the git repository in the current directory or one specified by ``cwd``.z	ls-remotez	--get-urlrI   rJ   rI   s    r   $_extract_repository_url_with_detailsr     s     ,K#NNr   c                 H    t        |       \  }}}}|dk(  r|S t        |      )r   rI   r   )r   r=   )r#   r   r   r>   r   s        r   extract_repository_urlr     s/     %IS$Q!FFAzQ
V
r   c                      t        d|       }|S )zhExtract git commit message from the git repository in the current directory or one specified by ``cwd``.zshow -s --format=%srI   rM   )r#   commit_messages     r   extract_commit_messager     s     ))>CHNr   c                      t        d|       }|S )zmExtract the root directory path from the git repository in the current directory or one specified by ``cwd``.zrev-parse --show-toplevelrI   rM   )r#   workspace_paths     r   extract_workspace_pathr     s     ))D#NNr   c                      t        d|       }|S )z`Extract git branch from the git repository in the current directory or one specified by ``cwd``.zrev-parse --abbrev-ref HEADrI   rM   )r#   branchs     r   extract_branchr      s     !!>CHFMr   c                      t        d|       }|S )zdExtract git commit SHA from the git repository in the current directory or one specified by ``cwd``.zrev-parse HEADrI   rM   )r#   
commit_shas     r   extract_commit_shar   '  s     %%53?Jr   c                 ~   i }t                	 t        |       |t        <   t        |       |t        <   t        |       }|d   d   |t        <   |d   d   |t        <   |d   d   |t        <   |d   d   |t        <   |d   d   |t        <   |d   d   |t        <   t        |       |t        <   t        |       |t        <   |S # t         $ r t"        j%                  d       Y |S t&        $ rQ}t"        j)                  t*        j,                        }t/        |      }t"        j%                  d||	       Y d
}~|S d
}~ww xY w)zExtract git commit metadata.rI   re   r      ro   rf   rA   z!Error extracting git metadata: %s)exc_infoN)rD   r   REPOSITORY_URLr   COMMIT_MESSAGErm   COMMIT_AUTHOR_NAMECOMMIT_AUTHOR_EMAILCOMMIT_AUTHOR_DATECOMMIT_COMMITTER_NAMECOMMIT_COMMITTER_EMAILCOMMIT_COMMITTER_DATEr   BRANCHr   
COMMIT_SHArB   r*   rC   r=   isEnabledForloggingDEBUGr;   )r#   tagsuserse
debug_moder   s         r   extract_git_metadatar   .  sG    DT5#>^5#>^!c*#(?1#5 $)(OA$6 !#(?1#5 &+K&8&;"#',['9!'<#$&+K&8&;"#%#.V-#6Z K  L		JK K  T%%gmm4
Q		5v
	SSKTs   B2C D<#D<+AD77D<c                    | t         j                  n| } t        | j                  d            }t        | j                  d            }t	        | j                  d            r|}d}i }| j                  d      |t
        <   | j                  d      |t        <   ||t        <   ||t        <   | j                  d      |t        <   | j                  d      |t        <   | j                  d      |t        <   | j                  d	      |t        <   | j                  d
      |t        <   | j                  d      |t        <   | j                  d      |t        <   |S )z8Extract git commit metadata from user-provided env vars.NDD_GIT_BRANCH
DD_GIT_TAG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)rV   environr   getr!   r   r   r   TAGr   r   r   r   r   r   r   )envr   tagr   s       r   extract_user_git_metadatar   I  s,    "**C377?34F
-
.C CGGO,-D77#:;Dww23DDLDI77#:;D"ww'BCD	 #(D ED	"ww'BCD	"%''*H"ID	#&77+J#KD	 "%''*H"ID	Kr   c           
   #     K   t        t        j                  dd            }|r|nt        j                         }t        j                         }t        |      t        |j                        k(  r|j                  }n#t        j                  d|j                  |       |}dj                  ||      }t        j                  d|       	 t        ddd	||| j                  d
            }||f t        |t
        j                        r't        j                  d|       |j                          y y # t        |t
        j                        r't        j                  d|       |j                          w w xY ww)Nr   i@B z=tempdir %s and cwd %s are on different filesystems, using cwdz{basepath}/{basename})basepathbasenamez%Building packfiles in prefix path: %szpack-objectsz--compression=9z--max-pack-size=3mzutf-8r"   z#Cleaning up temporary directory: %s)r;   randomrandintrV   getcwdr   TemporaryDirectoryrZ   r   r*   r+   formatr7   encoder:   cleanup)	revisionsr#   use_tempdirr   tempdirr   prefixprocess_detailss           r   !_build_git_packfiles_with_detailsr   f  s3     6>>!W-.H #"))+C'')GC $8$FF<<		QSZS_S_ade$++X+QFII5v>: ##G,
 o%%gv889II;XFOO ::gv889II;XFOO :s    CE7	&D1 /AE71AE44E7c              #      K   t        | |      5 \  }}|j                  dk(  r| 	 d d d        y t        j                  d|j                  |j                         t        |j                        # 1 sw Y   y xY ww)NrI   r   z:Failed to pack objects, command return code: %s, error: %s)r   r   r*   r+   r   r=   )r   r#   r   r   s       r   build_git_packfilesr     s~      
+9#	> 	1B[6?%%*L	1 	1 			H&&""	

 //00	1 	1s!   A=A1	A=A A11A:6A=)NNrU   )NNN)NT)M__doc__
contextlibr   rV   r   rer,   typingr   r   r   r   r   r   r	   r
   ddtrace.internalr   ddtrace.internal.loggerr   ddtrace.internal.utils.timer   FileNotFoundErrorrB   r   r   r   r   r   r   r   r   r   r   r   MAIN_PACKAGEcompiler   r   r   __name__r*   r;   floatrr   r   r   r!   r7   r?   rD   rK   rO   rS   rZ   ra   rc   rm   ru   rw   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   <module>r      s     	  	     !     # . 1 %  
 
 &  .  0  .  4  6  4  & %2::()RZZ$
2::i "xo#U@SVbdgUhi 
f
,
 04D :
2. 
;";
]
r
T? 	O6:  B 1 1r   