Ë
    Q^(h®  ã                   ó   — d 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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  ej*                  e«      Z G d
„ de«      Z G d„ d«      Zdefd„Zde
e   fd„Z G d„ d«      Zy)a  
Implementation of a custom transfer agent for the transfer type "multipart" for
git-lfs.

Inspired by:
github.com/cbartz/git-lfs-swift-transfer-agent/blob/master/git_lfs_swift_transfer.py

Spec is: github.com/git-lfs/git-lfs/blob/master/docs/custom-transfers.md


To launch debugger while developing:

``` [lfs "customtransfer.multipart"]
path = /path/to/huggingface_hub/.env/bin/python args = -m debugpy --listen 5678
--wait-for-client
/path/to/huggingface_hub/src/huggingface_hub/commands/huggingface_cli.py
lfs-multipart-upload ```é    N)Ú_SubParsersAction)ÚDictÚListÚOptional)ÚBaseHuggingfaceCLICommand)ÚLFS_MULTIPART_UPLOAD_COMMANDé   )Úget_sessionÚhf_raise_for_statusÚlogging)ÚSliceFileObjc                   ó&   — e Zd ZdZedefd„«       Zy)ÚLfsCommandsuÈ  
    Implementation of a custom transfer agent for the transfer type "multipart"
    for git-lfs. This lets users upload large files >5GB ðŸ”¥. Spec for LFS custom
    transfer agent is:
    https://github.com/git-lfs/git-lfs/blob/master/docs/custom-transfers.md

    This introduces two commands to the CLI:

    1. $ huggingface-cli lfs-enable-largefiles

    This should be executed once for each model repo that contains a model file
    >5GB. It's documented in the error message you get if you just try to git
    push a 5GB file without having enabled it before.

    2. $ huggingface-cli lfs-multipart-upload

    This command is called by lfs directly and is not meant to be called by the
    user.
    Úparserc                 óÔ   — | j                  dd¬«      }|j                  dt        d¬«       |j                  d„ ¬«       | j                  t        d	¬
«      }|j                  d„ ¬«       y )Nzlfs-enable-largefilesz:Configure your repository to enable upload of files > 5GB.)ÚhelpÚpathz/Local path to repository you want to configure.)Útyper   c                 ó   — t        | «      S ©N)ÚLfsEnableCommand©Úargss    úZ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/huggingface_hub/commands/lfs.pyú<lambda>z1LfsCommands.register_subcommand.<locals>.<lambda>?   ó   € Ô5EÀdÓ5K€ ó    )ÚfuncF)Úadd_helpc                 ó   — t        | «      S r   )ÚLfsUploadCommandr   s    r   r   z1LfsCommands.register_subcommand.<locals>.<lambda>C   r   r   )Ú
add_parserÚadd_argumentÚstrÚset_defaultsr   )r   Úenable_parserÚupload_parsers      r   Úregister_subcommandzLfsCommands.register_subcommand9   sr   € à×)Ñ)Ø#Ð*fð *ó 
ˆð 	×"Ñ" 6´Ð:kÐ"ÔlØ×"Ñ"Ñ(KÐ"ÔLð ×)Ñ)Ô*FÐQVÐ)ÓWˆØ×"Ñ"Ñ(KÐ"ÕLr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr   r(   © r   r   r   r   $   s&   „ ñð( ð	MÐ$5ò 	Mó ñ	Mr   r   c                   ó   — e Zd Zd„ Zd„ Zy)r   c                 ó   — || _         y r   r   ©Úselfr   s     r   Ú__init__zLfsEnableCommand.__init__G   ó	   € Øˆ�	r   c                 ó�  — t         j                  j                  | j                  j                  «      }t         j                  j	                  |«      st        d«       t        d«       t        j                  dj                  «       d|¬«       t        j                  dt        › �j                  «       d|¬«       t        d«       y )Nz)This does not look like a valid git repo.é   z<git config lfs.customtransfer.multipart.path huggingface-cliT)ÚcheckÚcwdz-git config lfs.customtransfer.multipart.args z Local repo set up for largefiles)Úosr   Úabspathr   ÚisdirÚprintÚexitÚ
subprocessÚrunÚsplitr   )r2   Ú
local_paths     r   r?   zLfsEnableCommand.runJ   sŽ   € Ü—W‘W—_‘_ T§Y¡Y§^¡^Ó4ˆ
Ü�w‰w�}‰}˜ZÔ(ÜÐ=Ô>Ü�ŒGÜ�‰ØJ×PÑPÓRØØõ	
ô
 	�‰Ø;Ô<XÐ;YÐZ×`Ñ`ÓbØØõ	
ô
 	Ð0Õ1r   N©r)   r*   r+   r3   r?   r.   r   r   r   r   F   s   „ òó2r   r   Úmsgc                 ó®   — t        j                  | «      dz   }t        j                  j	                  |«       t        j                  j                  «        y)z-Write out the message in Line delimited JSON.ú
