§
    «˜º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dS )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dS )Ú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                 ó  — |                       dd¬¦  «        }|                     dt          d¬¦  «         |                     d„ ¬¦  «         |                       t          d	¬
¦  «        }|                     d„ ¬¦  «         d S )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    úd/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/huggingface_hub/commands/lfs.pyú<lambda>z1LfsCommands.register_subcommand.<locals>.<lambda>?   ó   € Õ5EÀdÑ5KÔ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   s˜   € à×)Ò)Ø#Ð*fð *ñ 
ô 
ˆð 	×"Ò" 6µÐ:kÐ"ÑlÔlÐlØ×"Ò"Ð(KÐ(KÐ"ÑLÔLÐLð ×)Ò)Õ*FÐQVÐ)ÑWÔWˆØ×"Ò"Ð(KÐ(KÐ"ÑLÔLÐLÐLÐLr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr   r(   © r   r   r   r   $   sM   € € € € € ðð ð( ð	MÐ$5ð 	Mð 	Mð 	Mñ „\ð	Mð 	Mð 	Mr   r   c                   ó   — e Zd Zd„ Zd„ ZdS )r   c                 ó   — || _         d S r   r   ©Úselfr   s     r   Ú__init__zLfsEnableCommand.__init__G   ó   € ØˆŒ	ˆ	ˆ	r   c                 ó¤  — t           j                             | j        j        ¦  «        }t           j                             |¦  «        st          d¦  «         t          d¦  «         t          j        d 	                    ¦   «         d|¬¦  «         t          j        dt          › � 	                    ¦   «         d|¬¦  «         t          d¦  «         d S )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—_’_ T¤Y¤^Ñ4Ô4ˆ
ÝŒw�}Š}˜ZÑ(Ô(ð 	ÝÐ=Ñ>Ô>Ð>Ý�‰GŒGˆGÝŒØJ×PÒPÑRÔRØØð	
ñ 	
ô 	
ð 	
õ
 	ŒØZÕ<XÐZÐZ×`Ò`ÑbÔbØØð	
ñ 	
ô 	
ð 	
õ
 	Ð0Ñ1Ô1Ð1Ð1Ð1r   N©r)   r*   r+   r3   r?   r.   r   r   r   r   F   s2   € € € € € ðð ð ð2ð 2ð 2ð 2ð 2r   r   Úmsgc                 ó®   — t          j        | ¦  «        dz   }t          j                             |¦  «         t          j                             ¦   «          dS )z-Write out the message in Line delimited JSON.ú
N)ÚjsonÚdumpsÚsysÚstdoutÚwriteÚflush)rC   Úmsg_strs     r   Ú	write_msgrM   \   sD   € åŒj˜‰oŒo Ñ$€GÝ„J×Ò�WÑÔÐÝ„J×ÒÑÔÐÐÐr   Úreturnc                  óp  — t          j        t          j                             ¦   «                              ¦   «         ¦  «        } d|                      d¦  «        |                      d¦  «        fv rdS |                      d¦  «        dvr.t                               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   s“   € å
Œ*•S”Y×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1Ñ
2Ô
2€Cà�s—w’w˜v‘”¨¯ª°Ñ(8Ô(8Ð9Ð9Ð9àˆtà
‡w‚wˆwÑÔÐ5Ð5Ð5Ý�ŠÐ5Ñ6Ô6Ð6ÝŒ�‰Œˆà€Jr   c                   ó   — e Zd Zdd„Zdd„ZdS )r!   rN   Nc                 ó   — || _         d S r   r   r1   s     r   r3   zLfsUploadCommand.__init__s   r4   r   c           
      ó  — t          j        t          j                             ¦   «                              ¦   «         ¦  «        }|                     d¦  «        dk    r|                     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          |                     d¦  «        ¦  «        }t          |                     ¦   «         ¦  «        }t          d|d	ddœ¦  «         g }	t          |d¦  «        5 }
t          |¦  «        D ]±\  }}t!          |
||z  |¬¦  «        5 }t#          ¦   «                              ||¬¦  «        }t'          |¦  «         |	                     |j                             d¦  «        |d	z   dœ¦  «         t          d||d	z   |z  |dœ¦  «         d d d ¦  «         n# 1 swxY w Y   Œ²	 d d d ¦  «         n# 1 swxY w Y   t#          ¦   «                              |||	dœ¬¦  «        }t'          |¦  «         t          d|dœ¦  «         �ŒÜ)NrQ   ÚinitÚ	operationrS   Úerroré    zWrong lfs init operation)ÚcodeÚmessager6   Tr   Ú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   s1  € õ ”:�cœi×0Ò0Ñ2Ô2×8Ò8Ñ:Ô:Ñ;Ô;ˆØ—’˜WÑ%Ô%¨Ò/Ð/°H·L²LÀÑ4MÔ4MÐQYÒ4YÐ4YÝ�w¨Ð8RÐ SÐ SÐTÑUÔUÐUÝŒH�Q‰KŒKˆKõ 	�"‰ŒˆðA	9Ý‘*”*ˆCØˆ{õ
 ”˜‘”�à�e”*ˆCØ˜6”{ˆHØ  œ]¨6Ô2ˆNØ˜”] 8Ô,ˆFÝ˜VŸZšZ¨Ñ5Ô5Ñ6Ô6ˆJÝ(,¨V¯]ª]©_¬_Ñ(=Ô(=ˆNõ
 à'ØØ"#Ø&'ð	ð ñô ð ð ˆEÝ�h Ñ%Ô%ð ¨Ý(1°.Ñ(AÔ(Að ð Ñ$�A�}Ý%ØØ"# j¡.Ø#-ðñ ô ð ð Ý'™MœM×-Ò-¨mÀ$Ð-ÑGÔG˜Ý+¨AÑ.Ô.Ð.ØŸšà()¬	¯ª°fÑ(=Ô(=Ø./°!©eðð ñô ð õ "à)3Ø'*Ø/0°1©u¸
Ñ.BØ2<ð	ð ñô ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øððð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ6 ‘”×"Ò"ØàØ"ðð ð #ñ ô ˆAõ   Ñ"Ô"Ð"å 
°3Ð7Ð7Ñ8Ô8Ð8ñCA	9s7   Å&*H5ÆB HÈH5ÈH È H5È#H È$H5È5H9È<H9)rN   NrB   r.   r   r   r!   r!   r   sB   € € € € € ðð ð ð ðR9ð R9ð R9ð R9ð R9ð 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ð Mð Mð MÐ+ñ Mô Mð MðD2ð 2ð 2ð 2ð 2ñ 2ô 2ð 2ð,�4ð ð ð ð ð�(˜4”.ð ð ð ð ðV9ð V9ð V9ð V9ð V9ñ V9ô V9ð V9ð V9ð V9r   