Ë
    ómxi•k  ã                   ó^  — d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZ d dlmZmZmZmZmZ d dlmZmZ d dlmZ dZ	 d dlmZ d	Zd
Z G d„ de«      Z G d„ de«      Z G d„ d«      Z G d„ de«      Z  G d„ de«      Z! G d„ de«      Z" G d„ d«      Z# G d„ d«      Z$y# e$ r Y Œ_w xY w)é    )ÚBytesION)Úmsb_sizeÚstream_copyÚapply_delta_dataÚconnect_deltasÚdelta_types)Úallocate_memoryÚ	LazyMixinÚmake_shaÚwriteÚclose)Ú	NULL_BYTEÚ
BYTE_SPACE)Úforce_bytesF)Úapply_deltaT)	ÚDecompressMemMapReaderÚFDCompressedSha1WriterÚDeltaApplyReaderÚ
Sha1WriterÚFlexibleSha1WriterÚZippedStoreShaWriterr   ÚFDStreamÚ
NullStreamc                   óx   — e Zd ZdZdZdZdd„Zd„ Zd„ Zd„ Z	e
dd	„«       Zd
„ Zd„ Zd„ Z eedd«      fd„Zdd„Zy)r   a£  Reads data in chunks from a memory map and decompresses it. The client sees
    only the uncompressed data, respective file-like read calls are handling on-demand
    buffered decompression accordingly

    A constraint on the total size of bytes is activated, simulating
    a logical file within a possibly larger physical memory area

    To read efficiently, you clearly don't want to read individual bytes, instead,
    read a few kilobytes at least.

    **Note:** The chunk-size should be carefully selected as it will involve quite a bit
        of string copying due to the way the zlib is implemented. Its very wasteful,
        hence we try to find a good tradeoff between allocation time and number of
        times we actually allocate. An own zlib implementation would be good here
        to better support streamed reading - it would only need to keep the mmap
        and decompress it into chunks, that's all ... )Ú_mÚ_zipÚ_bufÚ_buflenÚ_brÚ_cwsÚ_cweÚ_sÚ_closeÚ_cbrÚ_phii   Nc                 óÆ   — || _         t        j                  «       | _        d| _        d| _        |�|| _        d| _        d| _        d| _	        d| _
        d| _        || _        y)z|Initialize with mmap for stream reading
        :param m: must be content data - use new if you have object data and no sizeNr   F)r   ÚzlibÚdecompressobjr   r   r   r"   r   r    r!   r$   r%   r#   )ÚselfÚmÚclose_on_deletionÚsizes       úC/home/htdocs/ttos/venv/lib/python3.12/site-packages/gitdb/stream.pyÚ__init__zDecompressMemMapReader.__init__E   s`   € ð ˆŒÜ×&Ñ&Ó(ˆŒ	ØˆŒ	ØˆŒØÐØˆDŒGØˆŒØˆŒ	ØˆŒ	ØˆŒ	ØˆŒ	Ø'ˆ�ó    c                 ó2   — |dk(  sJ ‚| j                  «        y )Nr"   )Ú_parse_header_info©r)   Úattrs     r-   Ú_set_cache_z"DecompressMemMapReader._set_cache_U   s   € Ø�tŠ|Ðˆ|ð 	×ÑÕ!r/   c                 ó$   — | j                  «        y ©N)r   ©r)   s    r-   Ú__del__zDecompressMemMapReader.__del__[   s   € Ø�
