o
    Wi!                     @  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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dZdddZdZdddZG dd dZdS )    )annotationsN)Callable)	Generator)Sequence)	clientlib)	file_lock)git)CalledProcessError)clean_path_on_failurecmd_output_b)resource_text
pre_commitreturnstrc                  C  s:   t jdpt jt jdpt jdd} t j| S )a7  Returns the default directory for the Store.  This is intentionally
    underscored to indicate that `Store.get_default_directory` is the intended
    way to get this information.  This is also done so
    `Store.get_default_directory` can be mocked in tests and
    `_get_default_directory` can be tested.
    PRE_COMMIT_HOMEXDG_CACHE_HOMEz~/.cachez
pre-commit)osenvirongetpathjoin
expanduserrealpath)ret r   D/home/ubuntu/.local/lib/python3.10/site-packages/pre_commit/store.py_get_default_directory   s
   r   )z
Cargo.tomlzmain.gozgo.modzmain.rsz
.npmignorezpackage.jsonz!pre-commit-package-dev-1.rockspecz&pre_commit_placeholder_package.gemspeczsetup.pyzenvironment.ymlzMakefile.PLzpubspec.yamlz	renv.lockzrenv/activate.Rzrenv/LICENSE.renv	directoryNonec              	   C  s   t D ]@}tj|\}}td| }tj| |}tj||}tj|dd t|d}|| W d    n1 s=w   Y  qd S )Nempty_template_Texist_okw)	_LOCAL_RESOURCESr   r   splitr   r   makedirsopenwrite)r   resourceresource_dirnameresource_basenamecontents
target_dirtarget_filefr   r   r   _make_local_repo0   s   r0   c                   @  s   e Zd ZeeZd,d-ddZejd.d	d
Z	ej	d,d/ddZ
ed0ddZd1ddZd2ddZd2ddZd3d4d!d"Zd5d#d$Zd6d'd(Zd7d*d+ZdS )8StoreNr   
str | Noner   r   c              	   C  sj  |pt  | _tj| jd| _tj| jot| jtj	 | _
tj| jsPtj| jdd ttj| jdd}|d W d    n1 sKw   Y  tj| jrYd S |  N tj| jrn	 W d    d S tj| jd\}}t| | j|d}|d	 | | W d    n1 sw   Y  t|| j W d    d S 1 sw   Y  d S )
Nzdb.dbTr!   READMEr#   zmThis directory is maintained by the pre-commit project.
Learn more: https://github.com/pre-commit/pre-commit
)dir)db_pathzuCREATE TABLE repos (    repo TEXT NOT NULL,    ref TEXT NOT NULL,    path TEXT NOT NULL,    PRIMARY KEY (repo, ref));)r1   get_default_directoryr   r   r   r   r5   existsaccessW_OKreadonlyr&   r'   r(   exclusive_locktempfilemkstempcloseconnectexecutescript_create_configs_tablereplace)selfr   r/   fdtmpfiledbr   r   r   __init__>   s8   

"zStore.__init__Generator[None]c                 c  sP    ddd}t tj| jd| d V  W d    d S 1 s!w   Y  d S )Nr   r   c                   S  s   t d d S )NzLocking pre-commit directory)loggerinfor   r   r   r   
blocked_cbi   s   z(Store.exclusive_lock.<locals>.blocked_cbz.lock)r   r   )r   lockr   r   r   r   )rC   rK   r   r   r   r;   g   s
   
"zStore.exclusive_lockr5   Generator[sqlite3.Connection]c              	   c  s|    |p| j }tt|&}| |V  W d    n1 sw   Y  W d    d S W d    d S 1 s7w   Y  d S N)r5   
contextlibclosingsqlite3r?   )rC   r5   rF   r   r   r   r?   o   s   
"zStore.connectrepor   depsSequence[str]c                 C  s   |r| dd | S |S )N:,)r   )clsrR   rS   r   r   r   db_repo_name}   s   zStore.db_repo_namerefmake_strategyCallable[[str], None]c           
   	     s  } |d
 fdd}| }|r|S  c | }|r+|W  d    S td d tjdjd}t| || W d    n1 sOw   Y   }	|		d	 |g W d    n1 slw   Y  t
