
    gj@                     $   d Z ddlZddlZddl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 ddlmZ d	d
lmZmZmZmZmZmZ d	dlmZ d	dlmZmZ e
rd	dlmZ  ej        e           Z! ej"        d          Z#dZ$dddZ% G d d          Z&e	 	 	 	 d8dee&         de'dz  de'de'de'dz  de'dz  de(e'e'f         dz  de)e'         dz  de*e)e(         e)e(         e'dz  f         fd            Z+ G d de          Z, G d  d!e          Z-	 	 	 d9d"d#d$e(de'dz  de(e'e'f         dz  de'dz  ddfd%Z.d&e(fd'Z/d(e(fd)Z0d*e(fd+Z1d"d#d,e'ddfd-Z2d"d#d.e(d/e3d,e'ddf
d0Z4d.e(d1e&d/e3de)e'         fd2Z5d3e)e(         d4e'de-fd5Z6d"d#d6e)e'         d/e3de)e(         fd7Z7dS ):z.Git LFS related type definitions and utilities    N)Iterable)ceil)getsize)TYPE_CHECKINGBinaryIO	TypedDict)unquote)	constants   )build_hf_headersfix_hf_endpoint_in_urlhf_raise_for_statushttp_backoffloggingvalidate_hf_hub_args)SliceFileObj)sha256sha_fileobj)CommitOperationAddz^[0-9a-f]{40}$zlfs-multipart-uploadzapplication/vnd.git-lfs+json)AcceptzContent-Typec            
           e Zd ZdZ	 	 ddedededz  dedz  fdZedefd	            Z	e	j
        d
eddfd            Z	edefd            ZdefdZedefd            Zedefd            Zedefd            ZdS )
UploadInfoa  
    Data structure holding required information to determine whether a blob
    should be uploaded to the hub using the LFS protocol or the regular protocol.

    The SHA256 of the blob is computed lazily: creating an `UploadInfo` from a local path only reads
    the first 512 bytes of the file. The full file is read (and hashed) only if `sha256` is accessed
    before it has been set. When a file is uploaded through the Xet protocol, the SHA256 is computed
    during upload (single read pass) and set afterwards.

    Args:
        size (`int`):
            Size in bytes of the blob
        sample (`bytes`):
            First 512 bytes of the blob
        sha256 (`bytes`, *optional*):
            SHA256 hash of the blob, if already known. Otherwise computed lazily from `source_path`.
        source_path (`str`, *optional*):
            Path to the local file the blob comes from. Required to lazily compute `sha256` if not provided.
    Nsizesampler   source_pathc                 d    ||t          d          || _        || _        || _        || _        d S )Nz2Either `sha256` or `source_path` must be provided.)
ValueErrorr   r   _sha256_source_path)selfr   r   r   r   s        W/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/huggingface_hub/lfs.py__init__zUploadInfo.__init__J   s@     >k1QRRR	'    returnc                     | j         J| j        J t          | j        d          5 }t          |          | _         ddd           n# 1 swxY w Y   | j         S )zZSHA256 of the blob. If not set yet, reads the whole file from `source_path` to compute it.Nrb)r   r   openr   )r    files     r!   r   zUploadInfo.sha256X   s     <$000d'.. 1$*4001 1 1 1 1 1 1 1 1 1 1 1 1 1 1|s   AAAvaluec                     || _         d S )Nr   )r    r)   s     r!   r   zUploadInfo.sha256a   s    r#   c                     | j         duS )zVWhether the SHA256 is already known (accessing `sha256` will not trigger a file read).Nr+   )r    s    r!   	is_hashedzUploadInfo.is_hashede   s     |4''r#   c                 b    | j         | j                                         nd}d| j         d| dS )Nz<not computed>zUploadInfo(size=z	, sha256=))r   hexr   )r    shas     r!   __repr__zUploadInfo.__repr__j   s=    $(L$<dl   BR<$)<<c<<<<r#   pathc                     t          |          }t          |d          5 }|                    d          d d         }d d d            n# 1 swxY w Y    | |||          S )Nr&      )r   r   r   )r   r'   peek)clsr3   r   r(   r   s        r!   	from_pathzUploadInfo.from_pathn   s    t}}$ 	*YYs^^DSD)F	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*sV>>>>s   A

