
    ;3hr^                     `   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 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) erddl*m+Z+  ejX                  e-      Z.dZ/dZ0g dZ1ee2   e3d<   ddddddddddde4dee4ef   de4dee4   dee5   deeee4   e4f      deeee4   e4f      d ee2   d!e5d"e2fd#Z6 G d$ d%e jn                        Z8eeef   Z9 G d& d'      Z:d(e:ddde4de4de4f
d)Z;d(e:d*eee8ee9   f      fd+Z<d,e9d*dfd-Z=d.ee9   ddde4de4de4d*dfd/Z>d,e9ddde4de4de4d*dfd0Z?d.ee9   ddde4de4de4d*dfd1Z@ G d2 d3e      ZAd,e9d*eAfd4ZBd5d6d*ee9   fd7ZCd5d6d8e2d*ee9   fd9ZDd:e4d*dfd;ZEy)<    N)datetime)Path)Lock)TYPE_CHECKING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)sha_fileobj)HfApi
   d   )
   2   K   r   }         i  iX  i  COMMIT_SIZE_SCALET<   )revisionprivateallow_patternsignore_patternsnum_workersprint_reportprint_report_everyapir   repo_idfolder_path	repo_typer'   r(   r)   r*   r+   r,   r-   c                   |t        d      |t        vrt        dt               |t        }t              j	                         j                         j                         st        d d      |g }nt        |t              r|g}|t        z  }|'t        j                         xs d}t        |dz
  d      }| j                  |||d	      }t        j                  d
|        |j                   }t#        fdj%                  d      D        ||      }|D cg c]  }t'        |       }}t        j                  dt)        |       d       t+        |d      D cg c]  }|t-        |j.                        f }}t1        |      }t3        |      D cg c]#  }t5        j6                  t8        || |||d      % }}|D ]  }|j;                           |	rt=        d|j?                         z          tA        j@                         }	 tA        jB                  d       tA        j@                         |z
  |
k\  r/|	rtE        |j?                                tA        j@                         }|jG                         rtI        j                  d       n|D ]  }|jK                           t        j                  |j?                                tI        j                  d       yc c}w c c}w c c}w )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)r/   r1   r(   exist_okzRepo created: c              3   ~   K   | ]4  }|j                         s|j                        j                          6 y wN)is_filerelative_toas_posix).0pathr0   s     d/var/www/html/audio-gradio/venv/lib/python3.12/site-packages/huggingface_hub/_upload_large_folder.py	<genexpr>z/upload_large_folder_internal.<locals>.<genexpr>c   s1     idZ^ZfZfZh		+	&	/	/	1is   =$=z**/*)r)   r*   zFound z candidate files to uploadzRecovering from metadata files)desc)statusr.   r/   r1   r'   )targetkwargsz

zIs done: exiting main loopzUpload is complete!)&
ValueErrorr   r   r   
expanduserresolveis_dir
isinstancestrr   os	cpu_countmaxcreate_repologgerinfor/   r   globr   lenr   r   path_in_repoLargeUploadStatusrange	threadingThread_worker_jobstartprintcurrent_reporttimesleep_print_overwriteis_doneloggingjoin)r.   r/   r0   r1   r'   r(   r)   r*   r+   r,   r-   nb_coresrepo_urlfiltered_paths_listrelpath
paths_listpathsitemsr?   _threadsthreadlast_report_tss     `                    r<   upload_large_folder_internalrj   1   s   & I
 	
 
"=j\JKK#{#..088:K+K=8LMNN	OS	)*+..O<<>&Q(Q,* w)W_cdH
KK.
+,G .ik>N>Nv>Vi%'
 Obb7(g>bJb
KK&Z))CDE
 *+KL 
