
    q&f8                        d dl Z d dlZd dlZddlmZmZmZmZ ddlmZ ddZ	ej                  j                  d      ZerddZ	 ej                  ej                  d	z         Z ej                  d
      Z G d d      Zd Zd ZddZy)    N   )encodingerrornodeutil   )	constantsc                 X    t        j                  t        j                  | dz              S )z_return a new unique identifier.

    The identifier is random and composed of ascii characters.r   )r   hexosurandom)id_sizes    >/usr/lib/python3/dist-packages/mercurial/revlogutils/docket.pymake_uidr   #   s      88BJJw!|,--    s   HGTEST_UUIDFILEc                 d   	 t        t        d      5 }|j                         j                         }d d d        t              }d}t        dd      }|D ]  }|dz	  }||z  dz  }||z   |z   } t        j                         }	|	j                  |d	
       |	j                  | dz        }
| dk(  sJ t        j                  d|
      }t        j                  |      }t        t        d      5 }|j                  |       d d d        |S # 1 sw Y   xY w# t        $ r d}Y w xY w# 1 sw Y   |S xY w)Nrb)modes   04r   #11111111111111111111111111111111111r   #      r   )version      z>Lwb)openstable_docket_filereadstripFileNotFoundErroriterintrandomRandomseedgetrandbitsstructpackr   r   write)r   fr%   	iter_seedint_seedlow_maski	high_partlow_partrrawpnews                r   r   r   1   s*   	(t4 (vvx~~'( J	x# 	0A BI 8+2H 8+a/H	0 MMO	x#mmGaK(!||KKc"hhqk$d+ 	qGGCL	
