Ë
    ëÿæiô  ã                   óú   — 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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d	ee ej,                  d
¬«      f   ddfd„Zdefd„Zdedz  fd„Z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/.venv/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)Ú	Annotated)ÚCLIError)ÚLFS_MULTIPART_UPLOAD_COMMANDé   )Úget_sessionÚhf_raise_for_statusÚlogging)ÚSliceFileObjÚpathz/Local path to repository you want to configure.)ÚhelpÚreturnc                 óR  — t         j                  j                  | «      }t         j                  j                  |«      st	        d«      ‚t        j                  dj                  «       d|¬«       t        j                  dt        › �j                  «       d|¬«       t        d«       y)zÑ
    Configure your repository to enable upload of files > 5GB.

    This command sets up git-lfs to use the custom multipart transfer agent
    which enables efficient uploading of large files in chunks.
    z)This does not look like a valid git repo.z/git config lfs.customtransfer.multipart.path hfT)ÚcheckÚcwdz-git config lfs.customtransfer.multipart.args z Local repo set up for largefilesN)
Úosr   ÚabspathÚisdirr   Ú
subprocessÚrunÚsplitr   Úprint)r   Ú
local_paths     úl/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/huggingface_hub/cli/lfs.pyÚlfs_enable_largefilesr   %   s„   € ô —‘—‘ Ó&€JÜ�7‰7�=‰=˜Ô$ÜÐBÓCÐCÜ‡N�NØ9×?Ñ?ÓAØØõô
 ‡N�NØ
7Ô8TÐ7UÐV×\Ñ\Ó^ØØõô
 
Ð
,Õ-ó    Ú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)r   Úmsg_strs     r   Ú	write_msgr&   C   s6   € ä�j‰j˜‹o Ñ$€GÜ‡J�J×Ñ�WÔÜ‡J�J×ÑÕr   c                  ó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.Ú	terminateÚtypeÚeventN)ÚdownloadÚuploadzReceived unexpected messageé   )
r   Úloadsr!   ÚstdinÚreadlineÚstripÚgetÚloggerÚcriticalÚexit)r   s    r   Úread_msgr6   J   sv   € ä
�*‰*”S—Y‘Y×'Ñ'Ó)×/Ñ/Ó1Ó
2€Cà�s—w‘w˜v“¨¯©°Ó(8Ð9Ñ9àà
‡w�wˆwÓÐ5Ñ5Ü�‰Ð5Ô6Ü�‰�Œà€Jr   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)zÜInternal git-lfs custom transfer agent for multipart uploads.

    This function implements the custom transfer protocol for git-lfs multipart uploads.
    Handles chunked uploads of large files to Hugging Face Hub.
    r*   ÚinitÚ	operationr,   Úerroré    zWrong lfs init operation)ÚcodeÚmessager-   Nr   Úoidr   ÚactionÚhrefÚheaderÚ
chunk_sizeÚprogress)r*   r>   Ú
bytesSoFarÚbytesSinceLastÚrb)Ú	seek_fromÚ
read_limit)ÚdataÚetag)rJ   Ú
partNumber)r>   Úparts)r   Úcomplete)r*   r>   )r   r.   r!   r/   r0   r1   r2   r&   r5   r6   ÚintÚpopÚlistÚvaluesÚopenÚ	enumerater
   r   Úputr   ÚappendÚheadersÚpost)Úinit_msgr   r>   ÚfilepathÚcompletion_urlrA   rB   Úpresigned_urlsrL   ÚfileÚiÚpresigned_urlrI   Úrs                 r   Úlfs_multipart_uploadr`   Y   s  € ô �z‰zœ#Ÿ)™)×,Ñ,Ó.×4Ñ4Ó6Ó7€HØ�L‰L˜Ó! VÒ+°·±¸[Ó0IÈXÒ0UÜ�7 RÐ4NÑOÐPÔQÜ�‰�Œô ˆb„Mð Ü‹jˆØˆ;ô
 �H‰H�QŒKà�%‰jˆØ�v‘;ˆØ˜X™ vÑ.ˆØ�X‘˜xÑ(ˆÜ˜Ÿ™ LÓ1Ó2ˆ
Ü$(¨¯©«Ó$9ˆô
 	à#ØØØ"#ñ	ô	
ð ˆÜ�(˜DÔ! TÜ$-¨nÖ$=Ñ ��=Ü!ØØ *™nØ)õð Ü#›×)Ñ)¨-¸dÐ)ÓC�AÜ'¨Ô*Ø—L‘Là$%§I¡I§M¡M°&Ó$9Ø*+¨a©%ñôô à%/Ø#&Ø+,¨q©5°JÑ*>Ø.8ñ	ô÷ð ñ %>÷ "ô4 ‹M×ÑØàØñð ó 
ˆô 	˜AÔä˜J¨sÑ3Ô4ñA ÷>ð ú÷ "Ð!ús%   Ä%#HÅA-HÆ5
HÈH
ÈHÈH)r   N)Ú__doc__r   r   r   r!   Útypingr   ÚtyperÚhuggingface_hub.errorsr   Úhuggingface_hub.lfsr   Úutilsr   r   r	   Ú
utils._lfsr
   Ú
get_loggerÚ__name__r3   ÚstrÚArgumentr   Údictr&   r6   r`   © r   r   Ú<module>rn      s˜   ðñó$ Û 	Û Û 
Ý ã å +Ý <ç =Ñ =Ý %ð 
ˆ×	Ñ	˜HÓ	%€ð.Ø
ØØˆ�‰ØBô	
ð	ñð.ð 
ó.ð<�4ó ð�$˜‘+ó ôV5r   