
    5pj"                      % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKJrJr  SSKJr  SSKJrJrJrJr  SSKJr  SS	KJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6  SS
K7J8r8J9r9J:r:J;r;J<r<  SSK=J>r>  SSK?J@r@  \(       a  SSKAJBrB  SSKCJDrD  SSKEJFrF  \@" S5      rG\H\-  \I-  \-  \\I   -  rJSrK " S S5      rLS*S jrMS+S jrNS,S jrO S-     S.S jjrPS/S jrQ  S0       S1S jjrR " S S5      rS\SR                  \SR                  \SR                  \SR                  \SR                  \SR                  \SR                  \SR                  \SR                  \SR                  \SR                  \SR                  \SR                  S.r[S\\S'   S2S jr] " S  S!5      r^ " S" S#5      r_ " S$ S%5      r` " S& S'5      ra " S( S)5      rbg)3u  Internal file upload implementation.

Strict behavioral parity with the old modelscope SDK upload pipeline:
- LFS detection by suffix list + size threshold
- Upload tracker for resumable uploads (.ms_upload_cache)
- Adaptive batch sizing
- Pipeline mode: ThreadPoolExecutor uploads + ordered batch commits
- Per-file retry with exponential backoff
- Per-commit retry
- ReAct progressive retry fallback (parallel → serial → single-file)
- Upload report
    )annotationsN)ThreadPoolExecutoras_completed)Path)IOTYPE_CHECKINGAnyBinaryIO)tqdm   )DATASET_LFS_SUFFIXDEFAULT_IGNORE_PATTERNSDEFAULT_MAX_WORKERSMODEL_LFS_SUFFIXUPLOAD_ADAPTIVE_BATCH_SIZE&UPLOAD_BATCH_CONSECUTIVE_FAILURE_LIMITUPLOAD_BLOB_MAX_RETRIESUPLOAD_BLOB_RETRY_BACKOFFUPLOAD_BLOB_RETRY_MAX_WAIT"UPLOAD_BLOB_TQDM_DISABLE_THRESHOLDUPLOAD_CACHE_FILEUPLOAD_COMMIT_BATCH_SIZEUPLOAD_COMMIT_MAX_RETRIESUPLOAD_COMMIT_MAX_TOTAL_WAITUPLOAD_FAILED_FILE_MAX_RETRIESUPLOAD_LEGACY_PROGRESS_FILEUPLOAD_LFS_ENFORCE_THRESHOLDUPLOAD_MAX_FILE_COUNTUPLOAD_MAX_FILE_COUNT_IN_DIRUPLOAD_MAX_FILE_SIZE#UPLOAD_NORMAL_FILE_SIZE_TOTAL_LIMIT!UPLOAD_REACT_BACKOFF_MAX_EXPONENTUPLOAD_REACT_ENABLEDUPLOAD_REACT_MAX_DELAYUPLOAD_REACT_ROUND2_BASE_DELAYUPLOAD_REACT_ROUND3_FILE_DELAYUPLOAD_USE_CACHEUPLOAD_VALIDATE_BLOB_BATCH_SIZE)FileIntegrityErrorHubErrorInvalidParameterNetworkErrorStorageError)compute_hash)
