
    hAc                     z   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) ddl*m+Z+ erddl,m-Z-  ej\                  e/      Z0dZ1dZ2g dZ3ee4   e5d<   dZ6dZ7ddddddddddde8dee8ef   de8dee8   dee9   d eeee8   e8f      d!eeee8   e8f      d"ee4   d#e9d$e4fd%Z: G d& d'e jv                        Z<eeef   Z= G d( d)      Z>d*e>ddde8de8de8f
d+Z?d*e>d,eee<ee=   f      fd-Z@d.e=d,dfd/ZAd0ee=   ddde8de8de8d,dfd1ZBd0ee=   ddde8de8de8d,dfd2ZCd0ee=   ddde8de8de8d,dfd3ZD G d4 d5e      ZEd.e=d,eEfd6ZFd7d8d,ee=   fd9ZGd7d8d:e4d,ee=   fd;ZHd<e8d,dfd=ZIy)>    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)is_xet_available)sha_fileobj)HfApi
   d   )
   2   K   r   }         i  iX  i  COMMIT_SIZE_SCALE   T<   )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                j   |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#               xr | j%                  |||d      j&                  }|rt(        nt*        }t-        fdj/                  d      D        ||      }|D cg c]  }t1        |       }}t        j                  dt3        |       d       t5        |d      D cg c]  }|t7        |j8                        f }}t;        ||      }t=        |      D cg c]#  }t?        j@                  tB        || |||d      % }}|D ]  }|jE                           |	rtG        d|jI                         z          tK        jJ                         }	 tK        jL                  d       tK        jJ                         |z
  |
k\  r/|	rtO        |jI                                tK        jJ                         }|jQ                         rtS        j                  d       n|D ]  }|jU                           t        j                  |jI                                tS        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)r1   r3   r*   exist_okzRepo created: 
xetEnabled)r1   r3   r)   expandc              3   ~   K   | ]4  }|j                         s|j                        j                          6 y wN)is_filerelative_toas_posix).0pathr2   s     `/var/www/Befach/backend/env/lib/python3.12/site-packages/huggingface_hub/_upload_large_folder.py	<genexpr>z/upload_large_folder_internal.<locals>.<genexpr>r   s1     idZ^ZfZfZh		+	&	/	/	1is   =$=z**/*)r+   r,   zFound z candidate files to uploadzRecovering from metadata files)desc)statusr0   r1   r3   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infor1   r   	repo_infoxet_enabledUPLOAD_BATCH_SIZE_XETUPLOAD_BATCH_SIZE_LFSr   globr   lenr   r   path_in_repoLargeUploadStatusrange	threadingThread_worker_jobstartprintcurrent_reporttimesleep_print_overwriteis_doneloggingjoin)r0   r1   r2   r3   r)   r*   r+   r,   r-   r.   r/   nb_coresrepo_urlis_xet_enabledupload_batch_sizefiltered_paths_listrelpath
paths_listpathsitemsrC   _threadsthreadlast_report_tss     `                      r@   upload_large_folder_internalrt   5   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 	 	MM	  

 +  2@-EZ .ik>N>Nv>Vi%'
 Obb7(g>bJb
KK&Z))CDE
 *+KL 
