o
    ĎiXm                     @   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+jMg dFdGddHde$jNdHddfdIeee7 ejOdJdf dKeeAejOdLdf dMeeeKe7  ejOdNdOdPdf dQee$ejOdRdf dSeeAejOdTdUdVdf dWeee9 ejOdXdf dYeeeP ejOdZdf d$dfd[d\ZQe+jMg d]dG		H	Hd{dCeeKe7 ejRd^df dIeee7 ejOdJdf d_eeAejOd`dadbdf dceeAejOdddf d$df
dedfZSe+jMdgdhgdG		H	Hd{dIeee7 ejOdJdf d_eeAejOd`dadbdf dceeAejOdddf d$dfdidjZTe+jMg dkdGe&jUddddHdHdfdle%dme&dne'dIeee7 ejOdodf dpeee7 ejOdqdf dreeAejOdsdtdf dueeAejOdvdwdf dxe(d$dfdydz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/   U/home/jeff/fluffinator/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>.+)$>   <=>!=<=>=>   refssizetypeaccessedmodified>   namer8   r:   r;   z.^(?P<key>[a-zA-Z_]+)(?::(?P<order>asc|desc))?$descasc)r:   r;   r8   r<   z:asc_ascz:desc_descSortOptions)r9   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   rC   Y   s
   
 rC   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$   rC   )rI   rD   total_revisionsrevisions_in_full_reposrepor$   rE   r/   r/   r0   summarize_deletionsf   s   rP   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rO   r/   r/   r0   <lambda>z       z0print_cache_selected_revisions.<locals>.<lambda>key/c                 S      | j S rR   commit_hashrevr/   r/   r0   rX   |         - z (entire repo): z
(detached)z      z [z] N)sortedkeysrT   rU   rL   r$   printjoinr7   r_   size_on_disk_str)rI   rO   repo_keyr$   revisionr7   r/   r/   r0   print_cache_selected_revisionsx   s    rm   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_idrV   r$   r_   )rn   repo_lookuprevision_lookuprO   rk   rl   r/   r/   r0   build_cache_index   s   


