o
    WiA                     @  s  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 d dlm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 edZeejejZ dZ!g e!dR Z"dddZ#dddZ$dddZ%ddddZ&dd d!Z'e(e)d"d#e*d#eje+d$e,ejg Z-dd'd(Z.G d)d* d*eZ/G d+d, d,e/Z0G d-d. d.eZ1G d/d0 d0eZ2dd2d3Z3G d4d5 d5eZ4G d6d7 d7e4Z5e)d"d#e+d8eeje%d9e*d#eje*d1eje*d:eje5d;e6ee+d<ejd=e+d>e d=e+d?e d@e+dAe,e#dBge+dCe,e#g e+dDe,e#g e+dEe,ejg e+dFe,ejg e+dGej7dHe+dIej7dHe+dJej7dKe+dLejd=e+dMejej8e+dNejd=e+dOej7dHe0d$g e+dPej7dHZ9e(e9Z:G dQdR dReZ;ddUdVZ<ej=ej>e:e<e;dWZ?dXZ@dYZAG dZd[ d[ejBZCG d\d] d]ejDZEG d^d_ d_ejDZFddadbZGddhdiZHddjdkZIdldmd>dneJejK dofd:eGdpfffdqdrd>dneJejK dofd:eGdsfffdtdudvd:eGdtffffZLG dwdx dxejDZMeEd>ejeEd?eje1d$fZNej)d"d#e*d#eje*d#e6eOdydz eLD e+d;e6d{hd{eMd:ejPgd|dz eLD d}dz e9jQD eNR  ZRej)d"d#e*d#ejgd~dz e9jQD e/d$g e4d;e6eeNR  ZSej)d"d#ge9jQeNR  ZTe)dd%e*d%ejeUde(eSd%eVe@eAeUde(eTd%e@eUde(eRd%eAeCdejd%eVe@eAdKdeWdeIZXej)ddeYegddz eD R  ZZe)dde+d8eeje%d9e[de(eXe+de,e6e!dge\deZi e0de"e2de+d>e d=e+d?e d@e+dIej7dHeWdeHeFd>ejeFd?ejeDde]e^Z_G dd deZ`ej=ej>e_ee`dWZadS )    )annotationsN)Callable)Sequence)Any)
NamedTuple)ALL_TAGS)language_names)
FatalError)	yaml_load
pre_commit)
z
commit-msgzpost-checkoutzpost-commitz
post-mergezpost-rewrite
pre-commitpre-merge-commitpre-pushz
pre-rebasezprepare-commit-msgmanualtagstrreturnNonec                 C  s   | t vrtd| dd S )Nz	Type tag z; is not recognized.  Try upgrading identify and pre-commit?)r   cfgvValidationError)r    r   H/home/ubuntu/.local/lib/python3.10/site-packages/pre_commit/clientlib.pycheck_type_tag*   s
   
r   stuple[int, ...]c                 C  s   t dd | dD S )zpoor man's version comparisonc                 s  s    | ]}t |V  qd S N)int).0pr   r   r   	<genexpr>4       z parse_version.<locals>.<genexpr>.)tuplesplit)r   r   r   r   parse_version2   s   r$   versionc                 C  s0   t | t tjkrtd|  dtj dd S )Nzpre-commit version z is required but version z? is installed.  Perhaps run `pip install --upgrade pre-commit`.)r$   CVERSIONr   r   )r%   r   r   r   check_min_version7   s   r(   r   r   r   )commitzmerge-commitpushstagec                 C  s   t | | S r   )_STAGESget)r+   r   r   r   transform_stageG   s   r.   Hookidstagesrepo	directoryc              
   C  s   zt jtj|tjttt	d}W n
 t	y   Y d S w i }|D ]}|
ddD ]
}|tv r2d||< q(q |rMtd|  dd| dt|  d	 d S d S )
Nschemaload_strategyexc_tpr1   r   Tzrepo `` uses deprecated stage names (, zX) which will be removed in a future version.  Hint: often `pre-commit autoupdate --repo zM` will fix this.  if it does not -- consider reporting an issue to that repo.)r   load_from_filenameospathjoinr&   MANIFEST_FILEMINIMAL_MANIFEST_SCHEMAr
   InvalidManifestErrorr-   r,   loggerwarningshlexquote)r2   r3   manifestlegacy_stageshookr+   r   r   r   warn_for_stages_on_repo_initT   s4   
rH   c                   @  <   e Zd ZU ded< ded< dd	d
ZdddZdddZdS )StagesMigrationNoDefaultr   keySequence[str]defaultdctdict[str, Any]r   r   c                 C  s   | j |vrd S td| j  ' || j  }ttj| dd |D }ttt| W d    d S 1 s:w   Y  d S )NAt key: c                 S     g | ]}t |qS r   r.   r   vr   r   r   
<listcomp>|       z2StagesMigrationNoDefault.check.<locals>.<listcomp>)rK   r   validate_contextcheck_array	check_anycheck_one_ofSTAGES)selfrN   valr   r   r   checkt   s   

