o
    2jR                  $   @   s  d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZ dd	lmZmZmZmZ dd
lmZ ddlmZmZ ddlmZmZ eeZeddZejdg dd				ddeeej ddf dee!ej"dddf deedB ej"dddf dee!ej"dddf deddfd dZ#d!ede!fd"d#Z$ejd$g d%d						dd!eedB ej d&df d'ee!ej"d(d)d*df d+ee!ej"d,d-df d.ee!ej"d/d0d1df d2ededdfd3d4Z%d5edB d2edB d'e!d+e!d.e!dedB ddfd6d7Z&d!ed'e!d+e!d.e!dedB ddfd8d9Z'ejd:d;d<gd	ddeeej d=df deddfd>d:Z(ejd?g d@d			ddeeej d=df dAee!ej"dBdCdDdf dEee!ej"dFdGdf deddf
dHd?Z)ejdIg dJd						dd!eeej dKdf d.ee!ej"d/d0dLdf dAee!ej"dBdCdDdf dMee!ej"dNdOdf dPee*e dB ej"dQdf dRee*e dB ej"dSdf deddfdTdUZ+ejdVg dWd	ddXeeej dYdf dZeeej d[df deddfd\dVZ,ejd]g d^d															dd_eedB ej d`df daeedB ej dbdf d?ee!ej"dcdf ddee!ej"dedfdf dgee!ej"dhdidf djeedB ej"dkdf dleedB ej"dmdf dMee!ej"dNdndf dPee*e dB ej"dodf dRee*e dB ej"dpdf dqeedB ej"drdf dsee!ej"dtdudf dvee!ej"dwdxdf dyee!ej"dzd{d|df deddf d}d]Z-ejd~g dded dS )z7Contains commands to interact with buckets via the CLI.    )	AnnotatedN)logging)BUCKET_PREFIX
BucketFileFilterMatcher_parse_bucket_uri   )REPO_REGIONS   )	SearchOptTokenOpt
get_hf_apityper_factory)make_cp)format_sizeprint_file_listing)OutputFormatoutz"Commands to interact with buckets.)helpcreate)zhf buckets create my-bucketz hf buckets create user/my-bucketz-hf buckets create hf://buckets/user/my-bucketz*hf buckets create user/my-bucket --privatez+hf buckets create user/my-bucket --exist-okz,hf buckets create user/my-bucket --region us)nameexamplesF	bucket_idzTBucket ID: bucket_name, namespace/bucket_name, or hf://buckets/namespace/bucket_nameprivatez	--privatezCreate a private bucket.regionz--regionzdCloud region in which to create the bucket. Can be one of 'us' or 'eu'. Requires Team plan or above.exist_okz
--exist-okz3Do not raise an error if the bucket already exists.tokenreturnc                 C   sv   t |d}| tr t| }|jrtd|  dt d|j} |j| |r'|nd||d}t	j
d|j |jd dS )	zCreate a new bucket.r   z-Cannot specify a prefix for bucket creation: . Use namespace/bucket_name or namespace/bucket_name.N)r   r   r   zBucket created)uriurl)r   
startswithr   r   path_in_repotyperBadParameteridcreate_bucketr   resultr!   to_urir"   )r   r   r   r   r   apiparsed
bucket_url r.   V/var/www/html/whisper/venv/lib/python3.10/site-packages/huggingface_hub/cli/buckets.pyr   .   s"   
*

argumentc                 C   s.   |  tr| ttd }d|v S | }d|v S )zFCheck if argument is a bucket ID (namespace/name) vs just a namespace.N/)r#   r   len)r0   pathr.   r.   r/   _is_bucket_idl   s
   
r4   z	list | ls)
zhf buckets listzhf buckets list huggingfacez$hf buckets list --search "my-prefix"zhf buckets list user/my-bucketz!hf buckets list user/my-bucket -Rz!hf buckets list user/my-bucket -hz%hf buckets list user/my-bucket --treez(hf buckets list user/my-bucket --tree -hz+hf buckets list hf://buckets/user/my-bucketz%hf buckets list user/my-bucket/sub -RzyNamespace (user or org) to list buckets, or bucket ID (namespace/bucket_name(/prefix) or hf://buckets/...) to list files.human_readablez--human-readablez-hz$Show sizes in human readable format.as_treez--treez3List files in tree format (only for listing files).	recursivez--recursivez-Rz0List files recursively (only for listing files).searchc                 C   sT   | duot | }|r|durtdt| ||||d dS t| |||||d dS )zList buckets or files in a bucket.

    When called with no argument or a namespace, lists buckets.
    When called with a bucket ID (namespace/bucket_name), lists files in the bucket.
    Nz'Cannot use --search when listing files.)r0   r5   r6   r7   r   )	namespacer8   r5   r6   r7   r   )r4   r%   r&   _list_files_list_buckets)r0   r5   r6   r7   r8   r   is_file_moder.   r.   r/   list_cmdu   s&   9


r=   r9   c                    s   |rt d|rt d| dur$| tr$| ttd } | d} t|d} fdd|j| |dD }tj	|d	d
id dS )zList buckets in a namespace.z'Cannot use --tree when listing buckets.z,Cannot use --recursive when listing buckets.Nr1   r   c                    s6   g | ]}|j |j rt|j n|j|j|jd qS ))r'   r   sizetotal_files
created_at)r'   r   r   r>   r?   r@   ).0bucketr5   r.   r/   
<listcomp>   s    z!_list_buckets.<locals>.<listcomp>)r9   r8   r>   right)
alignments)
r%   r&   r#   r   r2   rstripr   list_bucketsr   table)r9   r8   r5   r6   r7   r   r+   itemsr.   rC   r/   r;      s   






