
    HTh                        S r SSKrSSKrSSKrSSKrSSKJr  SSKJrJ	r	J
r
  SSKJr  SSKJr  SSKJrJrJr  SS	KJr  \R*                  " \5      r " S
 S\5      r " S S5      rS\4S jrS\
\   4S jr " S S5      rg)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                   0    \ rS rSrSr\S\4S j5       rSrg)LfsCommands$   u  
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                     U R                  SSS9nUR                  S[        SS9  UR                  S S9  U R                  [        S	S
9nUR                  S S9  g )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                     [        U 5      $ N)LfsEnableCommandargss    T/var/www/auris/envauris/lib/python3.13/site-packages/huggingface_hub/commands/lfs.py<lambda>1LfsCommands.register_subcommand.<locals>.<lambda>?   
    5Ed5K    )funcF)add_helpc                     [        U 5      $ r   )LfsUploadCommandr   s    r   r   r   C   r   r   )
add_parseradd_argumentstrset_defaultsr   )r   enable_parserupload_parsers      r   register_subcommandLfsCommands.register_subcommand9   sr    ))#*f * 
 	""6:k"l""(K"L ))*FQV)W""(K"Lr    N)	__name__
__module____qualname____firstlineno____doc__staticmethodr   r*   __static_attributes__r,   r   r   r   r   $   s&    ( 	M$5 	M 	Mr   r   c                        \ rS rSrS rS rSrg)r   F   c                     Xl         g r   r   selfr   s     r   __init__LfsEnableCommand.__init__G       	r   c                    [         R                  R                  U R                  R                  5      n[         R                  R	                  U5      (       d  [        S5        [        S5        [        R                  " SR                  5       SUS9  [        R                  " S[         3R                  5       SUS9  [        S5        g )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   )r8   
local_paths     r   rF   LfsEnableCommand.runJ   s    WW__TYY^^4
ww}}Z((=>GJPPR	

 	;<X;YZ``b	

 	01r   r   Nr-   r.   r/   r0   r9   rF   r3   r,   r   r   r   r   F   s    2r   r   msgc                     [         R                  " U 5      S-   n[        R                  R	                  U5        [        R                  R                  5         g)z-Write out the message in Line delimited JSON.
N)jsondumpssysstdoutwriteflush)rK   msg_strs     r   	write_msgrU   \   s6    jjo$GJJWJJr   returnc                  T   [         R                  " [        R                  R	                  5       R                  5       5      n SU R                  S5      U R                  S5      4;   a  gU R                  S5      S;  a+  [        R                  S5        [        R                  " S5        U $ )z$Read Line delimited JSON from stdin.	terminater   eventN)downloaduploadzReceived unexpected messager=   )
rN   loadsrP   stdinreadlinestripgetloggercriticalrD   )rK   s    r   read_msgrc   c   sv    
**SYY'')//1
2Cswwv(899
www5556Jr   c                   (    \ rS rSrSS jrSS jrSrg)r#   r   Nc                     Xl         g r   r   r7   s     r   r9   LfsUploadCommand.__init__s   r;   r   c           
      @   [         R                  " [        R                  R	                  5       R                  5       5      nUR                  S5      S:X  a  UR                  S5      S:X  d&  [        SSSS.05        [        R                  " S	5        [        0 5         [        5       nUc  [        R                  " S
5        US   nUS   nUS   S   nUS   S   n[        UR                  S5      5      n[        UR                  5       5      n[        SUS	S
S.5        / n	[        US5       n
[        U5       H  u  p[!        U
X-  US9 n[#        5       R%                  XS9n['        U5        U	R)                  UR*                  R                  S5      US	-   S.5        [        SUUS	-   U-  US.5        S S S 5        M     S S S 5        [#        5       R-                  UUU	S.S9n['        U5        [        SUS.5        GM`  ! , (       d  f       M  = f! , (       d  f       NW= f)NrY   init	operationr[   error    zWrong lfs init operation)codemessager=   r   oidr   actionhrefheader
chunk_sizeprogress)rY   ro   
bytesSoFarbytesSinceLastrb)	seek_from
read_limit)dataetag)r{   
partNumber)ro   parts)rN   complete)rY   ro   )rN   r\   rP   r]   r^   r_   r`   rU   rD   rc   intpoplistvaluesopen	enumerater   r
   putr   appendheaderspost)r8   init_msgrK   ro   filepathcompletion_urlrr   rs   presigned_urlsr}   fileipresigned_urlrz   rs                  r   rF   LfsUploadCommand.runv   s	    ::cii00288:;W%/HLL4MQY4Yw8R STUHHQK 	" *C{
 e*C6{H ]62N]8,FVZZ56J(,V]]_(=N
 '"#&'	 Eh%(1.(A$A%"#.#- 'M--m-G+A.()		f(=./!e ")3'*/01u
.B2<	  )B &6 """ # A  "
378C >  &%s%   +H	A)G=2H=
HH
Hr   )rV   NrJ   r,   r   r   r#   r#   r   s    R9r   r#   )r1   rN   r@   rE   rP   argparser   typingr   r   r   huggingface_hub.commandsr   huggingface_hub.lfsr   utilsr
   r   r   
utils._lfsr   
get_loggerr-   ra   r   r   rU   rc   r#   r,   r   r   <module>r      s   $  	  
 & ' ' > < = = % 
		H	%M+ MD2 2,4 (4. V9 V9r   