‰
�r/   c                 ó4  — d}|| _         | j                  |«      }|j                  t        «      }|d| j	                  t
        «      \  }}t        |«      }|| _         d| _        |dz  }t        ||d «      | _	        t        |«      |z
  | _        d| _        ||fS )z¶If this stream contains object data, parse the header info and skip the
        stream to a point where each read will yield object content

        :return: parsed type_string, sizei    Nr   é   T)r"   ÚreadÚfindr   Úsplitr   Úintr   r   r   Úlenr   r%   )r)   ÚmaxbÚhdrÚhdrendÚtypr,   s         r-   r1   z)DecompressMemMapReader._parse_header_info^   sš   € ð ˆØˆŒØ�i‰i˜‹oˆØ—‘œ)Ó$ˆØ˜˜�L×&Ñ&¤zÓ2‰	ˆˆTÜ�4‹yˆØˆŒð ˆŒØ�!‰ˆÜ˜C  ˜LÓ)ˆŒ	Ü˜3“x &Ñ(ˆŒàˆŒ	à�DˆyÐr/   c                 óL   — t        ||d«      }|j                  «       \  }}|||fS )a¦  Create a new DecompressMemMapReader instance for acting as a read-only stream
        This method parses the object header from m and returns the parsed
        type and size, as well as the created stream instance.

        :param m: memory map on which to operate. It must be object data ( header + contents )
        :param close_on_deletion: if True, the memory map will be closed once we are
            being deletedr   )r   r1   )r)   r*   r+   ÚinstrC   r,   s         r-   ÚnewzDecompressMemMapReader.new{   s1   € ô & aÐ):¸AÓ>ˆØ×+Ñ+Ó-‰	ˆˆTØ�D˜$ˆÐr/   c                 ó   — | j                   S )z8:return: random access compatible data we are working on)r   r7   s    r-   ÚdatazDecompressMemMapReader.dataˆ   s   € à�w‰wˆr/   c                 óŒ   — | j                   r8t        | j                  d«      r| j                  j                  «        d| _         yy)z¿Close our underlying stream of compressed bytes if this was allowed during initialization
        :return: True if we closed the underlying stream
        :note: can be called safely
        r   FN)r#   Úhasattrr   r   r7   s    r-   r   zDecompressMemMapReader.closeŒ   s2   € ð
 �;Š;Ü�t—w‘w Ô(Ø—‘—‘”ØˆD�Kð r/   c                 óÖ  — | j                   | j                  k(  �rD| j                  j                  �s-d| _         t	        | j                  d«      ro| j                  j
                  t        j                  k(  rØ| j                  t        j                  «       | j                  j
                  t        j                  k(  rŒGn�| j                  j                  sz| j                  t        | j                  «      k7  rX| j                  t        j                  «       | j                  j                  s#| j                  t        | j                  «      k7  rŒX| j                  | _         | j                  S )zŒ
        :return: number of compressed bytes read. This includes the bytes it
            took to decompress the header ( if there was one )r   Ústatus)r   r"   r   Úunused_datarJ   rL   r'   ÚZ_OKr;   ÚmmapÚPAGESIZEr$   r?   r   r7   s    r-   Úcompressed_bytes_readz,DecompressMemMapReader.compressed_bytes_read—   sâ   € ð0 �8‰8�t—w‘wÓ t§y¡y×'<Ó'<ð ˆDŒHÜ�t—y‘y (Ô+Ø—i‘i×&Ñ&¬$¯)©)Ò3Ø—I‘IœdŸm™mÔ,ð —i‘i×&Ñ&¬$¯)©)Ô3ð
 Ÿ)™)×/Ò/°D·I±IÄÀTÇWÁWÃÒ4MØ—I‘IœdŸm™mÔ,ð Ÿ)™)×/Ò/°D·I±IÄÀTÇWÁWÃÓ4Mð —w‘wˆDŒHð
 �y‰yÐr/   ÚSEEK_SETr   c                 óâ   — |dk7  s|t        t        dd«      k7  rt        d«      ‚t        j                  «       | _        dx| _        x| _        x| _        | _	        | j                  r
