o
    2jh                     @   s  d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlZddlmZ d	d
lmZmZmZmZmZmZmZmZ d	dlmZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& e$ddZ'e	ddG dd dZ(e)dZ*h dZ+h dZ,h dZ-e)dZ.dddddZ/i Z0e1e-D ]Z2e2e0e2< e2 de0e2 d< e2 de0e2 d < qed!e0e3e4d"Z5e	ddG d#d$ d$Z6e7eedB f Z8e9ee:e3 f Z;d%eee:e f d&e6fd'd(Z<d%eee:e f d&dfd)d*Z=d+ed&e7e9e3ef e9e3e7eef f f fd,d-Z>d.e3d&e3fd/d0Z?d+ed1e@d&e7eAe8 e;f fd2d3ZBd4e3d5e;d&eeedB eCge@f fd6d7ZDd8eCdB d9e3d:eCd&e@fd;d<ZEd=e3d&e7ee8ge7ed>f f e@f fd?d@ZFd+edAeAe3 d&e(fdBdCZGe'jHdDg dEdF		G			dtdHee3dB ejIdIdf dJee@ejIdKdf dLeeAe3 dB ejIdMdNdOdf dPee5dB ejIdQdf dReeJdB ejIdSdf d&dfdTdUZKe'jHg dVdF		G	GdudAeeAe3 ejLdWdf dHee3dB ejIdIdf dXee@ejIdYdZd[df d\ee@ejId]df d&df
d^d_ZMe'jHd`dagdF		G	GdudHee3dB ejIdIdf dXee@ejIdYdZd[df d\ee@ejId]df d&dfdbdcZNe'jHg dddFe jOddddGdGdfdeedfe dge!dHee3dB ejIdhdf diee3dB ejIdjdf dkee@ejIdldmdf dnee@ejIdodpdf dqe"d&dfdrdsZPdS )vzHContains the 'hf cache' command group with cache management subcommands.    N)defaultdict)CallableMapping)	dataclass)Enum)	AnnotatedAny)CLIError   )ANSICachedRepoInfoCachedRevisionInfoCacheNotFoundHFCacheInfo_format_sizeparse_hf_uriscan_cache_dir)parse_duration
parse_size   )	RepoIdArgRepoTypeOptRevisionOptTokenOpt
get_hf_apityper_factory)outzManage local cache directory.)helpT)frozenc                   @   s>   e Zd ZU ee ed< eeee f ed< e	edf ed< dS )_DeletionResolution	revisionsselected.missingN)
__name__
__module____qualname__	frozensetstr__annotations__dictr   r   tuple r+   r+   T/var/www/html/whisper/venv/lib/python3.10/site-packages/huggingface_hub/cli/cache.pyr   1   s   
 r   zA^(?P<key>[a-zA-Z_]+)\s*(?P<op>==|!=|>=|<=|>|<|=)\s*(?P<value>.+)$>   <=>!=<=>=>   refssizetypeaccessedmodified>   namer4   r6   r7   z.^(?P<key>[a-zA-Z_]+)(?::(?P<order>asc|desc))?$descasc)r6   r7   r4   r8   z:asc_ascz:desc_descSortOptions)r5   modulec                   @   s*   e Zd ZU dZeed< eed< eed< dS )CacheDeletionCountsz>Simple counters summarizing cache deletions for CLI messaging.
repo_countpartial_revision_counttotal_revision_countN)r#   r$   r%   __doc__intr(   r+   r+   r+   r,   r?   P   s
   
 r?   selected_by_reporeturnc                 C   sd   d}d}d}|   D ]\}}|t|7 }t|t|jkr'|d7 }|t|7 }q
|| }t|||S )z(Summarize deletions across repositories.r   r   )itemslenr    r?   )rE   r@   total_revisionsrevisions_in_full_reposrepor    rA   r+   r+   r,   summarize_deletions]   s   rL   c              
   C   s   t |  dd dD ]P}|j d|j }t | | dd d}t|t|jkr2td| d q
td| d |D ]}d	t |j	pHd
}td|j
 d| d|j  q=q