get_logger)LegacyClient)OpenAPIClient)	HubConfigupload   c                  N    \ rS rSrSrS	S jrS
SS jjr\SS j5       rSS jr	Sr
g)_CountedReadStreamZ   z?File wrapper that counts bytes read and updates a progress bar.c                B    Xl         X l        X0l        X@l        SU l        g Nr   )_file_expected_size_pbar_chunk_size_bytes_read)selffile_objexpected_sizepbar
chunk_sizes        R/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/modelscope_hub/_upload.py__init___CountedReadStream.__init__]   s     
+
%    c                   US:  a  U R                   O[        XR                   5      nU R                  R                  U5      nU(       a;  [	        U5      nU =R
                  U-  sl        U R                  R                  U5        U$ r9   )r=   minr:   readlenr>   r<   update)r?   size	read_sizechunkns        rD   rJ   _CountedReadStream.readd   sf    (,qD$$c$@P@P6Q	

	*E
A!JJa rG   c                    U R                   $ N)r>   r?   s    rD   
bytes_read_CountedReadStream.bytes_readm   s    rG   c                    U R                   U R                  :w  a&  [        SU R                    SU R                   S35      eg )NzUpload data incomplete: read z bytes, expected z2 bytes. File may have been modified during upload.)r>   r;   r)   rT   s    rD   verify_complete"_CountedReadStream.verify_completeq   sR    t222$/0@0@/A B //0 1=>  3rG   )r>   r=   r;   r:   r<   N)
r@   r	   rA   intrB   r	   rC   rZ   returnNone))rM   rZ   r[   bytesr[   rZ   r[   r\   )__name__
__module____qualname____firstlineno____doc__rE   rJ   propertyrU   rX   __static_attributes__ rG   rD   r6   r6   Z   s(    I    rG   r6   c                    U[         :  a  g[        U [        [        45      (       a#  [        U 5      R                  R                  5       OSnUS:X  a	  U[        ;   $ US:X  a	  U[        ;   $ U[         :  $ )zIDetermine if a file should use LFS upload mode (suffix + size threshold).T modeldataset)r   
isinstancestrr   suffixlowerr   r   )pathrM   	repo_typero   s       rD   _is_lfsrs   z   sl    ***4TC;*G*GT$Z$$&RFG)))I+++...rG   c                ,    [        XU5      (       a  S$ S$ )z)Return the commit/upload mode for a file.lfsnormal)rs   )rq   rM   rr   s      rD   _upload_moderw      s    D	225@@rG   c                `    U S::  a  gU S::  a  U $ U S::  a  [        S[        SU S-  5      5      $ g)	z>Calculate optimal commit batch size based on total file count.r   r   d   i'  @      P   i   )maxrI   )total_filess    rD   _calculate_adaptive_batch_sizer      s?    acf2s3r 1233rG   c                   [        U [        5      (       a1  U [        R                  " U 5      R	                  5       [        U 5      S.$ [        U [        [        45      (       a@  [        U 5      nUR                  5       R                  n[        US5      n[        U 5      UUS.$ U R                  5       nU[        R                  " U5      R	                  5       [        U5      S.$ )zCompute SHA256 hash and size for a file, bytes, or file-like object.

Returns dict with 'file_hash', 'file_size', 'file_path_or_obj' keys.
file_path_or_obj	file_hash	file_sizesha256)rm   r^   hashlibr   	hexdigestrK   rn   r   statst_sizer.   rJ   )r   buffer_size_mbrq   r   r   datas         rD   _compute_file_hashr      s     "E** 0 (89CCE-.
 	

 "S$K00$%IIK''	 x0	 #$4 5""
 	
   "D ^^D)335Y rG   c                >   ^  U(       d  g[        U 4S jU 5       5      $ )NFc              3  R   >#    U  H  n[         R                   " TU5      v   M     g 7frS   )fnmatch).0patrq   s     rD   	<genexpr>$_matches_patterns.<locals>.<genexpr>   s     >XcwtS))Xs   $')any)rq   patternss   ` rD   _matches_patternsr      s    >X>>>rG   c                    / nU  HF  nU(       a  [        XA5      (       d  M  U(       a  [        XB5      (       a  M5  UR                  U5        MH     U$ )z;Filter file paths using fnmatch allow/ignore pattern lists.)r   append)itemsallow_patternsignore_patternsfiltereditems        rD   _filter_repo_objectsr      sH     H"3D"I"I0GG  OrG   c                  P    \ rS rSrSrSrSrSrSrSr	Sr
S	r1 S
kr\SS j5       rSrg)_ErrorCategory   transient_networktransient_server	throttledauth_failed	not_foundfile_invalid	permanentunknown>   r   r   r   r   c                    XR                   ;  $ rS   )_NON_RETRYABLE)clscategorys     rD   is_retryable_ErrorCategory.is_retryable   s    1111rG   rh   N)r   rn   r[   bool)ra   rb   rc   rd   TRANSIENT_NETWORKTRANSIENT_SERVER	THROTTLEDAUTH_FAILED	NOT_FOUNDFILE_INVALID	PERMANENTUNKNOWNr   classmethodr   rg   rh   rG   rD   r   r      sC    +)IKI!LIGNN2 2rG   r   )E1001E1002E1003E1020E1021E1022E2020E3001E3002E3020E3021E3023E9001zdict[str, str]_CATEGORY_BY_ERROR_CODEc                   [        U [        5      (       aX  [        U SS5      nU(       a  U[        ;   a	  [        U   $ U R                  (       a  [
        R                  $ [
        R                  $ [        U [        5      (       a  [
        R                  $ [        U [        R                  5      (       a  [
        R                  $ [        U [        [        45      (       a  [
        R                  $ [        U [        [         45      (       aa  [#        U 5      R%                  5       nSU;   d  SU;   a  [
        R                  $ SU;   d  SU;   a  [
        R                  $ [
        R                  $ [
        R                  $ )u  Classify an exception for retry strategy using the SDK error hierarchy.

For :class:`HubError` instances, classification is driven by
:attr:`~HubError.error_code` via a lookup table — no ``isinstance``
chains or string-matching heuristics needed for known error types.

error_codeNzsize changedzno such file
permissionzaccess denied)rm   r*   getattrr   	retryabler   r   r   FileNotFoundErrorr   	_builtinsPermissionErrorConnectionErrorTimeoutErrorr   IOErrorOSErrorrn   rp   )errorcode	error_strs      rD   classify_errorr      s    %""ulD1D33*400).~%%Vn>V>VV%*++***%2233***%/<899///%'7+,,J$$&	Y&.I*E!...9$9(D!...///!!!rG   c                       \ rS rSrSrSrSrSrg)
FileStatusi  ucfrh   N)ra   rb   rc   rd   UPLOADED	COMMITTEDFAILEDrg   rh   rG   rD   r   r     s    HIFrG   r   c                      \ rS rSrSrSS jr\SS j5       rSS jrSS jr	SS jr
SS jrSS	 jrSS
 jrSSS jjrSS jrSS jrSS jrSS jrSS jrSrg)UploadTrackeri  zIPersistent JSON cache at {folder}/.ms_upload_cache for resumable uploads.c                    [        U5      U l        X l        0 U l        [        R
                  " 5       U l        SU l        U R                  5         g NF)	r   _path_repo_id_files	threadingLock_lock_dirty_load)r?   
cache_pathrepo_ids      rD   rE   UploadTracker.__init__  s8    *%
')^^%


rG   c                    U  SU SU 3$ )N|rh   )rel_pathmtimerM   s      rD   	_make_keyUploadTracker._make_key"  s    1UG1TF++rG   c                    U R                  XU5      nU R                     U R                  R                  U5      nS S S 5        Wb  SU;  a  g UUS   US   S.$ ! , (       d  f       N$= f)NhashrM   r   r   r   r   getr?   r   r   rM   keyentrys         rD   get_hashUploadTracker.get_hash&  sb    nnXd3ZZKKOOC(E =F%/ (vv
 	
	 Zs   A
A'c                    U R                  XU5      nU R                     U R                  R                  U0 5      nUS   US'   US   US'   X`R                  U'   SU l        S S S 5        g ! , (       d  f       g = f)Nr   r   r   rM   T)r   r   r   r   r   )r?   r   r   rM   	hash_infor   r   s          rD   put_hashUploadTracker.put_hash2  sf    nnXd3ZZKKOOC,E%k2E&M%k2E&M$KKDK ZZs   AA**
A8c                   U R                  XU5      nU R                     U R                  R                  U5      nS S S 5        WS L=(       a"    UR                  S5      [        R
                  :H  $ ! , (       d  f       N;= fNstatus)r   r   r   r   r   r   r   s         rD   is_committedUploadTracker.is_committed;  s\    nnXd3ZZKKOOC(E D PUYYx%8J<P<P%PP Zs   A00
A>c                    U R                  XU5      nU R                     U R                  R                  U5      nS S S 5        W(       a  UR                  S5      $ S $ ! , (       d  f       N(= fr  r   r   s         rD   
get_statusUploadTracker.get_statusA  sN    nnXd3ZZKKOOC(E &+uyy"55 Zs   A
A+c                    U R                  XU5      nU R                     X@R                  ;   a'  [        R                  U R                  U   S'   SU l        S S S 5        g ! , (       d  f       g = fNr  T)r   r   r   r   r   r   )r?   r   r   rM   r   s        rD   mark_uploadedUploadTracker.mark_uploadedG  sM    nnXd3ZZkk!-7-@-@C *" ZZs   7A
A-c                    U R                      U HI  u  p#nU R                  X#U5      nXPR                  ;   d  M)  [        R                  U R                  U   S'   MK     SU l        S S S 5        g ! , (       d  f       g = fr  )r   r   r   r   r   r   )r?   	file_keysr   r   rM   r   s         rD   mark_committed_batch"UploadTracker.mark_committed_batchN  s^    ZZ)2%nnXd;++%1;1E1EDKK$X. *3 DK ZZs   (A-+A--
A;c                h   U R                  XU5      nU R                     XPR                  ;   a9  [        R                  U R                  U   S'   U(       a  X@R                  U   S'   O+S[        R                  0nU(       a  XFS'   X`R                  U'   SU l        S S S 5        g ! , (       d  f       g = f)Nr  
error_typeT)r   r   r   r   r   r   )r?   r   r   rM   r  r   r   s          rD   mark_failedUploadTracker.mark_failedV  s    nnXd3ZZkk!-7->->C *5?KK$\2)1:3D3D(E*4,'#(C DK ZZs   A;B##
B1c                n   U R                      U R                  (       d
   S S S 5        g [        U R                  U R                  R                  5        VVs0 s H  u  pU[        U5      _M     snnS.nSU l        S S S 5         U R                  R                  R                  SSS9  [        R                  " [        U R                  R                  5      SS9u  pE [        R                  " USSS	9 n[        R                   " WUSS
9  S S S 5        [        R"                  " U[        U R                  5      5        g s  snnf ! , (       d  f       N= f! , (       d  f       NP= f! [$         a    [        R&                  " U5        e f = f! [(         a   n[*        R-                  SU5         S nAg S nAff = f)N)versionr   filesFT)parentsexist_okz.tmp)dirro   wzutf-8)encoding)ensure_asciiz!Failed to save upload tracker: %s)r   r   _TRACKER_VERSIONr   r   r   dictr   parentmkdirtempfilemkstemprn   osfdopenjsondumpreplaceBaseExceptionunlink	Exceptionloggerwarning)r?   kvr   fdtmp_pathr   es           rD   saveUploadTracker.saved  sI   ZZ;; Z ,==151B1B1DE1D!T!W*1DED
  DK 	CJJ##D4#@#++DJJ4E4E0FvVLBYYr39QIIdAE: :

8S_5 F Z :9 ! 		(#  	CNN>BB	Cse   E-ED=.EAF
 E% 3E
2E% =E
E
E"E% %"FF
 

F4F//F4c                     U R                   R                  SS9  U R
                     U R                  R                  5         SU l        S S S 5        g ! [         a   n[        R	                  SU5         S nAN\S nAff = f! , (       d  f       g = f)NT)
missing_okz!Failed to delete tracker file: %sF)	r   r+  r   r-  r.  r   r   clearr   )r?   r3  s     rD   r8  UploadTracker.clear{  sp    	CJJ. ZZKKDK Z  	CNN>BB	CZs"   A "A?
A<A77A<?
Bc                N   U R                   R                  5       (       d  U R                  5         g  [        U R                   5       n[        R
                  " U5      nS S S 5        WR                  S5      nUc  U R                  U5        g UR                  SS5      nU(       a1  XPR                  :w  a"  [        R                  SUU R                  5        g UR                  S0 5      U l        [        S U R                  R                  5        5       5      nUS:  a*  [        R!                  S	[#        U R                  5      U5        U R                  5         g ! , (       d  f       GN= f! [        R                  [        4 a   n[        R                  SU5         S nAg S nAff = f)
Nz1Failed to load upload tracker, starting fresh: %sr  r   rj   zKTracker repo_id mismatch (cached: %s, current: %s), ignoring stale tracker.r  c              3  n   #    U  H+  oR                  S 5      [        R                  :X  d  M'  Sv   M-     g7f)r  r   N)r   r   r   )r   r3  s     rD   r   &UploadTracker._load.<locals>.<genexpr>  s(     i)=AxT^ThThAhaa)=s   &5	5r   z0Upload tracker loaded: %d entries, %d committed.)r   exists_check_legacy_progressopenr'  loadJSONDecodeErrorr   r-  r.  r   _migrate_v1r   r   sumvaluesinforK   )r?   r   r   r3  r  stored_repocommitted_counts          rD   r   UploadTracker._load  sB   zz  ""'')	djj!Qyy| " ((9%?T"hhy"-;--7NN]
 hhw+i););)=iiQKKBDKK 
 	##%9 "!$$g. 	NNNPQR	s5   E* EE* 
E'"E* 'E* *F$FF$c                   0 nUR                  5        H>  u  p4[        U[        5      (       d  M  SU;   d  M$  US   UR                  SS5      S.X#'   M@     X l        SU l        U(       a   [        R                  S[        U5      5        g g )Nr   r   r   )r   rM   Tz2Migrated %d entries from legacy hash cache format.)	r   rm   r   r   r   r   r-  rE  rK   )r?   r   migratedr   values        rD   rB  UploadTracker._migrate_v1  sx    **,JC%&&;%+?!+.!IIk15! ' KKDH rG   c                    U R                   R                  [        -  nUR                  5       (       a  [        R                  SU5        g g )Nz`Legacy upload progress file detected: %s. This file is no longer used. You may delete it safely.)r   r!  r   r=  r-  r.  )r?   legacy_paths     rD   r>  $UploadTracker._check_legacy_progress  s=    jj''*EENNr  rG   )r   r   r   r   r   N)r   
str | Pathr   rn   r[   r\   )r   rn   r   floatrM   rZ   r[   rn   )r   rn   r   rQ  rM   rZ   r[   zdict | None
r   rn   r   rQ  rM   rZ   r   r   r[   r\   r   rn   r   rQ  rM   rZ   r[   r   )r   rn   r   rQ  rM   rZ   r[   
str | Noner   rn   r   rQ  rM   rZ   r[   r\   )r  zlist[tuple[str, float, int]]r[   r\   rj   
r   rn   r   rQ  rM   rZ   r  rn   r[   r\   r`   )r   r   r[   r\   )ra   rb   rc   rd   re   rE   staticmethodr   r   r   r  r  r  r  r  r4  r8  r   rB  r>  rg   rh   rG   rD   r   r     s]    S , ,

Q6#C. !&F rG   r   c                  v    \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	SS jr
SSS	 jjrSS
 jrSS jrSrg)NullTrackeri  z+No-op tracker for when caching is disabled.c                    g rS   rh   r?   r   r   rM   s       rD   r   NullTracker.get_hash      rG   c                    g rS   rh   )r?   r   r   rM   r   s        rD   r   NullTracker.put_hash      rG   c                    gr   rh   r\  s       rD   r  NullTracker.is_committed  s    rG   c                    g rS   rh   r\  s       rD   r  NullTracker.get_status  r^  rG   c                    g rS   rh   r\  s       rD   r  NullTracker.mark_uploaded  ra  rG   c                    g rS   rh   )r?   r  s     rD   r   NullTracker.mark_committed_batch  ra  rG   c                    g rS   rh   )r?   r   r   rM   r  s        rD   r  NullTracker.mark_failed  ra  rG   c                    g rS   rh   rT   s    rD   r4  NullTracker.save  ra  rG   c                    g rS   rh   rT   s    rD   r8  NullTracker.clear  ra  rG   rh   NrU  rR  rS  )r  listr[   r\   rV  rW  r`   )ra   rb   rc   rd   re   r   r   r  r  r  r  r  r4  r8  rg   rh   rG   rD   rZ  rZ    s2    5rG   rZ  c                  r    \ rS rSrSrSS jr\SS j5       rSS jrSS jr	SS jr
SS jrSS	 jrSS
 jrSrg)BatchTrackeri  z4Thread-safe tracker for pre-assigned upload batches.c                ^   X l         US:  a  US-
  U-  S-   OSU l        [        U R                  5       Vs/ s H  n/ PM     snU l        [        U R                  5       Vs/ s H  n/ PM     snU l        / U l        [        U R                  5       H2  nXB-  n[        XR-   U5      nU R
                  R                  Xe-
  5        M4     [        U R                  5       Vs/ s H  n[        R                  " 5       PM     snU l
        [        R                  " 5       U l        g s  snf s  snf s  snf )Nr   r   )_batch_size_num_batchesrange_batch_results_batch_failures_batch_expectedrI   r   r   Event_batch_eventsr   r   )r?   r~   
batch_size_istartends          rD   rE   BatchTracker.__init__  s   %CNQR?[1_;a?XY=B4CTCT=U0V=U=U0V?DTEVEV?W2X?W!2?W2X*,t(()ANEe(+6C  ''4 * QVVZVgVgPh4iPh1Y__5FPh4i^^%
 1W2X 5js   D !D%D*c                    U R                   $ rS   )ru  rT   s    rD   num_batchesBatchTracker.num_batches  s       rG   c                    XR                   -  $ rS   )rt  )r?   
file_indexs     rD   batch_indexBatchTracker.batch_index  s    ----rG   c                   U R                  U5      nU R                     U R                  U   R                  U5        U R	                  U5      (       a  U R
                  U   R                  5         S S S 5        g ! , (       d  f       g = frS   )r  r   rw  r   _is_batch_completer{  set)r?   r  resultidxs       rD   record_successBatchTracker.record_success  sd    z*ZZ$++F3&&s++""3'++- ZZs   AA99
Bc                   U R                  U5      nU R                     U R                  U   R                  X#45        U R	                  U5      (       a  U R
                  U   R                  5         S S S 5        g ! , (       d  f       g = frS   )r  r   rx  r   r  r{  r  )r?   r  r   r   r  s        rD   record_failureBatchTracker.record_failure  sf    z*ZZ  %,,d];&&s++""3'++- ZZs   AA::
Bc                   U R                  U5      nU R                     U R                  U==   S-  ss'   U R                  U5      (       a  U R                  U   R                  5         S S S 5        g ! , (       d  f       g = fNr   )r  r   ry  r  r{  r  )r?   r  r  s      rD   mark_file_skippedBatchTracker.mark_file_skipped	  sa    z*ZZ  %*%&&s++""3'++- ZZs   AA22
B c                    U R                   U   R                  5         U R                     [        U R                  U   5      [        U R
                  U   5      4sS S S 5        $ ! , (       d  f       g = frS   )r{  waitr   rp  rw  rx  )r?   	batch_idxs     rD   wait_for_batchBatchTracker.wait_for_batch  sU    9%**,ZZT((34T)))45 ZZs   0A$$
A2c                    [        U R                  U   5      [        U R                  U   5      -   nX R                  U   :  $ rS   )rK   rw  rx  ry  )r?   r  counts      rD   r  BatchTracker._is_batch_complete  s@    D''	23c$:N:Ny:Y6ZZ,,Y777rG   )r{  ry  rx  rw  rt  r   ru  N)r~   rZ   r|  rZ   r[   r\   r_   )r  rZ   r[   rZ   )r  rZ   r  r   r[   r\   )r  rZ   r   tupler   r,  r[   r\   )r  rZ   r[   r\   )r  rZ   r[   ztuple[list[dict], list[tuple]])r  rZ   r[   r   )ra   rb   rc   rd   re   rE   rf   r  r  r  r  r  r  r  rg   rh   rG   rD   rr  rr    s<    >& ! !....8rG   rr  c                     \ rS rSrSr S!SS.         S"S jjjrSSSSS	S
.                   S#S jjrSSSSSSS\S	S	S.
                           S$S jjr            S%S jr	\
S&S j5       rSSS	S.               S'S jjrS	SSSS.                   S(S jjr        S)S jrS\S.             S*S jjr            S+S jrS,S jr      S-S jr      S-S jr   S.           S/S jjr S0                 S1S jjr S0                     S2S jjrS rg)3UploadManageri"  zKInternal file upload implementation with production-grade retry and resume.N)create_repo_fnc               4    Xl         X l        X0l        X@l        g rS   )_client_config_openapi_create_repo_fn)r?   legacy_clientconfigopenapi_clientr  s        rD   rE   UploadManager.__init__%  s     %&-rG   zUpload filemaster   F)commit_messagecommit_descriptionrevisionr   disable_tqdmc                  Uc  [        S5      e[        U[        [        45      (       an  [        R
                  R                  [        R
                  R                  [        U5      5      5      nU=(       d    [        R
                  R                  U5      nOU(       d  [        S5      e[        X85      n
U
S   nU
S   n[        U[        [        [        45      (       d  U
S   nU=(       d    SU S3nU R                  b  U R                  X5        [        XLU5      nUS	:X  a  U R                  UUUUUU	S
U 3US9nOSSSSS.nU R                  UUU
UUS   S9n[        SU S3SS9  U R                   R#                  UUU/UUS9$ )z%Upload a single file to a repository.Nz#Path or file object cannot be None!z#Arg `path_in_repo` cannot be empty!r   r   r   zUpload z to ModelScope hubru   z[Uploading] )r   rr   r   rM   r   r  	tqdm_descr   TFurlis_uploaded	is_reusedis_blob_uploadedr  path_in_repopath_or_fileobjr   upload_moder  zCommitting file to z ...)flushr   rr   
operationsr  r  )r+   rm   rn   r   r%  rq   abspath
expanduserbasenamer   r^   r  rw   _upload_blob_build_operationprintr  create_commit)r?   r   rr   r  r  r  r  r  r   r  r   r   r   r  
upload_res	operations                   rD   upload_fileUploadManager.upload_file5  s    ""#HIIoT{33 ggoobgg.@.@_AU.VWO'L277+;+;O+LL&'LMM&G	k*	k*	/Cu+=>>'(:;O'UW\NBT+U+  4"<IF%**# $)(7- + 	J #"$)	J ))%+#"=1 * 
	 	#G9D1>||))!{) * 
 	
rG   rj   )
r  r  r  r  r   r   max_workers	use_cacher  sync_remote_repoc       
        z  ^ ^^^^O^P^Q [         R                   " 5       nT(       d  [        S5      eUc  [        S5      eU
c  [        n
U=(       d    SnU	c  / n	O$[        U	[        5      (       a  U	/n	O[        U	5      n	U	[        -  n	Ub  U	 Vs/ s H  oU;  d  M
  UPM     n	nUb  UOST S3nU=(       d    Sn[        [        /nU VVs/ s H  nUSU 34  H  oPM     M     nnnU	U-   n	[        R                  S5        T R                  UUTUU	S	9nU(       a+  T R                  UUTSSS	9nU VVs1 s H  u  nnUiM
     nnnO
[        5       nU(       d  [        S
U S35      e[        R                  S[        U5      5        T R                  b  T R                  TT5        [        US S9n[         (       a5  [#        [        U5      5      n[        R                  SU[        U5      5        O[$        S:  a  [$        O
[        U5      n['        U5      R)                  5       nU(       a  U[        -  n[+        UTS9mQO
[-        5       mQ[/        [        U5      U5      mO/ n[        5       mP[1        U5       H  u  nu  nn [2        R4                  " U5      nTQR7                  UUR8                  UR:                  5      (       a$  TPR=                  U5        TOR?                  U5        Mp   URE                  UUU445        M     0 n 0 n!U Hg  u  nu  nn [2        R4                  " U5      nTQRG                  UUR8                  UR:                  5      n"U"b  [I        UU"S   T5      S:X  a  U"U4U!U'   Mg  Mi     U!(       a  U!RK                  5        V#Vs/ s H  u  n#nU#S   U#S   S.PM     n$n#nT RM                  TTU$S9n%U%n [O        S U%RK                  5        5       5      n&[        R                  S[        U$5      U&[        U$5      U&-
  5        [        TP5      n'U'S:  a  [        R                  SU'5        [        R                  S[        U5      U'[        U5      5        [        R                  S[        U5      TORP                  U5        STSUUOUUUU UQ4S jjjn(/ n)/ n*/ n+TORP                  n, [S        U
S9 n-U HC  u  nn.Sn/UU!;   a!  U!U   S   S   n0U RU                  U05      n/U/c  Sn/U-RW                  U(UU.U/5        ME     Sn1[Y        [[        U,5      S U,TS!9 GHv  n2U2U-  n3[]        U3U-   [        U5      5      n4[_        UP4S" j[[        U3U45       5       5      (       a  [        R                  S#U2S$-   U,5        Ma  TORa                  U25      u  n5n6U6(       a7  U+Rc                  U65        U6 H   u  n7n8[        Re                  S%U7S   U85        M"     T Rg                  TQU55        T Ri                  U5T5      n9U9(       d  [        Re                  S&U2S$-   U,5        M  U S'U2S$-    S(U, S)3n: T Rk                  TTU9U:US*9n;U)RE                  U;5        U*Rc                  U55        [        R                  S+U2S$-   U,[        U55      5        T Rm                  TQU55        Sn1GMy     SSS5        TQR}                  5         U+(       aH  [~        (       a=  T R                  U+TQTTUUU
TS79u  n+n>n?U)Rc                  U>5        U*Rc                  U?5        OU+(       a  T R                  U+TQTTUUUU)U*TS89
n+TQR}                  5         Sn@U(       a  U+(       d  U(       a  UR                  S(5      OS9nAT R                  TTUUUAS:9nBUB(       ah  T R                  WB5      nCU S;[        UB5       S<3nD T Rk                  TTUCUDUS*9nEU)RE                  UE5        [        UB5      n@[        R                  S=U@5        [         R                   " 5       U-
  nF[        U5      nG[        U+5      nH[O        S? U* 5       5      nI[O        S@ U* 5       5      nJ[O        SA U* 5       5      nK[        U*5      nL[        SB5        [        SC5        [        SD5        [        SEUG 35        [        SFU' 35        [        SGUK 35        [        SHUI 35        [        SIUJ 35        [        SJUH 35        [        SKUL 35        [        SLW@ 35        [        SMUFSN SO35        [        SB5        U+(       aP  U+ H4  u  u  nMnn8[        Re                  SPUM[        U85      R                  U85        M6     WGWH-
  nN[        UH SQUN SR35      eU)(       d&  U'[        U5      :X  a  [        R                  SS5        gg[        U)5      S$:X  a  U)S   $ U)$ s  snf s  snnf s  snnf ! [@         a"  n[        RC                  SUU5         SnAGNSnAff = f! [@         a     GM  f = fs  snn#f ! [n         Ga  n[        Re                  S,U2S$-   U,U5        [q        U5      n<[r        Ru                  U<5      (       dR  U5 H!  n=TQRw                  U=S-   U=S.   U=S/   S0U<-   S19  M#     [        Re                  S2U2S$-   U,U<[        U55      5        U1S$-  n1ONU5 H  n=U+RE                  U=S-   U=S3   4U45        M      [        RC                  S4U2S$-   U,[        U55      U<5        U1S$-  n1U1[x        :  a  [{        S5U1 S6U 35      e SnAGM  SnAff = f! , (       d  f       GNk= f! TQR}                  5         f = f! [n         a!  n[        Re                  S>U5         SnAGNoSnAff = f)VzEUpload a folder with resumable support, adaptive batching, and retry.z"The arg `repo_id` cannot be empty!Nz%The arg `folder_path` cannot be None!z
Upload to z on ModelScope hubzUploading filesz*/zPreparing files to upload ...)folder_pathr  rr   r   r   z"No files to upload in the folder: z !zChecking %d files to upload ...c                    U S   $ r9   rh   )xs    rD   <lambda>-UploadManager.upload_folder.<locals>.<lambda>  s    !A$rG   )r   z&Adaptive batch size: %d (for %d files)r   )r   z'Cannot stat file %s, will re-upload: %sr   ru   r   oidrM   r   rr   objectsc              3  .   #    U  H  ob  M  Sv   M     g 7fr  rh   )r   r0  s     rD   r   .UploadManager.upload_folder.<locals>.<genexpr>  s     D$6q$6s   	zKPre-validated %d cached LFS hash(es): %d globally existing, %d need upload.z'%d file(s) already committed, skipping.z<Scan complete: %d total, %d committed (skip), %d to process.z@Uploading %d file(s) in %d batch(es) of size %d (pipeline mode).c           
     2  > Uu  p4 [         R                  SU5        TR                  UUT	T
TUTS9n[         R                  SU5        TR                  X5        g ! [         a2  n[         R                  SX65        TR                  XU5         S nAg S nAff = f)NzUploading: %s ...)r   rr   trackerpre_validatedr  zUploaded: %szUpload failed: %s - %s)r-  debug_upload_single_filer  r,  r   r  )file_idx	file_infor  path_in_repo_wfile_path_wr  r3  batch_trackerr  r   rr   r?   r  s          rD   _upload_worker3UploadManager.upload_folder.<locals>._upload_worker0  s    *3'NE0.A11"#'#"/!- 2  ^^<,,X> E5~I,,X!DDEs   AA 
B$(BBr  Tz[Committing batches])desctotaldisablec              3  ,   >#    U  H	  oT;   v   M     g 7frS   rh   )r   r~  skipped_indicess     rD   r   r  ]  s     W9VA/9V   z&Batch %d/%d fully committed, skipping.r   z  Failed: %s - %sz/Batch %d/%d: all files failed, skipping commit.z (batch /)r  z"Batch %d/%d: committed %d file(s).zBatch %d/%d commit failed: %sfile_path_in_repo
file_mtimefile_size_on_diskcommit_r  zDBatch %d/%d: permanent failure (%s), %d file(s) will not be retried.	file_pathzEBatch %d/%d: %d file(s) recovered to retry queue (error_category=%s).zUpload aborted: z/ consecutive batch commits failed. Last error: )failed_filesr  r   rr   r  r  r  r  )
r  r  r   rr   r  r  r  commit_infosall_resultsr  rj   )r   rr   r  local_paths_in_repopath_in_repo_prefixz (sync: delete z orphan file(s))z,Sync: deleted %d orphan file(s) from remote.zSync delete commit failed: %sc              3     #    U  H5  oR                  S 5      S:X  d  M  UR                  S5      (       d  M1  Sv   M7     g7f)r  ru   r  r   Nr   r   rs     rD   r   r    s2     n+Q}9MQV9Vq[\[`[`al[mqq+s   ??	?c              3  T   #    U  H  oR                  S 5      (       d  M  Sv   M      g7f)r  r   Nr  r  s     rD   r   r    s      UKq55AS;TKs   (	(c              3  R   #    U  H  oR                  S 5      S:X  d  M  Sv   M     g7f)r  rv   r   Nr  r  s     rD   r   r    s      VkUU=5IX5U11k   '	'z<============================================================zUpload Reportz<------------------------------------------------------------z  Total files       : z  Skipped (cached)  : z  Normal committed  : z  LFS existed       : z  LFS uploaded PUT  : z  Failed            : z  Committed         : z  Deleted (sync)    : z  Elapsed           : .1fsz  - %s: %s: %szL file(s) failed to upload. Please manually try again. Successfully uploaded z8 file(s) will be automatically skipped during the retry.z!All files were already committed.rS   )r  rZ   r  r  r  r	   r[   r\   )Itimer+   r   rm   rn   rp  r   r   r   r-  rE  _prepare_upload_folderr  rK   r  sortedr   r   r   r   resolver   rZ  rr  	enumerater%  r   r  st_mtimer   addr  r   r.  r   r   rw   rD  _validate_blobs_batchrC  r  r   r   submitr   rv  rI   allr  extendr   _track_uploaded_batch_build_batch_operations_commit_with_retry_track_committed_batchr,  r   r   r   r  r   RuntimeErrorr4  r#   _retry_failed_files_react_retry_failed_simplestrip_compute_remote_orphans_build_delete_operationsr  typera   r-   )Rr?   r   rr   r  r  r  r  r  r   r   r  r  r  r  
start_timep_internal_filesr   _internal_ignoresorted_filesall_local_files_in_repor}  all_local_paths_in_repocommit_batch_sizefolder_path_resolvedr   files_to_uploadr  r  r  str3  pre_validated_maplfs_hash_info_mapcachedrE  r  	validatedreusedskipped_countr  r  r  total_failed_filesr  executorr  pvcached_hashconsecutive_failuresr  batch_start	batch_endresultsfailuresr   errr  batch_commit_messagecommit_infor   r  react_commitsreact_resultsdeleted_countprefixorphans
delete_opsdelete_commit_messagedelete_commitelapsedr~   failed_countlfs_reused_countlfs_uploaded_countnormal_countrG  path_in_repo_f	succeededr  r  r  sR   ```         `                                                                  @@@rD   upload_folderUploadManager.upload_folder  s   $ YY[
"#GHH"#JKK-K (/4" O--./O"?3O22%*9U/Qn=Tq/OU+9+EZX_W``rKs/D3D -.IJ'6N!bH1AAN),<< 	3422#%)+ 3 
 &*&A&A')## $ 'B '# 6M&M5LTQq5L#&M#&)e#"%G}TV#WXX5s<7HI+  )4 l? &% >s<?P QKK8!L! =UWX<X 8^abn^o  $K088:-0AAJ3@U\3]G!mG$S%68IJ >@$'E8A,8O4H4()WWY'''(92;;

SS#''1!33H= T ""H/@).L#MN 9P  46DF8G4H4()WWY' ))*;R[["**U%$-";/%
 !! 8>rl)(3 &	 9H$ \m\t\t\vw\vQXQUWXtK0${:KL\vGw227iah2iI )DI$4$4$6DDFKK]GGv%	 O,1KKA=QJ 		
 	N %%		
	E 	E( $&"$*,#//p	#<+:'Hi,0B#44&7&A!&D[&Q.22;?:!%BOONHiL ,; ()$!%+&/%(	"I #,.?"?K #K2C$CSEV WIW{I9VWWWD%M'
 !(5(D(DY(O%GX*11(;)1ID#"LL)<d1gsK *2 ..w@!%!=!=gy!QJ%M%M'
 !.<-=XiRSm_TUVaUbbc+d(?&*&=&=$+&/'1+?%- '> ' %++K8#**73@%M'L	 33GWE/0,i" =^ LLN "6"6?C?]?]/#-!') @^ 	@<} .}-!%!:!:/#-#5!)') "; " 	 $60<\'',"F22#!$;$* 3 G !::7C
+9*:/#g,Wg(h%E$($;$; '"+#-'<!) %< %M !''6$'LMKKF% ))+
*,'-.n+nn  UK UUVkVVk*hoh&{m45&}o67&|n56&'7&89:&'9&:;<&|n56&&789&}o67&wsm156h,>(#S-~tCy?Q?QSVW -?#l2I. !D+ $%  L 11?@"%l"3q"8|AJlJq V O. 'NZ  =% 6   xp % -;%M'	 $2!#4-::8DD%, ' 3 3$%&9$:$%lO$%&9$:/88/C	 !4 !" &- #LL f )A + ( #G 1A50%, 2 9 9)*+>)?;(P()%&!" &- #NN g )A + #G ( 1A50/3YY"."23G2H I//0c!3#  ZS-A =<^ LLNx ! ELL!@!DDEs   	e;e;f 0f;A$fAf;g	k: (E)k(A-g?k(k: Al 
f8f33f8;
g
	g
k%C;k k( k%%k((
k72k: :l
l:l55l:c                   [         R                  S5        U R                  R                  UUUSS9n/ nU H  nUR	                  S5      =(       d    UR	                  S5      =(       d    Sn	U	S:X  a  M=  UR	                  S5      =(       d2    UR	                  S	5      =(       d    UR	                  S
5      =(       d    Sn
U
(       d  M  UR                  U
5        M     U(       a.  US-   nU Vs/ s H  oR                  U5      (       d  M  UPM     nnU Vs/ s H  oU;  d  M
  UPM     nn[         R                  S[        U5      [        U5      5        U$ s  snf s  snf )zCompute remote files that are not present locally (orphans).

Only files under ``path_in_repo_prefix`` are considered.
Returns a list of remote file paths to delete.
z8Sync: fetching remote file list for orphan detection ...T)r   rr   r  	recursiveTyper  blobtreer   rq   Namerj   r  z8Sync: %d remote file(s) in scope, %d orphan(s) detected.)r-  rE  r  list_repo_filesr   r   
startswithrK   )r?   r   rr   r  r  r  	raw_itemsremote_pathsr   	item_typerq   scope_prefixr  r:  s                 rD   r  %UploadManager._compute_remote_orphans%  s*    	NOLL00	 1 
	 #%D(FDHHV,<FIF"88F#Qtxx'7Q488F;KQrD%  .4L'3R|!||L7QA|LR*Kl7J.J1lKFL	

  SKs   +EE	E!Ec                B    U  Vs/ s H  nSUSSSSSS.PM     sn$ s  snf )z0Build delete operations for orphan remote files.deleterv   r   rj   actionrq   r  rM   r   contentr  rh   )orphan_pathsr  s     rD   r  &UploadManager._build_delete_operationsQ  sD     "
 " #  "
 	
 
s   )r  r  r  c                  Uc
  [        5       nS nS n	[        U[        [        R                  45      n
U
(       aF   [        R
                  " U5      n	UR                  XR                  U	R                  5      nUb  UnX(S'   UcR  [        US9nU
(       aB   U	c  [        R
                  " U5      n	UR                  UU	R                  U	R                  U5        U	c  U
(       a   [        R
                  " U5      n	US   nUS   n[        XU5      nUS:X  a  S n[        [        5       H  n [        U[        [        R                  45      (       aB  [        R                  R!                  [        U5      5      nUU:w  a  [#        SU SU SU 35      eU R%                  UUUUUU=(       d	    U[&        :*  S	U S
3US9n  O   [?        S[         SU SU 35      Ue[        U[        [        R                  45      (       aB  [        R                  R!                  [        U5      5      nUU:w  a  [#        SU SU SU 35      eS SSSS.nUUU	(       a  U	R                  OSU	(       a  U	R                  OURA                  SS5      US   URA                  SS5      URA                  SS5      UUS.	$ ! [         a    S n	 GN7f = f! [         a     GNf = f! [         a     GNf = f! [(        [*        [,        4 a  n[        U[(        5      (       a  UR.                  (       d  e UnU[        S-
  :  aU  [1        [2        U-  [4        5      n[6        R9                  SUS-   [        UUU5        [:        R<                  " U5         S nAGMZ   S nAGMa  S nAff = f)Nr   )r   r   r   ru   z.File size changed since hash computation: was z, now z. File may have been modified: z[Uploading ])r   rr   r   rM   r   r  r  r  r   z@Blob upload attempt %d/%d failed for %s: %s, retrying in %ds ...zBlob upload failed after z attempts for z: TFr  r   r  r  r  )	r  r  r  r  r  r  r  r  file_hash_info)!rZ  rm   rn   r%  PathLiker   r   r  r   r   r   r   rw   rv  r   rq   getsizer+   r  r   r*   r   r   r   rI   r   r   r-  r.  r  sleepr-   r   )r?   r  r  r   rr   r  r  r  hash_info_d	file_statis_real_pathr&  r   r   r  
last_errorattemptcurrent_sizer  r3  r  s                        rD   r  !UploadManager._upload_single_filed  s    ?!mG	!)c2;;-?@!GGI.	 ))*;=O=OQZQbQbc%"(K6? 23 ,iHK
 ($&GGI$6	$$)!**!))#	 GGI.	 %[1	$[1	"#4K%J !89%)!)c2;;-?@@')wws9~'F'94"2#''0k~ F@@Q?R!T# 
 "&!2!2 '"+(&&&2&eiCe6e$/0A/B!"D&3 "3 	"J ) :P #/0G/HWhViiklvkwx!" )c2;;%788!wws9~>9,*(k~ >88I7JL  #"$)	J "3"09),,q7@)"3"3kooVacdFe%m4#U; */A5 I&)

 
	
w  ! 	!    @ !/<@ )!!X..q{{!"J!81!<<"5w>6  ^#aK3-  

4(( =	)sQ   AJ' AJ: K &BK'J76J7:
KK
KKN1BNNz[Uploading])r  r  r   r  c       	           S SSSS.n
U	SL a%  [         R                  SUS S 5        SU
S'   SU
S'   U
$ [        U	[        5      (       a  U	nOYU R                  R                  UUX4S./S	9nUR                  U5      nUc%  [         R                  SUS S 5        SU
S'   SU
S'   U
$ UnUS
-  S
-  n[        USSUUS9 n[        U[        [        45      (       aN  [        US5       n[        UXOU5      nU R                  R                  UUUS9  S S S 5        WR                  5         O[        U[        5      (       aM  [        [        R                  " U5      XOU5      nU R                  R                  UUUS9  UR                  5         O7[        XTX5      nU R                  R                  UUUS9  UR                  5         S S S 5        XS'   SU
S'   SU
S'   U
$ ! , (       d  f       N= f! , (       d  f       N/= f)NFr  Tz'Blob %s already exists globally, reuse.   r  r  r  r     B)r  unit
unit_scaler  r  rb)
upload_urlr   rM   r  r  )r-  rE  rm   rn   r  validate_blobsr   r   r   r?  r6   upload_blobrX   r^   ioBytesIO)r?   r   rr   r   rM   r   r  r  r   r  res_dro  r'  	maybe_urlrC   rB   r   streams                     rD   r  UploadManager._upload_blob  s      %	
 D KKA6"1:N#'E- !%E+LmS))+J33#!'67 4 I
 "f-I EvbqzR'+m$%)k""J#d*T1
 
 $d,,$%/4zJFLL,,
VZ,[ & &&(D%((+BJJt,<d*U((JVRV(W&&(+DI((JVRV(W&&('
* "e#m$( !! &%
 
s%   8(G$ )G	B2G$
G!	G$$
G2c                    0 n[         n[        S[        U5      U5       H5  nX6Xe-    nU R                  R	                  UUUS9nUR                  U5        M7     U$ )Nr   r  )r(   rv  rK   r  rp  rL   )	r?   r   rr   r  r  r|  r~  rO   r'  s	            rD   r
  #UploadManager._validate_blobs_batch/  sh     )+4
q#g,
3A/E33# 4 I
 MM)$ 4 rG   )r  max_retriesc          	       ^ S n[         R                  " 5       n[        U5       H!  n	 U R                  R	                  UUUUUS9s  $    [%        U[
        5      (       a  Ue['        S
U SU 35      Ue! [
         aG  n
U
R                  (       d*  [        U
5      mSS/n[        U4S jU 5       5      (       d  e U
n S n
A
O6S n
A
f[        [        4 a  n
U
n S n
A
OS n
A
f[         a  n
U
n S n
A
OS n
A
ff = f[        SU	-  S5      n[         R                  " 5       U-
  nX-   [        :  a  [        R                  S[        U5          M  [        R!                  SU	S	-   UUU5        [         R"                  " U5        GMV  )Nr  zCould not update refsz	try againc              3  ,   >#    U  H	  oT;   v   M     g 7frS   rh   )r   r  r   s     rD   r   3UploadManager._commit_with_retry.<locals>.<genexpr>_  s     J7I!I~7Ir     <   zRCommit total wait time would exceed %ds (already %.1fs elapsed), aborting retries.z4Commit attempt %d/%d failed: %s, retrying in %ds ...r   zCommit failed after z attempts: )r  	monotonicrv  r  r  r*   r   rn   r   r   r   r,  rI   r   r-  r   r.  r`  rm   r,   )r?   r   rr   r  r  r  rz  rd  r  re  r3  retryable_patternsr  r>  r   s                 @rD   r   UploadManager._commit_with_retryF  se    (,
^^%
[)G||11#')#1% 2   *N j(++1+k*VW]ggA  {{ #AI*A;)O&J7IJJJ
#\2 
 
 q'z2&Dnn&3G~ <<h0
 NNF! JJts/   A22
C1<=B>>C1CC1%C,,C1c                   US:X  a  SUSUS   US   SSS.$ [        U[        5      (       a  UnOf[        U[        [        45      (       a  [        U5      R	                  5       nO1UR                  5       nUR                  5       nUR                  U5        SUSUS   S[        R                  " U5      R                  5       SS.$ )	Nru   creater   r   rj   rV  rv   base64)rm   r^   rn   r   
read_bytestellrJ   seekr  	b64encodedecode)r?   r  r  r   r  r  content_bytesposs           rD   r  UploadManager._build_operation  s     %"$!+.#K0  /511 /Oc4[99 $_ 5 @ @ B%**, / 4 4 6$$S)"$ !+.!++M:AAC$ rG   c           	         / nU Hb  nUS   nUS   nUR                  S5      =(       d    [        US   US   U5      nU R                  US   UUUUS   S9nUR                  U5        Md     U$ )Nr  r]  r  r  r   r  r  )r   rw   r  r   )	r?   r1  rr   r  item_dr  r   r  ops	            rD   r  %UploadManager._build_batch_operations  s    
F{+I/0I **]3 |*++&8K
 &&#$78 )#'"=1 ' B b!   rG   c                n    U H  nUR                  US   US   US   5        M!     UR                  5         g Nr  r  r  )r  r4  r?   r  r1  r  s       rD   r  #UploadManager._track_uploaded_batch  s9    
 A!!!$7"8!L/1M`Kab rG   c           	         UR                  U Vs/ s H  o3S   US   US   4PM     sn5        UR                  5         g s  snf r  )r  r4  r  s       rD   r  $UploadManager._track_committed_batch  sM    
 	$$X_`X_ST#$aoq9L7MNX_`	
 	 as   ?c           
        [        U5      R                  5       R                  5       nUR                  5       (       d  [	        SU S35      e[        S UR                  S5       5       5      n[        U5      [        :  a  [	        S[        U5       S[         35      e0 nU H/  n	[        U	R                  5      n
UR                  U
S5      S-   X'   M1     UR                  5        H'  u  pU[        :  d  M  [	        SU S	U S
[         35      e   SnSnU Hr  n	U	R                  5       R                  nU[         :  a'  [	        SU	 SUS-  S-  S S[         S-  S-  S S35      eX-  n[#        [        U	5      X5      (       a  Mn  X-  nMt     U[$        :  a  [&        R)                  SU[$        5        U V	s0 s H+  oR+                  U5      R-                  5       [        U	5      _M-     nn	[/        [1        UR3                  5       5      UUS9nU(       a  UR5                  S5       S3OSnU Vs/ s H  nUU-   UU   4PM     nn[&        R7                  S[        U5      5        U$ s  sn	f s  snf )NzProvided path: 'z' is not a directoryc              3  R   #    U  H  oR                  5       (       d  M  Uv   M     g 7frS   )is_file)r   rq   s     rD   r   7UploadManager._prepare_upload_folder.<locals>.<genexpr>  s     R,?D<<>44,?r   z**/*zToo many files (z) in folder, max allowed: r   r   z) in directory z, max allowed per directory: zFile too large:  (rj  r  z MB), max allowed: z.0fz MBzjTotal normal (non-LFS) file size %d bytes exceeds soft limit %d bytes. Consider using LFS for large files.)r   r   r  rj   zPrepared %d files for upload.)r   r  r  is_dirr+   r  globrK   r   rn   r!  r   r   r   r   r   r    rs   r!   r-  r.  relative_toas_posixr   rp  keysr  rE  )r?   r  r  rr   r   r   folder	all_files
dir_countsrq   r!  dir_pathr  
total_sizenormal_sizefsizerelpath_to_abspathfiltered_keysr9  relpathprepareds                        rD   r  $UploadManager._prepare_upload_folder  s    k"--/779}}"%5fX=Q#RSSRFKK,?RR	y>11"%5c)n5EE_`u_v#wxx &(
D%F!+!:Q!>J   *//1OH33&&ug_XJ G22N1OQ   2 
DIIK''E++&&tfBut|d/B3.G H$$84$?$$Fs#K3P  J3t9e77$  <<NNF3	 ZccYbQU..v6??A3t9LYbc,#((*+)+
 3?L&&s+,A.BS`aS`Vg%'9''BCS`a3S]C d bs   52I#,I(c	                   / n	/ n
0 n/ n[        U5      n/ nU H  nUu  u  nnn[        U5      n[        R                  U5      (       a  UR	                  U5        MC  UR	                  U5         [        U[        [        R                  45      (       a  [        R                  " U5      OS nUR                  UU(       a  UR                  OSU(       a  UR                  OSUS9  [        R                  SUUU5        M     UnSS[!        SUS-  5      SSS	.S
SSS["        S	.SSSS[$        S	./n['        U5       GHy  u  nnU(       d    GOmUS   n[        R)                  SU[+        U5      5        / n/ nUS   (       a  [+        U5      S:  a  [-        US   S9 n0 nU H/  u  u  nnnUR/                  U R0                  UUUUUUS9nUU4UU'   M1     [3        U5       H-  nUU   u  nn UR5                  5       nUR	                  U5        M/     S S S 5        O['        U5       H  u  n!u  u  nnnUS   S:  ag  U!S:  aa  US:X  a  US   S[9        U![:        5      -  -  OUS   n"[9        U"[<        5      n"[        R)                  SU"U5        [>        R@                  " U"5         U R1                  UUUUUUS9nUR	                  U5        M     U
RC                  U5        [9        US   [!        S[+        U5      5      5      n#[E        S[+        U5      U#5       H  n$UU$U$U#-    n%U RG                  UU%5        U RI                  U%U5      n&U&(       d  M8   U RK                  UUU&U SU S3US9n'U	R	                  U'5        U RM                  UU%5        [        R)                  SU[+        U%5      5        M     / n)U GH  nUu  u  nnnURO                  US5      S-   UU'   UU   S":  a  UR	                  U5         [        U[        [        R                  45      (       a  [        R                  " U5      OS nUR                  UU(       a  UR                  OSU(       a  UR                  OSS#S9  [        R                  S$U5        M  [        U5      n[        R                  U5      (       a  U)R	                  U5        GM  UR	                  U5         [        U[        [        R                  45      (       a  [        R                  " U5      OS nUR                  UU(       a  UR                  OSU(       a  UR                  OSUS9  [        R                  S%UU5        GM     [+        U5      [+        U)5      -
  n*U*S:  a"  [        R)                  S&UU*[+        U)5      5        OU)(       a  [        RQ                  S'U5        U)nGM|     X-   n+U(       a  [        R                  S([+        U5      5        U+X4$ ! [         a    S n GNHf = f! [6         a!  n UR	                  UU4U 45         S n A GMC  S n A ff = f! , (       d  f       GNo= f! [6         a9  n [        R                  SUUU 5        UR	                  UU4U 45         S n A GMV  S n A ff = f! [6         a  n [        R                  SUU 5        [        U 5      n[        R                  U5      (       d.  U% H!  n(UR                  U(S   U(S   U(S   S U-   S9  M#      S n A GM  U% H  n(UR	                  U(S   U(S!   4U 45        M       S n A GM  S n A ff = f! [         a    S n GNf = f! [         a    S n GNGf = f))Nr   r  z&[ReAct] Permanent failure: %s (%s: %s)zRound 1 (parallel)Tr   r~  r  )nameparallelworkersr|  delayzRound 2 (serial+backoff)Fri  zRound 3 (single-file)r  z#[ReAct] %s: retrying %d file(s) ...r  r  r  r   rr   r  r  r  z*[ReAct] Waiting %ds before retrying %s ...z[ReAct] %s: failed %s - %sr|  r  r  r  z![ReAct] %s: committed %d file(s).z[ReAct] %s commit failed: %sr  r  r  r  r  r4   max_retries_exceededz#[ReAct] Max retries exceeded for %sz"[ReAct] Permanent failure: %s (%s)u@   [ReAct] %s: made progress — %d file(s) resolved, %d remaining.z2[ReAct] %s: no progress, escalating to next round.z8[ReAct] %d file(s) still failing after all retry rounds.))rp  r   r   r   r   rm   rn   r%  r^  r   r   r  r  r   r-  r   r}   r%   r&   r  rE  rK   r   r  r  r   r  r,  rI   r"   r$   r  r`  r  rv  r  r  r  r  r   r.  ),r?   r  r  r   rr   r  r  r  r  r  all_successesretry_countspermanent_failuresr   	remainingitem_errpath_in_repo_rfile_path_rr3  r   r#  round_configs	round_idxcfg
round_nameround_successesround_failuresr+  
future_map_errfuturer  r3  r~  r  r|  r/  batchr  r5  r  new_retryableprogressall_failuress,                                               rD   r  'UploadManager._retry_failed_files_react  s    $&$&')*,&		!H19.)^[3%c*H**844  *"))(31;K#r{{I[1\1\-bfB ##"#%BKK1"$BJJ!'	 $  <"	# ". 	 - q+"23  3!7 0!7/
0 (6NIsVJKK5I +-O*,N:3y>A#5'C	NCx')J?H;5t!) 44*'$+&/$+)5 "1 " /=k-J
6* @I #/z":6@6H3V%+]]_F+226:	 #; DC* AJ)@T<A<5t7|a'AE  )A~  LAQ8Y1Z,Z[!$W 
 !$E+A BH!*
 

5)R!%!9!9*'$+&/$+)5 ": " (..v6/ AUB   1S.As?7K0LMJ$QO(<jI'kJ6NO**7E:!99%K
!a"&"9"9 '"+#-*8)9J<q'I!) #: #K !''4//?KK;"E
#  JJ M*5=2-s/;/?/?PQ/RUV/V^,/14&--h7"5?cSUS^S^M_5`5`RWW[1fj ''&')q&(

a#9	 (  LL!FW)#.!..x88!((2&--h7"5?cSUS^S^M_5`5`RWW[1fj ''&')q&(

a#+	 (  LL<& A +L 9~M(::H!|V&	 H
 &IE 7H *5LLJI
 \88g  BR  ) V*11NK3PRS2TUUV% DCZ % R8&*	 '--/La.PQQRD ! aLL!?QO-a0H)66x@@!&A#// !"5 6 !, !"5 6+4x+?	 0  "' "'A*11A6I4JAkN3[]^2_` "'a. # "!"" # "!"s   -=W#AX$%!W6X$%X6AY<)=\#=\6#W32W36
X!	 X	X$X!	!X$$
X3	6
Y9 -Y44Y9<
\ A#\0$\\ #\32\36]]c                \   [        U5      n[        [        5       GH  nU(       d    U$ [        R	                  SUS-   [        [        U5      5        / n/ nU H/  u  u  nnn U R                  UUUUUU
S9nUR                  U5        M1     U(       a  U R                  X.5        U R                  X5      nU(       as   U R                  UUUU SUS-    S3US9nUR                  U5        U	R                  U5        U R                  X.5        [        R	                  SUS-   [        U5      5        UnGM     U$ ! [         a8  n[        R                  SUU5        UR                  UU4U45         S nAGM  S nAff = f! [         a  n[        R                  S	US-   U5        [        U5      n[         R#                  U5      (       d,  U H!  nUR%                  US
   US   US   SU-   S9  M#      S nANU H+  nUR                  US
   UR'                  SS5      4U45        M-      S nANS nAff = f)Nz5Retry round %d/%d: re-uploading %d failed file(s) ...r   r  z  Retry failed: %s - %sz (retry round r  r  z'  Retry round %d: committed %d file(s).z"  Retry round %d commit failed: %sr  r  r  r  r  r  rj   )rp  rv  r   r-  rE  rK   r  r   r,  r   r  r  r  r  r  r   r   r   r  r   )r?   r  r  r   rr   r  r  r  r  r  r  r*  retry_roundretry_failuresretry_successesr  r  r  r  r3  r  r5  r   s                          rD   r  "UploadManager._retry_failed_simple	  s{    ",/ !?@K%L "!K KKGa.&'	 +-N*,O7I3-tN!55&# '"+ '%1 6 F $**62 8J **7D!99/U
)"&*&=&=$+&/'1/=.>n[[\_L]]^,_%- '> ' %++K8#**?;33GME'!O0> "0O AP "!e ! NLL!:NAN"))NK+H!*LMMN. % "@'!O
 $2!#4-::8DD*9 ' 3 3$*+>$?$*<$8$*+>$?/88/C	 !4 !" +: +: . 5 5 -33F,G,2JJ{B,G)* )*%&!" +:!"s8   !%D6;A2E;6
E8 ,E33E8;
H+A&H&01H&&H+)r  r  r  r  rS   )
r  r0   r  r2   r  zOpenAPIClient | Noner  r	   r[   r\   )r   rn   rr   rn   r  PathOrFileObjr  rn   r  rn   r  rT  r  rn   r   rZ   r  r   r[   r   )r   rn   rr   rn   r  rP  r  rn   r  rT  r  rT  r  rn   r   list[str] | Noner   r  r  z
int | Noner  r   r  r   r  r   r[   zdict | list[dict] | None)r   rn   rr   rn   r  rn   r  zset[str]r  rn   r[   	list[str])rY  r  r[   
list[dict])r  rn   r  rn   r   rn   rr   rn   r  z"UploadTracker | NullTracker | Noner  r	   r  r   r[   r   )r   rn   rr   rn   r   rn   rM   rZ   r   r  r  r   r  rn   r   rZ   r  r	   r[   r   )r   rn   rr   rn   r  r  r[   zdict[str, str | None])r   rn   rr   rn   r  r  r  rn   r  rn   rz  rZ   r[   r   )r  rn   r  r  r   r   r  rn   r  r   r[   r   )r1  r  rr   rn   r[   r  )r  UploadTracker | NullTrackerr1  r  r[   r\   )rk   NN)r  rP  r  rn   rr   rn   r   r  r   r  r[   zlist[tuple[str, str]])F)r  list[tuple]r  r  r   rn   rr   rn   r  rn   r  rn   r  rZ   r  r   r[   z*tuple[list[tuple], list[dict], list[dict]])r  r  r  r  r   rn   rr   rn   r  rn   r  rT  r  rn   r  r  r  r  r  r   r[   r  )ra   rb   rc   rd   re   rE   r  r'   rE  r  rX  r  r  r  r
  r   r  r  r  r  r  r  r  r  rg   rh   rG   rD   r  r  "  s(   U 04	. #.#. . -	. . 
.. ,)-  "G
G
 G
 '	G

 G
 G
 'G
 G
 G
 G
 
G
d %))- +/,0"&*"!&_K_K _K  	_K _K #_K '_K _K )_K *_K  _K _K _K _K  
"!_KH** * 	*
 &* !* 
*X 
 
2 7;!"}
}
 }

 }
 }
 4}
 }
 }
 
}
T #& !D D 	D
 D D D D D D D 
DR  	
 
< !45h 5h 	5h
 5h 5h 5h 5h 
5ht## '# 	#
 # # 
#J.,  
	,  
	" !+/,0?? ? 	?
 )? *? 
?Z #n9!n9 -n9 	n9
 n9 n9 n9 n9 n9 
4n9| #V"!V" -V" 	V"
 V" V" 'V" V" !V"  V" V" 
V" V"rG   r  )rq   rP  rM   rZ   rr   rn   r[   r   )rq   rP  rM   rZ   rr   rn   r[   rn   )r~   rZ   r[   rZ   )r  )r   z)str | Path | bytes | BinaryIO | IO[bytes]r   rZ   r[   r   )rq   rn   r   r  r[   r   )NN)r   r  r   r  r   r  r[   r  )r   r,  r[   rn   )cre   
__future__r   r  builtinsr   r   r   rr  r'  r%  r#  r   r  concurrent.futuresr   r   pathlibr   typingr   r   r	   r
   	tqdm.autor   	constantsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   errorsr)   r*   r+   r,   r-   utils.file_utilsr.   utils.loggerr/   _legacy_apir0   r  r1   r  r2   r-  rn   r^   r  r  r6   rs   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   __annotations__r   r   r   rZ  rr  r  rh   rG   rD   <module>r     s   #     	  	    ?  3 3        <  + $)'!	H	 d
U"X-5	9  @	/A
 ? 
@? (,(,$ & 	 2 2$ --,,,,--%%((,,''''%%((((##+  ""F f fR H68 68|}" }"rG   