ó
    6°h"  ã                  óz   • S SK Jr  S SKrS SKrS SKrS SKrS SKJr  S SKJ	r
  SSKJ	r	  SrSrSr " S S	5      rS
 rg)é    )ÚannotationsN)Úhex)Úerroré   é   é   c                  ó�   • \ rS rSrSrSrSS jrS r\S 5       r	SS jr
S	 rS
 rS rS rSS jrS rS rS r\S 5       rS rSrg)Úrevmapé2   zvtrivial hg bin hash - linelog rev bidirectional map

also stores a flag (uint8) for each revision, and track renames.
s   REVMAP1 Nc                ó  • Xl         S/U l        S/U l        0 U l        S/U l        S/U l        SU l        U(       aF  [        R                   R                  U5      (       a  U R                  5         gU R                  5         gg)a  create or load the revmap, optionally associate to a file

if path is None, the revmap is entirely in-memory. the caller is
responsible for locking. concurrent writes to a same file is unsafe.
the caller needs to make sure one file is associated to at most one
revmap object at a time.Nr   ó    éÿÿÿÿ)ÚpathÚ_rev2hshÚ	_rev2flagÚ_hsh2revÚ_renamerevsÚ_renamepathsÚ_lastmaxrevÚosÚexistsÚ_loadÚflush)Úselfr   s     Ú;/usr/lib/python3/dist-packages/hgext/fastannotate/revmap.pyÚ__init__Úrevmap.__init__:   so   € ð Œ	Ø˜ˆŒØ˜ˆŒØˆŒð ˜3ˆÔØ ˜EˆÔØˆÔÞÜ�w‰w�~‰~˜d×#Ñ#Ø—
‘
•ð —
‘
•ð r   c                óð   • UR                   SS U l         UR                  SS U l        UR                  R                  5       U l        UR                  SS U l        UR
                  SS U l        SU l        g)z>copy the map data from another revmap. do not affect self.pathNr   )r   r   r   Úcopyr   r   r   )r   Úrhss     r   ÚcopyfromÚrevmap.copyfromQ   sa   € àŸ™¡Q˜ˆŒØŸ™¡qÐ)ˆŒØŸ™×)Ñ)Ó+ˆŒØŸ?™?©1Ð-ˆÔØ×,Ñ,©QÐ/ˆÔØˆÕr   c                ó2   • [        U R                  5      S-
  $ )z"return max linelog revision numberr   )Úlenr   )r   s    r   ÚmaxrevÚrevmap.maxrevZ   s   € ô �4—=‘=Ó! AÑ%Ð%r   c                ót  • XR                   ;   a"  [        R                  " S[        U5      -  5      e[	        U5      [
        :w  a  [        R                  " S[
        -  5      e[	        U R                  5      nSnU(       a	  U[        -  nUbQ  X0R                  S   :w  a?  U[        -  nU R                  R                  U5        U R                  R                  U5        U R                  R                  U5        U R                  R                  U5        XPR                   U'   U(       a  U R                  5         U$ )znadd a binary hg hash and return the mapped linelog revision.
if flush is True, incrementally update the file.
s   %r is in revmap alreadys   hsh must be %d-char longr   r   )r   r   ÚCorruptedFileErrorr   r$   Ú_hshlenÚhgerrorÚProgrammingErrorr   Úsidebranchflagr   Ú
renameflagr   Úappendr   r   )r   ÚhshÚ
sidebranchr   r   ÚidxÚflags          r   r.   Úrevmap.append_   s  € ð —-‘-ÓÜ×*Ò*Ø*¬S°«XÑ5óð ô ˆs‹8”wÓÜ×*Ò*Ø+¬gÑ5óð ô �$—-‘-Ó ˆØˆÞØ”NÑ"ˆDØÑ ×(9Ñ(9¸"Ñ(=Ó =Ø”JÑˆDØ×Ñ×#Ñ# CÔ(Ø×Ñ×$Ñ$ TÔ*Ø�‰×Ñ˜SÔ!Ø�‰×Ñ˜dÔ#Ø �‰�cÑÞØ�J‰JŒLØˆ
r   c                óL   • XR                   :”  d  US:  a  gU R                  U   $ )z>convert linelog revision to hg hash. return None if not found.r   N)r%   r   ©r   Úrevs     r   Úrev2hshÚrevmap.rev2hshz   s$   € à—‘Ó  a£ØØ�}‰}˜SÑ!Ð!r   c                óL   • XR                   :”  d  US:  a  gU R                  U   $ )z[get the flag (uint8) for a given linelog revision.
return None if revision does not exist.
r   N)r%   r   r5   s     r   Úrev2flagÚrevmap.rev2flag€   s&   € ð —‘Ó  a£ØØ�~‰~˜cÑ"Ð"r   c                ó”   • XR                   :”  d  US:  a  g[        R                  " U R                  U5      S-
  nU R                  U   $ )zSget the path for a given linelog revision.