AAdatac                     t          |                                          } | t          |          |d d         |          S )Nr5   )r   r   r   )r   digestlen)r7   r9   r1   s      r!   
from_byteszUploadInfo.from_bytesu   s>    Tll!!##sD		$tt*SAAAAr#   fileobjc                    |                     d          }|                    dt          j                   t	          |          }|                                }|                    dt          j                    | |||          S )Nr5   r   )r   r   r   )readseekioSEEK_SETr   tell)r7   r>   r   r1   r   s        r!   from_fileobjzUploadInfo.from_fileobjz   sp    c""Q$$$'""||~~Q$$$sS8888r#   )NN)__name__
__module____qualname____doc__intbytesstrr"   propertyr   setterboolr-   r2   classmethodr8   r=   r   rE    r#   r!   r   r   5   s        0  $"&( (( ( 	(
 4Z( ( ( (     X ]E d    ] (4 ( ( ( X(=# = = = = ?S ? ? ? [? Be B B B [B 98 9 9 9 [9 9 9r#   r   upload_infostoken	repo_typerepo_idrevisionendpointheaders	transfersr$   c                 |   ||nt           j        }d}|t           j        v rt           j        |         }| d| | d}	d||nddgd | D             d	d
}
|dt          |          i|
d<   i t          t          |          |pi }t          d|	||
          }t          |           |                                }|	                    dd          }t          |t                    st          d          |	                    d          }t          |t                    r|nd}d |D             d |D             |fS )a  
    Requests the LFS batch endpoint to retrieve upload instructions

    Learn more: https://github.com/git-lfs/git-lfs/blob/main/docs/api/batch.md

    Args:
        upload_infos (`Iterable` of `UploadInfo`):
            `UploadInfo` for the files that are being uploaded, typically obtained
            from `CommitOperationAdd.upload_info`
        token (`str` or `None`):
            An authentication token (see https://huggingface.co/settings/token).
            Pass `None` to fall back to the local cached token (or no token if unauthenticated).
        repo_type (`str`):
            Type of the repo to upload to: `"model"`, `"dataset"` or `"space"`.
        repo_id (`str`):
            A namespace (user or an organization) and a repo name separated
            by a `/`.
        revision (`str`, *optional*):
            The git revision to upload to.
        endpoint (`str`, *optional*):
            The Hub endpoint to send the request to. Defaults to the value of `HF_ENDPOINT`.
        headers (`dict`, *optional*):
            Additional headers to include in the request
        transfers (`list`, *optional*):
            List of transfer methods to use. Defaults to ["basic", "multipart"].

    Returns:
        `LfsBatchInfo`: 3-tuple:
            - First element is the list of upload instructions from the server
            - Second element is a list of errors, if any
            - Third element is the chosen transfer adapter if provided by the server (e.g. "basic", "multipart", "xet")

    Raises:
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If an argument is invalid or the server response is malformed.
        [`HfHubHTTPError`]
            If the server returned an error.
    N /z.git/info/lfs/objects/batchuploadbasic	multipartc                 P    g | ]#}|j                                         |j        d $S )oidr   )r   r0   r   ).0r]   s     r!   
<listcomp>z'post_lfs_batch_info.<locals>.<listcomp>   sG     
 
 

  }((** 
 
 
r#   r   )	operationrY   objects	hash_algonameref)rS   POSTrX   jsonrf   zMalformed response from servertransferc                 4    g | ]}d |vt          |          S error)_validate_batch_actionsrc   objs     r!   rd   z'post_lfs_batch_info.<locals>.<listcomp>   s+    OOO#G3<N<N	 	%	%<N<N<Nr#   c                 4    g | ]}d |v t          |          S ro   )_validate_batch_errorrr   s     r!   rd   z'post_lfs_batch_info.<locals>.<listcomp>   s&    III'S..	s	#	#...r#   )r
   ENDPOINTREPO_TYPES_URL_PREFIXESr	   LFS_HEADERSr   r   r   rl   get
isinstancelistr   rL   )rR   rS   rT   rU   rV   rW   rX   rY   
url_prefix	batch_urlpayloadresp
batch_inforf   chosen_transfers                  r!   post_lfs_batch_infor      s   b $/xxY5GHJI5556yA
NNjN'NNNI"+"7YYg{=S
 

 '
 
 
  G  '("3"34


'
'
' =bG
 	7IIIDJnnY--Ggt$$ ;9::: nnZ00O)3OS)I)ISootO 	POOOOIIwIII r#   c                   $    e Zd ZU eed<   eed<   dS )PayloadPartT
partNumberetagN)rF   rG   rH   rJ   __annotations__rL   rQ   r#   r!   r   r      s"         OOO
IIIIIr#   r   c                   4    e Zd ZU dZeed<   ee         ed<   dS )CompletionPayloadTz?Payload that will be sent to the Hub when uploading multi-part.rb   partsN)rF   rG   rH   rI   rL   r   r{   r   rQ   r#   r!   r   r      s2         II	HHHr#   r   re   r   lfs_batch_actionc                    t          |           |                    d          }|%t                              d| j         d           dS |d         d         }t          |           |d                             d          }|t          |           |                    di           }|                    d          }	t          |d	         |
          }