"zStagesMigrationNoDefault.checkc                 C  s,   | j |vrd S dd || j  D || j < d S )Nc                 S  rQ   r   rR   rS   r   r   r   rU      rV   z:StagesMigrationNoDefault.apply_default.<locals>.<listcomp>)rK   r\   rN   r   r   r   apply_default   s   
z&StagesMigrationNoDefault.apply_defaultc                 C     t r   NotImplementedErrorr_   r   r   r   remove_default      z'StagesMigrationNoDefault.remove_defaultNrN   rO   r   r   __name__
__module____qualname____annotations__r^   r`   rd   r   r   r   r   rJ   p   s   
 

rJ   c                         e Zd Zd fddZ  ZS )StagesMigrationrN   rO   r   r   c                   s    | | j| j t | d S r   )
setdefaultrK   rM   superr`   r_   	__class__r   r   r`      s   zStagesMigration.apply_defaultrf   )rh   ri   rj   r`   __classcell__r   r   rp   r   rm          rm   c                   @  4   e Zd ZU ded< dddZdd	d
ZdddZdS )DeprecatedStagesWarningr   rK   rN   rO   r   r   c                 C  sd   | j |vrd S || j  }ttj| dd |D }|r0td|d  dd| d d S d S )Nc                 S     g | ]}|t v r|qS r   r,   r   r+   r   r   r   rU          z1DeprecatedStagesWarning.check.<locals>.<listcomp>z	hook id `r0   r8   r9   i) which will be removed in a future version.  run: `pre-commit migrate-config` to automatically fix this.rK   r   rX   rY   rA   rB   r=   r\   rN   r]   rF   r   r   r   r^      s   

zDeprecatedStagesWarning.checkc                 C     d S r   r   r_   r   r   r   r`      re   z%DeprecatedStagesWarning.apply_defaultc                 C  ra   r   rb   r_   r   r   r   rd      re   z&DeprecatedStagesWarning.remove_defaultNrf   rg   r   r   r   r   ru      
   
 

ru   c                   @  rt   )DeprecatedDefaultStagesWarningr   rK   rN   rO   r   r   c                 C  sZ   | j |vrd S || j  }ttj| dd |D }|r+tdd| d d S d S )Nc                 S  rv   r   rw   rx   r   r   r   rU      ry   z8DeprecatedDefaultStagesWarning.check.<locals>.<listcomp>z8top-level `default_stages` uses deprecated stage names (r9   rz   r{   r|   r   r   r   r^      s   

z$DeprecatedDefaultStagesWarning.checkc                 C  r}   r   r   r_   r   r   r   r`      re   z,DeprecatedDefaultStagesWarning.apply_defaultc                 C  ra   r   rb   r_   r   r   r   rd      re   z-DeprecatedDefaultStagesWarning.remove_defaultNrf   rg   r   r   r   r   r      r~   r   namec                 C  s   ddd | | S )Nunsupportedunsupported_script)systemscript)r-   )r   r   r   r   _translate_language   s
   r   c                   @  rI   )LanguageMigrationr   rK   zCallable[[object], None]check_fnrN   rO   r   r   c                 C  sZ   | j |vrd S td| j   | t|| j   W d    d S 1 s&w   Y  d S )NrP   )rK   r   rW   r   r   r_   r   r   r   r^      s
   
"zLanguageMigration.checkc                 C  s&   | j |vrd S t|| j  || j < d S r   )rK   r   r_   r   r   r   r`      s   
zLanguageMigration.apply_defaultc                 C  ra   r   rb   r_   r   r   r   rd      re   z LanguageMigration.remove_defaultNrf   rg   r   r   r   r   r      s   
 

r   c                      rl   )LanguageMigrationRequiredrN   rO   r   r   c                   s,   | j |vrtd| j  t | d S )NzMissing required key: )rK   r   r   ro   r^   r_   rp   r   r   r^      s   
zLanguageMigrationRequired.checkrf   rh   ri   rj   r^   rr   r   r   rp   r   r      rs   r   minimum_pre_commit_version0entrylanguagealias filesexcludez^$typesfiletypes_orexclude_typesadditional_dependenciesargs
always_runF	fail_fastpass_filenamesTdescriptionlanguage_versionlog_filerequire_serialverbosec                   @     e Zd ZdS )r@   Nrh   ri   rj   r   r   r   r   r@         r@   contentsobjectc                 C  s&   t | }t|trtd td|S )N5unreachable)r
   
isinstancedictr(   AssertionError)r   objr   r   r   _load_manifest_forward_compat  s
   
r   r4   localmetac                      rl   )WarnMutableRevrN   rO   r   r   c                   sb   t  | | j|v r+|| j }d|vr-td|s/td| jd|d d d S d S d S d S )Nr!   z^[a-fA-F0-9]+$The z field of repo r2   a   appears to be a mutable reference (moving tag / branch).  Mutable references are never updated after first install and are not supported.  See https://pre-commit.com/#using-the-latest-version-for-a-repository for more details.  Hint: `pre-commit autoupdate` often fixes this.)ro   r^   rK   rematchrA   rB   )r\   rN   revrp   r   r   r^   '  s   