+( (  	D	"	
s3   D DD ,D%DD D"!D"%D/s   BBBBBBQQQQQQcz>BLc                      e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd Zd ZddZd Zd Z	dd	Z
d
 Zd ZddZed        Zej                   d        Zed        Zej                   d        Zed        Zej                   d        ZddZddZy)RevlogDocketzmetadata associated with revlogNc                    || _         t        |      | _        d| _        |j                  | _        |j                  | _        |j                  | _	        || _
        || _        || _        || _        || _        |	| _        t!        |      t!        |      z  rJ t!        |      t!        |	      z  rJ t!        |      t!        |	      z  rJ |
|k  sJ ||k  sJ ||k  sJ |
| _        || _        || _        || _        || _        || _        |r;| j$                  | _        | j(                  | _        | j,                  | _        || _        y | j"                  | _        | j&                  | _        | j*                  | _        || _        y )NF)_version_headerbool
_read_only_dirtyradix_radix_docket_file_pathopener_opener_index_uuid_older_index_uuids
_data_uuid_older_data_uuids_sidedata_uuid_older_sidedata_uuidsset_initial_index_end_pending_index_end_initial_data_end_pending_data_end_initial_sidedata_end_pending_sidedata_end
_index_end	_data_end_sidedata_enddefault_compression_header)selfrevloguse_pendingversion_header
index_uuidolder_index_uuids	data_uuidolder_data_uuidssidedata_uuidolder_sidedata_uuids	index_endpending_index_enddata_endpending_data_endsidedata_endpending_sidedata_endrR   s                    r   __init__zRevlogDocket.__init__f   s   &  .{+ll((
}}%"3#!1+%9"()C0@,AAAA'(3/C+DDDD()C0D,EEEE----++++3333"+"3!)!1%1"%9""55DO!33DN!%!;!;D
 +E' #55DO!33DN!%!;!;D*D'r   c                 n    | j                   t               | _         d| j                  | j                   fz  S )z=file path to the current index file associated to this docket	   %s-%s.idx)rB   r   r=   rS   s    r   index_filepathzRevlogDocket.index_filepath   s4     #'zDt{{D,<,<===r   c                     | j                   | j                  f}| j                  j                  d|       t	               | _         | j                         S )z\switch index file to a new UID

        The previous index UID is moved to the "older" list.r   )rB   rO   rC   insertr   rg   rS   olds     r   new_index_filezRevlogDocket.new_index_file   sG     1&&q#.#:""$$r   c              #   j   K   | j                   D ]   \  }}|s|dkD  sd| j                  |fz   " yw)z>yield file path to older index files associated to this docketr   re   N)rC   r=   rS   include_emptyuuidsizes       r   old_index_filepathsz RevlogDocket.old_index_filepaths   s>      11 	9JD$q"dkk4%888	9   33c                 n    | j                   t               | _         d| j                  | j                   fz  S )z<file path to the current data file associated to this docket	   %s-%s.dat)rD   r   r=   rf   s    r   data_filepathzRevlogDocket.data_filepath   s/     ??"&jDOt{{DOO<<<r   c                     | j                   | j                  f}| j                  j                  d|       t	               | _         | j                         S )zZswitch data file to a new UID

        The previous data UID is moved to the "older" list.r   )rD   rP   rE   ri   r   rv   rj   s     r   new_data_filezRevlogDocket.new_data_file   sD     /%%a-"*!!##r   c              #   j   K   | j                   D ]   \  }}|s|dkD  sd| j                  |fz   " yw)z=yield file path to older data files associated to this docketr   ru   N)rE   r=   rn   s       r   old_data_filepathszRevlogDocket.old_data_filepaths   s>      00 	9JD$q"dkk4%888	9rs   c                 n    | j                   t               | _         d| j                  | j                   fz  S )z@file path to the current sidedata file associated to this docket	   %s-%s.sda)rF   r   r=   rf   s    r   sidedata_filepathzRevlogDocket.sidedata_filepath   s4     &"**Dt{{D,?,?@@@r   c                     | j                   | j                  f}| j                  j                  d|       t	               | _         | j                         S )zbswitch sidedata file to a new UID

        The previous sidedata UID is moved to the "older" list.r   )rF   rQ   rG   ri   r   r}   rj   s     r   new_sidedata_filezRevlogDocket.new_sidedata_file   sI     ""D$6$67""))!S1&j%%''r   c              #   j   K   | j                   D ]   \  }}|s|dkD  sd| j                  |fz   " yw)zAyield file path to older sidedata files associated to this docketr   r|   N)rG   r=   rn   s       r   old_sidedata_filepathsz#RevlogDocket.old_sidedata_filepaths   s>      44 	9JD$q"dkk4%888	9rs   c                     | j                   S N)rO   rf   s    r   r]   zRevlogDocket.index_end   s    r   c                 @    || j                   k7  r|| _         d| _        y y NT)rO   r;   rS   new_sizes     r   r]   zRevlogDocket.index_end   s!    t&&DODK 'r   c                     | j                   S r   )rP   rf   s    r   r_   zRevlogDocket.data_end   s    ~~r   c                 @    || j                   k7  r|| _         d| _        y y r   )rP   r;   r   s     r   r_   zRevlogDocket.data_end   s!    t~~%%DNDK &r   c                     | j                   S r   )rQ   rf   s    r   ra   zRevlogDocket.sidedata_end   s    !!!r   c                 @    || j                   k7  r|| _         d| _        y y r   )rQ   r;   r   s     r   ra   zRevlogDocket.sidedata_end   s$    t)))!)DDK *r   c                    | j                   sy| j                  r&d}|| j                  z  }t        j                  |      |s|j                  | j                  d       | j                  | j                  dd      5 }|j                  | j                  |             d	d	d	       || _         y# 1 sw Y   || _         yxY w)
z_write the modification of disk if any

        This make the new content visible to all processFs   writing read-only docket: %ss   store)location   wT)r   
