o
     
jVf                     @   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 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 Z/e0e,D ]Z1e1e/e1< e1 de/e1 d< e1 de/e1 d < qed!e/e2e3d"Z4e	ddG d#d$ d$Z5e6eedB f Z7e8ee9e2 f Z:d%eee9e f d&e5fd'd(Z;d%eee9e f d&dfd)d*Z<d+ed&e6e8e2ef e8e2e6eef f f fd,d-Z=d+ed.e>d&e6e?e7 e:f fd/d0Z@d1e2d2e:d&eeedB eAge>f fd3d4ZBd5eAdB d6e2d7eAd&e>fd8d9ZCd:e2d&e6ee7ge6ed;f f e>f fd<d=ZDd+ed>e?e2 d&e'fd?d@ZEe&jFdAg dBdC		D			dqdEee2dB ejGdFdf dGee>ejGdHdf dIee?e2 dB ejGdJdKdLdf dMee4dB ejGdNdf dOeeHdB ejGdPdf d&dfdQdRZIe&jFg dSdC		D	Ddrd>ee?e2 ejJdTdf dEee2dB ejGdFdf dUee>ejGdVdWdXdf dYee>ejGdZdf d&df
d[d\ZKe&jFd]d^gdC		D	DdrdEee2dB ejGdFdf dUee>ejGdVdWdXdf dYee>ejGdZdf d&dfd_d`ZLe&jFg dadCejMddddDdDdfdbedcedde dEee2dB ejGdedf dfee2dB ejGdgdf dhee>ejGdidjdf dkee>ejGdldmdf dne!d&dfdodpZNdS )szHContains 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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*   L/home/kuhnn/.local/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>   namer3   r5   r6   z.^(?P<key>[a-zA-Z_]+)(?::(?P<order>asc|desc))?$descasc)r5   r6   r3   r7   z:asc_ascz:desc_descSortOptions)r4   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>   G   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>   )rD   r?   total_revisionsrevisions_in_full_reposrepor   r@   r*   r*   r+   summarize_deletionsT   s   rK   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rJ   r*   r*   r+   <lambda>h       z0print_cache_selected_revisions.<locals>.<lambda>key/c                 S      | j S rM   commit_hashrevr*   r*   r+   rS   j         - z (entire repo): z
(detached)z      z [z] N)sortedkeysrO   rP   rG   r   r   textjoinr2   rZ   size_on_disk_str)rD   rJ   repo_keyr   revisionr2   r*   r*   r+   print_cache_selected_revisionsf   s   "rh   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_idrQ   r   rZ   )ri   repo_lookuprevision_lookuprJ   rf   rg   r*   r*   r+   build_cache_indexu   s   


rn   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   rL   rM   rN   rR   r*   r*   r+   rS      rT   z'collect_cache_entries.<locals>.<lambda>rU   c                 S   s   h | ]
}|j D ]}|qqS r*   )r2   ).0rg   refr*   r*   r+   	<setcomp>   s    z(collect_cache_entries.<locals>.<setcomp>c                 S   rX   rM   rY   r[   r*   r*   r+   rS      r]   Nc                 S   s&   | d j | d d ur| d jfS dfS )Nr   r    )rk   rZ   entryr*   r*   r+   rS      s
   c                 S   s
   | d j S )Nr   )rk   rt   r*   r*   r+   rS      s   
 )ra   rj   r%   r   appendsort)ri   ro   entriesrepo_refs_mapsorted_reposrJ   rg   r*   r*   r+   collect_cache_entries   s"   r{   exprry   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'.rV   opvaluezUnsupported operator 'z' in filter ''. Must be one of .zUnsupported filter key '' in 'r3   c                    s"   t |d ur|j S | j S rM   )_compare_numericsize_on_diskrJ   rg   _)r}   size_thresholdr*   r+   rS      s    z&compile_cache_filter.<locals>.<lambda>>   r5   r6   rJ   rg   NnowrE   c                    s>    dkr| j n	|d ur|jn| j}|d u rdS t|| S )Nr5   F)last_accessedlast_modifiedr   )rJ   rg   r   	timestamp)rV   r}   secondsr*   r+   _time_filter   s   z*compile_cache_filter.<locals>._time_filterr4   r-   z/Only '=' is supported for 'type' filters. Got 'r   c                    s   | j   kS rM   )rO   rQ   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*   )rQ   )rp   rq   r*   r*   r+   
<listcomp>       z>compile_cache_filter.<locals>._refs_filter.<locals>.<listcomp>)r2   getr%   rQ   )rJ   rg   r   r2   )ry   	value_rawr*   r+   _refs_filter   s   z*compile_cache_filter.<locals>._refs_filter)_FILTER_PATTERNmatchstrip
ValueErrorgrouprQ   _ALLOWED_OPERATORSlist_FILTER_KEYSr   r   r   r   floatbool)r|   ry   r   r   r   r   r*   )r   rV   r}   ry   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-   r/   r.   r,   r1   r0   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'.rV   orderzUnsupported sort key 'r   r   r   r8   ru   rE   .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  )Nr7   r3   r5   g        r6   zUnsupported sort key: )rk   rQ   r   r   r   r   )ru   rJ   rg   r~   rU   r*   r+   	_sort_key
  s.   
z%compile_cache_sort.<locals>._sort_key)_SORT_PATTERNr   r   rQ   r   r   
_SORT_KEYSr   _SORT_DEFAULT_ORDER
CacheEntryr)   r   )r   r   explicit_orderr   reverser   r*   rU   r+   compile_cache_sort   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%   )rp   rJ   revsr*   r*   r+   
<dictcomp>L  s    z-_resolve_deletion_targets.<locals>.<dictcomp>r   r    r!   )rn   r   setr   rQ   re	fullmatchr   rv   addrZ   r   rF   r   r%   r)   )ri   r   rl   rm   r    r   r!   
raw_targettargetloweredr   rJ   rg   matched_repofrozen_selectedr*   r*   r+   _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)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.rw   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)ro   c                    s   g | ]}t | qS r*   )r   )rp   r|   ry   r*   r+   r     s    zls.<locals>.<listcomp>c                    s$   g | ]} |d  |d r|qS )r   r   r*   rp   ru   )fnr   r*   r+   r     s   $ )rV   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)idrP   rO   rg   snapshot_pathr3   r   r2   )
rk   rP   rO   rZ   r&   r   re   last_modified_strra   r2   )rp   rJ   rg   r*   r*   r+   r     s    )r   rg   r3   r   r2   rg   r3   r   )headersid_key
alignmentsc                    sB   g | ]\}}|j |j|j|j|jpd |jt |t dqS )rs   )r   rP   rO   r3   r   r   r2   )	rk   rP   rO   re   last_accessed_strr   ra   r   r%   rp   rJ   r   r   r*   r+   r     s    
)r   r3   r   r   r2   r   c                 S   s   h | ]\}}|qS r*   r*   r   r*   r*   r+   rr     r   zls.<locals>.<setcomp>c                 s   s     | ]\}}|d urdV  qd S )Nr   r*   rp   r   r\   r*   r*   r+   	<genexpr>  s    zls.<locals>.<genexpr>c                 s   s"    | ]\}}|d ur|j V  qd S rM   r   r   r*   r*   r+   r          c                 s   s    | ]}t |jV  qd S rM   )rG   r   rp   rJ   r*   r*   r+   r         c                 s       | ]}|j V  qd S rM   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~   rw   r   tablerG   sumrc   r   boldr   )r   r   r   rw   r   ri   excfiltersrx   
filter_fnssort_key_fnr   rF   unique_reposr?   revision_count
total_sizer*   )r   r   ry   r+   lsW  s   /

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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   rj   r   r3   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!   rd   r   warningrG   r   rc   r   Exitdelete_revisionsra   rK   r    r?   rv   r@   rA   expected_freed_size_strrh   resultconfirmexecute)r   r   r   r   ri   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)rG   r2   rp   rg   r*   r*   r+   r   Y  r   zprune.<locals>.<genexpr>c                 s   r   rM   rY   r   r*   r*   r+   r   ]  r   r   z2No unreferenced revisions found. Nothing to prune.r*   r   r   z unreferenced revision(s) (z total).r   T)r   r   r3   zProceed?r   r   z! unreferenced revision(s); freed r   )r   r   )r   r   r	   r   r   rj   r%   r   updaterG   r   rc   r   r   ra   rK   rA   r   rh   r   r   r   )r   r   r   ri   r   r    r   rJ   detachedr   r   r   r*   r*   r+   prune9  sV   


r   )zhf cache verify gpt2z)hf cache verify gpt2 --revision refs/pr/1z.hf cache verify my-dataset --repo-type datasetrP   rO   rg   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~   )rP   rO   rg   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*   )rp   mr*   r*   r+   r     s
    *
zverify.<locals>.<genexpr>u<   ❌ Checksum verification failed for the following file(s):
r   c                 s   r   r   r*   rp   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.)rP   rO   checkedr  )r   errorr   r   r   verify_repo_checksumshasattrr~   r&   
mismatchesrd   rc   missing_pathsr   rG   extra_pathsverified_pathrg   r   checked_count)rP   rO   rg   r   r   r  r  r  apir   	exit_coder   verified_locationr*   r*   r+   verify  s`   0

	

r  )NFNNN)NFF)OrB   r   r   collectionsr   collections.abcr   r   dataclassesr   enumr   typingr   r   r   huggingface_hub.errorsr	   utilsr   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_dictra   rV   r&   r"   r<   r>   r)   r   r(   r%   RepoRefsMaprK   rh   rn   r   r   r{   r   r   r   r   r   commandOptionrC   r   Argumentr   r   modelr  r*   r*   r*   r+   <module>   s  $ 








A,6,	
$RI	
