Ë
    /æjß  ã                   óŒ  — U d 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  ej                  e«      ZdZi Zeedf   ed	<    ej*                  «       Z ed
¬«       G d„ d«      «       Zdeeef   defd„Zdededefd„Zdedefd„Zdededeeef   dz  fd„Zdedeeef   dz  fd„Zdededeeef   ddfd„Zy)a5  On-disk cache for repository tree listings.

A tree listing is the set of files (with their download metadata) contained in a repo at a given commit. Because a
commit hash is immutable, its tree listing never changes and can be cached forever without any invalidation logic.

The listing is stored as a human-readable JSON file under `<tree_cache_folder>/trees/<commit_hash>.json`. The
folder depends on the download target: the per-repo `storage_folder` for `cache_dir` downloads, or
`local_dir/.cache/huggingface/` for `local_dir` downloads (see `tree_cache_folder_for_local_dir`).

```json
{
  "format_version": 1,
  "files": {
    "config.json": {"size": 519, "blob_id": "<git sha1>"},
    "model.safetensors": {"size": 1234, "blob_id": "...", "lfs_sha256": "<sha256>", "lfs_size": 1234, "xet_hash": "..."}
  }
}
```
é    N)Ú	dataclassé   )Úlogging)Úas_extended_path)Úis_valid_xet_hashzdict[str, TreeCacheEntry]Ú_IN_MEMORY_TREE_CACHET)Úfrozenc                   óˆ   — e Zd ZU dZeed<   eed<   dZedz  ed<   dZedz  ed<   dZ	edz  ed<   de
fd	„Zed
e
dd fd„«       Zy)ÚTreeCacheEntryz^Raw metadata of a single file in a cached tree listing, mirroring the `/tree` endpoint fields.ÚsizeÚblob_idNÚ
lfs_sha256Úlfs_sizeÚxet_hashÚreturnc                 óÂ   — | j                   | j                  dœ}| j                  �| j                  |d<   | j                  |d<   | j                  �| j                  |d<   |S )N)r   r   r   r   r   ©r   r   r   r   r   )ÚselfÚinfos     ú^/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/huggingface_hub/_tree_cache.pyÚto_jsonzTreeCacheEntry.to_json@   sW   € Ø"Ÿi™i°D·L±LÑAˆØ�?‰?Ð&Ø!%§¡ˆD�ÑØ#Ÿ}™}ˆD�ÑØ�=‰=Ð$Ø#Ÿ}™}ˆD�ÑØˆó    r   c           	      ó‚   —  | |d   |d   |j                  d«      |j                  d«      |j                  d«      ¬«      S )Nr   r   r   r   r   r   )Úget)Úclsr   s     r   Ú	from_jsonzTreeCacheEntry.from_jsonI   sA   € áØ�f‘Ø˜‘OØ—x‘x Ó-Ø—X‘X˜jÓ)Ø—X‘X˜jÓ)ô
ð 	
r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__Ústrr   r   r   Údictr   Úclassmethodr   © r   r   r   r   6   sh   … áhà
ƒIØƒLØ!€J��d‘
Ó!Ø€Hˆc�D‰jÓØ€Hˆc�D‰jÓð˜ó ð ð
˜Tð 
Ð&6ò 
ó ñ
r   r   Úentriesr   c                 óB   — t        d„ | j                  «       D «       «      S )z<Return whether all Xet hashes in the tree listing are valid.c              3   óf   K  — | ])  }|j                   d u xs t        |j                   «      –— Œ+ y ­w)N)r   r   )Ú.0Úentrys     r   ú	<genexpr>z(is_valid_tree_entries.<locals>.<genexpr>V   s+   è ø€ ÒiÈuˆu�~‰~ Ð%ÒJÔ):¸5¿>¹>Ó)JÓJÑiùs   ‚/1)ÚallÚvalues)r'   s    r   Úis_valid_tree_entriesr/   T   s   € äÑiÐX_×XfÑXfÓXhÔiÓiÐir   Útree_cache_folderÚcommit_hashc                 ó\   — t        t        j                  j                  | d|› d�«      «      S )NÚtreesz.json)r   ÚosÚpathÚjoin)r0   r1   s     r   Ú_tree_cache_pathr7   Y   s)   € ô œBŸG™GŸL™LÐ):¸GÈÀ}ÐTYÐEZÓ[Ó\Ð\r   Ú	local_dirc                 óD   — t         j                  j                  | dd«      S )zGFolder under which the `trees/` cache lives for a `local_dir` download.z.cacheÚhuggingface)r4   r5   r6   )r8   s    r   Útree_cache_folder_for_local_dirr;   _   s   € ä�7‰7�<‰<˜	 8¨]Ó;Ð;r   c                 ó$  — t        | |«      }t        5  |t        v r!t        |   }t        |«      r|ndcddd«       S 	 ddd«       t	        |«      }|�t        |«      syt        5  |t        |<   ddd«       |S # 1 sw Y   Œ<xY w# 1 sw Y   |S xY w)zbReturn the cached tree listing for a commit hash, or `None` if not cached, invalid, or unreadable.N)r7   Ú_IN_MEMORY_TREE_CACHE_LOCKr   r/   Ú_read_tree_cache_from_disk)r0   r1   r5   Úcached_entriesr'   s        r   Úread_tree_cacher@   d   sž   € äÐ-¨{Ó;€DÜ	#ñ UØÔ(Ñ(Ü2°4Ñ8ˆNÜ%:¸>Ô%J‘>ÐPT÷Uñ UØ(÷Uô )¨Ó.€GØ€Ô3°GÔ<ØÜ	#ñ .Ø&-Ô˜dÑ#÷.à€N÷Uð Uú÷.à€Nús   “ A9Á%
BÁ9BÂBr5   c                 óº  — 	 t        | d¬«      5 }t        j                  |«      }d d d «       j                  d«      t        k7  ry |d   j                  «       D ��ci c]  \  }}|t        j                  |«      “Œ c}}S # 1 sw Y   Œ\xY wc c}}w # t        $ r Y y t        t        t        t        f$ r%}t        j                  d| › d|› �«       Y d }~y d }~ww xY w)Núutf-8©ÚencodingÚformat_versionÚfilesz#Ignoring corrupted tree cache file ú: )ÚopenÚjsonÚloadr   ÚTREE_CACHE_FORMAT_VERSIONÚitemsr   r   ÚFileNotFoundErrorÚOSErrorÚ
ValueErrorÚKeyErrorÚ	TypeErrorÚloggerÚwarning)r5   ÚfÚdataÚ	file_pathr   Úes         r   r>   r>   s   sÅ   € ðÜ�$ Ô)ð 	 ¨QÜ—9‘9˜Q“<ˆD÷	 à�8‰8Ð$Ó%Ô)BÒBàØQUÐV]ÑQ^×QdÑQdÓQf×g¹o¸iÈ�	œ>×3Ñ3°DÓ9Ñ9ÓgÐg÷	 ð 	 üó
 høÜò ÙÜ”Z¤¬9Ð5ò Ü�‰Ð<¸T¸FÀ"ÀQÀCÐHÔIÜûðúsE   ‚B �B ¥ B ÁB Á BÁ<B Â B	ÂB Â	CÂCÂ5CÃCc                 óì  — t        |«      syt        | |«      }t        t        |«      D �ci c]  }|||   j	                  «       “Œ c}dœ}	 t        j                  t
        j                  j                  |«      d¬«       t        j                  t
        j                  j                  |«      d¬«      \  }}t        j                  |dd¬	«      5 }t        j                  ||d