dS )zBPretty-print selected cache revisions during confirmation prompts.c                 S      | j | j fS N	repo_typerepo_idlowerrK   r+   r+   r,   <lambda>q       z0print_cache_selected_revisions.<locals>.<lambda>key/c                 S      | j S rN   commit_hashrevr+   r+   r,   rT   s         - z (entire repo): z
(detached)z      z [z] N)sortedkeysrP   rQ   rH   r    r   textjoinr3   r[   size_on_disk_str)rE   rK   repo_keyr    revisionr3   r+   r+   r,   print_cache_selected_revisionso   s   "ri   hf_cache_infoc                 C   sL   i }i }| j D ]}|j }|||< |jD ]}||f||j < qq||fS )zPCreate lookup tables so CLI commands can resolve repo ids and revisions quickly.)reposcache_idrR   r    r[   )rj   repo_lookuprevision_lookuprK   rg   rh   r+   r+   r,   build_cache_index~   s   


ro   targetc                 C   sN   |  ds| S t| }|jstd|jdus|jrtd|j d|j S )zCReturn the cache id matching a repo target passed to `hf cache rm`.zhf://z:Only repository hf:// URIs are supported by `hf cache rm`.NzBOnly repo-level hf:// URIs are supported by `hf cache rm` for now.rX   )
startswithr   is_repor	   rh   path_in_repor5   id)rp   urir+   r+   r,   _repo_cache_id_from_target   s   
rv   include_revisionsc                C   s   g }i }t | jdd d}|D ]+}tdd |jD ||< |r3t |jdd dD ]	}|||f q(q||df q|rI|jdd d ||fS |jd	d d ||fS )
z;Flatten cache metadata into rows consumed by `hf cache ls`.c                 S   rM   rN   rO   rS   r+   r+   r,   rT      rU   z'collect_cache_entries.<locals>.<lambda>rV   c                 S   s   h | ]
}|j D ]}|qqS r+   )r3   ).0rh   refr+   r+   r,   	<setcomp>   s    z(collect_cache_entries.<locals>.<setcomp>c                 S   rY   rN   rZ   r\   r+   r+   r,   rT      r^   Nc                 S   s&   | d j | d d ur| d jfS dfS )Nr   r    )rl   r[   entryr+   r+   r,   rT      s
   c                 S   s
   | d j S )Nr   )rl   r|   r+   r+   r,   rT      s   
 )rb   rk   r&   r    appendsort)rj   rw   entriesrepo_refs_mapsorted_reposrK   rh   r+   r+   r,   collect_cache_entries   s"   r   exprr   c                    s  t |  }|std|  d|d |d|d tvr8td d|  dtt d	tvrLtd
 d|  dtt d	dkr[t	fddS dv rzt
 dtdtdB dtdtffdd}|S dkr  dkrtd ddtdtdB dtdtf fdd}|S dkrtd d	dtdtdB dtdtffdd}|S ) zqConvert a `hf cache ls` filter expression into the yes/no test we apply to each cache entry before displaying it.zInvalid filter expression: 'z'.rW   opvaluezUnsupported operator 'z' in filter ''. Must be one of .zUnsupported filter key '' in 'r4   c                    s"   t |d ur|j S | j S rN   )_compare_numericsize_on_diskrK   rh   _)r   size_thresholdr+   r,   rT      s    z&compile_cache_filter.<locals>.<lambda>>   r6   r7   rK   rh   NnowrF   c                    s>    dkr| j n	|d ur|jn| j}|d u rdS t|| S )Nr6   F)last_accessedlast_modifiedr   )rK   rh   r   	timestamp)rW   r   secondsr+   r,   _time_filter   s   z*compile_cache_filter.<locals>._time_filterr5   r.   z/Only '=' is supported for 'type' filters. Got 'r   c                    s   | j   kS rN   )rP   rR   r   )expectedr+   r,   _type_filter   s   z*compile_cache_filter.<locals>._type_filterz.Only '=' is supported for 'refs' filters. Got c                    s2   |d ur|j n | t } dd |D v S )Nc                 S   s   g | ]}|  qS r+   )rR   )rx   ry   r+   r+   r,   