N)ÚjsonÚdumpsÚsysÚstdoutÚwriteÚflush)rC   Úmsg_strs     r   Ú	write_msgrM   \   s6   € ä�j‰j˜‹o Ñ$€GÜ‡J�J×Ñ�WÔÜ‡J�J×ÑÕr   Úreturnc                  óH  — t        j                  t        j                  j	                  «       j                  «       «      } d| j                  d«      | j                  d«      fv ry| j                  d«      dvr*t        j                  d«       t        j                  d«       | S )z$Read Line delimited JSON from stdin.Ú	terminater   ÚeventN)ÚdownloadÚuploadzReceived unexpected messager6   )
rF   ÚloadsrH   ÚstdinÚreadlineÚstripÚgetÚloggerÚcriticalr=   )rC   s    r   Úread_msgr[   c   sv   € ä
�*‰*”S—Y‘Y×'Ñ'Ó)×/Ñ/Ó1Ó
2€Cà�s—w‘w˜v“¨¯©°Ó(8Ð9Ñ9àà
‡w�wˆwÓÐ5Ñ5Ü�‰Ð5Ô6Ü�‰�Œà€Jr   c                   ó   — e Zd Zdd„Zdd„Zy)r!   Nc                 ó   — || _         y r   r   r1   s     r   r3   zLfsUploadCommand.__init__s   r4   r   c           
      ó2  — t        j                  t        j                  j	                  «       j                  «       «      }|j                  d«      dk(  r|j                  d«      dk(  s%t        ddddœi«       t        j                  d	«       t        i «       	 t        «       }|€t        j                  d
«       |d   }|d   }|d   d   }|d   d   }t        |j                  d«      «      }t        |j                  «       «      }t        d|d	d
dœ«       g }	t        |d«      5 }
t        |«      D ]‹  \  }}t!        |
||z  |¬«      5 }t#        «       j%                  ||¬«      }t'        |«       |	j)                  |j*                  j                  d«      |d	z   dœ«       t        d||d	z   |z  |dœ«       d d d «       Œ� 	 d d d «       t#        «       j-                  |||	dœ¬«      }t'        |«       t        d|dœ«       �Œh# 1 sw Y   ŒÙxY w# 1 sw Y   ŒNxY w)NrQ   ÚinitÚ	operationrS   Úerroré    zWrong lfs init operation)ÚcodeÚmessager6   r   Úoidr   ÚactionÚhrefÚheaderÚ
chunk_sizeÚprogress)rQ   re   Ú
bytesSoFarÚbytesSinceLastÚrb)Ú	seek_fromÚ
read_limit)ÚdataÚetag)rq   Ú
partNumber)re   Úparts)rF   Úcomplete)rQ   re   )rF   rT   rH   rU   rV   rW   rX   rM   r=   r[   ÚintÚpopÚlistÚvaluesÚopenÚ	enumerater   r
   Úputr   ÚappendÚheadersÚpost)r2   Úinit_msgrC   re   ÚfilepathÚcompletion_urlrh   ri   Úpresigned_urlsrs   ÚfileÚiÚpresigned_urlrp   Úrs                  r   r?   zLfsUploadCommand.runv   s  € ô —:‘:œcŸi™i×0Ñ0Ó2×8Ñ8Ó:Ó;ˆØ—‘˜WÓ%¨Ò/°H·L±LÀÓ4MÐQYÒ4YÜ�w¨Ð8RÑ SÐTÔUÜ�H‰H�QŒKô 	�"Œð Ü“*ˆCØˆ{ô
 —‘˜”à�e‘*ˆCØ˜6‘{ˆHØ  ™]¨6Ñ2ˆNØ˜‘] 8Ñ,ˆFÜ˜VŸZ™Z¨Ó5Ó6ˆJÜ(,¨V¯]©]«_Ó(=ˆNô
 à'ØØ"#Ø&'ñ	ôð ˆEÜ�h Ó%ð ¨Ü(1°.Ó(Aò Ñ$�A�}Ü%ØØ"# j¡.Ø#-ôð ð Ü'›M×-Ñ-¨mÀ$Ð-ÓG˜Ü+¨AÔ.ØŸ™à()¯	©	¯©°fÓ(=Ø./°!©eñôô "à)3Ø'*Ø/0°1©u¸
Ñ.BØ2<ñ	ô÷ð ñ÷ô6 “×"Ñ"ØàØ"ñð #ó ˆAô   Ô"ä 
°3Ñ7Ô8ñC ÷>ð ú÷ð ús%   Ä%#HÅA-HÆ5
HÈH
ÈHÈH)rN   NrB   r.   r   r   r!   r!   r   s   „ óôR9r   r!   )r,   rF   r9   r>   rH   Úargparser   Útypingr   r   r   Úhuggingface_hub.commandsr   Úhuggingface_hub.lfsr   Úutilsr
   r   r   Ú
utils._lfsr   Ú
get_loggerr)   rY   r   r   rM   r[   r!   r.   r   r   ú<module>rŽ      s†   ðñó$ Û 	Û Û 
Ý &ß 'Ñ 'å >Ý <ç =Ñ =Ý %ð 
ˆ×	Ñ	˜HÓ	%€ôMÐ+ô M÷D2ñ 2ð,�4ó ð�(˜4‘.ó ÷V9ò V9r   