
    	^ci8                        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
                            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dS )    N   )encodingerrornodeutil   )	constants   c                 T    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"     8BJw!|,,---    s   HGTEST_UUIDFILEc                    	 t          t          d          5 }|                                                                }d d d            n# 1 swxY w Y   n# t          $ r d}Y nw xY wt          |          }d}t          dd          }|D ]}|dz	  }||z  dz  }||z   |z   }t          j                    }	|		                    |d	
           |	
                    | dz            }
| dk    sJ t          j        d|
          }t          j        |          }t          t          d          5 }|                    |           d d d            n# 1 swxY w Y   |S )Nrb)modes   04r   #11111111111111111111111111111111111r   #      r   )version   r
   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44 (vvxx~~''( ( ( ( ( ( ( ( ( ( ( ( ( ( (  	 	 	DDD	JJ	x## 	0 	0A BI 8+2H 8+a/HHMOO	x###mmGaK((!||||Kc""hqkk$d++ 	qGGCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
sE   A 'AA AA AA A&%A&,EEEs   BBBBBBLLLLLLcz>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dS )RevlogDocketzmetadata associated with revlogFN r   c                    || _         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        | _        n$| j        | _        | j        | _        | j        | _        || _        d S )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_endrS   s                    r   __init__zRevlogDocket.__init__f   s   &  .{++l(
}%"3#!1+%9"())C0@,A,AAAAA'((3/C+D+DDDDD())C0D,E,EEEEE-----+++++33333"+"3!)!1%1"%9" 	<"5DO!3DN!%!;D"5DO!3DN!%!;D*D'''r   c                 X    | j         t                      | _         d| j        | j         fz  S )z=file path to the current index file associated to this docketN	   %s-%s.idx)rC   r   r>   rT   s    r   index_filepathzRevlogDocket.index_filepath   s.     #'zzDt{D,<===r   c                     | j         | j        f}| j                            d|           t	                      | _         |                                 S )z\switch index file to a new UID

        The previous index UID is moved to the "older" list.r   )rC   rP   rD   insertr   rh   rT   olds     r   new_index_filezRevlogDocket.new_index_file   sJ     1&&q#...#::""$$$r   Tc              #   P   K   | j         D ]\  }}|s|dk    rd| j        |fz  V  dS )z>yield file path to older index files associated to this docketr   rf   N)rD   r>   rT   include_emptyuuidsizes       r   old_index_filepathsz RevlogDocket.old_index_filepaths   sQ       1 	9 	9JD$ 9q"dk4%88888	9 	9r   c                 X    | j         t                      | _         d| j        | j         fz  S )z<file path to the current data file associated to this docketN	   %s-%s.dat)rE   r   r>   rg   s    r   data_filepathzRevlogDocket.data_filepath   s+     ?"&jjDOt{DO<<<r   c                     | j         | j        f}| j                            d|           t	                      | _         |                                 S )zZswitch data file to a new UID

        The previous data UID is moved to the "older" list.r   )rE   rQ   rF   rj   r   rv   rk   s     r   new_data_filezRevlogDocket.new_data_file   sH     /%%a---"**!!###r   c              #   P   K   | j         D ]\  }}|s|dk    rd| j        |fz  V  dS )z=yield file path to older data files associated to this docketr   ru   N)rF   r>   ro   s       r   old_data_filepathszRevlogDocket.old_data_filepaths   sQ       0 	9 	9JD$ 9q"dk4%88888	9 	9r   c                 X    | j         t                      | _         d| j        | j         fz  S )z@file path to the current sidedata file associated to this docketN	   %s-%s.sda)rG   r   r>   rg   s    r   sidedata_filepathzRevlogDocket.sidedata_filepath   s.     &"***Dt{D,?@@@r   c                     | j         | j        f}| j                            d|           t	                      | _         |                                 S )zbswitch sidedata file to a new UID

        The previous sidedata UID is moved to the "older" list.r   )rG   rR   rH   rj   r   r}   rk   s     r   new_sidedata_filezRevlogDocket.new_sidedata_file   sK     "D$67"))!S111&jj%%'''r   c              #   P   K   | j         D ]\  }}|s|dk    rd| j        |fz  V  dS )zAyield file path to older sidedata files associated to this docketr   r|   N)rH   r>   ro   s       r   old_sidedata_filepathsz#RevlogDocket.old_sidedata_filepaths   sQ       4 	9 	9JD$ 9q"dk4%88888	9 	9r   c                     | j         S N)rP   rg   s    r   r^   zRevlogDocket.index_end   s
    r   c                 <    || j         k    r|| _         d| _        d S d S NT)rP   r<   rT   new_sizes     r   r^   zRevlogDocket.index_end   s)    t&&&DODKKK '&r   c                     | j         S r   )rQ   rg   s    r   r`   zRevlogDocket.data_end   s
    ~r   c                 <    || j         k    r|| _         d| _        d S d S r   )rQ   r<   r   s     r   r`   zRevlogDocket.data_end   s)    t~%%%DNDKKK &%r   c                     | j         S r   )rR   rg   s    r   rb   zRevlogDocket.sidedata_end   s    !!r   c                 <    || j         k    r|| _         d| _        d S d S r   )rR   r<   r   s     r   rb   zRevlogDocket.sidedata_end   s+    t)))!)DDKKK *)r   c                 l   | j         sdS | j        r d}|| j        z  }t          j        |          |s|                    | j        d           |                     | j        dd          5 }|                    |                     |                     d	d	d	           n# 1 swxY w Y   || _         dS )
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	addbackuprB   r)   
_serialize)rT   transactionr   	strippingmsgr*   s         r   r)   zRevlogDocket.write   s     { 	5 25tz!,S111 E %%dj8%DDDdjtEE :88999: : : : : : : : : : : : : : : "DK4s   ,*B""B&)B&c                 B   |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 }|                    t!          j        |            |                    | j                   | j	        D ]@\  }}|                    t$                              t          |          |                     A| j	        D ]\  }}|                    |           |                    | j
                   | j        D ]@\  }}|                    t$                              t          |          |                     A| j        D ]\  }}|                    |           |                    | j                   | j        D ]@\  }}|                    t$                              t          |          |                     A| j        D ]\  }}|                    |           d                    |          S )Nr   )rJ   rL   rN   rP   rQ   rR   r9   lenrC   rD   rE   rF   rG   rH   rS   appendS_HEADERr(   	S_OLD_UIDjoin)	rT   r   official_index_endofficial_data_endofficial_sidedata_enddatasurr   s	            r   r   zRevlogDocket._serialize  s    	7!%!8 $ 6$($>!!!% $$($6! !DN2222$(:::::  !!'((  &''#$$*++ON!+
  	%&&&	!""". 	3 	3GAtHHY^^CFFD112222. 	 	GAtHHQKKKK	!!!- 	3 	3GAtHHY^^CFFD112222- 	 	GAtHHQKKKK	$%%%1 	3 	3GAtHHY^^CFFD1122221 	 	GAtHHQKKKKxx{{r   )FNNr7   Nr7   Nr7   r   r   r   r   r   r   N)T)FFF)__name__
__module____qualname____doc__rd   rh   rm   rs   rv   rx   rz   r}   r   r   propertyr^   setterr`   rb   r)   r   r7   r   r   r6   r6   c   s       ))
 #'#4E 4E 4E 4El> > >% % %9 9 9 9= = =$ $ $9 9 9 9A A A( ( (9 9 9 9   X   
   X _  _
 " " X"   
   *1 1 1 1 1 1r   r6   c                     |dz  }|t           j        t           j        fvrdS t          j        | j                                                 }t          | ||          }d|_        |S )z?given a revlog version a new docket object for the given revlogi  N)rW   rS   T)	r	   REVLOGV2CHANGELOGV2r   compengines_compenginerevlogheaderr6   r<   )rU   rW   
rl_versioncompdockets        r   default_docketr   H  sn    &(J),i.CDDDtF./<<>>D%#'  F
 FMMr   c                    g }g }t          d|          D ]D} | t          j                  }|                    t                              |                     E|D ]'\  }} | |          }|                    ||f           (|S )Nr   )ranger   rr   r   unpack)	get_datacount	all_sizesall_uidsr.   r2   uid_size	file_sizeuids	            r   _parse_old_uidsr   W  s    IH1e__ 0 0hy~&&))#..////( * *)hx  i())))Or   Fc                 "   t                               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                    k    r3d}|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)rr   r   r2   r   offsets      r   r   zparse_docket.<locals>.get_datak  s    !9tc$ii''<CF1I$c$ii00C+c"""6!9vay4//0q			T			
r   )rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rS   )r   r   rr   r!   nextr   r6   )rU   r   rV   headerr   iheaderrW   index_uuid_sizerX   older_index_uuid_countrY   data_uuid_sizerZ   older_data_uuid_countr[   sidedata_uuid_sizer\   older_sidedata_uuid_countr]   
index_sizepending_index_size	data_sizepending_data_sizesidedata_sizepending_sidedata_sizerS   r   r   s    `                         @r   parse_docketr   d  s   __T/HM/233F m_F	 	 	 	 	 	 6llG']]N7mmO/**J!']]'2HII']]N((I MM&x1FGGgH/00M $W*85NOOgJgWIWMMM MM!%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   r7   r   r   <module>r      si  & 
			                  
. . . . %))*<==     X 6=36FFGG FM%  	b b b b b b b bJ  
 
 
H H H H H Hr   