$[%2D2DEFE  u%F {#  	 "&$		
G    fv,,../YY[N


199;'+== !6!6!89!YY[N>>LL56    KK%%'(LL&'] cs   $K,*K1#(K6c                       e Zd Z ej                         Z ej                         Z ej                         Z ej                         Z ej                         Z	y)	WorkerJobN)
__name__
__module____qualname__enumautoSHA256GET_UPLOAD_MODEPREUPLOAD_LFSCOMMITWAIT     r<   rl   rl      sC    TYY[FdiikODIIKMTYY[F499;Drx   rl   c                   ^    e Zd ZdZde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y	)rQ   zBContains information, queues and tasks for a large upload process.re   c                 z   || _         t        j                         | _        t        j                         | _        t        j                         | _        t        j                         | _        t               | _        d| _	        d| _
        d| _        d| _        d| _        d | _        t        j                          | _        d| _        t               | _        | j                   D ]  }|\  }}|j(                  | j                  j+                  |       0|j,                  | j                  j+                  |       X|j,                  dk(  r(|j.                  s| j
                  j+                  |       |j0                  s| j                  j+                  |       t2        j5                  d|j6                   d        y )Nr   r   lfszSkipping file z! (already uploaded and committed))re   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_lfsnb_workers_commitnb_workers_waitinglast_commit_attemptr   now_started_at
_chunk_idx_chunk_locksha256putupload_modeis_uploadedis_committedrL   debugrP   )selfre   itemrd   metadatas        r<   __init__zLargeUploadStatus.__init__   s[   
7<{{}@E">Ckkm 7<{{}F	&'/0'-.%&''(48 #<<> !% JJ 	eD"OE8&!!%%d+%%-**..t4%%.x7K7K((,,T2**!!%%d+~e.@.@-AAbcd	erx   returnc                 l    | j                   5  t        | j                     cd d d        S # 1 sw Y   y xY wr6   )r   r%   r   r   s    r<   target_chunkzLargeUploadStatus.target_chunk   s,     	6$T__5	6 	6 	6s   *3successnb_itemsdurationNc           
         | j                   5  |s/t        j                  d| d       | xj                  dz  c_        nI|t        | j                     k\  r3|dk  r.t        j                  d| d       | xj                  dz  c_        t        dt        | j                  t        t              dz
              | _        d d d        y # 1 sw Y   y xY w)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   rL   warningr   r%   rM   rJ   minrO   )r   r   r   r   s       r<   update_chunkzLargeUploadStatus.update_chunk   s     	W!28*<uvw1$.t??HrM5hZ?mno1$!!S#>O:PST:T%UVDO	W 	W 	Ws   B0C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                  s|dz  }||j                  z  } t        |	      }t        j                         }|j                  d      }|| j                  z
  }t        |      j                  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kD  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 Y   yxY w)z<Generate a report of the current status of the large upload.r   r   Nr{   z%Y-%m-%d %H:%M:%S.z
---------- z (z) z----------
z	Files:   zhashed /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   re   should_ignoresizer   r   r   r   r   r   r   strftimer   rG   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_filesrf   r   total_size_strr   now_strelapsedelapsed_strmessages                       r<   rX   z LargeUploadStatus.current_report   s   	
YY /	#zz 48))!Q&Mhmm+
q ??.NI8==0K''50aKF''/!Q&M''"a'N$5$(( A%L"hmm3N%4& **5N,,.Cll#67GD,,,Gg,,,S1!4K%G7)2k]"55G&G{"G1[ML<U;VVWXfWggkllG'7q<P`CaBbbcdrcsstuuGq Sx88~Q{m2lSaFbEccdesdttuvvGm_B77G{"G4#9#9":#>>G*4+J+J*K3OOG)F)F(GsKKGd&<&<%=SAAG4#:#:";2>>GxG_/	 /	 /	s   B*H4EH44H=c                 ~    | j                   5  t        d | j                  D              cd d d        S # 1 sw Y   y xY w)Nc              3   V   K   | ]!  \  }}|j                   xs |j                   # y wr6   r   r   r:   rf   r   s      r<   r=   z,LargeUploadStatus.is_done.<locals>.<genexpr>  s(     e;1hx,,F0F0FFe   '))r   allre   r   s    r<   r\   zLargeUploadStatus.is_done  s7    YY 	feZ^ZdZdee	f 	f 	fs   3<)rm   rn   ro   __doc__r   
JOB_ITEM_Tr   intr   boolfloatr   rG   rX   r\   rw   rx   r<   rQ   rQ      sf    Led:. eB6c 6	WD 	WC 	W5 	WT 	W= =~f frx   rQ   r?   c                 <	   	 d}t        |       }|y|\  }}|t        j                  k(  rX|d   }	 t        |       | j                  j                  |       | j                  5  | xj                  dz  c_        ddd       nQ|t        j                  k(  r	 t!        |||||       |D ]  }|\  }
}|j"                  r|j$                  dk(  r| j&                  j                  |       @|j$                  d	k(  r| j(                  j                  |       k| j                  j                  |        | j                  5  | xj*                  dz  c_        ddd       nw|t        j,                  k(  r]|d   }	 t/        |||||       | j(                  j                  |       | j                  5  | xj0                  dz  c_        ddd       n|t        j2                  k(  rt5        j4                         }d}	 t7        |||||       t5        j4                         |z
  }| j9                  |t;        |      |       | j                  5  t5        j4                         | _        | xj>                  dz  c_        ddd       nV|t        j@                  k(  rCt5        jB                  tD               | j                  5  | xjF                  dz  c_#        ddd       # t        $ r  t        $ rR}	t        j                  d|	        t        j                          | j                  j                  |       Y d}	~	d}	~	ww xY w# 1 sw Y   rxY w# t        $ r  t        $ r7}	t        j                  d|	        t        j                          Y d}	~	d}	~	ww xY w# 1 sw Y   xY w# t        $ r  t        $ rR}	t        j                  d
|	        t        j                          | j&                  j                  |       Y d}	~	_d}	~	ww xY w# 1 sw Y   >xY w# t        $ r  t        $ r[}	t        j                  d|	        t        j                          |D ]  }| j(                  j                  |        d}Y d}	~	vd}	~	ww xY w# 1 sw Y   xY w# 1 sw Y   xY w)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   )r.   r/   r1   r'   zFailed to get upload mode: r{   regularzFailed to preupload LFS: zFailed to commit: F)$_determine_next_jobrl   rr   _compute_sha256r   r   KeyboardInterrupt	ExceptionrL   error	traceback
format_excr~   r   r   rs   _get_upload_moder   r   r   r   r   rt   _preupload_lfsr   ru   rY   _commitr   rO   r   r   rv   rZ   WAITING_TIME_IF_NO_TASKSr   )r?   r.   r/   r1   r'   next_jobjobre   r   erf   r   start_tsr   r   s                  r<   rU   rU     s    AE 'v.
U )"""8D.%,,006  .((A-(. . I---' CI`hi  	;"8))''50..2248))Y6''++D10044T:	;  711Q617 7 I+++8D5tg]ef##''-  5//14/5 5 I$$$yy{HG	 39W_` yy{X-HUX> .-1YY[*((A-(. . INN"JJ/0 /))Q.)/s  %  .9!=>$$&##''--.
. . %  ':1#>?$$&&'(7 7 %  58<=$$&**..t445
5 5 %   1!56$$&! 2D''++D12 . ./ /s   &K "L<M <N5+N  ,P6P /R5RL9'AL44L9<MN,NNN P2AO??PPR&AQ<<RRRr   c                    | j                   5  | j                  dk(  r| j                  j                         dkD  r| j                  t        j
                         | j                  z
  dkD  rg| xj                  dz  c_        t        j                  d       t        j                  t        | j                  | j                               fcd d d        S | j                  dk(  r| j                  j                         dk\  rg| xj                  dz  c_        t        j                  d       t        j                  t        | j                  | j                               fcd d d        S | j                  j                         t        k\  re| xj                  dz  c_        t        j                  dt         d       t        j                  t        | j                  t              fcd d d        S | j                   j                         dkD  rg| j"                  dk(  rX| xj"                  dz  c_        t        j                  d	       t        j$                  t'        | j                         fcd d d        S | j(                  j                         dkD  rg| j*                  dk(  rX| xj*                  dz  c_        t        j                  d
       t        j,                  t'        | j(                        fcd d d        S | j                  j                         dkD  rl| j                  dk(  r]| xj                  dz  c_        t        j                  d       t        j                  t        | j                  t              fcd d d        S | j                   j                         dkD  rw| j"                  dk(  st.        j0                  sX| xj"                  dz  c_        t        j                  d       t        j$                  t'        | j                         fcd d d        S | j(                  j                         dkD  rX| xj*                  dz  c_        t        j                  d       t        j,                  t'        | j(                        fcd d d        S | j                  j                         dkD  r]| xj                  dz  c_        t        j                  d       t        j                  t        | j                  t              fcd d d        S | j                  dk(  r| j                  j                         dkD  r| j                  t        j
                         | j                  z
  dkD  rg| xj                  dz  c_        t        j                  d       t        j                  t        | j                  | j                               fcd d d        S | j                  dk(  r| j                  j                         dkD  r| j(                  j                         dk(  r| j                  j                         dk(  r| j                   j                         dk(  r| j*                  dk(  r| j                  dk(  rv| j"                  dk(  rg| xj                  dz  c_        t        j                  d       t        j                  t        | j                  | j                               fcd d d        S t3        d | j4                  D              rt        j7                  d       	 d d d        y | xj8                  dz  c_        t        j                  dt:         d       t        j<                  g fcd d d        S # 1 sw Y   y xY w)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 moder&   z-Job: commit (1 min since last commit attempt)zJob: commitc              3   V   K   | ]!  \  }}|j                   xs |j                   # y wr6   r   r   s      r<   r=   z&_determine_next_job.<locals>.<genexpr>  s(     a[Q&&@(*@*@@ar   z.All files have been processed! Exiting worker.zNo task available, waiting... (zs))r   r   r   qsizer   rY   rL   r   rl   ru   _get_nr   r   MAX_NB_FILES_FETCH_UPLOAD_MODEr   rs   r   r   rt   _get_oner~   r   rr   r   HF_HUB_ENABLE_HF_TRANSFERr   re   rM   r   r   rv   )r?   s    r<   r   r     s   	 c( $$)##))+a/**6		f8886A$$)$LLVW$$fV-@-@&BUBUBW&XYc( c( %%*v/B/B/H/H/Jc/Q$$)$LL9:$$fV-@-@&BUBUBW&XY!c( c(& ))//15SS--2-LL23Q2RR_`a--vf6R6RTr/st-c( c(2 ''--/!38W8W[\8\++q0+LLPQ++Xf6P6P-QR9c( c(>   &&(1,1I1IQ1N$$)$LLIJ$$hv/B/B&CDEc( c(J ))//1A5&:[:[_`:`--2-LLUV--vf6R6RTr/stQc( c(X ''--/!3++q0	8[8[++q0+LL-.++Xf6P6P-QRcc( c(h   &&(1,$$)$LL'$$hv/B/B&CDoc( c(t ))//1A5--2-LL/0--vf6R6RTr/st{c( c(B $$)##))+a/**6		f8886A$$)$LLHI$$fV-@-@&BUBUBW&XYQc( c(Z $$)##))+a/##))+q0,,2249**002a7((A-11Q6//14$$)$LL'$$fV-@-@&BUBUBW&XYqc( c(v aTZT`T`aaKKHI{c( c(B %%*%LL:;S:TTVWXNNB'Gc( c( c(s_   B:]!B	]!$A<]!*A:]!.A:]!2A?]!;B
]!A+]!A0]!>B9]!D]!2]!A]!!]*r   c                     | \  }}|j                   B|j                  j                  d      5 }t        |      j	                         |_         ddd       |j                  |       y# 1 sw Y   xY w)z1Compute sha256 of a file and save it in metadata.Nrb)r   	file_pathopenr   hexsave)r   rd   r   fs       r<   r   r     s^    OE8__!!$' 	31)!n002HO	3MM%	3 	3s   A&&A/re   c           
      `   | D cg c]  }t        |       }}t        ||||j                         t        |d      |j                         t        | |      D ]N  \  }}|\  }}	|j                  |	_        |j                  |	_	        |j                  |	_        |	j                  |       P yc c}w )zmGet upload mode for each file and update metadata.

    Also receive info if the file should be ignored.
     )safe)	additionsr1   r/   headersr'   endpointN)_build_hacky_operationr   _build_hf_headersr   r   zip_upload_moder   _should_ignorer   _remote_oid
remote_oidr   )
re   r.   r/   r1   r'   r   r   additionrd   r   s
             r<   r   r      s    
 ;@@$'-@I@%%'xb) eY/ hx'44!)!8!8&22e As   B+c                     | \  }}t        |       }|j                  ||||g       d|_        |j                  |       y)z'Preupload LFS file and update metadata.)r/   r1   r'   r   TN)r   preupload_lfs_filesr   r   )r   r.   r/   r1   r'   rd   r   r   s           r<   r   r     sL    OE8%d+H*	    HMM%rx   c                     | D cg c]  }t        |       }}|j                  ||||d       | D ]  \  }}d|_        |j                  |        yc c}w )zCommit files to the repo.z(Add files using upload-large-folder tool)r/   r1   r'   
operationscommit_messageTN)r   create_commitr   r   )	re   r.   r/   r1   r'   r   r   rd   r   s	            r<   r   r   %  sl    :?@$'-@I@A   ! x $e As   Ac                       e Zd ZddZy)HackyCommitOperationAddNc                 n    t        | j                  t              rt        | j                        | _        y y r6   )rF   path_or_fileobjr   rG   r   s    r<   __post_init__z%HackyCommitOperationAdd.__post_init__:  s*    d**D1#&t';';#<D  2rx   )r   N)rm   rn   ro   r   rw   rx   r<   r   r   9  s    =rx   r   c                    | \  }}t        |j                  |j                        }|j                  j                  d      5 }|j	                  d      d d }d d d        |j
                  t        d      t        t        j                  |j
                        |j                        |_        |j                  |_        |j                  |_        |j                   |_        |S # 1 sw Y   xY w)N)rP   r   r   i   z&sha256 must have been computed by now!)r   r   sample)r   rP   r   r   peekr   rB   r   bytesfromhexr   upload_infor   r   r   r   r   r   )r   rd   r   	operationfiler  s         r<   r   r   ?  s    OE8'U5G5GY^YhYhiI			d	# &t3%&ABB&emmHOO.LS[S`S`iopI%11I'55I$//I& &s   C%%C.r|   zqueue.Queue[JOB_ITEM_T]c                 &     | j                          gS r6   )get)r|   s    r<   r   r   R  s    EIIK=rx   nc                     t        t         | j                         |            D cg c]  } | j                          c}S c c}w r6   )rR   r   r   r
  )r|   r  rf   s      r<   r   r   V  s2    !&s;5;;=!'<!=>AIEIIK>>>s   Areportc                 $   | dz  } t        j                         j                  t        fd| j	                         D              }t        |      D ]@  }t        j                  j                  d       t        j                  j                  d       B t        j                  j                  |        t        j                  j                  dt        | j	                         d         z
  z         t        j                  j                          y)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   @   K   | ]  }t        |      z  d z     yw)r   N)rO   )r:   lineterminal_widths     r<   r=   z#_print_overwrite.<locals>.<genexpr>g  s     St3t9.2Ss   z[Kz[Fr   N)shutilget_terminal_sizecolumnssum
splitlinesrR   sysstdoutwriterO   flush)r  nb_linesrf   r  s      @r<   r[   r[   Z  s     dNF--/77N Sv?P?P?RSSH 8_ #

$

"#
 JJVJJSNS1B1B1DR1H-IIJKJJrx   )Frp   r]   rH   r|   r  r  rS   rY   r   r   pathlibr   r   typingr   r   r   r	   r
   urllib.parser   r   r   _commit_apir   r   r   _local_folderr   r   r   r   r   r   utilsr   r   r   utils._cache_managerr   	utils.shar   hf_apir   	getLoggerrm   rL   r   r   r%   r   __annotations__rG   r   rj   Enumrl   r   rQ   rU   r   r   r   r   r   r   r   r   r   r[   rw   rx   r<   <module>r)     s     	   
       > >   L L v v 3 E E . " 			8	$ !$ O 49 O #"6:7;!% d(	d(d( sDy!d(
 d( smd( d^d( U49c>23d( eDIsN34d( #d( d( d(X		  ')@@A
tf tfni/i/	i/ i/ 	i/
 i/Xd( 1 d(huYPTU_P`E`?a6b d(X*  D, 7 S UX dg lp , ' C C [^ cg 4
# ' C C [^ cg (=0 = 0G &- $z2B ?+ ? ?Z8H ?S T rx   