atomictemp)pendingN)	r;   r:   r?   r   ProgrammingError	addbackuprA   r)   
_serialize)rS   transactionr   	strippingmsgr*   s         r   r)   zRevlogDocket.write   s     {{5tzz!,,S11 %%djj8%DdjjtE :89: "DK	: "DKs   ="B//B?c                    |r%| j                   }| j                  }| j                  }n$| j                  }| j                  }| j
                  }|| j                  k  sJ || j
                  k  sJ | j                  t        | j                        t        | j                        t        | j                        t        | j                        t        | j                        t        | j                        || j                  || j                  || j
                  | j                  f}g }|j                  t!        j"                  |        |j                  | j                         | j                  D ]3  \  }}|j                  t$        j#                  t        |      |             5 | j                  D ]  \  }}|j                  |        |j                  | j                         | j                  D ]3  \  }}|j                  t$        j#                  t        |      |             5 | j                  D ]  \  }}|j                  |        |j                  | j                         | j                  D ]3  \  }}|j                  t$        j#                  t        |      |             5 | j                  D ]  \  }}|j                  |        dj'                  |      S )Nr   )rI   rK   rM   rO   rP   rQ   r8   lenrB   rC   rD   rE   rF   rG   rR   appendS_HEADERr(   	S_OLD_UIDjoin)	rS   r   official_index_endofficial_data_endofficial_sidedata_enddatasurq   s	            r   r   zRevlogDocket._serialize  sf   !%!8!8 $ 6 6$($>$>!!% $$($6$6! !DNN222$(:(::::    !''( &&'##$**+OONN!++
  	%&	!!".. 	3GAtHHY^^CFD12	3.. 	GAtHHQK	 	
!-- 	3GAtHHY^^CFD12	3-- 	GAtHHQK	 	
$$%11 	3GAtHHY^^CFD12	311 	GAtHHQK	xx{r   )FNN Nr   Nr   r   r   r   r   r   r   N)T)FFF)__name__
__module____qualname____doc__rc   rg   rl   rr   rv   rx   rz   r}   r   r   propertyr]   setterr_   ra   r)   r   r   r   r   r6   r6   c   s    )
 #'#4El>%9=$9A(9    
   __ 
 " "  
*1r   r6   c                     |dz  }|t         j                  t         j                  fvryt        j                  | j
                  j                     j                         }t        | ||      }d|_	        |S )z?given a revlog version a new docket object for the given revlogi  N)rV   rR   T)
r	   REVLOGV2CHANGELOGV2r   compenginesfeature_configcompression_enginerevlogheaderr6   r;   )rT   rV   
rl_versioncompdockets        r   default_docketr   H  st    &(J),,i.C.CDD00ln 	 %#'F
 FMMr   c                     g }g }t        d|      D ]<  } | t        j                        }|j                  t        j	                  |             > |D ]   \  }} | |      }|j                  ||f       " |S )Nr   )ranger   rq   r   unpack)	get_datacount	all_sizesall_uidsr.   r2   uid_size	file_sizeuids	            r   _parse_old_uidsr   Y  s    IH1e_ 0y~~&))#./0  ) *)x i()* Or   c                 z   t         j                  dt         j                         }t         j                  gfd}t        |      }t	        |      }t	        |      } ||      }t	        |      }	t        ||	      }
t	        |      } ||      }t	        |      }t        ||      }t	        |      } ||      }t	        |      }t        ||      }t	        |      }t	        |      }t	        |      }t	        |      }t	        |      }t	        |      }t	        |      }t        | f||||
|||||||||||d}|S )zBgiven some docket data return a docket object for the given revlogNc                     d   | z   t              kD  r-d}|d   | z   t              fz  }t        j                  |      d   d   | z    }dxx   | z  cc<   |S )z/utility closure to access the `size` next bytesr   s'   docket is too short, expected %d got %d)r   r   Abort)rq   r   r2   r   offsets      r   r   zparse_docket.<locals>.get_datam  st    !9tc$i'<CF1I$c$i00C++c""6!9vay4/0q	T	
r   )rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rR   )r   r   rq   r!   nextr   r6   )rT   r   rU   headerr   iheaderrV   index_uuid_sizerW   older_index_uuid_countrX   data_uuid_sizerY   older_data_uuid_countrZ   sidedata_uuid_sizer[   older_sidedata_uuid_countr\   
index_sizepending_index_size	data_sizepending_data_sizesidedata_sizepending_sidedata_sizerR   r   r   s    `                         @r   parse_docketr   f  sN   __T/HMM23F mm_F	 6lG']N7mO/*J!']'2HI']N(I M&x1FGg/0M $W*85NOgJgWIWMM M!%g%+)#1,*"2#=!F$ Mr   )r   r   )r   r#   r'    r   r   r   r   r	   r   environgetr   StructINDEX_HEADER_FMTr   r   r6   r   r   r   r   r   r   <module>r      s   & 
   
. %%))*<= X 6==336FFG FMM% 	b bJ"
Hr   