
    6h                    v    S SK Jr  S SKrSSKJr  SSKJrJr  Sr\" S5      r	S r
 " S	 S
5      r " S S5      rg)    )annotationsN   )_)errorutili   sC   partial read of revlog %s; expected %d bytes from offset %d, got %dc                .    X S-
  -  S:H  =(       a    U S:g  $ )N   r    )ns    H/usr/lib/python3/dist-packages/mercurial/revlogutils/randomaccessfile.py_is_power_of_twor      s    QK1(!q&(    c                  l    \ rS rSrSrS rS rS rS r\	S 5       r
S rSS	 jrSS
 jrS rS rS rSrg)appender   z\the changelog index must be updated last on disk, so we use this class
to delay writes to itc                    X@l         U" X#5      nXPl        UR                  5       U l        UR	                  U5      R
                  U l        U R                  U l        g N)datafptelloffsetfstatst_sizesize_end)selfvfsnamemodebufr   s         r   __init__appender.__init__    sB    	_ggiIIbM))	II	r   c                    U R                   $ r   )r   r   s    r   endappender.end(   s    yyr   c                    U R                   $ r   )r   r$   s    r   r   appender.tell+   s    {{r   c                    g r   r
   r$   s    r   flushappender.flush.   s    r   c                .    U R                   R                  $ r   )r   closedr$   s    r   r-   appender.closed1   s    ww~~r   c                8    U R                   R                  5         g r   )r   closer$   s    r   r0   appender.close5   s    r   c                   US:X  a  Xl         O:US:X  a  U =R                   U-  sl         OUS:X  a  U R                  5       U-   U l         U R                   U R                  :  a&  U R                  R	                  U R                   5        gg)z,virtual file offset spans real file and datar   r	   r   N)r   r%   r   r   seek)r   r   whences      r   r3   appender.seek8   se    Q; Kq[KK6!Kq[((*v-DK;;"GGLL% #r   c                   SnU R                   U R                  :  aO  U R                  R                  U5      nUnU =R                   [	        U5      -  sl         US:  a  U[	        U5      -  nUS:w  a  U R                   U R                  -
  nU R
                  R                  SSR                  U R
                  5      5        U R
                  SS2	 U R
                  S   XDU-    nU =R                   [	        U5      -  sl         X#-  nU$ )z5only trick here is reads that span real file and datar   r   r	   N)r   r   r   readlenr   insertjoin)r   countretsdoffs        r   r7   appender.readC   s    ;;"U#ACKK3q6!KqyQA:;;*DIIQ 34		!"		!T5L1AKK3q6!KHC
r   c                    U R                   R                  [        U5      5        U =R                  [	        U5      -  sl        U =R
                  [	        U5      -  sl        g r   )r   appendbytesr   r8   r   )r   r=   s     r   writeappender.writeU   s<    		q"s1v		SV	r   c                :    U R                   R                  5         U $ r   )r   	__enter__r$   s    r   rF   appender.__enter__Z   s    r   c                4    U R                   R                  " U6 $ r   )r   __exit__)r   argss     r   rI   appender.__exit__^   s    ww&&r   )r   r   r   r   r   N)r   ))__name__
__module____qualname____firstlineno____doc__r!   r%   r   r*   propertyr-   r0   r3   r7   rC   rF   rI   __static_attributes__r
   r   r   r   r      sM      	&$
'r   r   c                      \ rS rSrSr SS jrS r\S 5       rSS jr	\
R                  S 5       r\
R                  S	 5       rS
 rS rS rSrg)randomaccessfileb   zDAccessing arbitrary chuncks of data within a file, with some cachingNc                    [        U5      (       d   eXl        X l        X0l        S U l        S U l        SU l        SU l        U(       a  Uu  U l        U l        g g Nr   r   )r   openerfilenamedefault_cached_chunk_sizewriting_handlereading_handle_cached_chunk_cached_chunk_position)r   rY   rZ   r[   initial_caches        r   r!   randomaccessfile.__init__e   s^       9:::: )B&"" &'#>K;D'); r   c                     SU l         SU l        g rX   )r^   r_   r$   s    r   clear_cacherandomaccessfile.clear_cachey   s     &'#r   c                H    U R                   SL=(       d    U R                  SL$ )zSTrue if any file handle is being held