rs   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   rQ   rR   rS   rW   r/   r/   r0   rX      rY   z'collect_cache_entries.<locals>.<lambda>rZ   c                 S   s   h | ]
}|j D ]}|qqS r/   )r7   ).0rl   refr/   r/   r0   	<setcomp>   s    z(collect_cache_entries.<locals>.<setcomp>c                 S   r]   rR   r^   r`   r/   r/   r0   rX      rb   Nc                 S   s&   | d j | d d ur| d jfS dfS )Nr   r    )rp   r_   entryr/   r/   r0   rX      s
   c                 S   s
   | d j S )Nr   )rp   ry   r/   r/   r0   rX      s   
 )rf   ro   r*   r$   appendsort)rn   rt   entriesrepo_refs_mapsorted_reposrO   rl   r/   r/   r0   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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'.r[   opvaluezUnsupported operator 'z' in filter ''. Must be one of .zUnsupported filter key '' in 'r8   c                    s"   t |d ur|j S | j S rR   )_compare_numericsize_on_diskrO   rl   _)r   size_thresholdr/   r0   rX      s    z&compile_cache_filter.<locals>.<lambda>>   r:   r;   rO   rl   nowrJ   c                    s>    dkr| j n	|d ur|jn| j}|d u rdS t|| S )Nr:   F)last_accessedlast_modifiedr   )rO   rl   r   	timestamp)r[   r   secondsr/   r0   _time_filter   s   z*compile_cache_filter.<locals>._time_filterr9   r2   z/Only '=' is supported for 'type' filters. Got 'r   c                    s   | j   kS rR   )rT   rV   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/   )rV   )ru   rv   r/   r/   r0   
<listcomp>       z>compile_cache_filter.<locals>._refs_filter.<locals>.<listcomp>)r7   getr*   rV   )rO   rl   r   r7   )r~   	value_rawr/   r0   _refs_filter   s   z*compile_cache_filter.<locals>._refs_filter)_FILTER_PATTERNmatchstrip
ValueErrorgrouprV   _ALLOWED_OPERATORSlist_FILTER_KEYSr   r   r   r   r   floatbool)r   r~   r   r   r   r   r/   )r   r[   r   r~   r   r   r   r0   compile_cache_filter   s6   
  &"$r   r}   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)rU   rT   rl   snapshot_pathr   r   r   r7   )rU   rT   r   r   r   r7   )rU   rT   r_   r+   r   r   r   r   rf   r7   r   r*   r{   )r}   rt   r~   payloadrO   rl   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)IDREVISIONSIZELAST_MODIFIEDREFSc              
   S   s@   g | ]\}}|d ur|j |j|jd|jdt|jgqS )N   re   )rp   r_   rj   rjustlast_modified_strri   rf   r7   )ru   rO   rl   r/   r/   r0   r     s    
z-print_cache_entries_table.<locals>.<listcomp>)r   r   LAST_ACCESSEDr   r   c                    sD   g | ]\}}|j |jd |jpd|jdt |t gqS )r   rx   re   )	rp   rj   r   last_accessed_strr   ri   rf   r   r*   ru   rO   r   r~   r/   r0   r   +  s    
)headersc                 S   s   h | ]\}}|qS r/   r/   r   r/   r/   r0   rw   8  r   z,print_cache_entries_table.<locals>.<setcomp>c                 s   s     | ]\}}|d urdV  qd S )Nr   r/   ru   r   rl   r/   r/   r0   	<genexpr>;  s    z,print_cache_entries_table.<locals>.<genexpr>c                 s   s"    | ]\}}|d ur|j V  qd S rR   r   r   r/   r/   r0   r   <       c                 s   s    | ]}t |jV  qd S rR   )rL   r$   ru   rO   r/   r/   r0   r   >  s    c                 s       | ]}|j V  qd S rR   r   r   r/   r/   r0   r   ?      z
Found z repo(s) for a total of z revision(s) and z	 on disk.)rh   r   rL   sumr   r   bold)r}   rt   r~   messager   
table_rowsunique_reposrD   revision_count
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.rt   r~   r   )indent
N)r   jsondumpsysstdoutwrite)r}   rt   r~   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)r2   r4   r3   r1   r6   r5   z)Unsupported numeric comparison operator: )r   )r   r   r   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'.r[   orderzUnsupported sort key 'r   r   r   r=   rz   rJ   .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<   r8   r:   g        r;   zUnsupported sort key: )rp   rV   r   r   r   r   )rz   rO   rl   r   rZ   r/   r0   	_sort_keyw  s.   
z%compile_cache_sort.<locals>._sort_key)_SORT_PATTERNr   r   rV   r   r   
_SORT_KEYSr   _SORT_DEFAULT_ORDER
CacheEntryr.   r   )r   r   explicit_orderr   reverser   r/   rZ   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*   )ru   rO   revsr/   r/   r0   
<dictcomp>  s    z-_resolve_deletion_targets.<locals>.<dictcomp>r$   r%   r&   )rs   r   setr   rV   re	fullmatchr   r{   addr_   r$   rK   r#   r*   r.   )rn   r   rq   rr   r%   r$   r&   
raw_targettargetloweredr   rO   rl   matched_repofrozen_selectedr/   r/   r0   _resolve_deletion_targets  s@   




r   )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.formatzOutput format.quietz-qz--quietz-Print only IDs (repo IDs or revision hashes).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| }
|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)rt   c                    s   g | ]}t | qS r/   )r   )ru   r   r   r/   r0   r   	  s    zls.<locals>.<listcomp>c                    s$   g | ]} |d  |d r|qS )r   r   r/   )ru   rz   )fnr   r/   r0   r     s   $ )r[   r   r   z&Limit must be a positive integer, got r   r   )r   r   r   r   r   r   typerBadParameterr+   timer   r   r|   rh   r_   rp   r   tabler   r   r   )r   r$   r   r   r   r|   r   rn   excfiltersr}   
filter_fnssort_key_fnr   rO   rl   
formattersr/   )r   r   r~   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:rc   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&   rh   rL   r$   r   Exitdelete_revisionsrf   rP   r%   rD   r{   rE   rF   ri   expected_freed_size_strrm   confirmexecute)r   r   r   r   rn   r   
resolutionrz   strategycountssummary_parts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)rL   r7   ru   rl   r/   r/   r0   r     r   zprune.<locals>.<genexpr>c                 s   r   rR   r^   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   ro   r*   r$   updaterL   rh   r#   r  rf   rP   rF   r  rm   r   r  r  )r   r   r   rn   r   r%   r$   rO   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 datasetrU   rT   rl   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   )rU   rT   rl   r  r   r  r   u;   ❌ Checksum verification failed for the following file(s):rc   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.)rh   r   r  r   verify_repo_checksumshasattrr   r+   r   
mismatchesmissing_pathsrL   extra_pathsverified_pathrl   checked_count)rU   rT   rl   r   r  r  r  r  apiresult	exit_codehas_mismatchesmpwarningverified_locationr/   r/   r0   verify  sX   0
	

2

$r(  )NFF)WrG   r   r   r   r   collectionsr   dataclassesr   enumr   typingr   r   r   r   r	   r
   r   r   r   huggingface_hub.errorsr   utilsr   r   r   r   r   r   r   r   utils._parsingr   r   
_cli_utilsr   r   r   r   r   r   r    	cache_clir#   compiler   r   r   r   r   r   _sort_options_dictrf   r[   r+   r'   rA   rC   r   r*   RepoRefsMaprP   rm   rs   r   r   r   r   r   r   r   r   r.   r   r   r   commandr   OptionrH   r   Argumentr  r  modelr(  r/   r/   r/   r0   <module>   sX  ((
$








A
 
2
	,6,	
#,2_KB	
