
    wiru                     ,   U d dl Z d dlZd dlZd dlZd dl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 d dlmZ ddlmZ dd	lmZmZmZ dd
lmZmZm Z m!Z! ddlm"Z"m#Z# ddl$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- erddl.m/Z/  ej0        e1          Z2dZ3dZ4g dZ5ee6         e7d<   dZ8dZ9dZ:dZ;dZ<dZ=dee         ddfdZ>ddddddddd d!d"e?d#ee?ef         d$e?d%ee?         d&ee@         d'eeee?         e?f                  d(eeee?         e?f                  d)ee6         d*e@d+e6fd,ZA G d- d.e jB                  ZCeeef         ZD G d/ d0          ZEd1eEd d!d"e?d$e?d%e?f
d2ZFd1eEdeeeCeeD         f                  fd3ZGd4eDddfd5ZHd6eeD         d d!d"e?d$e?d%e?ddfd7ZId6eeD         d d!d"e?d$e?d%e?ddfd8ZJd6eeD         d d!d"e?d$e?d%e?ddfd9ZK G d: d;e          ZLd4eDdeLfd<ZMd=d>deeD         fd?ZNd=d>d@e6deeD         fdAZOdBe?ddfdCZPdS )D    N)datetime)Path)Lock)TYPE_CHECKINGAnyDictListOptionalTupleUnion)quote   )	constants)CommitOperationAdd
UploadInfo_fetch_upload_modes)LocalUploadFileMetadataLocalUploadFilePathsget_local_upload_pathsread_upload_metadata)DEFAULT_REVISION
REPO_TYPES)DEFAULT_IGNORE_PATTERNSfilter_repo_objectstqdm)_format_size)is_xet_available)sha_fileobj)HfApi
   d   )
   2   K   r!   }         i  iX  i  COMMIT_SIZE_SCALE   i i'  r#   r"   
paths_listreturnc                    t                               d           t          |           t          k    r5t                               dt          |           ddt          dd           ddlm}  |d           }| D ]}t          |j                  }|j	        }t          |j                  d	k    rt          |j                  nd	}||         d
xx         dz  cc<   t          |dd                   D ]K\  }}|dk    rd	nd                    |d|                   }||         d                             |           L|                                D ]o\  }	}
|
d
         }t          |
d                   }||z   }|t           k    r=|	d	k    rdn|	}t                               d| d|dd|dd|ddt           dd           pg }g }| D ]t}|j                                        j        }|dz  }|t(          k    r|                    |j        |f           M|t,          k    r|                    |j        |f           u|rd                    d |dd         D                       }t          |          dk    rdt          |          dz
   dnd}t                               dt          |           dt(           d | | d!           |rd                    d" |dd         D                       }t          |          dk    rdt          |          dz
   dnd}t                               dt          |           d#t,           d$| | d%           t                               d&           dS )'au  
    Validate upload against repository limits and warn about potential issues.

    Args:
        paths_list: List of file paths to be uploaded

    Warns about:
        - Too many files in the repository (>100k)
        - Too many entries (files or subdirectories) in a single folder (>10k)
        - Files exceeding size limits (>20GB recommended, >50GB hard limit)
    z/Running validation checks on files to upload...zYou are about to upload ,z. files. This exceeds the recommended limit of z files per repository.
Consider:
  - Splitting your data into multiple repositories
  - Using fewer, larger files (e.g., parquet files)
  - See: https://huggingface.co/docs/hub/repositories-recommendationsr   )defaultdictc                  $    dt                      dS )Nr   )filessubdirs)set     |/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/huggingface_hub/_upload_large_folder.py<lambda>z)_validate_upload_limits.<locals>.<lambda>X   s    qUXUZUZ=[=[ r4   .r0   r   N/r1   rootzFolder 'z' contains z
 entries (z files and z/ subdirectories). This exceeds the recommended z< entries per folder.