zWarnMutableRev.checkrf   r   r   r   rp   r   r   &  rs   r   c                      rl   )OptionalSensibleRegexAtHookrN   rO   r   r   c              	     s   t  | d|| jdv rtd| jd|dd dD ]}||| jdv r>td| jd|dd	|  q!d S )
N/*r   r   z field in hook r0   zJ is a regex, not a glob -- matching '/*' probably isn't what you want herez[\\/]z[\/]z[/\\]z%pre-commit normalizes slashes in the z1 to forward slashes, so you can use / instead of ro   r^   r-   rK   rA   rB   r\   rN   fwd_slash_rerp   r   r   r^   :  s    
z!OptionalSensibleRegexAtHook.checkrf   r   r   r   rp   r   r   9  rs   r   c                      rl   )OptionalSensibleRegexAtToprN   rO   r   r   c                   sj   t  | d|| jdv rtd| jd dD ]}||| jdv r2td| jd|  qd S )Nr   r   zThe top-level zP field is a regex, not a glob -- matching '/*' probably isn't what you want herer   z3pre-commit normalizes the slashes in the top-level z7 field to forward slashes, so you can use / instead of r   r   rp   r   r   r^   M  s    z OptionalSensibleRegexAtTop.checkrf   r   r   r   rp   r   r   L  rs   r   modnamec                 C  s   t tj d|  S )zthe hook `entry` is passed through `shlex.split()` by the command
    runner, so to prevent issues with spaces and backslashes (on Windows)
    it must be quoted here.
    z -m pre_commit.meta_hooks.)rC   rD   sys
executable)r   r   r   r   _entry^  s   r   extrarL   	orig_keysrN   dict[str, str]c                 C  s   t dd|   d S )Nz#Unexpected key(s) present at root: r9   rA   rB   r=   r   r   rN   r   r   r   warn_unknown_keys_rootf  s   r   c                 C  s$   t d|d  dd|   d S )NzUnexpected key(s) present on r2   z: r9   r   r   r   r   r   warn_unknown_keys_repon  s   r   zcheck-hooks-apply)r   z#Check hooks apply to the repository^$check_hooks_applyzcheck-useless-excludes)r   zCheck for useless excludescheck_useless_excludesidentity)r   r   )r   Tc                   @  s   e Zd ZdddZdS )	
NotAllowedrN   rO   r   r   c                 C  s    | j |v rt| j dd S )Nz cannot be overridden)rK   r   r   r_   r   r   r   r^     s   
zNotAllowed.checkNrf   )rh   ri   rj   r^   r   r   r   r   r     s    r   c                 c  s    | ]\}}|V  qd S r   r   )r   k_r   r   r   r     r    r   r   c              	   c  s6    | ]\}}|D ]\}}t |t j|d |V  qqdS )r0   N)r   ConditionalOptionalrY   )r   hook_idvaluesrK   valuer   r   r   r     s    c                 c  s.    | ]}|j d v rt|j |jn|V  qdS )>   r   r   r   NrK   r   OptionalNoDefaultr   r   itemr   r   r   r     s    

c                 c  s>    | ]}|j d kr|j dkr|j dkrt|j |jV  qdS )r0   r1   r   Nr   r   r   r   r   r     s    



Repositoryhooksr   )condition_keycondition_valueensure_absent)r2   r   r   DefaultLanguageVersionc                 c  s"    | ]}t |t jtjV  qd S r   )r   Optionalcheck_stringr&   DEFAULT)r   xr   r   r   r     s     Configreposdefault_install_hook_typesdefault_language_versiondefault_stages)	r   r   r   r   r   r   r   r   cir   c                   @  r   )InvalidConfigErrorNr   r   r   r   r   r     r   r   )r   r   r   r   )r   r   r   r   )r%   r   r   r   )r+   r   r   r   )r2   r   r3   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   rL   r   rL   rN   r   r   r   )b
__future__r   	functoolsloggingos.pathr;   r   rC   r   collections.abcr   r   typingr   r   r   identify.identifyr   pre_commit.constants	constantsr&   pre_commit.all_languagesr   pre_commit.errorsr	   pre_commit.yamlr
   	getLoggerrA   	check_andr   check_regexcheck_string_regex
HOOK_TYPESr[   r   r$   r(   r,   r.   ArrayMapRequiredr   rX   r?   rH   rJ   rm   ru   r   r   r   r   rZ   
check_boolr   MANIFEST_HOOK_DICTMANIFEST_SCHEMAr@   r   partialr:   load_manifestLOCALMETAConditionalr   r   r   r   r   r   r   escapeCONFIG_FILE_metar   _COMMON_HOOK_WARNINGSr"   rY   itemsMETA_HOOK_DICTCONFIG_HOOK_DICTLOCAL_HOOK_DICTConditionalRecurseNotInWarnAdditionalKeysCONFIG_REPO_DICTNoAdditionalKeysDEFAULT_LANGUAGE_VERSIONRequiredRecurseOptionalRecurse
check_typer   CONFIG_SCHEMAr   load_configr   r   r   r   <module>   s   






	

$
	









	






.