return None if revision does not exist.
r   Nr   )r%   ÚbisectÚbisect_rightr   r   )r   r6   r1   s      r   Úrev2pathÚrevmap.rev2pathˆ   sE   € ð —‘Ó  a£ØÜ×!Ò! $×"2Ñ"2°CÓ8¸1Ñ<ˆØ× Ñ  Ñ%Ð%r   c                ó8   • U R                   R                  U5      $ )z>convert hg hash to linelog revision. return None if not found.)r   Úget)r   r/   s     r   Úhsh2revÚrevmap.hsh2rev‘   s   € à�}‰}× Ñ  Ó%Ð%r   c                ó€   • S/U l         S/U l        0 U l        S/U l        SU l        U(       a  U R                  5         gg)z3make the map empty. if flush is True, write to diskNr   r   )r   r   r   Ú	_rev2pathr   r   )r   r   s     r   ÚclearÚrevmap.clear•   s?   € ð ˜ˆŒØ˜ˆŒØˆŒØ˜ˆŒØˆÔÞØ�J‰J�Lð r   c                óX  • U R                   (       d  gU R                  S:X  ar  [        U R                   S5       nUR                  U R                  5        [        S[        U R                  5      5       H  nU R                  X!5        M     SSS5        Oc[        U R                   S5       n[        U R                  S-   [        U R                  5      5       H  nU R                  X!5        M     SSS5        U R                  U l        g! , (       d  f       N = f! , (       d  f       N1= f)z write the state down to the fileNr   Úwbr   Úab)
r   r   ÚopenÚwriteÚHEADERÚranger$   r   Ú	_writerevr%   )r   ÚfÚis      r   r   Úrevmap.flush    sÑ   € à�y�yØØ×Ñ˜rÓ!Ü�d—i‘i Ô&¨!Ø—‘˜Ÿ™Ô$Ü˜q¤# d§m¡mÓ"4Ö5�AØ—N‘N 1Ö(ñ 6÷ 'Ð&ô
 �d—i‘i Ô&¨!Ü˜t×/Ñ/°!Ñ3´S¸¿¹Ó5GÖH�AØ—N‘N 1Ö(ñ I÷ 'ð  Ÿ;™;ˆÕ÷ 'Õ&ú÷
 'Õ&ús   ¹AD
Â+ADÄ

DÄ
D)c                ó|  • U R                   (       d  gSn[        n[        U R                   S5       nUR                  [	        U R
                  5      5      U R
                  :w  a  [        R                  " 5       eU R                  SS9   UR                  U5      nU(       d  Oñ[        U5      n[	        U R                  5      nU[        -  (       aG  U R                  U5      nU R                  R                  U5        U R                  R                  U5        UR                  U5      n[	        U5      U:w  a  [        R                  " 5       eX`R                   U'   U R"                  R                  U5        U R                  R                  U5        GM
  SSS5        U R$                  U l        g! , (       d  f       N = f)zload state from fileNr   ÚrbF)r   )r   r)   rL   Úreadr$   rN   r   r(   rG   Úordr   r-   Ú	_readcstrr   r.   r   r   r   r%   r   )	r   ÚflaglenÚhshlenrQ   Úbufr2   r6   r   r/   s	            r   r   Úrevmap._load¯   sG  € à�y�yØð ˆÜˆÜ�$—)‘)˜TÔ" aØ�v‰v”c˜$Ÿ+™+Ó&Ó'¨4¯;©;Ó6Ü×.Ò.Ó0Ð0Ø�J‰J˜UˆJÑ#ØØ—f‘f˜W“o�ÞØÜ˜3“x�Ü˜$Ÿ-™-Ó(�Øœ*×$ØŸ>™>¨!Ó,�DØ×$Ñ$×+Ñ+¨CÔ0Ø×%Ñ%×,Ñ,¨TÔ2Ø—f‘f˜V“n�Ü�s“8˜vÓ%Ü×2Ò2Ó4Ð4Ø%(—‘˜cÑ"Ø—‘×%Ñ% dÔ+Ø—‘×$Ñ$ SÔ)ò ÷	 #ð(  Ÿ;™;ˆÕ÷) #Õ"ús   ±E"F-Æ-
F;c                óL  • U R                   U   nU R                  U   nUR                  [        R                  " SU5      5        U[
        -  (       aA  U R                  U5      nUc  [        R                  " SU-  5      eUR                  US-   5        UR                  U5        g)zappend a revision data to fileó   BNs   cannot find path for %só    )	r   r   rM   ÚstructÚpackr-   r?   r   r(   )r   r6   rQ   r2   r/   r   s         r   rP   Úrevmap._writerevÍ   s‚   € à�~‰~˜cÑ"ˆØ�m‰m˜CÑ ˆØ	�‰”—’˜D $Ó'Ô(Ø”*×Ø—=‘= Ó%ˆDØ‰|Ü×.Ò.Ð/IÈCÑ/OÓPÐPØ�G‰G�D˜5‘LÔ!Ø	�‰��r   c                ó€   • Sn U R                  S5      nU(       d  [        R                  " 5       eUS:X  a   U$ X-  nM<  )z,read a C-language-like ' '-terminated stringr   r   r_   )rV   r   r(   )rQ   r[   Úchs      r   rX   Úrevmap._readcstrÙ   sH   € ð ˆØØ—‘˜“ˆBÞÜ×.Ò.Ó0Ð0Ø�U‹{Øàˆ
ð ‰IˆCñ r   c                ó  • [        U[        5      (       a  Uu  p#OUR                  5       UR                  5       p2U R	                  U5      nUc  gUb  X0R                  U5      :w  a  gU R                  U5      [        -  S:H  $ )z•(fctx or (node, path)) -> bool.
test if (node, path) is in the map, and is not in a side branch.
f can be either a tuple of (node, path), or a fctx.
Fr   )Ú
isinstanceÚtupleÚnoder   rC   r?   r:   r,   )r   rQ   r/   r   r6   s        r   Ú__contains__Úrevmap.__contains__æ   ss   € ô
 �aœ×ÑØ‰IˆC�àŸ™› !§&¡&£(�Ø�l‰l˜3ÓˆØ‰;ØØÑ ¯©°cÓ(:Ó :ØØ—‘˜cÓ"¤^Ñ3¸Ñ9Ð9r   )r   r   r   r   r   r   rF   r   )N)FNF)F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rN   r   r!   Úpropertyr%   r.   r7   r:   r?   rC   rG   r   r   rP   ÚstaticmethodrX   rj   Ú__static_attributes__© r   r   r
   r
   2   sr   † ñð
 €Fôò.ð ñ&ó ð&ôò6"ò#ò&ò&ô	ò'ò'ò<
ð ñ
ó ð
õ:r   r
   c                óF  • Sn [        U S5       nUR                  [        * [        R                  5        UR                  5       [        [        R                  5      :”  a  UR                  [        5      nSSS5        U$ ! , (       d  f       U$ = f! [         a     U$ f = f)z�return the last hash in a revmap, without loading its full content.
this is equivalent to `m = revmap(path); m.rev2hsh(m.maxrev)`, but faster.
NrU   )rL   Úseekr)   ÚioÚSEEK_ENDÚtellr$   r
   rN   rV   ÚOSError)r   r/   rQ   s      r   Úgetlastnoder{   ÷   s†   € ð €CðÜ�$˜Ô Ø�F‰F”G�8œRŸ[™[Ô)Ø�v‰v‹xœ#œfŸm™mÓ,Ó,Ø—f‘fœW“o�÷ ð €J÷ Ôð €Jûô ó ØØ€Jðús/   „B �A&B Á6B Â 
BÂ
B ÂB Â
B ÂB )Ú
__future__r   r=   rw   r   r`   Úmercurial.noder   Ú	mercurialr   r*   Ú r,   r-   r)   r
   r{   rt   r   r   Ú<module>r€      sJ   ðõ #ã Û 	Û 	Û å õõ ð, €ð €
ð €÷B:ñ B:óJr   