Consider reorganising into sub-folders.i ʚ;z
  - c              3   .   K   | ]\  }}| d |ddV  dS z: z.1fGBNr3   .0pathsizes      r5   	<genexpr>z*_validate_upload_limits.<locals>.<genexpr>   s:      !a!ajdDT"9"9T"9"9"9"9!a!a!a!a!a!ar4      z
  ... and z more files Found z files exceeding the zGB hard limit:
  - zM
These files may fail to upload. Consider splitting them into smaller chunks.c              3   .   K   | ]\  }}| d |ddV  dS r<   r3   r>   s      r5   rB   z*_validate_upload_limits.<locals>.<genexpr>   s:      !\!\jdDT"9"9T"9"9"9"9!\!\!\!\!\!\r4   z files larger than zGB (recommended limit):
  - z2
Large files may slow down loading and processing.zValidation checks complete.)loggerinfolenMAX_FILES_PER_REPOwarningcollectionsr.   r   path_in_repopartsstrparent	enumeratejoinadditemsMAX_FILES_PER_FOLDER	file_pathstatst_sizeMAX_FILE_SIZE_GBappendRECOMMENDED_FILE_SIZE_GB)r*   r.   entries_per_folderpathsr@   rN   rP   ichildfolderdata
file_countsubdir_counttotal_entriesfolder_displaylarge_filesvery_large_filesrA   size_gb	files_strmore_strs                        r5   _validate_upload_limitsrk   ;   s    KKABBB :+++Us:B U U5GcU U U	
 	
 	
 (''''')45[5[)\)\ = =E&''
 &)%5%5%<%<T[!!!#6"7+++q0+++ "%*-- 	= 	=HAuFFSSrr(;(;Fv&y155e<<<<	=
 +0022  ']
4	?++"\1///'-}}VV&NNN:> : :mP : :O: :-9O: :0D^: : :   K > >##%%-&%%%##U%7$ABBBB/// 2G<===  
MM!a!aL\]_^_]_L`!a!a!aaa	LOP`LaLadeLeLeH#&6"7"7!";HHHHkm\S)** \ \AQ \ \\&\ \ \	
 	
 	
  
MM!\!\KXZYZXZO!\!\!\\\	GJ;GWGWZ[G[G[C#k"2"2Q"6CCCCacAS%% A A:R A AA&A A A	
 	
 	
 KK-.....r4   T<   )revisionprivateallow_patternsignore_patternsnum_workersprint_reportprint_report_everyapir   repo_idfolder_path	repo_typerm   rn   ro   rp   rq   rr   rs   c                     t          d          t          vrt          dt                     t          t                                                                                                                    st          d d          |g }nt          |t                    r|g}|t          z  }|(t          j                    pd}t          |dz
  d          }                     |d	          }t                              d
|            |j        t#                      o                     d          j        }|rt(          nt*          }t-          fd                    d          D             ||          }fd|D             }t                              dt1          |           d           t3          |           t                              d           fdt5          |d          D             }t7          ||           fdt9          |          D             }|D ]}|                                 |	r$t=          d                                z              tA          j                     }	 tA          j!        d           tA          j                     |z
  |
k    r6|	r!tE                                                     tA          j                     }#                                rtI          j        d           n|D ]}|%                                 t                                                                         tI          j        d           dS )zUpload a large folder to the Hub in the most resilient way possible.

    See [`HfApi.upload_large_folder`] for the full documentation.
    NzFor large uploads, `repo_type` is explicitly required. Please set it to `model`, `dataset` or `space`. If you are using the CLI, pass it as `--repo-type=model`.z"Invalid repo type, must be one of zProvided path: 'z' is not a directoryr      T)ru   rw   rn   exist_okzRepo created: 
xetEnabled)ru   rw   rm   expandc              3      K   | ]?}|                                 |                                                              V  @d S N)is_filerelative_toas_posix)r?   r@   rv   s     r5   rB   z/upload_large_folder_internal.<locals>.<genexpr>   sO      iidZ^ZfZfZhZhi		+	&	&	/	/	1	1iiiiiir4   z**/*)ro   rp   c                 0    g | ]}t          |          S r3   )r   )r?   relpathrv   s     r5   
<listcomp>z0upload_large_folder_internal.<locals>.<listcomp>   s$    bbb7(g>>bbbr4   rE   z candidate files to uploadzStarting upload...c                 >    g | ]}|t          |j                  fS r3   )r   rM   )r?   r]   rv   s     r5   r   z0upload_large_folder_internal.<locals>.<listcomp>   s<        
$[%2DEEF  r4   zRecovering from metadata files)descc                 R    g | ]#}t          j        t          d           $S ))statusrt   ru   rw   rm   )targetkwargs)	threadingThread_worker_job)r?   _rt   ru   rw   rm   r   s     r5   r   z0upload_large_folder_internal.<locals>.<listcomp>   sY         	 "&$ 		
 		
 		
  r4   z

zIs done: exiting main loopzUpload is complete!)&
ValueErrorr   r   r   
expanduserresolveis_dir
isinstancerO   r   os	cpu_countmaxcreate_reporG   rH   ru   r   	repo_infoxet_enabledUPLOAD_BATCH_SIZE_XETUPLOAD_BATCH_SIZE_LFSr   globrI   rk   r   LargeUploadStatusrangestartprintcurrent_reporttimesleep_print_overwriteis_doneloggingrR   )rt   ru   rv   rw   rm   rn   ro   rp   rq   rr   rs   nb_coresrepo_urlis_xet_enabledupload_batch_sizefiltered_paths_listr*   rT   threadsthreadlast_report_tsr   s   `````                @r5   upload_large_folder_internalr      s   & I
 
 	
 
""JjJJKKK#{##..0088::K OMKMMMNNN	OS	)	) ,*+..O<>>&Q(Q,** w)W_cddH
KK+++,,,G 	 	MM	  
 

   2@Z--EZ .iiiik>N>Nv>V>Viii%'  
 cbbbNabbbJ
KKDZDDDEEE J'''
KK$%%%   *+KLLL  E u&788F        {##  G     0fv,,...///Y[[N
19;;'+=== : !6!6!8!8999!Y[[N>> 	L5666   
KK%%''(((L&'''''r4   c                       e Zd Z ej                    Z ej                    Z ej                    Z ej                    Z ej                    Z	dS )	WorkerJobN)
__name__
__module____qualname__enumautoSHA256GET_UPLOAD_MODEPREUPLOAD_LFSCOMMITWAITr3   r4   r5   r   r     sO        TY[[FdikkODIKKMTY[[F49;;DDDr4   r   c                   l    e Zd ZdZddee         defdZdefdZde	d	ed
e
ddfdZdefdZde	fdZdS )r   zBContains information, queues and tasks for a large upload process.r   rT   r   c                 J   || _         t          j                    | _        t          j                    | _        t          j                    | _        t          j                    | _        t                      | _        d| _	        d| _
        d| _        || _        d| _        d| _        d | _        t!          j                    | _        d| _        t                      | _        | j         D ]}|\  }}|j        | j                            |           )|j        | j                            |           K|j        dk    r"|j        s| j                            |           x|j        s| j                            |           t4                              d|j         d           d S )Nr   r   lfszSkipping file z! (already uploaded and committed))rT   queueQueuequeue_sha256queue_get_upload_modequeue_preupload_lfsqueue_commitr   locknb_workers_sha256nb_workers_get_upload_modenb_workers_preupload_lfsr   nb_workers_commitnb_workers_waitinglast_commit_attemptr   now_started_at
_chunk_idx_chunk_locksha256putupload_modeis_uploadedis_committedrG   debugrM   )selfrT   r   itemr]   metadatas         r5   __init__zLargeUploadStatus.__init__%  s   
7<{}}@E">Ckmm 7<{}}FF	&'/0'-.%&7&''(48 #<>> !% J 	e 	eD"OE8&!%%d++++%-*..t4444%..x7K.(,,T2222* e!%%d++++ce.@cccdddd	e 	er4   r+   c                 h    | j         5  t          | j                 cd d d            S # 1 swxY w Y   d S r~   )r   r(   r   r   s    r5   target_chunkzLargeUploadStatus.target_chunkG  sy     	6 	6$T_5	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s   '++successnb_itemsdurationNc           
         | j         5  |s/t                              d| d           | xj        dz  c_        nJ|t          | j                 k    r4|dk     r.t                              d| d           | xj        dz  c_        t          dt          | j        t          t                    dz
                      | _        d d d            d S # 1 swxY w Y   d S )NzFailed to commit z9 files at once. Will retry with less files in next batch.r   (   zSuccessfully committed z. at once. Increasing the limit for next batch.r   )	r   rG   rK   r   r(   rH   r   minrI   )r   r   r   r   s       r5   update_chunkzLargeUploadStatus.update_chunkK  s0    	W 	W %v8vvvwww1$.t???HrMMnhnnnooo1$!!S#>O:P:PST:T%U%UVVDO	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	Ws   B9CCCc                    d}d}d}d}d}d}d}d}d}	d}
d}| j         5  | j        D ]\  }}|j        r|
dz  }
|	|j        z  }	|dz  }|j        |dz  }||j        z  }|j        dk    r|dz  }|j        |dz  }|j        r|dz  }||j        z  }|j        r|dz  }||j        z  }t          |	          }t          j
                    }|                    d          }|| j        z
  }t          |                              d          d         }d}|d| d	| d
z  }|dz  }|dz  }|d| d| d	t          |           d| d	z  }|d| d| d	t          |           d| d	z  }|dk    r	|d| dz  }|d| d| d	t          |           d| d	z  }|d|
 dz  }|dz  }|d| j         dz  }|d| j         dz  }|d| j         dz  }|d| j         dz  }|d| j         dz  }|dz  }|cddd           S # 1 swxY w Y   dS )z<Generate a report of the current status of the large upload.r   r   Nr   z%Y-%m-%d %H:%M:%Sr7   z
---------- z (z) z----------
z	Files:   zhashed r9   z) | zpre-uploaded: )z (+z unsure)z | committed: z | ignored: 
z	Workers: z	hashing: z | zget upload mode: zpre-uploading: zcommitting: z	waiting: z3---------------------------------------------------)r   rT   should_ignorerA   r   r   r   r   r   r   r   strftimer   rO   splitr   r   r   r   r   )r   	nb_hashedsize_hashednb_preuploadednb_lfsnb_lfs_unsuresize_preuploadednb_committedsize_committed
total_sizeignored_filestotal_filesr   r   total_size_strr   now_strelapsedelapsed_strmessages                       r5   r   z LargeUploadStatus.current_reportV  ss   	
Y /	 /	#z 4 48) !Q&Mhm+
q ?.NI8=0K'500aKF'/!Q&M' 6"a'N$5$( 4 A%L"hm3N)*55N,..Cll#677GD,,Gg,,,,S11!4K%G5755k5555G&G{"Glll[llL<U<UllXfllllGuuuuu<P`CaCauudruuuuGq  88888vvv{vvlSaFbFbvvesvvvvG7m7777G{"G>4#9>>>>GO4+JOOOOGK)FKKKKGAd&<AAAAG>4#:>>>>GxG_/	 /	 /	 /	 /	 /	 /	 /	 /	 /	 /	 /	 /	 /	 /	 /	 /	 /	s   GG::G>G>c                     | j         5  t          d | j        D                       cd d d            S # 1 swxY w Y   d S )Nc              3   8   K   | ]\  }}|j         p|j        V  d S r~   r   r   r?   r   r   s      r5   rB   z,LargeUploadStatus.is_done.<locals>.<genexpr>  s1      ee;1hx,F0Feeeeeer4   )r   allrT   r   s    r5   r   zLargeUploadStatus.is_done  s    Y 	f 	feeZ^Zdeeeee	f 	f 	f 	f 	f 	f 	f 	f 	f 	f 	f 	f 	f 	f 	f 	f 	f 	fs   377)r   )r   r   r   __doc__r	   
JOB_ITEM_Tintr   r   boolfloatr   rO   r   r   r3   r4   r5   r   r   "  s        LL e  ed:.  e3  e  e  e  eD6c 6 6 6 6	WD 	WC 	W5 	WT 	W 	W 	W 	W= = = = =~f f f f f f fr4   r   r   c                 	   	 d}t          |           }|dS |\  }}|t          j        k    r|d         }	 t          |           | j                            |           nk# t          $ r  t          $ rT}	t          	                    d|	            t          j                     | j                            |           Y d}	~	nd}	~	ww xY w| j        5  | xj        dz  c_        ddd           n# 1 swxY w Y   n|t          j        k    r	 t!          |||||           nQ# t          $ r  t          $ r:}	t          	                    d|	            t          j                     Y d}	~	nd}	~	ww xY w|D ]u}|\  }
}|j        r|j        dk    r| j                            |           5|j        d	k    r| j                            |           [| j                            |           v| j        5  | xj        dz  c_        ddd           n# 1 swxY w Y   nn|t          j        k    r	 t/          |||||           |D ]}| j                            |           np# t          $ r  t          $ rY}	t          	                    d
|	            t          j                     |D ]}| j                            |           Y d}	~	nd}	~	ww xY w| j        5  | xj        dz  c_        ddd           n# 1 swxY w Y   n|t          j        k    rt5          j                    }d}	 t7          |||||           nr# t          $ r  t          $ r[}	t          	                    d|	            t          j                     |D ]}| j                            |           d}Y d}	~	nd}	~	ww xY wt5          j                    |z
  }|                     |t;          |          |           | j        5  t5          j                    | _        | xj        dz  c_        ddd           n# 1 swxY w Y   nX|t          j         k    rHt5          j!        tD                     | j        5  | xj#        dz  c_#        ddd           n# 1 swxY w Y   )a  
    Main process for a worker. The worker will perform tasks based on the priority list until all files are uploaded
    and committed. If no tasks are available, the worker will wait for 10 seconds before checking again.

    If a task fails for any reason, the item(s) are put back in the queue for another worker to pick up.

    Read `upload_large_folder` docstring for more information on how tasks are prioritized.
    TNr   zFailed to compute sha256: r   )rt   ru   rw   rm   zFailed to get upload mode: r   regularzFailed to preupload LFS: zFailed to commit: F)$_determine_next_jobr   r   _compute_sha256r   r   KeyboardInterrupt	ExceptionrG   error	traceback
format_excr   r   r   r   _get_upload_moder   r   r   r   r   r   _preupload_lfsr   r   r   _commitr   rI   r   r   r   r   WAITING_TIME_IF_NO_TASKSr   )r   rt   ru   rw   rm   next_jobjobrT   r   er   r   start_tsr   r   s                  r5   r   r     s   [/AE 'v..F
U )"""8D.%%%,006666$    . . .=!==>>>$&&&#''--------.
  . .((A-((. . . . . . . . . . . . . . . I---' CI`hiiiii$    ' ' '>1>>???$&&&&&&&&'  	; 	;"8) '500.2248888)Y66'++D1111044T:::: 7 711Q6117 7 7 7 7 7 7 7 7 7 7 7 7 7 7 I+++
9u#w)^fgggg! 2 2D'++D11112$    9 9 9<<<===$&&&! 9 9D.22488889 9 9 9 99  5 5//14//5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 I$$$y{{HG	 39W_`````$         5!55666$&&&! 2 2D'++D1111  y{{X-HUX>>> . .-1Y[[*((A-((. . . . . . . . . . . . . . . IN""J/000 / /))Q.))/ / / / / / / / / / / / / / /u[/s   )A C3A
CCC..C25C2D" "E060E++E02HHH-3I! !K5AK		KK55K9<K9)L> >N-AN((N-1)P&&P*-P*"Q??RRc                 z   | j         5  | j        dk    r| j                                        dk    r| j        t          j                    | j        z
  dk    ri| xj        dz  c_        t                              d           t          j	        t          | j        |                                           fcd d d            S | j        dk    r| j                                        dk    ri| xj        dz  c_        t                              d           t          j	        t          | j        |                                           fcd d d            S | j                                        t          k    re| xj        dz  c_        t                              dt           d           t          j        t          | j        t                    fcd d d            S | j                                        | j        k    rg| j        dk    r\| xj        dz  c_        t                              d	           t          j        t          | j        | j                  fcd d d            S | j                                        dk    ra| j        dk    rV| xj        dz  c_        t                              d
           t          j        t/          | j                  fcd d d            S | j                                        dk    rg| j        dk    r\| xj        dz  c_        t                              d           t          j        t          | j        t                    fcd d d            S | j                                        | j        k    rs| j        dk    st0          j        s\| xj        dz  c_        t                              d           t          j        t          | j        | j                  fcd d d            S | j                                        dk    rV| xj        dz  c_        t                              d           t          j        t/          | j                  fcd d d            S | j                                        dk    r\| xj        dz  c_        t                              d           t          j        t          | j        t                    fcd d d            S | j                                        dk    r\| xj        dz  c_        t                              d           t          j        t          | j        | j                  fcd d d            S | j        dk    r| j                                        dk    r| j        t          j                    | j        z
  dk    ri| xj        dz  c_        t                              d           t          j	        t          | j        |                                           fcd d d            S | j        dk    r| j                                        dk    r| j                                        dk    r| j                                        dk    r| j                                        dk    r| j        dk    r| j        dk    rt| j        dk    ri| xj        dz  c_        t                              d           t          j	        t          | j        |                                           fcd d d            S t5          d | j        D                       r(t                              d           	 d d d            d S | xj        dz  c_        t                              dt<           d           t          j        g fcd d d            S # 1 swxY w Y   d S )Nr   i,  r   z;Job: commit (more than 5 minutes since last commit attempt)   zJob: commit (>100 files ready)zJob: get upload mode (>z files ready)z5Job: preupload LFS (no other worker preuploading LFS)z.Job: sha256 (no other worker computing sha256)z:Job: get upload mode (no other worker getting upload mode)zJob: preupload LFSzJob: sha256zJob: get upload moderl   z-Job: commit (1 min since last commit attempt)zJob: commitc              3   8   K   | ]\  }}|j         p|j        V  d S r~   r   r   s      r5   rB   z&_determine_next_job.<locals>.<genexpr>i  s1      aa[Q&@(*@aaaaaar4   z.All files have been processed! Exiting worker.zNo task available, waiting... (zs)) r   r   r   qsizer   r   rG   r   r   r   _get_nr   r   MAX_NB_FILES_FETCH_UPLOAD_MODEr   r   r   r   r   r   r   r   r   _get_oner   HF_HUB_ENABLE_HF_TRANSFERr   rT   rH   r   r  r   )r   s    r5   r  r    sB	   	 i( i( $))#))++a//*6	f886AA$$)$$LLVWWW$fV-@&BUBUBWBW&X&XYi( i( i( i( i( i( i( i( %**v/B/H/H/J/Jc/Q/Q$$)$$LL9:::$fV-@&BUBUBWBW&X&XY!i( i( i( i( i( i( i( i(& )//115SSS--2--LL`3Q```aaa-vf6RTr/s/st-i( i( i( i( i( i( i( i(2 '--//63KKKPVPostPtPt++q0++LLPQQQ+VF4NPVPh-i-ij9i( i( i( i( i( i( i( i(>  &&((1,,1IQ1N1N$$)$$LLIJJJ$hv/B&C&CDEi( i( i( i( i( i( i( i(J )//11A55&:[_`:`:`--2--LLUVVV-vf6RTr/s/stQi( i( i( i( i( i( i( i(X '--//63KKK+q00	8[0++q0++LL-...+VF4NPVPh-i-ijci( i( i( i( i( i( i( i(h  &&((1,,$$)$$LL'''$hv/B&C&CDoi( i( i( i( i( i( i( i(t )//11A55--2--LL/000-vf6RTr/s/st{i( i( i( i( i( i( i( i(@ '--//!33++q0++LL-...+VF4NPVPh-i-ijGi( i( i( i( i( i( i( i(N $))#))++a//*6	f886AA$$)$$LLHIII$fV-@&BUBUBWBW&X&XY]i( i( i( i( i( i( i( i(f $))#))++a//#))++q00,224499*0022a77(A--1Q66/144$$)$$LL'''$fV-@&BUBUBWBW&X&XY}i( i( i( i( i( i( i( i(B aaTZT`aaaaa 	(KKHIIIGi( i( i( i( i( i( i( i(N %%*%%LLW;SWWWXXXNB'Si( i( i( i( i( i( i( i( i( i( i( i( i( i( i( i( i( i(sl   B+^0 B^0A:^0A<^0!A1^0A7^0#B^08A&^0+A,^0$A,^0B*^0C<^09^0#A ^00^47^4r   c                     | \  }}|j         X|j                            d          5 }t          |                                          |_         ddd           n# 1 swxY w Y   |                    |           dS )z1Compute sha256 of a file and save it in metadata.Nrb)r   rV   openr   hexsave)r   r]   r   fs       r5   r  r  y  s    OE8_!!$'' 	31)!nn0022HO	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3MM%s   'AA!ArT   c           
      <   d | D             }t          ||||                                t          |d          |j                   t	          | |          D ]C\  }}|\  }}	|j        |	_        |j        |	_        |j	        |	_
        |	                    |           DdS )zmGet upload mode for each file and update metadata.

    Also receive info if the file should be ignored.
    c                 ,    g | ]}t          |          S r3   _build_hacky_operationr?   r   s     r5   r   z$_get_upload_mode.<locals>.<listcomp>  !    @@@$'--@@@r4   rD   )safe)	additionsrw   ru   headersrm   endpointN)r   _build_hf_headersr   r-  zip_upload_moder   _should_ignorer   _remote_oid
remote_oidr"  )
rT   rt   ru   rw   rm   r+  r   additionr]   r   s
             r5   r  r    s    
 A@%@@@I%%''xb)))    eY//  hx'4!)!8&2e r4   c                     d | D             }|                     ||||           | D ]!\  }}d|_        |                    |           "dS )z(Preupload LFS files and update metadata.c                 ,    g | ]}t          |          S r3   r&  r(  s     r5   r   z"_preupload_lfs.<locals>.<listcomp>  r)  r4   )ru   rw   rm   r+  TN)preupload_lfs_filesr   r"  rT   rt   ru   rw   rm   r+  r]   r   s           r5   r  r    sz    @@%@@@I	     !  x#e r4   c                     d | D             }|                     ||||d           | D ]!\  }}d|_        |                    |           "dS )zCommit files to the repo.c                 ,    g | ]}t          |          S r3   r&  r(  s     r5   r   z_commit.<locals>.<listcomp>  r)  r4   z(Add files using upload-large-folder tool)ru   rw   rm   