|	M	 t          |	          }	n(# t          t          f$ r t          d|	 d          w xY wt          | ||	|
           nt          | |
           |t          |           t          |d	         |          }t          d|t          ||          | j        j                                        | j        j        d          }t%          |           t                              | j         d           dS )a  
    Handles uploading a given object to the Hub with the LFS protocol.

    Can be a No-op if the content of the file is already present on the hub large file storage.

    Args:
        operation (`CommitOperationAdd`):
            The add operation triggering this upload.
        lfs_batch_action (`dict`):
            Upload instructions from the LFS batch endpoint for this object. See [`~utils.lfs.post_lfs_batch_info`] for
            more details.
        token (`str`, *optional*):
            An authentication token (see https://huggingface.co/settings/token). Used to call the
            optional LFS verify step at the end of the upload. If `None`, falls back to the local
            cached token.
        headers (`dict`, *optional*):
            Headers to include in the request, including authentication and user agent headers.
        endpoint (`str`, *optional*):
            The Hub endpoint to send the request to. Defaults to the value of `HF_ENDPOINT`.

    Raises:
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If `lfs_batch_action` is improperly formatted
        [`HfHubHTTPError`]
            If the upload resulted in an error
    actionsNzContent of file z. is already present upstream - skipping uploadr]   verifyheader
chunk_sizehref)rW   zTMalformed response from LFS batch endpoint: `chunk_size` should be an integer. Got 'z'.)re   r   r   
upload_url)re   r   rj   )rS   rX   ra   rk   z: Upload successful)rq   ry   loggerdebugpath_in_repo_validate_lfs_actionr   rJ   r   	TypeError_upload_multi_part_upload_single_partr   r   upload_infor   r0   r   r   )re   r   rS   rX   rW   r   upload_actionverify_actionr   r   r   
verify_urlverify_resps                r!   
lfs_uploadr      s   D ,---""9--Gn	(>nnnooo %Y/9M'''$Y/33H==M ]+++ x,,FL))J'f(=QQQJ	ZJJI& 	 	 	ugquuu  	 	Yv*akllllliJGGGG  ]++++M&,A8LL
"$5'BBB".599;;YEZE_``	
 
 
 	K(((
LLI*???@@@@@s   C* *%D
lfs_actionc                     t          |                     d          t                    r=|                     d          7t          |                     d          t                    st	          d          | S ).validates response from the LFS batch endpointr   r   Nz"lfs_action is improperly formatted)rz   ry   rL   dictr   )r   s    r!   r   r   9  se     	:>>&))3//?^^H%%-JNN8<T<TVZ1[1[-=>>>r#   lfs_batch_actionsc                    t          |                     d          t                    r(t          |                     d          t                    st	          d          |                     di                               d          }|                     di                               d          }|t          |           |t          |           | S )r   rb   r   z)lfs_batch_actions is improperly formattedr   r]   r   )rz   ry   rL   rJ   r   r   )r   r   r   s      r!   rq   rq   C  s    (,,U33S99 FjIZI^I^_eIfIfhk>l>l FDEEE%)))R88<<XFFM%)))R88<<XFFM ]+++ ]+++r#   lfs_batch_errorc                    t          |                     d          t                    r(t          |                     d          t                    st	          d          |                     d          }t          |t
                    rPt          |                    d          t                    r(t          |                    d          t                    st	          d          | S )r   rb   r   z'lfs_batch_error is improperly formattedrp   messagecode)rz   ry   rL   rJ   r   r   )r   
error_infos     r!   ru   ru   Q  s    **511377 DJGZGZ[aGbGbdg<h<h DBCCC $$W--J:t$$Dz~~i00#66D z~~f--s33D
 BCCCr#   r   c                     |                      d          5 }t          d||          }t          |           ddd           dS # 1 swxY w Y   dS )aK  
    Uploads `fileobj` as a single PUT HTTP request (basic LFS transfer protocol)

    Args:
        upload_url (`str`):
            The URL to PUT the file to.
        fileobj:
            The file-like object holding the data to upload.

    Raises:
        [`HfHubHTTPError`]
            If the upload resulted in an error.
    T	with_tqdmPUTr9   N)as_filer   r   )re   r   r>   responses       r!   r   r   _  s     
		T		*	* &gz@@@H%%%& & & & & & & & & & & & & & & & & &s   "AA
A
r   r   c           	          t          || j        |          }t          | ||          }t          d|t	          || j        j                                                  t                    }t          |           dS )z@
    Uploads file using HF multipart LFS transfer protocol.
    )r   r   r   )re   sorted_parts_urlsr   rj   )rl   rX   N)	_get_sorted_parts_urlsr   _upload_parts_iterativelyr   _get_completion_payloadr   r0   rx   r   )re   r   r   r   r   response_headerscompletion_ress          r!   r   r   s  s    
 /f)J_lvwww 1/@Z   "$%5y7L7S7W7W7Y7YZZ	  N '''''r#   r   c                     d t          d |                                 D             d           D             }t          |          }|t          |j        |z            k    rt          d          |S )Nc                     g | ]\  }}|S rQ   rQ   )rc   _r   s      r!   rd   z*_get_sorted_parts_urls.<locals>.<listcomp>  s,     
 
 
Az 	
 
 
r#   c                     g | ]>\  }}|                                 r%t          |          d k    ,t          |d          |f?S )r   
   )isdigitr<   rJ   )rc   part_numr   s      r!   rd   z*_get_sorted_parts_urls.<locals>.<listcomp>  s\       (Hj##%% +.h--!*;*; Xr""J/*;*;*;r#   c                     | d         S )Nr   rQ   )ts    r!   <lambda>z(_get_sorted_parts_urls.<locals>.<lambda>  s
    !A$ r#   )keyz0Invalid server response to upload large LFS file)sorteditemsr<   r   r   r   )r   r   r   sorted_part_upload_urls	num_partss        r!   r   r     s    
 
# ,2LLNN  
 
 
 

 
 
 +,,ID)J67777KLLL""r#   r   rb   c                     g }t          |           D ]U\  }}|                    d          }||dk    rt          d| d|dz              |                    |dz   |d           V||dS )Nr   r[   zInvalid etag (`z`) returned for part r   )r   r   )rb   r   )	enumeratery   r   append)r   rb   r   part_numberr   r   s         r!   r   r     s     "E()9:: 	
 	