d| _
        | `yy)zgAllows to reset the stream to restart reading
        :raise ValueError: If offset and whence are not 0r   rR   úCan only seek to position 0FN)ÚgetattrÚosÚ
ValueErrorr'   r(   r   r   r    r!   r$   r%   r"   ©r)   ÚoffsetÚwhences      r-   ÚseekzDecompressMemMapReader.seekÈ   sm   € ð �QŠ;˜&¤G¬B°
¸AÓ$>Ò>ÜÐ:Ó;Ð;ô ×&Ñ&Ó(ˆŒ	Ø78Ð8ˆŒÐ8�4”9Ð8˜tœy¨4¬9Ø�9Š9ØˆDŒIØ‘ð r/   c                 ó`  — |dk  r| j                   | j                  z
  }n#t        || j                   | j                  z
  «      }|dk(  ryd}| j                  r¬| j                  |k\  rG| j                  j                  |«      }| xj                  |z  c_        | xj                  |z  c_        |S | j                  j                  «       }|| j                  z  }| xj                  | j                  z  c_        d| _        d | _        | j                  j                  }|r2| j                  t        |«      z
  | _
        | j                  |z   | _        n'| j                  }| j                  | _
        ||z   | _        | j                  | j                  z
  dk  r| j                  dz   | _        | j                  | j                  | j                   }| j                  t        |«      z   | _        | j                  j                  ||«      }t        t        dt        j                  «      dv r3t         j"                  dk(  s t        | j                  j                  «      }n?t        | j                  j                  «      t        | j                  j$                  «      z   }| xj&                  t        |«      |z
  z  c_        | xj                  t        |«      z  c_        |r||z   }|rSt        |«      t        |«      z
  |k  r9| j                  | j                   k  r || j                  |t        |«      z
  «      z  }|S )Nr:   r   r/   é   ÚZLIB_RUNTIME_VERSION)z1.2.7z1.2.5Údarwin)r"   r   Úminr   r   r;   r   Úunconsumed_tailr!   r?   r    r   Ú
decompressrU   r'   ÚZLIB_VERSIONÚsysÚplatformrM   r$   )r)   r,   ÚdatÚtailÚcwsÚindataÚdcompdatÚunused_datalens           r-   r;   zDecompressMemMapReader.readÖ   sv  € Ø�!Š8Ø—7‘7˜TŸX™XÑ%‰Dä�t˜TŸW™W t§x¡xÑ/Ó0ˆDð �1Š9Øð ˆØ�9Š9Ø�|‰|˜tÒ#à—i‘i—n‘n TÓ*�Ø—’ Ñ$•Ø—’˜DÑ •Ø�
à—i‘i—n‘nÓ&�Ø˜Ÿ™Ñ$�Ø—’˜DŸL™LÑ(•à �”Ø �”	ð �y‰y×(Ñ(ˆÙð Ÿ	™	¤C¨£IÑ-ˆDŒIØŸ	™	 DÑ(ˆD�Ià—)‘)ˆCØŸ	™	ˆDŒIØ˜d™
ˆDŒIð �9‰9�t—y‘yÑ  1Ò$ØŸ	™	 A™ˆDŒIð —‘˜Ÿ™ 4§9¡9Ð-ˆð —I‘I¤ F£Ñ+ˆŒ	Ø—9‘9×'Ñ'¨°Ó5ˆô ”4Ð/´×1BÑ1BÓCÐGYÑYÔbe×bnÑbnÐrzÒbzÜ  §¡×!:Ñ!:Ó;‰Nä  §¡×!:Ñ!:Ó;¼cÀ$Ç)Á)×BWÑBWÓ>XÑXˆNð 	�	Š	”S˜“[ >Ñ1Ñ1�	Ø�Š”C˜“MÑ!�áØ˜X‘~ˆHñ œ˜X›¬¨S«Ñ1°TÒ9¸d¿h¹hÈÏÉÒ>PØ˜Ÿ	™	 $¬¨X«Ñ"6Ó7Ñ7ˆHàˆr/   r6   ©F)éÿÿÿÿ)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__Úmax_read_sizer.   r4   r8   r1   ÚclassmethodrF   rH   r   rQ   rU   rV   r[   r;   © r/   r-   r   r   .   sf   „ ñ:ð !€Ið €Mó(ò "òòð: ò
ó ð
òò ò-ñb #*¨"¨j¸!Ó"<ó ôir/   r   c                   óš   — e Zd ZdZdZdZd„ Zd„ Zd„ Ze	seZ
neZ
dd„Z eed	d«      fd
„Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zy)r   aµ  A reader which dynamically applies pack deltas to a base object, keeping the
    memory demands to a minimum.

    The size of the final object is only obtainable once all deltas have been
    applied, unless it is retrieved from a pack index.

    The uncompressed Delta has the following layout (MSB being a most significant
    bit encoded dynamic size):

    * MSB Source Size - the size of the base against which the delta was created
    * MSB Target Size - the size of the resulting data after the delta was applied
    * A list of one byte commands (cmd) which are followed by a specific protocol:

     * cmd & 0x80 - copy delta_data[offset:offset+size]

      * Followed by an encoded offset into the delta data
      * Followed by an encoded size of the chunk to copy

     *  cmd & 0x7f - insert

      * insert cmd bytes from the delta buffer into the output stream

     * cmd == 0 - invalid operation ( or error in delta stream )
    )Ú_bstreamÚ	_dstreamsÚ