operationscommit_messageTN)create_commitr   r"  r8  s           r5   r  r    s}    @@%@@@IA     !  x $e r4   c                       e Zd ZddZdS )HackyCommitOperationAddr+   Nc                 p    t          | j        t                    rt          | j                  | _        d S d S r~   )r   path_or_fileobjr   rO   r   s    r5   __post_init__z%HackyCommitOperationAdd.__post_init__  s:    d*D11 	=#&t';#<#<D   	= 	=r4   )r+   N)r   r   r   rB  r3   r4   r5   r?  r?    s(        = = = = = =r4   r?  c                    | \  }}t          |j        |j                  }|j                            d          5 }|                    d          d d         }d d d            n# 1 swxY w Y   |j        t          d          t          t          	                    |j                  |j
        |          |_        |j        |_        |j        |_        |j        |_        |S )N)rM   rA  r  i   z&sha256 must have been computed by now!)r   rA   sample)r?  rM   rV   r   peekr   r   r   bytesfromhexrA   upload_infor   r0  r   r1  r3  r2  )r   r]   r   	operationfilerD  s         r5   r'  r'    s   OE8'U5GY^YhiiiI			d	#	# &t3%& & & & & & & & & & & & & & &ABBB&emmHO.L.LS[S`iopppI%1I'5I$/Is   A%%A),A)r   zqueue.Queue[JOB_ITEM_T]c                 "     | j                     gS r~   get)r   s    r5   r  r    s    EIKK=r4   nc                 p      fdt          t            j                    |                    D             S )Nc                 .    g | ]} j                     S r3   rL  )r?   r   r   s     r5   r   z_get_n.<locals>.<listcomp>  s!    >>>AIEIKK>>>r4   )r   r   r  )r   rN  s   ` r5   r  r    s7    >>>>s;5;==!'<'<!=!=>>>>r4   reportc                 J   | dz  } t          j                    j        t          fd|                                 D                       }t          |          D ]@}t          j                            d           t          j                            d           At          j                            |            t          j                            dt          |                                 d                   z
  z             t          j        
                                 dS )zPrint a report, overwriting the previous lines.

    Since tqdm in using `sys.stderr` to (re-)write progress bars, we need to use `sys.stdout`
    to print the report.

    Note: works well only if no other process is writing to `sys.stdout`!
    r   c              3   B   K   | ]}t          |          z  d z   V  dS )r   N)rI   )r?   lineterminal_widths     r5   rB   z#_print_overwrite.<locals>.<genexpr>  s3      SSt3t99.2SSSSSSr4   z[Kz[Fr   r8   N)shutilget_terminal_sizecolumnssum