$[%2D2DEFE  u&78F {#  	 "&$		
G    fv,,../YY[N


199;'+== !6!6!89!YY[N>>LL56    KK%%'(LL&'] cs   L&#L+(L0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@   rv   rv      sC    TYY[FdiikODIIKMTYY[F499;Dr   rv   c                   d    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y
)rY   zBContains information, queues and tasks for a large upload process.ro   rj   c                    || _         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(|j0                  s| j
                  j-                  |       |j2                  s| j                  j-                  |       t4        j7                  d|j8                   d        y )Nr   r   lfszSkipping file z! (already uploaded and committed))ro   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_lfsrj   nb_workers_commitnb_workers_waitinglast_commit_attemptr   now_started_at
_chunk_idx_chunk_locksha256putupload_modeis_uploadedis_committedrP   debugrX   )selfro   rj   itemrn   metadatas         r@   __init__zLargeUploadStatus.__init__   s\   
7<{{}@E">Ckkm 7<{{}F	&'/0'-.%&7&''(48 #<<> !% JJD"OE8&!!%%d+%%-**..t4%%.x7K7K((,,T2**!!%%d+~e.@.@-AAbcd r   returnc                 l    | j                   5  t        | j                     cd d d        S # 1 sw Y   y xY wr:   )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   rP   warningr   r&   rQ   rN   minrW   )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   ro   should_ignoresizer   r   r   r   r   r   r   strftimer   rK   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_filesrp   r   total_size_strr   now_strelapsedelapsed_strmessages                       r@   r`   z LargeUploadStatus.current_report   s   	
YY /	#zz8))!Q&Mhmm+
q ??.NI8==0K''50aKF''/!Q&M''"a'N$5$(( A%L"hmm3N%  *& **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r:   r   r   r>   rp   r   s      r@   rA   z,LargeUploadStatus.is_done.<locals>.<genexpr>,  s(     e;1hx,,F0F0FFe   '))r   allro   r   s    r@   rd   zLargeUploadStatus.is_done*  s7    YY 	feZ^ZdZdee	f 	f 	fs   3<)r   )rw   rx   ry   __doc__r   
JOB_ITEM_Tintr   r   boolfloatr   rK   r`   rd   r   r   r@   rY   rY      sn    L ed:.  e3  eD6c 6	WD 	WC 	W5 	WT 	W= =~f fr   rY   rC   c                 P	   	 d}t        |       }|y|\  }}|t        j                  k(  rX|d   }	 t        |       | j                  j                  |       | j                  5  | xj                  dz  c_        ddd       nT|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       nz|t        j,                  k(  r`	 t/        |||||       |D ]  }| 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        $ rY}	t        j                  d
|	        t        j                          |D ]  }| j&                  j                  |        Y d}	~	fd}	~	ww xY w# 1 sw Y   ExY w# t        $ r  t        $ r[}	t        j                  d|	        t        j                          |D ]  }| j(                  j                  |        d}Y d}	~	}d}	~	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   )r0   r1   r3   r)   zFailed to get upload mode: r   regularzFailed to preupload LFS: zFailed to commit: F)$_determine_next_jobrv   r|   _compute_sha256r   r   KeyboardInterrupt	ExceptionrP   error	traceback
format_excr   r   r   r}   _get_upload_moder   r   r   r   r   r~   _preupload_lfsr   r   ra   _commitr   rW   r   r   r   rb   WAITING_TIME_IF_NO_TASKSr   )rC   r0   r1   r3   r)   next_jobjobro   r   erp   r   start_tsr   r   s                  r@   r]   r]   /  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+++
9u#w)^fg!D''++D1 "  5//14/5 5 I$$$yy{HG	 39W_` yy{X-HUX> .-1YY[*((A-(. . INN"JJ/0 /))Q.)/u  %  .9!=>$$&##''--.
. . %  ':1#>?$$&&'(7 7 %  98<=$$&!D..2248 "95 5 %   1!56$$&!D''++D1 " . ./ /s   &K "L?M <N02N# /P9P /R8RL<*AL77L<?MN,NNN #P5AP		PPR0AR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                         | j"                  k\  rr| j$                  dk(  rc| xj$                  dz  c_        t        j                  d	       t        j&                  t        | j                   | 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                         | j"                  k\  r| j$                  dk(  st0        j2                  sc| xj$                  dz  c_        t        j                  d       t        j&                  t        | j                   | 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                   j                         dkD  rc| 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                  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 t5        d | j6                  D              rt        j9                  d       	 d d d        y | xj:                  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r:   r   r   s      r@   rA   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   ra   rP   r   rv   r   _get_nr   r   MAX_NB_FILES_FETCH_UPLOAD_MODEr   r}   r   rj   r   r~   r   r   r|   _get_oner   HF_HUB_ENABLE_HF_TRANSFERr   ro   rQ   r   r   r   )rC   s    r@   r   r     s   	 i( $$)##))+a/**6		f8886A$$)$LLVW$$fV-@-@&BUBUBW&XYi( i( %%*v/B/B/H/H/Jc/Q$$)$LL9:$$fV-@-@&BUBUBW&XY!i( i(& ))//15SS--2-LL23Q2RR_`a--vf6R6RTr/st-i( i(2 ''--/63K3KKPVPoPostPt++q0+LLPQ++VF4N4NPVPhPh-ij9i( i(>   &&(1,1I1IQ1N$$)$LLIJ$$hv/B/B&CDEi( i(J ))//1A5&:[:[_`:`--2-LLUV--vf6R6RTr/stQi( i(X ''--/63K3KK++q0	8[8[++q0+LL-.++VF4N4NPVPhPh-ijci( i(h   &&(1,$$)$LL'$$hv/B/B&CDoi( i(t ))//1A5--2-LL/0--vf6R6RTr/st{i( i(@ ''--/!3++q0+LL-.++VF4N4NPVPhPh-ijGi( i(N $$)##))+a/**6		f8886A$$)$LLHI$$fV-@-@&BUBUBW&XY]i( i(f $$)##))+a/##))+q0,,2249**002a7((A-11Q6//14$$)$LL'$$fV-@-@&BUBUBW&XY}i( i(B aTZT`T`aaKKHIGi( i(N %%*%LL:;S:TTVWXNNB'Si( i( i(sf   B:`B	`$A<`*B`A:`A?`B`9A+`.A0`(A6`(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   rn   r   fs       r@   r   r     s^    OE8__!!$' 	31)!n002HO	3MM%	3 	3s   A&&A/ro   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)	additionsr3   r1   headersr)   endpointN)_build_hacky_operationr   _build_hf_headersr   r   zip_upload_moder   _should_ignorer   _remote_oid
remote_oidr   )
ro   r0   r1   r3   r)   r   r   additionrn   r   s
             r@   r   r     s    
 ;@@$'-@I@%%'xb) eY/hx'44!)!8!8&22e 0 As   B+c                     | D cg c]  }t        |       }}|j                  ||||       | D ]  \  }}d|_        |j                  |        yc c}w )z(Preupload LFS files and update metadata.)r1   r3   r)   r   TN)r   preupload_lfs_filesr   r   	ro   r0   r1   r3   r)   r   r   rn   r   s	            r@   r   r   -  sd    :?@$'-@I@	   !x#e ! As   A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)r1   r3   r)   
