
    q&f\H                     D   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	 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$y)    N)_)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y)_cachebackedpacksc           
          t        |      | _        t        j                  |      | _        d | _        t        t        t        |t        |                        D ]  }| j                  ||           y 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__9   s^    %j**95 %Is5z :;< 	(AeAh'	(    c                 "    d| j                   |<   y )NT)r   r   packs     r!   r   z_cachebackedpacks._movetofrontC   s    #tr#   c                 b    | j                   #| j                  | j                          d | _         y y r   )r   r   r   s    r!   _registerlastpackusagez(_cachebackedpacks._registerlastpackusageG   s*    >>%dnn-!DN &r#   c                 |    | j                          | j                  |       | j                  j                  |       y r   )r)   r   r   addr%   s     r!   r+   z_cachebackedpacks.addL   s.    ##% 	$r#   c              #      K   | j                          | j                  D ]  }|| _        |  | j                  D ch c]  }| }}| j                  |z
  D ]  }|| _        |  d | _        y c c}w wr   )r)   r   r   r   )r   r&   cachedpackss      r!   __iter__z_cachebackedpacks.__iter__T   s~     ##% NN 	D!DNJ	 )-7t77KK+- 	D!DNJ	
  8s   ;A4	A/.A4N)__name__
__module____qualname__r"   r   r)   r+   r.    r#   r!   r   r   8   s    ($"
r#   r   c                   N    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y	)basepackstored   c                    || _         || _        d| _        g }| j                         D ])  \  }}}	 | j	                  |      }|j                  |       + t        || j                        | _        y # t
        $ rG}t        |dd       t        j                  k7  r|j                  t        d      ||fz         Y d }~d }~ww xY w)Nr   errnos   unable to load pack %s: %s
)uipathlastrefresh_getavailablepackfilessortedgetpack	Exceptiongetattrr7   ENOENTwarnr   appendr   DEFAULTCACHESIZEr   )r   r8   r9   r   filepath__r&   exs           r!   r"   zbasepackstore.__init__j   s    	  $ A A C 	Hb"||H- LL	  'ud.C.CD
  
 2w-=GGA=>(BOP
s   A00	C 9=B;;C c              #     K   t        | j                        }t        | j                        }t               }t	        j
                  d       }t	        j
                  d       }	 t        j                  | j                  d      D ]  \  }}}d}	|| d | j                  k(  r|d|  }	n|| d | j                  k(  r|d|  }	|	s?||	xx   |j                  z  cc<   ||	   j                  |j                         |	|v r?t        j                  j                  | j                  |	      t        ||	         ||	   f |j                  |	        y# t         $ r Y yw xY w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                       y)Nr   r2   r2   r#   r!   <lambda>z6basepackstore._getavailablepackfiles.<locals>.<lambda>   s    r#   c                      g S r   r2   r2   r#   r!   rH   z6basepackstore._getavailablepackfiles.<locals>.<lambda>   s     r#   T)statN)r   INDEXSUFFIX
PACKSUFFIXr   collectionsdefaultdictr   listdirr9   st_sizerA   st_mtimeosjoinmaxr+   FileNotFoundError)
r   indexsuffixlenpacksuffixlenidssizesmtimesfilenametyperJ   ids
             r!   _getavailablepackfilesz$basepackstore._getavailablepackfiles   sN     T--.DOO,e''	2((4	(.tyyt(L $$$^O,-1A1AA!"2N?3B}no.$//A!/M>2B
 "I-I2J%%dmm4SyGGLLB7r
O!"I  )$* ! 		s2   A!E$AE BE E	EEEEc              #      K   g }| j                         D ]  \  }}}|j                  |||f        t        |d      }|D ]  \  }}}|||f  yw)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)r^   rA   sorted)r   filesr9   mtimesizes        r!   r;   z*basepackstore._getavailablepackfilessorted   sn      !%!<!<!> 	.D%LL%t,-	.ud+!& 	$E4t##	$s   AAc                 X    d}d}| j                         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
   )r^   )r   	totalsizecountrD   rd   s        r!   gettotalsizeandcountz"basepackstore.gettotalsizeandcount   sL     	 779 	LBDIQJE	 %r#   c                 2    | j                         \  }}||dS )z+Returns metrics on the state of this store.)s   numpackss   totalpacksize)rh   )r   rd   rg   s      r!   
getmetricszbasepackstore.getmetrics   s$    //1e"
 	
r#   c                     t               r   NotImplementedError)r   r9   s     r!   r<   zbasepackstore.getpack       !##r#   c                     |}| j                   D ]  }|j                  |      }|r|c S  |r&| j                         D ]  }|j                  |      } |S r   )r   
getmissingrefresh)r   keysmissingr&   s       r!   rp   zbasepackstore.getmissing   sa    JJ 	Doog.G 	  3//'23 r#   Nc                 H    | j                   D ]  }|j                  |        y r   )r   
markledger)r   ledgeroptionsr&   s       r!   ru   zbasepackstore.markledger   s!    JJ 	$DOOF#	$r#   c                     d| _         y)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                 r   t        j                          }g }|| j                  t        z   kD  r|| _        | j                  D ch c]  }|j                   }}| j                         D ]H  \  }}}||vs| j                  |      }|j                  |       | j                  j                  |       J |S c c}w )ztChecks for any new packs on disk, adds them to the main pack list,
        and returns a list of just the new packs.)	timer:   REFRESHRATEr   r9   r;   r<   rA   r+   )r   nownewpacksppreviousrC   rD   newpacks           r!   rq   zbasepackstore.refresh   s     iik !!K//"D(,

