
    O&hm`                     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) erddl*m+Z+  ejX                  e-      Z.dZ/dZ0dZ1g dZ2ee3   e4d<   ddddddddddde5dee5ef   de5dee5   dee6   deeee5   e5f      d eeee5   e5f      d!ee3   d"e6d#e3fd$Z7 G d% d&e jp                        Z9eeef   Z: G d' d(      Z;d)e;ddde5de5de5f
d*Z<d)e;d+eee9ee:   f      fd,Z=d-e:d+dfd.Z>d/ee:   ddde5de5de5d+dfd0Z?d-e:ddde5de5de5d+dfd1Z@d/ee:   ddde5de5de5d+dfd2ZA G d3 d4e      ZBd-e:d+eBfd5ZCd6d7d+ee:   fd8ZDd6d7d9e3d+ee:   fd:ZEd6d7d+ee:   fd;ZFd<e5d+dfd=ZGy)>    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
   K      )
   2   r   d   }         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)r0   r2   r)   exist_okzRepo created: c              3   ~   K   | ]4  }|j                         s|j                        j                          6 y wN)is_filerelative_toas_posix).0pathr1   s     e/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/huggingface_hub/_upload_large_folder.py	<genexpr>z/upload_large_folder_internal.<locals>.<genexpr>d   s1     idZ^ZfZfZh		+	&	/	/	1is   =$=z**/*)r*   r+   zFound z candidate files to uploadzRecovering from metadata files)desc)statusr/   r0   r2   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infor0   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/   r0   r1   r2   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_internalrk   2   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=   rm   rm      sC    TYY[FdiikODIIKMTYY[F499;Dry   rm   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	)rR   zBContains information, queues and tasks for a large upload process.rf   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))rf   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_committedrM   debugrQ   )selfrf   itemre   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ry   returnc                 l    | j                   5  t        | j                     cd d d        S # 1 sw Y   y xY wr7   )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   rM   warningr   r&   rN   rK   minrP   )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   rf   should_ignoresizer   r   r   r   r   r   r   strftimer   rH   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_filesrg   r   total_size_strr   now_strelapsedelapsed_strmessages                       r=   rY   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r7   r   r   r;   rg   r   s      r=   r>   z,LargeUploadStatus.is_done.<locals>.<genexpr>  s(     e;1hx,,F0F0FFe   '))r   allrf   r   s    r=   r]   zLargeUploadStatus.is_done  s7    YY 	feZ^ZdZdee	f 	f 	fs   3<)rn   ro   rp   __doc__r   
JOB_ITEM_Tr   intr   boolfloatr   rH   rY   r]   rx   ry   r=   rR   rR      sf    Led:. eB6c 6	WD 	WC 	W5 	WT 	W= =~f fry   rR   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/   r0   r2   r(   zFailed to get upload mode: r|   regularzFailed to preupload LFS: zFailed to commit: F)$_determine_next_jobrm   rs   _compute_sha256r   r   KeyboardInterrupt	ExceptionrM   error	traceback
format_excr   r   r   rt   _get_upload_moder   r   r   r   r   ru   _preupload_lfsr   rv   rZ   _commitr   rP   r   r   rw   r[   WAITING_TIME_IF_NO_TASKSr   )r@   r/   r0   r2   r(   next_jobjobrf   r   erg   r   start_tsr   r   s                  r=   rV   rV      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  rX| xj                  dz  c_        t        j                  d       t        j                  t        | j                        fcd d d        S | j                  dk(  ru| j                  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k\  rg| 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  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  rv| 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                         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  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                  |t        j
                         | j                  z
  dkD  rX| xj                  dz  c_        t        j                  d       t        j                  t        | 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(  rv| j                  dk(  rg| j"                  dk(  rX| xj                  dz  c_        t        j                  d       t        j                  t        | 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)r   zJob: commit (>100 files ready)r   z&Job: get upload mode (>10 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r7   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   rZ   rM   r   rm   rv   _get_items_to_commitr   r   rt   _get_nr   r   r   ru   _get_oner   r   rs   r   HF_HUB_ENABLE_HF_TRANSFERr   rf   rN   r   r   rw   )r@   s    r=   r   r     s   	 c( $$)##))+a/**6		f8886A$$)$LLVW$$&:6;N;N&OPc( c( %%*v/B/B/H/H/Jc/Q$$)$LL9:$$&:6;N;N&OP!c( c(& ))//1R7--2-LLAB--vf6R6RTZTgTgTi/jk-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--vf6R6RTZTgTgTi/jkQ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--vf6R6RTZTgTgTi/jk{c( c(B $$)##))+a/**6		f8886A$$)$LLHI$$&:6;N;N&OPQc( c(Z $$)##))+a/##))+q0,,2249**002a7((A-11Q6//14$$)$LL'$$&:6;N;N&OPq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+\6A:\6A:\6
A:\6A:\6B	\6%B
\69A+\6.A:\62B*\6&C>\6.2\6)A\66\?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   re   r   fs       r=   r   r     s^    OE8__!!$' 	31)!n002HO	3MM%	3 	3s   A&&A/rf   c           
      (   | D cg c]  }t        |       }}t        ||||j                         t        |d             t	        | |      D ]=  \  }}|\  }}	|j
                  |	_        |j                  |	_        |	j                  |       ? yc c}w )zmGet upload mode for each file and update metadata.

    Also receive info if the file should be ignored.
     )safe)	additionsr2   r0   headersr(   N)
_build_hacky_operationr   _build_hf_headersr   zip_upload_moder   _should_ignorer   r   )
rf   r/   r0   r2   r(   r   r   additionre   r   s
             r=   r   r     s    
 ;@@$'-@I@%%'xb) eY/ hx'44!)!8!8e	 As   Bc                     | \  }}t        |       }|j                  ||||g       d|_        |j                  |       y)z'Preupload LFS file and update metadata.)r0   r2   r(   r   TN)r   preupload_lfs_filesr   r   )r   r/   r0   r2   r(   re   r   r   s           r=   r   r     sL    OE8%d+H*	    HMM%ry   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)r0   r2   r(   
operationscommit_messageTN)r   create_commitr   r   )	rf   r/   r0   r2   r(   r   r   re   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 r7   )rG   path_or_fileobjr   rH   r   s    r=   __post_init__z%HackyCommitOperationAdd.__post_init__9  s*    d**D1#&t';';#<D  2ry   )r   N)rn   ro   rp   r   rx   ry   r=   r   r   8  s    =ry   r   c                 |   | \  }}t        |j                  |j                        }|j                  j                  d      5 }|j	                  d      d d }d d d        |j
                  t        d      t        t        j                  |j
                        |j                        |_        |S # 1 sw Y   \xY w)N)rQ   r   r   i   z&sha256 must have been computed by now!)r   r   sample)r   rQ   r   r   peekr   rC   r   bytesfromhexr   upload_info)r   re   r   	operationfiler   s         r=   r   r   >  s    OE8'U5G5GY^YhYhiI			d	# &t3%&ABB&emmHOO.LS[S`S`iopI& &s   B22B;r}   zqueue.Queue[JOB_ITEM_T]c                 &     | j                          gS r7   )get)r}   s    r=   r   r   N  s    EIIK=ry   nc                     t        t         | j                         |            D cg c]  } | j                          c}S c c}w r7   )rS   r   r   r  )r}   r  rg   s      r=   r   r   R  s2    !&s;5;;=!'<!=>AIEIIK>>>s   Ac                     g }d\  }}	  | j                          dk(  r|S |t        k\  s	|t        k\  r|S  | j                         }|j	                  |       |\  }}|j
                  dk(  r|dz  }n|dz  }l)zXSpecial case for commit job: the number of items to commit depends on the type of files.)r   r   r   r|   r   )r   MAX_NB_LFS_FILES_PER_COMMITMAX_NB_REGULAR_FILES_PER_COMMITr  appendr   )r}   rf   r   
nb_regularr   rg   r   s          r=   r   r   V  s     !EFJ
5;;=AL 00JBa4aL uyy{T85(aKF!OJ! ry   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)rP   )r;   lineterminal_widths     r=   r>   z#_print_overwrite.<locals>.<genexpr>{  s     St3t9.2Ss   z[Kz[Fr   N)shutilget_terminal_sizecolumnssum
splitlinesrS   sysstdoutwriterP   flush)r  nb_linesrg   r  s      @r=   r\   r\   n  s     dNF--/77N Sv?P?P?RSSH 8_ #

$

"#
 JJVJJSNS1B1B1DR1H-IIJKJJry   )Hrq   r^   rI   r}   r  r  rT   rZ   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   	getLoggerrn   rM   r   r  r  r&   r   __annotations__rH   r   rk   Enumrm   r   rR   rV   r   r   r   r   r   r   r   r   r   r   r\   rx   ry   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 ? 9 d:>N 0S T ry   