
    	^c\H                     j   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZ d dlmZ ddlmZ  ej        d	          ZdZd
ZeZdZdZd
ZdZdZ G d d          Z  G d d          Z! G d d          Z" G d de"          Z# G d de"          Z$ G d d          Z%dS )    N)_)getattropen)hex)policyutilvfs)hashutil   )shallowutilosutil   i    g?c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )_cachebackedpacksc           
         t          |          | _        t          j        |          | _        d | _        t          t          t          |t          |                                        D ]}| 
                    ||                    d S N)set_packsr   lrucachedict	_lrucache	_lastpackreversedrangeminlen_movetofront)selfpacks	cachesizeis       >/usr/lib/python3/dist-packages/hgext/remotefilelog/basepack.py__init__z_cachebackedpacks.__init__:   s~    %jj*955 %Is5zz : :;;<< 	( 	(AeAh''''	( 	(    c                     d| j         |<   d S )NT)r   r   packs     r"   r   z_cachebackedpacks._movetofrontD   s    #tr$   c                 Z    | j         #|                     | j                    d | _         d S d S r   )r   r   r   s    r"   _registerlastpackusagez(_cachebackedpacks._registerlastpackusageH   s3    >%dn---!DNNN &%r$   c                     |                                   |                     |           | j                            |           d S r   )r*   r   r   addr&   s     r"   r,   z_cachebackedpacks.addM   sD    ##%%% 	$r$   c              #      K   |                                   | j        D ]}|| _        |V  d | j        D             }| j        |z
  D ]}|| _        |V  d | _        d S )Nc                     h | ]}|S  r/   ).0r'   s     r"   	<setcomp>z-_cachebackedpacks.__iter__.<locals>.<setcomp>]   s    777t777r$   )r*   r   r   r   )r   r'   cachedpackss      r"   __iter__z_cachebackedpacks.__iter__U   s      ##%%% N 	 	D!DNJJJJ77777K+- 	 	D!DNJJJJ r$   N)__name__
__module____qualname__r#   r   r*   r,   r3   r/   r$   r"   r   r   9   s_        ( ( ($ $ $" " "
      r$   r   c                   P    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
dd
Zd Zd Zd	S )basepackstored   c                    || _         || _        d| _        g }|                                 D ]\  }}}	 |                     |          }n]# t
          $ rP}t          |dd           t          j        k    r'|	                    t          d          ||fz             Y d }~rd }~ww xY w|                    |           t          || j                  | _        d S )Nr   errnos   unable to load pack %s: %s
)uipathlastrefresh_getavailablepackfilessortedgetpack	Exceptionr   r;   ENOENTwarnr   appendr   DEFAULTCACHESIZEr   )r   r<   r=   r   filepath__r'   exs           r"   r#   zbasepackstore.__init__k   s    	  $ A A C C 	 	Hb"||H-- 
 
 
 2w--==GGA=>>(BOPPP
 LL&ud.CDD


s   A		
B#ABB#c              #     K   t          | j                  }t          | j                  }t                      }t	          j        d           }t	          j        d           }	 t                              | j        d          D ]\  }}}d}	|| d         | j        k    r|d|          }	n|| d         | j        k    r|d|          }	|	r||	xx         |j	        z  cc<   ||	         
                    |j                   |	|v rDt          j                            | j        |	          t          ||	                   ||	         fV  |                    |	           dS # t           $ r Y dS w xY w)zFor each pack file (a index/data file combo), yields:
          (full path without extension, mtime, size)

        mtime will be the mtime of the index/data file (whichever is newer)
        size is the combined size of index/data file
        c                      dS )Nr   r/   r/   r$   r"   <lambda>z6basepackstore._getavailablepackfiles.<locals>.<lambda>   s     r$   c                      g S r   r/   r/   r$   r"   rK   z6basepackstore._getavailablepackfiles.<locals>.<lambda>   s     r$   T)statN)r   INDEXSUFFIX
PACKSUFFIXr   collectionsdefaultdictr   listdirr=   st_sizerD   st_mtimeosjoinmaxr,   FileNotFoundError)
r   indexsuffixlenpacksuffixlenidssizesmtimesfilenametyperM   ids
             r"   _getavailablepackfilesz$basepackstore._getavailablepackfiles   s      T-..DO,,ee'		22(44	(.tyt(L(L $ $$$^O,,-1AAA!"2N?"23BB}noo.$/AA!/M>/2B
  
$"III-III2J%%dm444SyyGLLB77r
OO!"I     )$ $* ! 	 	 	DD	s   $C=E# #
E10E1c              #      K   g }|                                  D ]\  }}}|                    |||f           t          |d          }|D ]\  }}}|||fV  dS )zLike `_getavailablepackfiles`, but also sorts the files by mtime,
        yielding newest files first.

        This is desirable, since it is more likely newer packfiles have more
        desirable data.
        T)reverseN)ra   rD   sorted)r   filesr=   mtimesizes        r"   r?   z*basepackstore._getavailablepackfilessorted   s       !%!<!<!>!> 	. 	.D%LL%t,----ud+++!& 	$ 	$E4t#####	$ 	$r$   c                 \    d}d}|                                  D ]\  }}}||z  }|dz  }||fS )aL  Returns the total disk size (in bytes) of all the pack files in
        this store, and the count of pack files.

        (This might be smaller than the total size of the ``self.path``
        directory, since this only considers fuly-writen pack files, and not
        temporary files or other detritus on the directory.)
        r   r   )ra   )r   	totalsizecountrG   rg   s        r"   gettotalsizeandcountz"basepackstore.gettotalsizeandcount   sO     	 7799 	 	LBDIQJEE%r$   c                 :    |                                  \  }}||dS )z+Returns metrics on the state of this store.)s   numpackss   totalpacksize)rk   )r   rg   rj   s      r"   
getmetricszbasepackstore.getmetrics   s,    //11e"
 
 	
r$   c                     t                      r   NotImplementedError)r   r=   s     r"   r@   zbasepackstore.getpack       !###r$   c                     |}| j         D ]}|                    |          }|s|c S |r,|                                 D ]}|                    |          }|S r   )r   
getmissingrefresh)r   keysmissingr'   s       r"   rs   zbasepackstore.getmissing   sz    J 	 	Doog..G    	3 3 3//'22r$   Nc                 D    | j         D ]}|                    |           d S r   )r   
markledger)r   ledgeroptionsr'   s       r"   rx   zbasepackstore.markledger   s2    J 	$ 	$DOOF####	$ 	$r$   c                     d| _         dS )z~Tells the store that there may be new pack files, so the next time it
        has a lookup miss it should check for new files.r   N)r>   r)   s    r"   markforrefreshzbasepackstore.markforrefresh   s     r$   c                 L   t          j                     }g }|| j        t          z   k    r{|| _        d | j        D             }|                                 D ]N\  }}}||vrD|                     |          }|                    |           | j                            |           O|S )ztChecks for any new packs on disk, adds them to the main pack list,
        and returns a list of just the new packs.c                     h | ]	}|j         
S r/   )r=   )r0   ps     r"   r1   z(basepackstore.refresh.<locals>.<setcomp>   s    3331333r$   )timer>   REFRESHRATEr   r?   r@   rD   r,   )r   nownewpackspreviousrF   rG   newpacks          r"   rt   zbasepackstore.refresh   s     ikk !K///"D33
333H$($E$E$G$G , , "b8++"ll844GOOG,,,JNN7+++r$   r   )r4   r5   r6   rE   r#   ra   r?   rk   rm   r@   rs   rx   r|   rt   r/   r$   r"   r8   r8   g   s        E E E6$ $ $L$ $ $     
 
 
$ $ $   $ $ $ $  
    r$   r8   c                       e Zd ZdZdgZd ZdS )versionmixinNr   c                     || j         v r/| j        	|| _        d S | j        |k    rt          d|z            d S t          d|z            )Ns   inconsistent version: %ds   unsupported version: %d)SUPPORTED_VERSIONSVERSIONRuntimeError)r   versions     r"   _checkversionzversionmixin._checkversion	  sb    d---|#&(("#>#HIII )( 9GCDDDr$   )r4   r5   r6   r   r   r   r/   r$   r"   r   r     s5        GE E E E Er$   r   c                       e Zd ZdZdgZd Zej        d             Zej        d             Z	d Z
d Zdd	Zd
 Zd Zd ZdS )basepacki  @r   c                    || _         || j        z   | _        || j        z   | _        t          j        | j                  j        | _        t          j        | j                  j        | _	        d | _
        d | _        |                                  t          j        d| j        d t                             d         }|                     |           t          j        d| j
        d t"                             \  }}|                     |           d|z  rt%          t&          |          | _        d S t%          t*          |          | _        d S )N   !Br      !BB   )r=   rO   packpathrN   	indexpathrU   rM   rS   	indexsizedatasize_index_data
freememorystructunpackPACKVERSIONSIZEr   INDEXVERSIONSIZEindexparamsLARGEFANOUTPREFIXparamsSMALLFANOUTPREFIX)r   r=   r   configs       r"   r#   zbasepack.__init__  s   	t. 00008..6
-tz2B?2B'CDDQG7### -<M=M<M0NOO7### 	B%&7AADKKK%&7AADKKKr$   c                 
   | j         }| j        t          t          |j        z            }g }t	          d|j                  D ]B}|dz  }t          j        d|||dz                      d         }|                    |           C|S )Nr         !I)	r   r   FANOUTSTART
fanoutsizer   fanoutcountr   r   rD   )r   r   	rawfanoutfanouttabler!   locfanoutentrys          r"   _fanouttablezbasepack._fanouttable2  s    KkF<M.M MN	q&,-- 	, 	,Aa%C -ysQw/GHHKK{++++r$   c                     t          j        d| j        | j        j        dz
            d         }| j        j        || j        z  z   S )N   !Q   r   )r   unpack_fromr   r   
indexstartINDEXENTRYLENGTH)r   	nodecounts     r"   	_indexendzbasepack._indexend=  sI    &4; 6 :
 

	 {%	D4I(IIIr$   c                 >   | j         rD| j        | j        k     rdS | j                                          | j                                         t          | j        d          5 }t          j        |                                dt          j	                  | _         ddd           n# 1 swxY w Y   t          | j
        d          5 }t          j        |                                dt          j	                  | _        ddd           n# 1 swxY w Y   d| _        dS )zUnmap and remap the memory to free it up after known expensive
        operations. Return True if self._data and self._index were reloaded.
        Fs   rbr   )accessNT)r   _pagedin
MAXPAGEDINcloser   r   r   mmapfilenoACCESS_READr   )r   indexfpdatafps      r"   r   zbasepack.freememoryD  s    ; 	}t..uKJ $.%(( 	G)  !D,<  DK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 $-'' 	P66==??Ad>NOOODJ	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P ts$   !9B&&B*-B*9DDDc                     t                      r   ro   )r   ru   s     r"   rs   zbasepack.getmissing[  rq   r$   Nc                     t                      r   ro   )r   ry   rz   s      r"   rx   zbasepack.markledger^  rq   r$   c                     t                      r   ro   )r   ry   s     r"   cleanupzbasepack.cleanupa  rq   r$   c                     t                      r   ro   r)   s    r"   r3   zbasepack.__iter__d  rq   r$   c                     t                      r   ro   r)   s    r"   iterentrieszbasepack.iterentriesg  rq   r$   r   )r4   r5   r6   r   r   r#   r   propertycacher   r   r   rs   rx   r   r3   r   r/   r$   r"   r   r     s         !JB B B. 
   
J J J  .$ $ $$ $ $ $$ $ $$ $ $$ $ $ $ $r$   r   c                   N    e Zd ZddZd Zd Zd Zd ZddZd	 Z	d
 Z
d Zd ZdS )mutablebasepackr   c                 2   |                      |           d| _        t          j        |          }d|_        || _        i | _        t          j        ||           |	                    | j
        dz             \  | _        | _        |	                    | j        dz             \  | _        | _        t!          j        | j        d          | _        t!          j        | j        d          | _        t%          j                    | _        d| _        |                    |                    | j                             |                    |                    | j                             t1          j        d| j                  }|                     |           d S )Ns   GZi$  s   -tmp)suffixzwb+Fr   )r   _compressorvfsmodr	   
createmodeopenerentriesr   mkstickygroupdirmkstemprO   packfpr   rN   idxfpidxpathrU   fdopenr
   sha1sha_closed_fixfilemoderV   r   r'   r   writeraw)r   r<   packdirr   r   
versionbufs         r"   r#   zmutablebasepack.__init__l  sb   7### G$$!$R111%+^^?W, &4 &
 &
"T] $*>>#g- $2 $
 $
 
DL iU33Ytz511
=??
 	FKK66777FKK55666
 [55
j!!!!!r$   c                     | S r   r/   r)   s    r"   	__enter__zmutablebasepack.__enter__  s    r$   c                 ^    ||                                   d S |                                  d S r   )r   abort)r   exc_type	exc_value	tracebacks       r"   __exit__zmutablebasepack.__exit__  s*    JJLLLLLJJLLLLLr$   c                 .    |                                   d S r   )_cleantemppacksr)   s    r"   r   zmutablebasepack.abort  s    r$   c                 n    | j                             |           | j                            |           d S r   )r   writer   update)r   datas     r"   r   zmutablebasepack.writeraw  s2    $r$   Nc                    | j         rd S 	 t          | j                                                  }| j                                         |                                  t          | j                  dk    r| 	                                 d| _         d S | j
                            | j        || j        z              	 | j
                            | j        || j        z              nH# t           $ r;}	 | j
                            || j        z              n# t           $ r Y nw xY w|d }~ww xY wn## t           $ r | 	                                  w xY wd| _         | j
                            |          }|r|                    |           |S )Nr   T)r   r   r   digestr   r   
writeindexr   r   r   r   renamer   rO   r   rN   rA   unlinkrV   
addcreated)r   ry   r   rH   results        r"   r   zmutablebasepack.close  s   < 	F	dhoo''((CKOO4<  A%%$$&&&#tKt}cDO.CDDD	""4<t7G1GHHHH   K&&sT_'<====    D  I  	 	 	  """	
 !!#&& 	&f%%%sT   BD. (D. <(C% $D. %
D*0"DD%
D D%D  D%%D**D. . Ec                     	 | j                             | j                   n# t          $ r Y nw xY w	 | j                             | j                   d S # t          $ r Y d S w xY wr   )r   r   r   rA   r   r)   s    r"   r   zmutablebasepack._cleantemppacks  s    	Kt}---- 	 	 	D		Kt|,,,,, 	 	 	DD	s   " 
//A 
A"!A"c                    t          | j                  t          k    }|rt          t          | j                  }nt          t          | j                  }t          g|j        z  }i }d}t          | j                  D ]Y}|| j
        z  }|||<   |dz  }t          j        |j        |d |j                           d         }||         t          k    r|||<   Zd}	d}
|D ]+}|t          k    r|n|
}|}
|	t          j        d|          z  }	,t          j        dt          | j                            }|                     |dt          |	          z             }|                     |           | j                            |	           | j                            |           | j                            |           | j                                         d S )Nr   r   r$   r   r   r   )r   r   SMALLFANOUTCUTOFFr   r   r   r   EMPTYFANOUTr   rd   r   r   r   fanoutstructfanoutprefixr'   createindex_writeheaderr   r   r   )r   largefanoutr   r   	locationsrj   nodelocation	fanoutkeyrawfanouttablelastoffsetrawentrieslengthrawindexs                 r"   r   zmutablebasepack.writeindex  s   $,''*;; 	B !2DLAAFF !2DLAAF"mf&88 	4<(( 
	2 
	2Dt44H&IdOQJE #T*?F,?*?%@ I 9%44)1I&! 	9 	9F%44VV$FDfk%888NN!;uc$,.?.?@@ ##Iq3~3F3F/FGG&!!!
(((
)***
"""
r$   c                     t                      r   ro   )r   nodelocationss     r"   r   zmutablebasepack.createindex  rq   r$   c                     d}|j         t          k    rd}| j                            t	          j        d| j        |                     d S )Nr   r   r   )r   r   r   r   r   r'   r   )r   r   r   s      r"   r   zmutablebasepack._writeheader  sI    
 #'888F
VT\6BBCCCCCr$   )r   r   )r4   r5   r6   r#   r   r   r   r   r   r   r   r   r   r/   r$   r"   r   r   k  s         "  "  "  "D        # # # #J  ) ) )V$ $ $D D D D Dr$   r   c                       e Zd ZdZd ZdS )r   )r   r   r   r   r   c                    || _         |t          k    rd| _        n%|t          k    rd| _        nt	          d|z            d|dz  z  | _        | j        dz  | _        t          | j        z   | _        | xj        dz  c_        d S )Nr   s   !Hs   invalid fanout prefix size: %sr   r   r   )	r   r   r   r   
ValueErrorr   r   r   r   )r   
prefixsizer   s      r"   r#   zindexparams.__init__  s    &
 *** %D,,, %D>KLLL a0 *Q.%71r$   N)r4   r5   r6   	__slots__r#   r/   r$   r"   r   r     s*        I    r$   r   )&rP   r;   r   rU   r   r   mercurial.i18nr   mercurial.pycompatr   r   mercurial.noder   	mercurialr   r   r	   r   mercurial.utilsr
    r   	importmodr   r   r   r   r   r   r   r   r   r   r8   r   r   r   r   r/   r$   r"   <module>r     sV         				                              
 % $ $ $ $ $      		(	#	#
   
    ! 
 + + + + + + + +\Z Z Z Z Z Z Z ZzE E E E E E E E T$ T$ T$ T$ T$| T$ T$ T$nYD YD YD YD YDl YD YD YDx         r$   