o
    0iim                     @   s  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mZmZmZmZmZ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)m*Z* e*ddZ+eddG dd dZ,e-dZ.h dZ/h dZ0h dZ1e-dZ2dddddZ3i Z4e5e1D ]Z6e6e4e6< e6 de4e6 d< e6 de4e6 d< qe
de4e7e8d Z9eddG d!d" d"Z:eeee f Z;eee<e7 f Z=d#eee<e f d$e:fd%d&Z>d#eee<e f d$dfd'd(Z?d)ed$eee7ef ee7eeef f f fd*d+Z@d)ed,eAd$eee; e=f fd-d.ZBd/e7d0e=d$eeee eCgeAf fd1d2ZDd3ee; d,eAd0e=d$eee7ef  fd4d5ZEd3ee; d,eAd0e=d$dfd6d7ZFd3ee; d,eAd0e=d$dfd8d9ZGd:eeC d;e7d<eCd$eAfd=d>ZHd?e7d$eIee;geIed@f f eAf fdAdBZJd)edCeKe7 d$e,fdDdEZLe+jMdFg dGdHddIde$jNdIddfdJeee7 ejOdKdf dLeeAejOdMdf dNeeeKe7  ejOdOdPdQdf dRee$ejOdSdf dTeeAejOdUdVdWdf dXeee9 ejOdYdf dZeeeP ejOd[df d$dfd\d]ZQe+jMg d^dH		I	Id|dCeeKe7 ejRd_df dJeee7 ejOdKdf d`eeAejOdadbdcdf ddeeAejOdedf d$df
dfdgZSe+jMdhdigdH		I	Id|dJeee7 ejOdKdf d`eeAejOdadbdcdf ddeeAejOdedf d$dfdjdkZTe+jMg dldHe&jUddddIdIdfdme%dne&doe'dJeee7 ejOdpdf dqeee7 ejOdrdf dseeAejOdtdudf dveeAejOdwdxdf dye(d$dfdzd{ZVdS )}zHContains the 'hf cache' command group with cache management subcommands.    N)defaultdict)	dataclass)Enum)	AnnotatedAnyCallableDictListMappingOptionalTuple)CLIError   )ANSICachedRepoInfoCachedRevisionInfoCacheNotFoundHFCacheInfo_format_sizescan_cache_dirtabulate)parse_duration
parse_size   )OutputFormat	RepoIdArgRepoTypeOptRevisionOptTokenOpt
get_hf_apityper_factoryz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/   S/home/kim/smarthome/.venv/lib/python3.10/site-packages/huggingface_hub/cli/cache.pyr#   :   s   
 r#   zA^(?P<key>[a-zA-Z_]+)\s*(?P<op>==|!=|>=|<=|>|<|=)\s*(?P<value>.+)$>   <=<=!=>>=>   accessedtyperefsmodifiedsize>   r7   namer:   r;   z.^(?P<key>[a-zA-Z_]+)(?::(?P<order>asc|desc))?$descasc)r7   r:   r;   r<   z:ascZ_ascz:descZ_descSortOptions)r8   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/   r0   rA   Y   s
   
 rA   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$   rA   )rG   rB   Ztotal_revisionsZrevisions_in_full_reposrepor$   rC   r/   r/   r0   summarize_deletionsf   s   rL   c              	   C   s   t |  dd dD ]M}|j d|j }t | | dd d}t|t|jkr1td| d q
td| d |D ]}d	t |jpFd
}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/   r0   <lambda>z       z0print_cache_selected_revisions.<locals>.<lambda>key/c                 S      | j S rN   commit_hashrevr/   r/   r0   rT   |         - z (entire repo): z
(detached)z      z [z] N)sortedkeysrP   rQ   rJ   r$   printjoinr9   r[   size_on_disk_str)rG   rK   repo_keyr$   revisionr9   r/   r/   r0   print_cache_selected_revisionsx   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/   r0   build_cache_index   s   


ro   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/   r0   rT      rU   z'collect_cache_entries.<locals>.<lambda>rV   c                 S   s   h | ]
}|j D ]}|qqS r/   )r9   ).0rh   refr/   r/   r0   	<setcomp>   s    z(collect_cache_entries.<locals>.<setcomp>c                 S   rY   rN   rZ   r\   r/   r/   r0   rT      r^   Nc                 S   s&   | d j | d d ur| d jfS dfS )Nr   r    )rl   r[   entryr/   r/   r0   rT      s
   c                 S   s
   | d j S )Nr   )rl   ru   r/   r/   r0   rT      s   
 )rb   rk   r*   r$   appendsort)rj   rp   entriesrepo_refs_mapZsorted_reposrK   rh   r/   r/   r0   collect_cache_entries   s"   r{   exprrz   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t dtdtffdd}|S dkr  dkrtd ddtdtt dtdtf fdd}|S dkrtd d	dtdtt 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 'r;   c                    s"   t |d ur|j S | j S rN   )_compare_numericsize_on_diskrK   rh   _)r}   size_thresholdr/   r0   rT      s    z&compile_cache_filter.<locals>.<lambda>>   r7   r:   rK   rh   nowrH   c                    s>    dkr| j n	|d ur|jn| j}|d u rdS t|| S )Nr7   F)last_accessedlast_modifiedr   )rK   rh   r   	timestamp)rW   r}   secondsr/   r0   _time_filter   s   z*compile_cache_filter.<locals>._time_filterr8   r3   z/Only '=' is supported for 'type' filters. Got 'r   c                    s   | j   kS rN   )rP   rR   r   )expectedr/   r0   _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   )rq   rr   r/   r/   r0   
<listcomp>       z>compile_cache_filter.<locals>._refs_filter.<locals>.<listcomp>)r9   getr*   rR   )rK   rh   r   r9   )rz   	value_rawr/   r0   _refs_filter   s   z*compile_cache_filter.<locals>._refs_filter)_FILTER_PATTERNmatchstrip
ValueErrorgrouprR   _ALLOWED_OPERATORSlist_FILTER_KEYSr   r   r   r   r   floatbool)r|   rz   r   r   r   r   r/   )r   rW   r}   rz   r   r   r   r0   compile_cache_filter   s6   
  &"$r   ry   c                C   s   g }| D ]=\}}|r'|du rq|j |j|jt|j|j|j|jt|j	d}n|j |j|j|j|jt|
|t d}|| q|S )zGNormalize cache entries into serializable records for JSON/CSV exports.N)rQ   rP   rh   snapshot_pathr   r   r   r9   )rQ   rP   r   r   r   r9   )rQ   rP   r[   r+   r   r   r   r   rb   r9   r   r*   rw   )ry   rp   rz   payloadrK   rh   recordr/   r/   r0   _build_cache_export_payload   s.   r   c                   s   | s|rdnd}t | dS |rg d}dd | D }ng d} fdd| D }t t||d	 d
d | D }t|}|rQtdd | D }tdd | D }	ntdd |D }tdd |D }	d| d| dt|	 d}
t t|
 dS )zBRender cache entries as a table and show a human-readable summary.zNo cached revisions found.zNo cached repositories found.N)IDZREVISIONSIZELAST_MODIFIEDREFSc              
   S   s@   g | ]\}}|d ur|j |j|jd|jdt|jgqS )N   ra   )rl   r[   rf   rjustlast_modified_strre   rb   r9   )rq   rK   rh   r/   r/   r0   r     s    
z-print_cache_entries_table.<locals>.<listcomp>)r   r   ZLAST_ACCESSEDr   r   c                    sD   g | ]\}}|j |jd |jpd|jdt |t gqS )r   rt   ra   )	rl   rf   r   Zlast_accessed_strr   re   rb   r   r*   rq   rK   r   rz   r/   r0   r   +  s    
)headersc                 S   s   h | ]\}}|qS r/   r/   r   r/   r/   r0   rs   8  r   z,print_cache_entries_table.<locals>.<setcomp>c                 s   s     | ]\}}|d urdV  qd S )Nr   r/   rq   r   rh   r/   r/   r0   	<genexpr>;  s    z,print_cache_entries_table.<locals>.<genexpr>c                 s   s"    | ]\}}|d ur|j V  qd S rN   r   r   r/   r/   r0   r   <       c                 s   s    | ]}t |jV  qd S rN   )rJ   r$   rq   rK   r/   r/   r0   r   >  s    c                 s       | ]}|j V  qd S rN   r   r   r/   r/   r0   r   ?      z
Found z repo(s) for a total of z revision(s) and z	 on disk.)rd   r   rJ   sumr   r   bold)ry   rp   rz   messager   Z
table_rowsZunique_reposrB   Zrevision_countZ
total_sizesummaryr/   r   r0   print_cache_entries_table  s.   
r   c                C   s0   t | ||d}tj|tjdd tjd dS )z7Dump cache entries as JSON for scripting or automation.rp   rz   r   )indent
N)r   jsondumpsysstdoutwrite)ry   rp   rz   r   r/   r/   r0   print_cache_entries_jsonE  s   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)r3   r4   r5   r2   r6   r1   z)Unsupported numeric comparison operator: )r   )r   r}   r   Zcomparisonsr/   r/   r0   r   N  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   r=   rv   rH   .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  )Nr<   r;   r7   g        r:   zUnsupported sort key: )rl   rR   r   r   r   r   )rv   rK   rh   r~   rV   r/   r0   	_sort_keyw  s.   
z%compile_cache_sort.<locals>._sort_key)_SORT_PATTERNr   r   rR   r   r   
_SORT_KEYSr   _SORT_DEFAULT_ORDER
CacheEntryr.   r   )r   r   Zexplicit_orderr   reverser   r/   rV   r0   compile_cache_sortb  s   
 r   targetsc                 C   s   t | \}}tt}t }g }|D ]V}| }|sq| }	td|	rE||	}
|
du r3|| q|
\}}|| 	| |	|j
 q||	}|du rT|| q|jD ]}|| 	| |	|j
 qWq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*   )rq   rK   revsr/   r/   r0   
<dictcomp>  s    z-_resolve_deletion_targets.<locals>.<dictcomp>r$   r%   r&   )ro   r   setr   rR   re	fullmatchr   rw   addr[   r$   rI   r#   r*   r.   )rj   r   rm   rn   r%   r$   r&   Z
raw_targettargetZloweredr   rK   rh   Zmatched_repoZfrozen_selectedr/   r/   r0   _resolve_deletion_targets  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)Z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.formatzOutput format.quietz-qz--quietz-Print only IDs (repo IDs or revision hashes).rx   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| }
|r|
D ]\}}t|dur|jn|j qdS tjttjti}|| |
|dS )z&List cached repositories or revisions.Cache directory not found: N)rp   c                    s   g | ]}t | qS r/   )r   )rq   r|   r   r/   r0   r   
  s    zls.<locals>.<listcomp>c                    s$   g | ]} |d  |d r|qS )r   r   r/   )rq   rv   )fnr   r/   r0   r     s   $ )rW   r   r   z&Limit must be a positive integer, got r   r   )r   r   r   r   r{   r   typerZBadParameterr+   timer   r~   rx   rd   r[   rl   r   tabler   r   r   )r   r$   r   r   r   rx   r   rj   excfiltersry   Z
filter_fnsZsort_key_fnr   rK   rh   
formattersr/   )r   r   rz   r0   ls  sJ   =r   )zhf cache rm model/gpt2zhf cache rm <revision_hash>z hf cache rm model/gpt2 --dry-runzhf cache rm model/gpt2 --yeszQOne or more repo IDs (e.g. model/bert-base-uncased) 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r5td |jD ]	}td|  q+t|jdkrFtd t	j
dd|jt|j }t|j}	g }
|	jra|
|	j d |	jrm|
|	j d	 |
sx|
|	j d	 d
|
}td| d|j d t|j |rtd dS |st	jdddstd dS |  t|j}	td|	j d|	j d|j d dS )z(Remove cached repositories or revisions.r   Nz2Could not find the following targets in the cache:r_   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.zProceed with deletion?F)defaultzDeletion cancelled.Deleted z repo(s) and z revision(s); freed )r   r   r   r   r   r&   rd   rJ   r$   r   Exitdelete_revisionsrb   rL   r%   rB   rw   rC   rD   re   expected_freed_size_strri   confirmexecute)r   r   r   r   rj   r   
resolutionrv   strategycountsZsummary_partsZsummary_textr/   r/   r0   rm,  sJ   %





r   zhf cache prunezhf cache prune --dry-runc              
   C   s8  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rNt
d dS tt||dd	}	|jt|	j }
t|}t
d
|j d|
j d t| |r|t
d dS |stdst
d dS |
  t
d|j d|
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)rJ   r9   rq   rh   r/   r/   r0   r     r   zprune.<locals>.<genexpr>c                 s   r   rN   rZ   r   r/   r/   r0   r     r   r   z2No unreferenced revisions found. Nothing to prune.r/   r   r   z unreferenced revision(s) (z total).r   zProceed?zPruning cancelled.r   z! unreferenced revision(s); freed r   )r   r   r   r   r   rk   r*   r$   updaterJ   rd   r#   r   rb   rL   rD   r   ri   r   r   r   )r   r   r   rj   r   r%   r$   rK   Zdetachedr   r   r   r/   r/   r0   prune  sH   
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}
t|	j	}|rYt d	 |	j	D ]}t d
|d  d|d  d|d  d|d   q<d}
|	j
r|rrt d |	j
D ]	}t d
|  qed}
nt|	j
 d}t d|  |	jr|rt d |	jD ]	}t d
|  qd}
nt|	j d}t d|  |	j}|
dkrt d|  d|j d| d t d|	j  tj|
dt d|	j d|  d|j d|  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   u;   ❌ Checksum verification failed for the following file(s):r_   pathz: expected r   z (	algorithmz), got actualr   z1Missing files (present remotely, absent locally):zM remote file(s) are missing locally. Use --fail-on-missing-files for details.u   ⚠️  z/Extra files (present locally, absent remotely):zV local file(s) do not exist on the remote repo. Use --fail-on-extra-files for details.u   ❌ Verification failed for 'z' (z) in r   z  Revision: u   ✅ Verified z file(s) for 'z  All checksums match.)rd   r   r   r   Zverify_repo_checksumshasattrr~   r+   r   Z
mismatchesZmissing_pathsrJ   Zextra_pathsZverified_pathrh   Zchecked_count)rQ   rP   rh   r   r   r   r   r   apiresult	exit_codeZhas_mismatchesmpwarningZverified_locationr/   r/   r0   verify  sX   0
	

2

$r  )NFF)WrE   r   r   r   r   collectionsr   dataclassesr   enumr   typingr   r   r   r   r	   r
   r   r   r   Zhuggingface_hub.errorsr   utilsr   r   r   r   r   r   r   r   Zutils._parsingr   r   Z
_cli_utilsr   r   r   r   r   r   r    Z	cache_clir#   compiler   r   r   r   r   r   Z_sort_options_dictrb   rW   r+   r'   r?   rA   r   r*   ZRepoRefsMaprL   ri   ro   r   r{   r   r   r   r   r   r   r.   r   r   r   commandr   OptionrF   r   ZArgumentr   r   modelr  r/   r/   r/   r0   <module>   sZ  ((
$








A
 
2
	,6,	
#,2_KB	