Used for assert and debug in the python codeN)r]   r\   r$   s    r   is_openrandomaccessfile.is_open}   s'     t+Nt/B/B$/N	
r   c                6    U R                  U R                  US9$ )zReturn a file object)r   )rY   rZ   )r   r   s     r   _openrandomaccessfile._open   s    {{4==t{44r   c              #     #    U R                   (       a  U R                   v   gU R                  (       a  U R                  v   gU R                  5        nUv   SSS5        g! , (       d  f       g= f7f)z%File object suitable for reading dataN)r\   r]   ri   r   r   s     r   _read_handlerandomaccessfile._read_handle   sL      %%%  %%%  s   AA2A!	A2!
A/+A2c              #     #    U R                   cG  U R                  c:  U R                  b-  U R                  5        nXl          Sv   SU l          SSS5        gSv   g! SU l         f = f! , (       d  f       g= f7f)z4Context manager that keeps the file open for readingN)r]   r\   rZ   ri   rl   s     r   readingrandomaccessfile.reading   si      '##+)&(#/*.D'   +/D' s4   8A9A(AA(A9	A%%A((
A62A9c                    X-   nU R                   nU[        U R                  5      -   nXA::  a@  X5::  a;  XA:X  a  X5:X  a  U R                  $ X-
  n[        R                  " U R                  Xb5      $ U R                  X5      $ )zRead a chunk of bytes from the file.

Accepts an absolute offset, length to read.

Returns a str or buffer of raw byte data.

Raises if the requested number of bytes could not be read.
)r_   r8   r^   r   buffer_read_and_update_cache)r   r   lengthr%   cache_start	cache_endrelative_starts          r   
read_chunkrandomaccessfile.read_chunk   s}     o11#d&8&8"99	 S%5$)9)))#1N;;t11>JJ**6::r   c                   XR                   S-
  ) -  nX-   U R                   -   U R                   S-
  ) -  U-
  nU R                  5        nUR                  U5        UR                  U5      nS S S 5        U R	                  UW5        X-
  n[        U5      U-
  nX:  a,  [        U R                  X!U4-  n	[        R                  " U	5      eX:w  d  XB:w  a  [        R                  " XgU5      $ U$ ! , (       d  f       N= f)Nr	   )r[   rm   r3   r7   _add_cached_chunkr8   PARTIAL_READ_MSGrZ   r   RevlogErrorr   rs   )
r   r   ru   real_offsetreal_lengthfile_objr   relative_offsetgotmessages
             r   rt   'randomaccessfile._read_and_update_cache   s     !?!?!!CDD_t===..234  HMM+&==-D ! 	{D1 .$i/)<&$--)MMG##G,, K$9;;tf== ! s   #C++
C9c                    U R                   [        U R                  5      -   U:X  a?  [        U R                  5      [        U5      -   [        :  a  U =R                  U-  sl        gX l        Xl         g)zlAdd to or replace the cached data chunk.

Accepts an absolute offset and the data that is at that location.
N)r_   r8   r^   _MAX_CACHED_CHUNK_SIZE)r   r   r   s      r   r|   "randomaccessfile._add_cached_chunk   s^     ''#d.@.@*AAVKD&&'#d)36LL $&!%*0'r   )r^   r_   r[   rZ   rY   r]   r\   r   )   r)rM   rN   rO   rP   rQ   r!   rc   rR   rf   ri   
contextlibcontextmanagerrm   rp   ry   rt   r|   rS   r
   r   r   rU   rU   b   sq    N L(( 
 
5  "   ;*21r   rU   )
__future__r   r   i18nr    r   r   r   r}   r   r   rU   r
   r   r   <module>r      sI    #   ! J 
)C' C'LF1 F1r   