_mm_targetÚ_sizer   i€²æc                 óv   — t        |«      dkD  sJ d«       ‚|d   | _        t        |dd «      | _        d| _        y)zÏInitialize this instance with a list of streams, the first stream being
        the delta to apply on top of all following deltas, the last stream being the
        base object onto which to apply the deltasr:   z+Need at least one delta and one base streamrm   Nr   )r?   rw   Útuplerx   r   )r)   Ústream_lists     r-   r.   zDeltaApplyReader.__init__h  sB   € ô �;Ó !Ò#ÐRÐ%RÓRÐ#à# B™ˆŒÜ˜{¨3¨BÐ/Ó0ˆŒØˆ�r/   c                 óš  — t        | j                  «      dk(  r| j                  |«      S t        | j                  «      }|j	                  «       dk(  rd| _        t        d«      | _        y |j	                  «       | _        t        | j
                  «      | _        t        | j                  j                  «      }t        | j                  j                  |j                  | j                  j                  dt        j                  z  «       | j                  j                  }|j                  ||«       | j                  j!                  d«       y )Nr:   r   é   )r?   rx   Ú_set_cache_brute_r   Úrboundrz   r	   ry   rw   r,   r   r;   r   rO   rP   Úapplyr[   )r)   r3   ÚdclÚbbufr   s        r-   Ú_set_cache_too_slow_without_cz.DeltaApplyReader._set_cache_too_slow_without_cr  sï   € ô ˆt�~‰~Ó !Ò#Ø×)Ñ)¨$Ó/Ð/ô
 ˜TŸ^™^Ó,ˆð �:‰:‹<˜1ÒØˆDŒJÜ-¨aÓ0ˆDŒOØð —Z‘Z“\ˆŒ
Ü)¨$¯*©*Ó5ˆŒä˜tŸ}™}×1Ñ1Ó2ˆÜ�D—M‘M×&Ñ&¨¯
©
°D·M±M×4FÑ4FÈÌdÏmÉmÑH[Ô\ð —‘×%Ñ%ˆØ�	‰	�$˜Ôà�‰×Ñ˜QÕr/   c           	      ó"  — t        «       }d}| j                  D ]T  }|j                  d«      }t        |«      \  }}t        ||«      \  }}|j	                  ||d |||f«       t        ||«      }ŒV | j                  j                  }	|}t        | j                  «      dkD  rt        |	|«      x}	}t        |	«      }
t        | j                  j                  |
j                  |	dt        j                  z  «       t        |«      }d}t        t        |«      t        | j                  «      «      D ]Ô  \  \  }}}}}t        |j                  |z
  «      }|j                  |«       t        |j                  |j                  |j                  dt        j                  z  «       dt!        «       v rt#        |