¬«       ddd«       t        j                  ||«       t$        5  t'        |«      t(        |<   ddd«       yc c}w # 1 sw Y   ŒFxY w# t        $ r%}	t         j#                  d|› d|	› �«       Y d}	~	yd}	~	ww xY w# 1 sw Y   yxY w)zTWrite a valid tree listing to the cache (ignoring invalid entries and any failures).N)rE   rF   T)Úexist_okz.tmp)ÚdirÚsuffixÚwrB   rC   r   )Úindentz,Ignored error while writing tree cache file rG   )r/   r7   rK   Úsortedr   r4   Úmakedirsr5   ÚdirnameÚtempfileÚmkstempÚfdopenrI   ÚdumpÚreplacerN   rR   rS   r=   r$   r   )
r0   r1   r'   r5   rV   rU   Útmp_fdÚtmp_pathrT   rW   s
             r   Úwrite_tree_cacherh   ‚   s5  € ä  Ô)ØäÐ-¨{Ó;€Dä3ÜKQÐRYË?Ö[¸i�)˜W YÑ/×7Ñ7Ó9Ñ9Ò[ñ€DðÜ
�‰”B—G‘G—O‘O DÓ)°DÕ9Ü#×+Ñ+´·±·±ÀÓ0EÈfÔUÑˆ�Ü�Y‰Y�v˜s¨WÔ5ð 	)¸Ü�I‰I�d˜A aÕ(÷	)ä
�
‰
�8˜TÔ"ô 
$ñ 4Ü&*¨7£mÔ˜dÑ#÷4ð 4ùò \÷
	)ð 	)ûô ò Ü�‰ÐEÀdÀVÈ2ÈaÈSÐQÔRÜûðú÷
4ð 4úsB   «D(ÁBD9 ÃD-Ã(D9 ÄE*Ä-D6Ä2D9 Ä9	E'ÅE"Å"E'Å*E3)r    rI   r4   ra   Ú	threadingÚdataclassesr   Úutilsr   Úutils._pathsr   Ú
utils._xetr   Ú
get_loggerr   rR   rK   r   r$   r#   r"   ÚLockr=   r   Úboolr/   r7   r;   r@   r>   rh   r&   r   r   ú<module>rq      sO  ðòó( Û 	Û Û Ý !å Ý *Ý )ð 
ˆ×	Ñ	˜HÓ	%€àÐ ð ACÐ �t˜CÐ!<Ð<Ñ=Ó BØ+˜YŸ^™^Ó-Ð ñ �$Ô÷
ð 
ó ð
ð:j 4¨¨^Ð(;Ñ#<ð jÀó jð
]¨ð ]¸#ð ]À#ó ]ð<¨sð <°só <ð
 sð ¸ð ÀÀcÈ>ÐFYÑAZÐ]aÑAaó ð Sð ¨T°#°~Ð2EÑ-FÈÑ-Mó ð4¨ð 4¸#ð 4ÈÈSÐR`ÐM`ÑHað 4Ðfjô 4r   