313H3$($E$E$G , "b8+"ll84GOOG,JJNN7+	,  4s   B4r   )r/   r0   r1   rB   r"   r^   r;   rh   rj   r<   rp   ru   ry   rq   r2   r#   r!   r4   r4   f   s<    E6$L$ 
$ $
r#   r4   c                       e Zd ZdZdgZd Zy)versionmixinNr   c                     || j                   v r2| j                  || _        y | j                  |k7  rt        d|z        y t        d|z        )Ns   inconsistent version: %ds   unsupported version: %d)SUPPORTED_VERSIONSVERSIONRuntimeError)r   versions     r!   _checkversionzversionmixin._checkversion  sV    d---||#&("#>#HII ) 9GCDDr#   )r/   r0   r1   r   r   r   r2   r#   r!   r   r     s    G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y)basepacki  @r   c                    || _         || j                  z   | _        || j                  z   | _        t        j                  | j                        j                  | _        t        j                  | j                        j                  | _	        d | _
        d | _        | j                          t        j                  d| j                  d t               d   }| j!                  |       t        j                  d| j                  d t"               \  }}| j!                  |       d|z  rt%        t&        |      | _        y t%        t*        |      | _        y )N   !Br      !BB   )r9   rL   packpathrK   	indexpathrR   rJ   rP   	indexsizedatasize_index_data
freememorystructunpackPACKVERSIONSIZEr   INDEXVERSIONSIZEindexparamsLARGEFANOUTPREFIXparamsSMALLFANOUTPREFIX)r   r9   r   configs       r!   r"   zbasepack.__init__  s    	t. 0 00088.66
--tzz2B?'CDQG7# --<M=M0NO7#%&7ADK%&7ADKr#   c                 
   | j                   }| j                  t        t        |j                  z    }g }t	        d|j
                        D ]7  }|dz  }t        j                  d|||dz          d   }|j                  |       9 |S )Nr         !I)	r   r   FANOUTSTART