||«       n"t%        |
||t        |«      |j                  «       ||
}}
|
j'                  d«       |j'                  d«       |}ŒÖ |
| _        || _        y)z*If we are here, we apply the actual deltasr   i   Nr:   r   Úc_apply_delta)Úlistrx   r;   r   ÚappendÚmaxrw   r,   r?   r	   r   r   rO   rP   ÚzipÚreversedÚglobalsr‡   r   r[   ry   rz   )r)   r3   Úbuffer_info_listÚmax_target_sizeÚdstreamÚbufrY   Úsrc_sizeÚtarget_sizeÚ	base_sizer„   ÚtbufÚfinal_target_sizeÚdbufÚddatas                  r-   r€   z"DeltaApplyReader._set_cache_brute_”  sÝ  € ô
  ›6ÐØˆØ—~‘~ò 	@ˆGØ—,‘,˜sÓ#ˆCÜ'¨›}ÑˆF�HÜ"*¨3°Ó"7ÑˆF�KØ×#Ñ# S¨¨ \°6¸8À[Ð$QÔRÜ! /°;Ó?‰Oð	@ð —M‘M×&Ñ&ˆ	Ø%ˆô ˆt�~‰~Ó Ò"Ü&)¨)°_Ó&EÐEˆI˜ô
 ˜yÓ)ˆÜ�D—M‘M×&Ñ&¨¯