<listcomp>       z>compile_cache_filter.<locals>._refs_filter.<locals>.<listcomp>)r3   getr&   rR   )rK   rh   r   r3   )r   	value_rawr+   r,   _refs_filter   s   z*compile_cache_filter.<locals>._refs_filter)_FILTER_PATTERNmatchstrip
ValueErrorgrouprR   _ALLOWED_OPERATORSlist_FILTER_KEYSr   r   r   r   floatbool)r   r   r   r   r   r   r+   )r   rW   r   r   r   r   r   r,   compile_cache_filter   s6   
  &"$r   leftr   rightc                 C   sT   | du rdS | |k| |k| |k| |k | |k| |kd}||vr&t d| || S )z)Evaluate numeric comparisons for filters.NF)r.   r0   r/   r-   r2   r1   z)Unsupported numeric comparison operator: )r   )r   r   r   comparisonsr+   r+   r,   r      s   	r   	sort_expr.c                    s   t |   }|std|  d|d  |d} tvr3td  d|  dtt d|r7|nt  }|d	k}d
t	dt
tdf f fdd}||fS )zConvert a `hf cache ls` sort expression into a key function for sorting entries.

    Returns:
        A tuple of (key_function, reverse_flag) where reverse_flag indicates whether
        to sort in descending order (True) or ascending order (False).
    zInvalid sort expression: 'z5'. Expected format: 'key' or 'key:asc' or 'key:desc'.rW   orderzUnsupported sort key 'r   r   r   r9   r}   rF   .c                    s   | \}} dkr|j  }|fS  dkr$|d ur|j}|fS |j}|fS  dkr8|jd ur3|j}|fS d}|fS  dkr]|d urP|jd urK|j}|fS d}|fS |jd urX|jnd}|fS td  )Nr8   r4   r6   g        r7   zUnsupported sort key: )rl   rR   r   r   r   r   )r}   rK   rh   r   rV   r+   r,   	_sort_key   s.   
z%compile_cache_sort.<locals>._sort_key)_SORT_PATTERNr   r   rR   r   r   
_SORT_KEYSr   _SORT_DEFAULT_ORDER
CacheEntryr*   r   )r   r   explicit_orderr   reverser   r+   rV   r,   compile_cache_sort  s   
 r   targetsc                 C   s   t | \}}tt}t }g }|D ]Z}| }|sq| }	td|	rE||	}
|
du r3|| q|
\}}|| 	| |	|j
 q|t| }|du rX|| q|jD ]}|| 	| |	|j
 q[qdd | D }tt||t|dS )z8Resolve the deletion targets into a deletion resolution.z[0-9a-fA-F]{40}Nc                 S   s   i | ]	\}}|t |qS r+   )r&   )rx   rK   revsr+   r+   r,   
<dictcomp>b  s    z-_resolve_deletion_targets.<locals>.<dictcomp>r    r!   r"   )ro   r   setr   rR   re	fullmatchr   r~   addr[   rv   r    rG   r   r&   r*   )rj   r   rm   rn   r!   r    r"   
raw_targetrp   loweredr   rK   rh   matched_repofrozen_selectedr+   r+   r,   _resolve_deletion_targetsA  s@   