|| W d    |S 1 sw   Y  |S )Nr   r2   c                    sP     } | d f }|r|d nd W  d    S 1 s!w   Y  d S )Nz1SELECT path FROM repos WHERE repo = ? AND ref = ?r   )r?   executefetchone)rF   resultrY   rR   rC   r   r   _get_result   s   
$z$Store._new_repo.<locals>._get_resultzInitializing environment for .rR   )prefixr4   z4INSERT INTO repos (repo, ref, path) VALUES (?, ?, ?))r   r2   )rX   r;   rI   rJ   r<   mkdtempr   r
   r?   r\   r   warn_for_stages_on_repo_init)
rC   rR   rY   rS   rZ   original_repor`   r^   r   rF   r   r_   r   	_new_repo   s6   	




zStore._new_repogit_cmdCallable[..., None]c                 C  s(   |ddd |d| |dddd d	S )
z<Perform a complete clone of a repository and its submodules fetchoriginz--tagscheckout	submoduleupdate--init--recursiveNr   )rC   rY   rg   r   r   r   _complete_clone   s   
zStore._complete_clonec                 C  s8   d}|d|dd|d |dd |d|dd	d
dd dS )z;Perform a shallow clone of a repository and its submodules zprotocol.version=2z-cri   rj   z	--depth=1rk   
FETCH_HEADrl   rm   rn   ro   Nr   )rC   rY   rg   
git_configr   r   r   _shallow_clone   s   
zStore._shallow_cloner   c                   s"   d fdd}  ||S )	z2Clone the given url and checkout the specific ref.r   r   r   r   c                   sX   t   t  d fdd}z	| W d S  ty+   | Y d S w )Nargsr   r   r   c                    s   t dg| R  d d S )Nr   )cwdenvr   )rt   r   rv   r   r   _git_cmd   s   z5Store.clone.<locals>.clone_strategy.<locals>._git_cmd)rt   r   r   r   )r   	init_repo
no_git_envrs   r	   rp   )r   rx   r_   rw   r   clone_strategy   s   z#Store.clone.<locals>.clone_strategyNr   r   r   r   )rf   )rC   rR   rY   rS   r{   r   r_   r   clone   s   zStore.clonec                 C  s   |  dtj|tS )Nlocal)rf   CLOCAL_REPO_VERSIONr0   )rC   rS   r   r   r   
make_local   s   
zStore.make_localrF   sqlite3.Connectionc                 C  s   | d d S )NzQCREATE TABLE IF NOT EXISTS configs (   path TEXT NOT NULL,   PRIMARY KEY (path));)r@   )rC   rF   r   r   r   rA      s   zStore._create_configs_tabler   c                 C  sl   | j rd S tj|}tj|sd S |  }| | |d|f W d    d S 1 s/w   Y  d S )Nz(INSERT OR IGNORE INTO configs VALUES (?))r:   r   r   r   r7   r?   rA   r\   )rC   r   rF   r   r   r   mark_config_used   s   

"zStore.mark_config_usedrN   )r   r2   r   r   )r   rH   )r5   r2   r   rM   )rR   r   rS   rT   r   r   )
rR   r   rY   r   rS   rT   rZ   r[   r   r   )rY   r   rg   rh   r   r   )r   )rR   r   rY   r   rS   rT   r   r   )rS   rT   r   r   )rF   r   r   r   )r   r   r   r   )__name__
__module____qualname__staticmethodr   r6   rG   rO   contextmanagerr;   r?   classmethodrX   rf   rp   rs   r}   r   rA   r   r   r   r   r   r1   ;   s"    )

-


r1   )r   r   r|   )
__future__r   rO   loggingos.pathr   rQ   r<   collections.abcr   r   r   pre_commit.constants	constantsr   r   r   r   r   pre_commit.utilr	   r
   r   r   	getLoggerrI   r   r$   r0   r1   r   r   r   r   <module>   s,    


	