r;   c                 C   s\   |rt jtjkrtdt|d}t| }t|j	|j
|jpd|d}t||||d dS )zList files in a bucket.z%Cannot use --tree with --format json.r   Nprefixr7   )r5   r6   r7   )r   moder   jsonr%   r&   r   r   listlist_bucket_treer'   r$   r   )r0   r5   r6   r7   r   r+   r,   rJ   r.   r.   r/   r:      s   

r:   infozhf buckets info user/my-bucketz+hf buckets info hf://buckets/user/my-bucketzFBucket ID: namespace/bucket_name or hf://buckets/namespace/bucket_namec                 C   s0   t |d}t| }||j}tj|dd dS )zGet info about a bucket.r   r'   )id_keyN)r   r   bucket_infor'   r   dict)r   r   r+   r,   rB   r.   r.   r/   rQ      s   
delete)z hf buckets delete user/my-bucketz-hf buckets delete hf://buckets/user/my-bucketz&hf buckets delete user/my-bucket --yesz-hf buckets delete user/my-bucket --missing-okyesz--yesz-yzSkip confirmation prompt.
missing_okz--missing-okz3Do not raise an error if the bucket does not exist.c                 C   s   |  trt| }|jrtd|  dt d|j} nd| vr,td|  dt dtjd|  d|d	 t	|d
}|j
| |d tjd| d dS )zDelete a bucket.

    This deletes the entire bucket and all its contents. Use `hf buckets rm` to remove individual files.
    z-Cannot specify a prefix for bucket deletion: r   r    r1   zInvalid bucket ID: z-. Must be in format namespace/bucket_name or z(Are you sure you want to delete bucket ''?rV   r   )rW   zBucket deletedr   N)r#   r   r   r$   r%   r&   r'   r   confirmr   delete_bucketr)   )r   rV   rW   r   r,   r+   r.   r.   r/   rU     s&   
%
zremove | rm)z)hf buckets remove user/my-bucket/file.txtz2hf buckets rm hf://buckets/user/my-bucket/file.txtz.hf buckets rm user/my-bucket/logs/ --recursivez:hf buckets rm user/my-bucket --recursive --include "*.tmp"z8hf buckets rm user/my-bucket/data/ --recursive --dry-runzBucket path: namespace/bucket_name/path or hf://buckets/namespace/bucket_name/path. With --recursive, namespace/bucket_name is also accepted to target all files.z0Remove files recursively under the given prefix.dry_runz	--dry-runz8Preview what would be deleted without actually deleting.includezQInclude only files matching pattern (can specify multiple). Requires --recursive.excludezLExclude files matching pattern (can specify multiple). Requires --recursive.c                    sl  t | }|j |j}|dkr|std  d  d|s |r'|s'tdt|d}	|rtd}
g }|	j |p;dd	d
D ]}t	|t
rV|| |
dt| d q?|
dt| d |sf|rvt||dfdd|D }n|}dd |D }tdd |D }t|d	d}|std dS t| d| }|s|stddd |D  tjd| d  ddd |rtd fdd|D  td| d dS |	j |d  tjd!| d  d" t||d# dS |}|std$|rtd%t   d&|  td' dS tjd(| d)  d|d |	j |gd  tjd*| d+ dS ),zbRemove files from a bucket.

    To delete an entire bucket, use `hf buckets delete` instead.
     z?No file path specified. To remove files, provide a path (e.g. 'zd/FILE') or use --recursive to remove all files. To delete the entire bucket, use `hf buckets delete z`.z,--include and --exclude require --recursive.r   zListing files from remoteNTrK   zListing files from remote (z files))include_patternsexclude_patternsc                    s   g | ]
}  |jr|qS r.   )matchesr3   rA   f)matcherr.   r/   rD     s    zremove.<locals>.<listcomp>c                 S   s   g | ]}|j qS r.   )r3   rd   r.   r.   r/   rD     s    c                 s   s    | ]}|j V  qd S N)r>   rd   r.   r.   r/   	<genexpr>  s    zremove.<locals>.<genexpr>rC   zNo files to remove.z file(s) totaling 
c                 s   s    | ]}d | V  qdS )z  Nr.   rA   r3   r.   r.   r/   rh     s    zRemove z from 'rX   FrY   c                 3   s$    | ]}d t    d| V  qdS )delete: r1   N)r   rj   rZ   r.   r/   rh     s   " z
(dry run) z would be removed.)rU   zRemoved ')r   files_deletedr>   zFile path cannot be empty.rk   r1   z"(dry run) 1 file would be removed.zRemove 'z' from 'zFile removed)r3   r   )r   r'   r$   r%   r&   r   r   statusrP   
isinstancer   appendupdater2   doner   sumr   textjoinr[   batch_bucket_filesr)   r   )r0   r7   rV   r]   r^   r_   r   r,   rL   r+   rn   	all_filesitemmatched_files
file_paths
total_sizesize_strcount_label	file_pathr.   )r   rf   r/   removeQ  s|   =