r   z	list | ls)zhf cache lszhf cache ls --revisionsz*hf cache ls --filter "size>1GB" --limit 20zhf cache ls --format json)examplesF	cache_dirz9Cache directory to scan (defaults to Hugging Face cache).r    zCInclude revisions in the output instead of aggregated repositories.filterz-fz--filterzZFilter entries (e.g. 'size>1GB', 'type=model', 'accessed>7d'). Can be used multiple times.r   a  Sort entries by key. Supported keys: 'accessed', 'modified', 'name', 'size'. Append ':asc' or ':desc' to explicitly set the order (e.g., 'modified:asc'). Defaults: 'accessed', 'modified', 'size' default to 'desc' (newest/biggest first); 'name' defaults to 'asc' (alphabetical).limitzSLimit the number of results returned. Returns only the top N entries after sorting.c                    s&  zt | }W n ty } z	td|j |d}~ww |pg }t||d\}zfdd|D }	W n tyG } ztt||d}~ww t		 |	D ]  fdd|D }qN|rzt
|j\}
}|j|
|d W n ty } ztt||d}~ww |dur|dk rtd	| d
|d| }|rdd |D }tj|g ddddid nfdd|D }tj|g ddddid |rdd |D }t|}|rtdd |D }tdd |D }ntdd |D }tdd |D }ttd| d| dt| d dS dS )z&List cached repositories or revisions.Cache directory not found: N)rw   c                    s   g | ]}t | qS r+   )r   )rx   r   r   r+   r,   r     s    zls.<locals>.<listcomp>c                    s$   g | ]} |d  |d r|qS )r   r   r+   rx   r}   )fnr   r+   r,   r     s   $ )rW   r   r   z&Limit must be a positive integer, got r   c                 S   sF   g | ]\}}|d ur|j |j|j|jt|j|j|jt|j	dqS )N)rt   rQ   rP   rh   snapshot_pathr4   r   r3   )
rl   rQ   rP   r[   r'   r   rf   last_modified_strrb   r3   )rx   rK   rh   r+   r+   r,   r     s    )rt   rh   r4   r   r3   rh   r4   r   )headersid_key
alignmentsc                    sB   g | ]\}}|j |j|j|j|jpd |jt |t dqS )r{   )rt   rQ   rP   r4   r   r   r3   )	rl   rQ   rP   rf   last_accessed_strr   rb   r   r&   rx   rK   r   r   r+   r,   r     s    
)rt   r4   r   r   r3   rt   c                 S   s   h | ]\}}|qS r+   r+   r   r+   r+   r,   rz     r   zls.<locals>.<setcomp>c                 s   s     | ]\}}|d urdV  qd S )Nr   r+   rx   r   r]   r+   r+   r,   	<genexpr>  s    zls.<locals>.<genexpr>c                 s   s"    | ]\}}|d ur|j V  qd S rN   r   r   r+   r+   r,   r          c                 s   s    | ]}t |jV  qd S rN   )rH   r    rx   rK   r+   r+   r,   r         c                 s       | ]}|j V  qd S rN   r   r   r+   r+   r,   r         z
Found z repo(s) for a total of z revision(s) and z	 on disk.)r   r   r	   r   r   r   typerBadParameterr'   timer   r   r   r   tablerH   sumrd   r   boldr   )r   r    r   r   r   rj   excfiltersr   
filter_fnssort_key_fnr   rG   unique_reposr@   revision_count
total_sizer+   )r   r   r   r,   lsm  s   /

r   )zhf cache rm model/gpt2z-hf cache rm hf://models/openai-community/gpt2zhf cache rm <revision_hash>z hf cache rm model/gpt2 --dry-runzhf cache rm model/gpt2 --yesziOne or more repo IDs (e.g. model/bert-base-uncased), repo-level hf:// URIs, or revision hashes to delete.yesz-yz--yeszSkip confirmation prompt.dry_runz,Preview deletions without removing anything.c              
   C   s  zt |}W n ty } z	td|j |d}~ww t|| }|jr7ddd |jD }td|  t	|j
dkrItd tjdd	|jt|j
 }t|j}	g }
|	jrd|
|	j d
 |	jrp|
|	j d |
s{|
|	j d d|
}td| d|j d t|j |rtjdd|	j|	j|jd dS tjd|d |  t|j}	tjd|	j d|	j d|j d|	j|	j|jd dS )z(Remove cached repositories or revisions.r   N
c                 s       | ]}d | V  qdS r_   Nr+   r   r+   r+   r,   r   #  r   zrm.<locals>.<genexpr>zCould not find in cache:
r   zNothing to delete.codez repo(s)z revision(s)z and About to delete z totalling r   Dry run: no files were deleted.T)r   rk   r    r4   zProceed with deletion?r   Deleted z repo(s) and z revision(s); freed )repos_deletedrevisions_deletedfreed)r   r   r	   r   r   r"   re   r   warningrH   r    rd   r   Exitdelete_revisionsrb   rL   r!   r@   r~   rA   rB   expected_freed_size_strri   resultconfirmexecute)r   r   r   r   rj   r   
resolutiondetailsstrategycountssummary_partssummary_textr+   r+   r,   rm  sZ   &






r  zhf cache prunezhf cache prune --dry-runc              
   C   sJ  zt | }W n ty } z	td|j |d}~ww i }t }|jD ]}tdd |jD }|s3q$|||< |dd |D  q$t	|dkrOt
d dS tt||dd	}	|jt|	j }
t|}t
d
|j d|
j d t| |rt
jdd|j|
jd dS t
jd|d |
  t