fanoutsizer   fanoutcountr   r   rA   )r   r   	rawfanoutfanouttabler    locfanoutentrys          r!   _fanouttablezbasepack._fanouttable1  s    KKkF<M<M.MN	q&,,- 	,Aa%C --ysQw/G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<  sV    &&4;; 6 6 :

	 {{%%	D4I4I(IIIr#   c                 d   | j                   rN| j                  | j                  k  ry| j                   j                          | j                  j                          t        | j                  d      5 }t        j                  |j                         dt        j                        | _         ddd       t        | j                  d      5 }t        j                  |j                         dt        j                        | _        ddd       d| _        y# 1 sw Y   ixY w# 1 sw Y   d| _        yxY w)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.freememoryC  s     ;;}}t.KKJJ $..%( 	G)) !D,<,<DK	
 $--' 	P66==?Ad>N>NODJ	P 	 	
	P s   1:D	:DDD/c                     t               r   rl   )r   rr   s     r!   rp   zbasepack.getmissingZ  rn   r#   Nc                     t               r   rl   )r   rv   rw   s      r!   ru   zbasepack.markledger]  rn   r#   c                     t               r   rl   )r   rv   s     r!   cleanupzbasepack.cleanup`  rn   r#   c                     t               r   rl   r(   s    r!   r.   zbasepack.__iter__c  rn   r#   c                     t               r   rl   r(   s    r!   iterentrieszbasepack.iterentriesf  rn   r#   r   )r/   r0   r1   r   r   r"   r   propertycacher   r   r   rp   ru   r   r.   r   r2   r#   r!   r   r     sk     !JB. 
  
J J.$$$$$r#   r   c                   L    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y)mutablebasepackc                 B   | j                  |       d| _        t        j                  |      }d|_        || _        i | _        t        j                  ||       |j                  | j                  dz         \  | _        | _        |j                  | j                  dz         \  | _        | _        t!        j"                  | j                  d      | _        t!        j"                  | j                  d      | _        t%        j&                         | _        d| _        |j-                  |j/                  | j                               |j-                  |j/                  | j                               t1        j2                  d| j4                        }| j7                  |       y )Ns   GZi$  s   -tmp)suffixzwb+Fr   )r   _compressorvfsmodr   
createmodeopenerentriesr   mkstickygroupdirmkstemprL   packfpr   rK   idxfpidxpathrR   fdopenr	   sha1sha_closed_fixfilemoderS   r   r&   r   writeraw)r   r8   packdirr   r   
versionbufs         r!   r"   zmutablebasepack.__init__k  s<   7# G$!$$R1%+^^??W, &4 &
"T] $*>>##g- $2 $
 
DL iiU3YYtzz51
==?
 	FKK67FKK56
 [[5
j!r#   c                     | S r   r2   r(   s    r!   	__enter__zmutablebasepack.__enter__  s    r#   c                 J    || j                          y | j                          y r   )r   abort)r   exc_type	exc_value	tracebacks       r!   __exit__zmutablebasepack.__exit__  s    JJLJJLr#   c                 $    | j                          y r   )_cleantemppacksr(   s    r!   r   zmutablebasepack.abort  s    r#   c                 p    | j                   j                  |       | j                  j                  |       y r   )r   writer   update)r   datas     r!   r   zmutablebasepack.writeraw  s$    $r#   Nc                 *   | j                   ry 	 t        | j                  j                               }| j                  j                          | j                          t        | j                        dk(  r| j                          d| _         y | j                  j                  | j                  || j                  z          	 | j                  j                  | j                  || j                  z          	 d| _         | j                  j%                  |      }|r|j'                  |       |S # t         $ r@}	 | j                  j#                  || j                  z          |# t         $ r Y |w xY wd }~ww xY w# t         $ r | j                           w xY w)Nr   T)r   r   r   digestr   r   
writeindexr   r   r   r   renamer   rL   r   rK   r=   unlinkrS   
addcreated)r   rv   r   rE   results        r!   r   zmutablebasepack.close  sU   <<	dhhoo'(CKKOO4<< A%$$&#KKt}}cDOO.CD	""4<<t7G7G1GH !!#&f%#  KK&&sT__'<=
 	 !  	  	  "	sN   A<E7 3E7  3D+ +	E45(EE/	E,(E/+E,,E//E44E7 7Fc                     	 | j                   j                  | j                         	 | j                   j                  | j                         y # t        $ r Y 2w xY w# t        $ r Y y w xY wr   )r   r   r   r=   r   r(   s    r!   r   zmutablebasepack._cleantemppacks  s_    	KKt}}-	KKt||,  		  		s"   %A %A 	AA	A)(A)c                    t        | j                        t        kD  }|rt        t        | j
                        }nt        t        | j
                        }t        g|j                  z  }i }d}t        | j                        D ]]  }|| j                  z  }|||<   |dz  }t        j                  |j                  |d |j                         d   }||   t        k(  sY|||<   _ d}	d}
|D ]*  }|t        k7  r|n|
}|}
|	t        j                  d|      z  }	, t        j                  dt        | j                              }| j!                  |dt        |	      z         }| j#                  |       | j$                  j'                  |	       | j$                  j'                  |       | j$                  j'                  |       | j$                  j)                          y )Nr   r
   r#   r   r   r   )r   r   SMALLFANOUTCUTOFFr   r   r   r   EMPTYFANOUTr   ra   r   r   r   fanoutstructfanoutprefixr&   createindex_writeheaderr   r   r   )r   largefanoutr   r   	locationsrg   nodelocation	fanoutkeyrawfanouttablelastoffsetrawentrieslengthrawindexs                 r!   r   zmutablebasepack.writeindex  s   $,,'*;; !2DLLAF !2DLLAF"mf&8&88 	4<<( 
	2Dt444H&IdOQJE ##T*?F,?,?%@I 9%4)1I&
	2 ! 	9F%4V$FDfkk%88N	9
 ";;uc$,,.?@ ##Iq3~3F/FG&!

(

)*

"

r#   c                     t               r   rl   )r   nodelocationsindexoffsets      r!   r   zmutablebasepack.createindex  rn   r#   c                     d}|j                   t        k(  rd}| j                  j                  t	        j
                  d| j                  |             y )Nr   r   r   )r   r   r   r   r   r&   r   )r   r   r   s      r!   r   zmutablebasepack._writeheader  s@    
 ##'88F

VT\\6BCr#   )r   r   )r/   r0   r1   r"   r   r   r   r   r   r   r   r   r   r2   r#   r!   r   r   j  s8     "D#J)V$Dr#   r   c                       e Zd ZdZd Zy)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_        y )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 a0 **Q.%71r#   N)r/   r0   r1   	__slots__r"   r2   r#   r!   r   r     s    Ir#   r   )%rM   r7   r   rR   r   r{   mercurial.i18nr   mercurial.pycompatr   mercurial.noder   	mercurialr   r   r   r   mercurial.utilsr	    r   	importmodr   r   r   r   r   r   r   r   r|   r   r4   r   r   r   r   r2   r#   r!   <module>r     s       	     
 % 			(	#
   
    ! 
 + +\Z ZzE E T$| T$nYDl YDx r#   