splitlinesr   sysstdoutwriterI   flush)rQ  nb_linesr   rU  s      @r5   r   r     s     dNF-//7N SSSSv?P?P?R?RSSSSSH 8__ # #
$$$
"""" JVJSNS1B1B1D1DR1H-I-IIJKKKJr4   )Qr   r   r   r   rV  r[  r   r   r  r   pathlibr   r   typingr   r   r   r	   r
   r   r   urllib.parser   rD   r   _commit_apir   r   r   _local_folderr   r   r   r   r   r   utilsr   r   r   utils._cache_managerr   utils._runtimer   	utils.shar   hf_apir   	getLoggerr   rG   r  r  r(   r  __annotations__r   r   rJ   rU   rY   r[   rk   rO   r  r   Enumr   r  r   r   r  r  r  r  r  r?  r'  r  r  r   r3   r4   r5   <module>rm     s     				   



                            I I I I I I I I I I I I I I I I I I             L L L L L L L L L L v v v v v v v v v v v v 3 3 3 3 3 3 3 3 E E E E E E E E E E . . . . . . , , , , , , " " " " " "  		8	$	$ !$ OOO 49 O O O       ]/-A(B ]/t ]/ ]/ ]/ ]/L #"6:7;!% t( t( t(	t(t( sDy!t(
 t( smt( d^t( U49c>23t( eDIsN34t( #t( t( t( t( t( t(x    	    ')@@A
uf uf uf uf uf uf uf ufpj/j/	j/ j/ 	j/
 j/ j/ j/ j/Zj( 1 j(huYPTU_P`E`?a6b j( j( j( j(d*     D, 7 S UX dg lp    ,$z*  3 SV be jn    4
# ' C C [^ cg    (= = = = =0 = = = 0G    &- $z2B    ?+ ? ?Z8H ? ? ? ?S T      r4   