operationscommit_messageTN)r   create_commitr   r   r  s	            r@   r   r   <  sg    :?@$'-@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 r:   )rJ   path_or_fileobjr   rK   r   s    r@   __post_init__z%HackyCommitOperationAdd.__post_init__Q  s*    d**D1#&t';';#<D  2r   )r   N)rw   rx   ry   r  r   r   r@   r  r  P  s    =r   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)rX   r
  r   i   z&sha256 must have been computed by now!)r   r   sample)r  rX   r   r   peekr   rF   r   bytesfromhexr   upload_infor   r   r   r   r   r   )r   rn   r   	operationfiler  s         r@   r   r   V  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 r:   )get)r   s    r@   r   r   i  s    EIIK=r   nc                     t        t         | j                         |            D cg c]  } | j                          c}S c c}w r:   )rZ   r   r   r  )r   r  rp   s      r@   r   r   m  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)rW   )r>   lineterminal_widths     r@   rA   z#_print_overwrite.<locals>.<genexpr>~  s     St3t9.2Ss   z[Kz[Fr   N)shutilget_terminal_sizecolumnssum
splitlinesrZ   sysstdoutwriterW   flush)r  nb_linesrp   r  s      @r@   rc   rc   q  s     dNF--/77N Sv?P?P?RSSH 8_

$

" 
 JJVJJSNS1B1B1DR1H-IIJKJJr   )Jrz   re   rL   r   r  r#  r[   ra   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._runtimer   	utils.shar   hf_apir   	getLoggerrw   rP   r   r   r&   r   __annotations__rT   rU   rK   r   rt   Enumrv   r   rY   r]   r   r   r   r   r   r  r   r   r   rc   r   r   r@   <module>r5     s      	   
       > >   L L v v 3 E E . , " 			8	$ !$ O 49 O   #"6:7;!% o(	o(o( sDy!o(
 o( smo( d^o( U49c>23o( eDIsN34o( #o( o( o(n		  ')@@A
uf ufpj/j/	j/ j/ 	j/
 j/Zj( 1 j(huYPTU_P`E`?a6b j(d*  D, 7 S UX dg lp ,$z*  3 SV be jn 4
# ' C C [^ cg (=0 = 0G &- $z2B ?+ ? ?Z8H ?S T r   