jd|j d|
j d|j|
jd dS )z)Remove detached revisions from the cache.r   Nc                 s   s"    | ]}t |jd kr|V  qdS )r   N)rH   r3   rx   rh   r+   r+   r,   r   p  r   zprune.<locals>.<genexpr>c                 s   r   rN   rZ   r  r+   r+   r,   r   t  r   r   z2No unreferenced revisions found. Nothing to prune.r+   r   r   z unreferenced revision(s) (z total).r   T)r   r    r4   zProceed?r   r   z! unreferenced revision(s); freed r   )r   r   )r   r   r	   r   r   rk   r&   r    updaterH   r   rd   r   r   rb   rL   rB   r   ri   r   r   r   )r   r   r   rj   r   r!   r    rK   detachedr   r   r   r+   r+   r,   pruneP  sV   


r  )zhf cache verify gpt2z)hf cache verify gpt2 --revision refs/pr/1z.hf cache verify my-dataset --repo-type datasetrQ   rP   rh   zXCache directory to use when verifying files from cache (defaults to Hugging Face cache).	local_dirz?If set, verify files under this directory instead of the cache.fail_on_missing_filesz--fail-on-missing-filesz?Fail if some files exist on the remote but are missing locally.fail_on_extra_filesz--fail-on-extra-fileszLFail if some files exist locally but are not present on the remote revision.tokenc              
   C   s  |dur|durt d tjddt|d}|j| t|dr#|jnt|||||d}	d}
|	j	rGd	
d
d |	j	D }t d|  d}
|	jrm|rbd	
dd |	jD }t d|  d}
nt t|	j d |	jr|rd	
dd |	jD }t d|  d}
nt t|	j d |	j}|
dkrt d|  d|j d| d|	j  tj|
dt jd|	j d|j d|  d| |j|	jt|d dS )a  Verify checksums for a single repo revision from cache or a local directory.

    Examples:
      - Verify main revision in cache: `hf cache verify gpt2`
      - Verify specific revision: `hf cache verify gpt2 --revision refs/pr/1`
      - Verify dataset: `hf cache verify karpathy/fineweb-edu-100b-shuffle --repo-type dataset`
      - Verify local dir: `hf cache verify deepseek-ai/DeepSeek-OCR --local-dir /path/to/repo`
    NzCCannot pass both --local-dir and --cache-dir. Use one or the other.r
   r   )r	  r   )rQ   rP   rh   r  r   r	  r   r   c              
   s   s<    | ]}d |d  d|d  d|d  d|d  V  qdS )	r_   pathz: expected r   z (	algorithmz), got actualNr+   )rx   mr+   r+   r,   r     s
    *
zverify.<locals>.<genexpr>u<   ❌ Checksum verification failed for the following file(s):
r   c                 s   r   r   r+   rx   pr+   r+   r,   r     r   u6   ❌ Missing files (present remotely, absent locally):
zM remote file(s) are missing locally. Use --fail-on-missing-files for details.c                 s   r   r   r+   r  r+   r+   r,   r     r   u4   ❌ Extra files (present locally, absent remotely):
zV local file(s) do not exist on the remote repo. Use --fail-on-extra-files for details.zVerification failed for 'z' (z) in z.
  Revision: z	Verified z file(s) for z 'z'. All checksums match.)rQ   rP   checkedr
  )r   errorr   r   r   verify_repo_checksumshasattrr   r'   
mismatchesre   rd   missing_pathsr   rH   extra_pathsverified_pathrh   r   checked_count)rQ   rP   rh   r   r  r  r  r	  apir   	exit_coder   verified_locationr+   r+   r,   verify  s`   0

	

r  )NFNNN)NFF)QrC   r   r   collectionsr   collections.abcr   r   dataclassesr   enumr   typingr   r   r   huggingface_hub.errorsr	   utilsr   r   r   r   r   r   r   r   utils._parsingr   r   
_cli_utilsr   r   r   r   r   r   _outputr   	cache_clir   compiler   r   r   r   r   r   _sort_options_dictrb   rW   r'   r#   r=   r?   r*   r   r)   r&   RepoRefsMaprL   ri   ro   rv   r   r   r   r   r   r   r   r   commandOptionrD   r   Argumentr  r  modelr  r+   r+   r+   r,   <module>   s  (
 








A,6,	
$RI	