r   move)z/hf buckets move user/old-bucket user/new-bucketz/hf buckets move user/my-bucket my-org/my-bucketzIhf buckets move hf://buckets/user/old-bucket hf://buckets/user/new-bucketfrom_idzMSource bucket ID: namespace/bucket_name or hf://buckets/namespace/bucket_nameto_idzRDestination bucket ID: namespace/bucket_name or hf://buckets/namespace/bucket_namec                 C   s   t | }|jrtd|  dt dt |}|jr&td| dt dt|d}|j|j|jd tj	d|j|jd dS )z2Move (rename) a bucket to a new name or namespace.z)Cannot specify a prefix for bucket move: r   r    r   )r   r   zBucket movedN)
r   r$   r%   r&   r   r   move_bucketr'   r   r)   )r   r   r   parsed_from	parsed_tor+   r.   r.   r/   r     s"   
sync)z2hf buckets sync ./data hf://buckets/user/my-bucketz2hf buckets sync hf://buckets/user/my-bucket ./dataz;hf buckets sync ./data hf://buckets/user/my-bucket --deletez^hf buckets sync hf://buckets/user/my-bucket ./data --include "*.safetensors" --exclude "*.tmp"zIhf buckets sync ./data hf://buckets/user/my-bucket --plan sync-plan.jsonlz'hf buckets sync --apply sync-plan.jsonlz<hf buckets sync ./data hf://buckets/user/my-bucket --dry-runzChf buckets sync ./data hf://buckets/user/my-bucket --dry-run | jq .sourcezKSource path: local directory or hf://buckets/namespace/bucket_name(/prefix)destzPDestination path: local directory or hf://buckets/namespace/bucket_name(/prefix)z/Delete destination files not present in source.ignore_timesz--ignore-timesz;Skip files only based on size, ignoring modification times.ignore_sizesz--ignore-sizesz<Skip files only based on modification times, ignoring sizes.planz=Save sync plan to JSONL file for review instead of executing.applyz#Apply a previously saved plan file.z5Print sync plan to stdout as JSONL without executing.z6Include files matching pattern (can specify multiple).z6Exclude files matching pattern (can specify multiple).filter_fromz(Read include/exclude patterns from file.existingz
--existingzASkip creating new files on receiver (only update existing files).ignore_existingz--ignore-existingzCSkip updating files that exist on receiver (only create new files).verbosez	--verbosez-vz%Show detailed logging with reasoning.c                 C   s`   t |d}|j| ||||||||	|
||||t d |r,t s.td| d dS dS dS )z0Sync files between local directory and a bucket.r   )r   r   rU   r   r   r   r   r^   r_   r   r   r   r]   r   quietzRun `hf buckets sync --apply z` to execute this plan.N)r   sync_bucketr   is_quiethint)r   r   rU   r   r   r   r   r]   r^   r_   r   r   r   r   r   r+   r.   r.   r/   r     s*   
lcp)zEhf buckets cp hf://buckets/username/my-bucket/config.json config.jsonz<hf buckets cp hf://buckets/username/my-bucket/data.csv data/z;hf buckets cp hf://buckets/username/my-bucket/config.json -zQhf buckets cp model.safetensors hf://buckets/username/my-bucket/model.safetensorsz?hf buckets cp config.json hf://buckets/username/my-bucket/logs/z;hf buckets cp - hf://buckets/username/my-bucket/config.jsonzYhf buckets cp hf://buckets/username/my-bucket/data.csv hf://buckets/username/dest-bucket/z_hf buckets cp hf://buckets/username/source-bucket/logs/ hf://buckets/username/dest-bucket/logs/buckets)FNFN)NFFFNNrg   )FFN)FFFNNN)NNFFFNNFNNNFFFN).__doc__typingr   r%   huggingface_hubr   huggingface_hub._bucketsr   r   r   r   hf_apir	   
_cli_utilsr   r   r   r   _cpr   _file_listingr   r   _outputr   r   
get_logger__name__loggerbuckets_clicommandstrArgumentboolOptionr   r4   r=   r;   r:   rQ   rU   rO   r   r   r   r.   r.   r.   r/   <module>   s|  

3	
!"#A
#
1
!
'
-. *!'-4
:
@FMT\]{