©
°I¸sÄTÇ]Á]Ñ?RÔSô ˜{Ó+ˆð !ÐÜ>AÄ(ÐK[ÓB\Ô^fÐgk×guÑguÓ^vÓ>wò 	,Ñ:Ñ1ˆT�6˜8 [°7ô $ G§L¡L°6Ñ$9Ó:ˆEØ�K‰K˜Ôä˜Ÿ™ e§k¡k°7·<±<ÀÄtÇ}Á}ÑATÔUð ¤'£)Ñ+Ü˜d E¨4Õ0ä   x°¼¸E»
ÀDÇJÁJÔOð
 ˜t�$ˆDØ�I‰I�aŒLØ�I‰I�aŒLØ +Ñð/	,ð: ˆŒØ&ˆ�
r/   r   c                 óÂ   — | j                   | j                  z
  }|dk  s||kD  r|}| j                  j                  |«      }| xj                  t	        |«      z  c_        |S )Nr:   )rz   r   ry   r;   r?   )r)   ÚcountÚblrH   s       r-   r;   zDeltaApplyReader.readæ  sS   € Ø�Z‰Z˜$Ÿ(™(Ñ"ˆØ�1Š9˜ š
ØˆEð �‰×#Ñ# EÓ*ˆØ�Š”C˜“IÑ�Øˆr/   rR   c                 ó�   — |dk7  s|t        t        dd«      k7  rt        d«      ‚d| _        | j                  j                  d«       y)zhAllows to reset the stream to restart reading

        :raise ValueError: If offset and whence are not 0r   rR   rT   N)rU   rV   rW   r   ry   r[   rX   s      r-   r[   zDeltaApplyReader.seekð  s@   € ð �QŠ;˜&¤G¬B°
¸AÓ$>Ò>ÜÐ:Ó;Ð;àˆŒØ�‰×Ñ˜QÕr/   c                 ó¤   — t        |«      dk  rt        d«      ‚|d   j                  t        v rt        d|d   j                  z  «      ‚ | |«      S )a  
        Convert the given list of streams into a stream which resolves deltas
        when reading from it.

        :param stream_list: two or more stream objects, first stream is a Delta
            to the object that you want to resolve, followed by N additional delta
            streams. The list's last stream must be a non-delta stream.

        :return: Non-Delta OPackStream object whose stream can be used to obtain
            the decompressed resolved data
        :raise ValueError: if the stream list cannot be handledé   zNeed at least two streamsrm   zNCannot resolve deltas if there is no base object stream, last one was type: %s)r?   rW   Útype_idr   Útype)Úclsr}   s     r-   rF   zDeltaApplyReader.newü  sb   € ô ˆ{Ó˜aÒÜÐ8Ó9Ð9ð �r‰?×"Ñ"¤kÑ1ÜØ`ÐcnÐoqÑcr×cwÑcwÑwóyð yñ �;ÓÐr/   c                 ó.   — | j                   j                  S r6   )rw   r    r7   s    r-   r    zDeltaApplyReader.type  s   € à�}‰}×!Ñ!Ð!r/   c                 ó.   — | j                   j                  S r6   )rw   rŸ   r7   s    r-   rŸ   zDeltaApplyReader.type_id  s   € à�}‰}×$Ñ$Ð$r/   c                 ó   — | j                   S )z3:return: number of uncompressed bytes in the stream)rz   r7   s    r-   r,   zDeltaApplyReader.size  s   € ð �z‰zÐr/   N©r   )rn   ro   rp   rq   rr   Úk_max_memory_mover.   r…   r€   Úhas_perf_modr4   r;   rU   rV   r[   rt   rF   Úpropertyr    rŸ   r,   ru   r/   r-   r   r   B  sŸ   „ ñð0€Ið *Ðòò  òDH'ñV Ø'‰à3ˆóñ #*¨"¨j¸!Ó"<ó  ð ñ ó ð ð4 ñ"ó ð"ð ñ%ó ð%ð ñó ñr/   r   c                   ó(   — e Zd ZdZdZd„ Zd„ Zdd„Zy)r   zpSimple stream writer which produces a sha whenever you like as it degests
    everything it is supposed to writeÚsha1c                 ó"   — t        «       | _        y r6   )r   rª   r7   s    r-   r.   zSha1Writer.__init__2  s   € Ü“Jˆ�	r/   c                 óN   — | j                   j                  |«       t        |«      S )z{:raise IOError: If not all bytes could be written
        :param data: byte object
        :return: length of incoming data)rª   Úupdater?   ©r)   rH   s     r-   r   zSha1Writer.write7  s    € ð
 	�	‰	×Ñ˜Ôä�4‹yÐr/   c                 ón   — |r| j                   j                  «       S | j                   j                  «       S )z]:return: sha so far
        :param as_hex: if True, sha will be hex-encoded, binary otherwise)rª   Ú	hexdigestÚdigest)r)   Úas_hexs     r-   ÚshazSha1Writer.shaD  s-   € ñ Ø—9‘9×&Ñ&Ó(Ð(Ø�y‰y×ÑÓ!Ð!r/   Nrl   )rn   ro   rp   rq   rr   r.   r   r³   ru   r/   r-   r   r   ,  s   „ ñ*à€Iòò
ô"r/   r   c                   ó    — e Zd ZdZdZd„ Zd„ Zy)r   zZWriter producing a sha1 while passing on the written bytes to the given
    write functionÚwriterc                 ó<   — t         j                  | «       || _        y r6   )r   r.   rµ   )r)   rµ   s     r-   r.   zFlexibleSha1Writer.__init__T  s   € Ü×Ñ˜DÔ!Øˆ�r/   c                 óR   — t         j                  | |«       | j                  |«       y r6   )r   r   rµ   r®   s     r-   r   zFlexibleSha1Writer.writeX  s   € Ü×Ñ˜˜tÔ$Ø�‰�DÕr/   N)rn   ro   rp   rq   rr   r.   r   ru   r/   r-   r   r   N  s   „ ñà€Iòór/   r   c                   óL   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Z e	e
dd«      fd	„Zd
„ Zy)r   z=Remembers everything someone writes to it and generates a sha)r‘   r‹   c                 óœ   — t         j                  | «       t        «       | _        t	        j
                  t        j                  «      | _        y r6   )r   r.   r   r‘   r'   ÚcompressobjÚZ_BEST_SPEEDr‹   r7   s    r-   r.   zZippedStoreShaWriter.__init__b  s1   € Ü×Ñ˜DÔ!Ü“9ˆŒÜ×#Ñ#¤D×$5Ñ$5Ó6ˆ�r/   c                 ó.   — t        | j                  |«      S r6   )rU   r‘   r2   s     r-   Ú__getattr__z ZippedStoreShaWriter.__getattr__g  s   € Ü�t—x‘x Ó&Ð&r/   c                 óš   — t         j                  | |«      }| j                  j                  | j                  j	                  |«      «       |S r6   )r   r   r‘   r‹   Úcompress)r)   rH   Úalens      r-   r   zZippedStoreShaWriter.writej  s8   € Ü×Ñ  dÓ+ˆØ�‰�‰�t—x‘x×(Ñ(¨Ó.Ô/àˆr/   c                 ój   — | j                   j                  | j                  j                  «       «       y r6   )r‘   r   r‹   Úflushr7   s    r-   r   zZippedStoreShaWriter.closep  s   € Ø�‰�‰�t—x‘x—~‘~Ó'Õ(r/   rR   r   c                 ó‚   — |dk7  s|t        t        dd«      k7  rt        d«      ‚| j                  j	                  d«       y)z`Seeking currently only supports to rewind written data
        Multiple writes are not supportedr   rR   rT   N)rU   rV   rW   r‘   r[   rX   s      r-   r[   zZippedStoreShaWriter.seeks  s7   € ð �QŠ;˜&¤G¬B°
¸AÓ$>Ò>ÜÐ:Ó;Ð;à�‰�‰�aÕr/   c                 ó6   — | j                   j                  «       S )zA:return: string value from the current stream position to the end)r‘   Úgetvaluer7   s    r-   rÅ   zZippedStoreShaWriter.getvalue{  s   € à�x‰x× Ñ Ó"Ð"r/   N)rn   ro   rp   rq   rr   r.   r½   r   r   rU   rV   r[   rÅ   ru   r/   r-   r   r   ]  s6   „ áGØ€Iò7ò
'òò)ñ #*¨"¨j¸!Ó"<ó ó#r/   r   c                   óB   ‡ — e Zd ZdZdZ ed«      Zˆ fd„Zd„ Zd„ Z	ˆ xZ
S )r   zöDigests data written to it, making the sha available, then compress the
    data and write it to the file descriptor

    **Note:** operates on raw file descriptors
    **Note:** for this to work, you have to use the close-method of this instance)Úfdrª   r‹   z+Failed to write all bytes to filedescriptorc                 ó€   •— t         ‰| �  «        || _        t        j                  t        j
                  «      | _        y r6   )Úsuperr.   rÇ   r'   rº   r»   r‹   )r)   rÇ   Ú	__class__s     €r-   r.   zFDCompressedSha1Writer.__init__Œ  s-   ø€ Ü‰ÑÔØˆŒÜ×#Ñ#¤D×$5Ñ$5Ó6ˆ�r/   c                 óä   — | j                   j                  |«       | j                  j                  |«      }t	        | j
                  |«      }|t        |«      k7  r| j                  ‚t        |«      S )zZ:raise IOError: If not all bytes could be written
        :return: length of incoming data)rª   r­   r‹   r¿   r   rÇ   r?   Úexc)r)   rH   ÚcdataÚbytes_writtens       r-   r   zFDCompressedSha1Writer.write“  sY   € ð 	�	‰	×Ñ˜ÔØ—‘×!Ñ! $Ó'ˆÜ˜dŸg™g uÓ-ˆàœC ›JÒ&Ø—(‘(ˆNä�4‹yÐr/   c                 ó¼   — | j                   j                  «       }t        | j                  |«      t	        |«      k7  r| j
                  ‚t        | j                  «      S r6   )r‹   rÂ   r   rÇ   r?   rÌ   r   )r)   Ú	remainders     r-   r   zFDCompressedSha1Writer.closeŸ  s@   € Ø—H‘H—N‘NÓ$ˆ	Ü�—‘˜)Ó$¬¨I«Ò6Ø—(‘(ˆNÜ�T—W‘W‹~Ðr/   )rn   ro   rp   rq   rr   ÚIOErrorrÌ   r.   r   r   Ú__classcell__)rÊ   s   @r-   r   r   €  s,   ø„ ñUð
 &€Iñ Ð?Ó