Vzz&!!<42::[t[[+XY/[[\\\)Ao 	
 	
 	
 	
 '''r#   r   c                 b   g }|                      d          5 }t          |          D ]m\  }}t          |||z  |          5 }t          d||          }t	          |           |                    |j                   d d d            n# 1 swxY w Y   n	 d d d            n# 1 swxY w Y   |S )NTr   )	seek_from
read_limitr   r   )r   r   r   r   r   r   rX   )	re   r   r   rX   r>   part_idxpart_upload_urlfileobj_slicepart_upload_ress	            r!   r   r     sK    G			T		*	* 
8g)23D)E)E 		8 		8%Ho$x/%   8 ".uoM"Z"Z"Z#O44467778 8 8 8 8 8 8 8 8 8 8 8 8 8 8		8
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 Ns5   *B$<B?B$BB$BB$$B(+B()NNNN)NNN)8rI   rB   recollections.abcr   mathr   os.pathr   typingr   r   r   urllib.parser	   huggingface_hubr
   utilsr   r   r   r   r   r   
utils._lfsr   	utils.shar   r   _commit_apir   
get_loggerrF   r   compile	OID_REGEXLFS_MULTIPART_UPLOAD_COMMANDrx   r   rL   r   r{   tupler   r   r   r   r   rq   ru   r   rJ   r   r   r   r   rQ   r#   r!   <module>r      s   5 4 				 				 $ $ $ $ $ $             5 5 5 5 5 5 5 5 5 5             % % % % % %                % $ $ $ $ $ * * * * * * * *  0//////		H	%	%BJ())	5  -2 L9 L9 L9 L9 L9 L9 L9 L9^   %)"&X X:&X:X X 	X
 DjX DjX #s(^d"X Cy4X 4:tDz3:-.X X X Xv    9   
        %)JA JA#JAJA :JA #s(^d"	JA
 DjJA 
JA JA JA JAZT    t    4    &#7 &S &T & & & &(("6 ( (RU (cf (ko ( ( ( (.#4 #j #c #VZ[^V_ # # # #$(d4j (s (GY ( ( ( (#8<S	OR	$Z     r#   