@€Cô7ò
ör/   r   c                   ó:   — e Zd ZdZdZd„ Zd„ Zd
d„Zd„ Zd„ Z	d„ Z
y	)r   z¬A simple wrapper providing the most basic functions on a file descriptor
    with the fileobject interface. Cannot use os.fdopen as the resulting stream
    takes ownership©Ú_fdÚ_posc                 ó    — || _         d| _        y ©Nr   rÔ   )r)   rÇ   s     r-   r.   zFDStream.__init__¯  s   € ØˆŒØˆ�	r/   c                 ó€   — | xj                   t        |«      z  c_         t        j                  | j                  |«       y r6   )rÖ   r?   rV   r   rÕ   r®   s     r-   r   zFDStream.write³  s&   € Ø�	Š	”S˜“YÑ�	Ü
�‰�—‘˜4Õ r/   c                 óÞ   — |dk(  r)t         j                  j                  | j                  «      }t        j                  | j
                  |«      }| xj                  t        |«      z  c_        |S rØ   )rV   ÚpathÚgetsizeÚ	_filepathr;   rÕ   rÖ   r?   )r)   rš   Úbytess      r-   r;   zFDStream.read·  sL   € Ø�AŠ:Ü—G‘G—O‘O D§N¡NÓ3ˆEô —‘˜Ÿ™ %Ó(ˆØ�	Š	”S˜“ZÑ�	Øˆr/   c                 ó   — | j                   S r6   )rÕ   r7   s    r-   ÚfilenozFDStream.filenoÀ  s   € Ø�x‰xˆr/   c                 ó   — | j                   S r6   )rÖ   r7   s    r-   ÚtellzFDStream.tellÃ  s   € Ø�y‰yÐr/   c                 ó.   — t        | j                  «       y r6   )r   rÕ   r7   s    r-   r   zFDStream.closeÆ  s   € Üˆd�h‰h�r/   Nr¥   )rn   ro   rp   rq   rr   r.   r   r;   rà   râ   r   ru   r/   r-   r   r   ¨  s,   „ ñð  €Iòò!óòòór/   r   c                   ó2   — e Zd ZdZ e«       Zdd„Zd„ Zd„ Zy)r   zVA stream that does nothing but providing a stream interface.
    Use it like /dev/nullc                  ó   — y)NÚ ru   )r)   r,   s     r-   r;   zNullStream.readÐ  s   € Ør/   c                  ó   — y r6   ru   r7   s    r-   r   zNullStream.closeÓ  s   € Ør/   c                 ó   — t        |«      S r6   )r?   r®   s     r-   r   zNullStream.writeÖ  s   € Ü�4‹yÐr/   Nr¥   )	rn   ro   rp   rq   r|   rr   r;   r   r   ru   r/   r-   r   r   Ê  s   „ ñá“€Ióòór/   r   )%Úior   rO   rV   rd   r'   Ú	gitdb.funr   r   r   r   r   Ú
gitdb.utilr	   r
   r   r   r   Úgitdb.constr   r   Úgitdb.utils.encodingr   r§   Úgitdb_speedups._perfr   r‡   ÚImportErrorÚ__all__r   r   r   r   r   r   r   r   ru   r/   r-   ú<module>rñ      sÄ   ðõ ã Û 	Û 
Û ÷õ ÷õ ÷ .Ý ,à€ð	ÝAØ€Lð%€ôQ˜Yô Qôh`�yô `÷T"ñ "ôD˜ô ô #˜:ô  #ôF#˜Zô #÷Pñ ÷Dò øðM ò 	Ùð	ús   ÁB$ Â$B,Â+B,