o ]LbJ@s8ddlmZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z m Z ddl mZddlmZmZmZmZddlmZdd lmZed ZdZd ZeZd ZdZd Z d Z!dZ"ej#rhej$shdZ%ndZ%Gddde&Z'Gddde&Z(Gddde&Z)Gddde)Z*Gddde)Z+Gddde&Z,dS))absolute_importN)_)getattropen)hex)policypycompatutilvfs)hashutil) shallowutilosutili g?srbesrbc@s4eZdZddZddZddZddZd d Zd S) _cachebackedpackscCsJt||_t||_d|_ttt|t |D] }| ||qdSN) set_packsr lrucachedict _lrucache _lastpackreversedrangeminlen _movetofront)selfpacks cachesizeir!>/usr/lib/python3/dist-packages/hgext/remotefilelog/basepack.py__init__Es  z_cachebackedpacks.__init__cCsd|j|<dS)NT)rrpackr!r!r"rOsz_cachebackedpacks._movetofrontcCs$|jdur||jd|_dSdSr)rrrr!r!r"_registerlastpackusageSs   z(_cachebackedpacks._registerlastpackusagecCs"||||j|dSr)r'rraddr$r!r!r"r(Xs z_cachebackedpacks.addccsX||jD]}||_|Vqdd|jD}|j|D]}||_|Vqd|_dS)NcSsh|]}|qSr!r!).0r%r!r!r" hsz-_cachebackedpacks.__iter__..)r'rrr)rr% cachedpacksr!r!r"__iter__`s  z_cachebackedpacks.__iter__N)__name__ __module__ __qualname__r#rr'r(r,r!r!r!r"rDs   rc@sbeZdZdZddZddZddZdd Zd d Zd d Z ddZ dddZ ddZ ddZ dS) basepackstoredc Cs||_||_d|_g}|D]8\}}}z||}Wn&tyA}zt|ddtjkr7| t d||fWYd}~qd}~ww| |qt ||j |_dS)Nrerrnosunable to load pack %s: %s )uipath lastrefresh_getavailablepackfilessortedgetpack Exceptionrr2ENOENTwarnrappendrDEFAULTCACHESIZEr)rr3r4rfilepath__r%exr!r!r"r#vs  zbasepackstore.__init__c cs8t|j}t|j}t}tdd}tdd}zetj|jddD]Y\}}}d} || d|jkr>|d| } n|| d|jkrO|d| } | r~|| |j 7<||  |j | |vryt j |j| t|| || fVq%|| q%WdSty} z| jtjkrWYd} ~ dSd} ~ ww)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 cSsdS)Nrr!r!r!r!r"z6basepackstore._getavailablepackfiles..cSsgSrr!r!r!r!r"r@rAT)statN)r INDEXSUFFIX PACKSUFFIXr collections defaultdictrlistdirr4st_sizer;st_mtimeosjoinmaxr(OSErrorr2r9) rindexsuffixlen packsuffixlenidssizesmtimesfilenametyperBidr?r!r!r"_getavailablepackfiless<     z$basepackstore._getavailablepackfilesccsVg}|D] \}}}||||fqt|dd}|D] \}}}|||fVqdS)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)rVr;sorted)rfilesr4mtimesizer!r!r"r6s z*basepackstore._getavailablepackfilessortedcCs4d}d}|D] \}}}||7}|d7}q||fS)aLReturns 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.) rr )rV)r totalsizecountr>r[r!r!r"gettotalsizeandcounts  z"basepackstore.gettotalsizeandcountcCs|\}}||dS)z+Returns metrics on the state of this store.)snumpackss totalpacksize)r^)rr[r]r!r!r" getmetricss zbasepackstore.getmetricscCtrNotImplementedError)rr4r!r!r"r7zbasepackstore.getpackcCsF|}|jD] }||}|s|Sq|r!|D]}||}q|Sr)r getmissingrefresh)rkeysmissingr%r!r!r"rds    zbasepackstore.getmissingNcCs|jD]}||qdSr)r markledger)rledgeroptionsr%r!r!r"rhs  zbasepackstore.markledgercCs d|_dS)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.rN)r5r&r!r!r"markforrefreshs zbasepackstore.markforrefreshcCspt}g}||jtkr6||_dd|jD}|D]\}}}||vr5||}|||j|q|S)ztChecks for any new packs on disk, adds them to the main pack list, and returns a list of just the new packs.cSsh|]}|jqSr!)r4)r)pr!r!r"r*sz(basepackstore.refresh..)timer5 REFRESHRATErr6r7r;r()rnownewpackspreviousr=r>newpackr!r!r"res   zbasepackstore.refreshr)r-r.r/r<r#rVr6r^r_r7rdrhrkrer!r!r!r"r0rs'  r0c@seZdZdZdgZddZdS) versionmixinNrcCsD||jvr|jdur||_dS|j|krtd|dStd|)Nsinconsistent version: %dsunsupported version: %d)SUPPORTED_VERSIONSVERSION RuntimeError)rversionr!r!r" _checkversions      zversionmixin._checkversion)r-r.r/rurtrxr!r!r!r"rss rsc@sleZdZdZdgZddZejddZejddZ d d Z d d Z dddZ ddZ ddZddZd S)basepacki@rcCs||_||j|_||j|_t|jj|_t|jj|_ d|_ d|_ | t d|j dtd}||t d|j dt\}}||d|@rYtt||_dStt||_dS)N!Br!BB)r4rDpackpathrC indexpathrJrBrH indexsizedatasize_index_data freememorystructunpackPACKVERSIONSIZErxINDEXVERSIONSIZE indexparamsLARGEFANOUTPREFIXparamsSMALLFANOUTPREFIX)rr4rwconfigr!r!r"r#'s    zbasepack.__init__cCsd|j}|jtt|j}g}td|jD]}|d}td|||dd}| |q|S)Nr!I) rr FANOUTSTART fanoutsizerxrange fanoutcountrrr;)rr rawfanout fanouttabler loc fanoutentryr!r!r" _fanouttable>s zbasepack._fanouttablecCs.td|j|jjdd}|jj||jS)N!Qr)r unpack_fromrr indexstartINDEXENTRYLENGTH)r nodecountr!r!r" _indexendIs zbasepack._indexendcCs|jr|j|jkr dS|j|jt|jt}tj| dtj d|_Wdn1s2wYt|j t}tj| dtj d|_Wdn1sTwYd|_dS)zUnmap and remap the memory to free it up after known expensive operations. Return True if self._data and self._index were reloaded. Fr)accessNT) r_pagedin MAXPAGEDINcloserrr~ PACKOPENMODEmmapfileno ACCESS_READr})rindexfpdatafpr!r!r"rPs     zbasepack.freememorycCr`rra)rrfr!r!r"rdgrczbasepack.getmissingNcCr`rra)rrirjr!r!r"rhjrczbasepack.markledgercCr`rra)rrir!r!r"cleanupmrczbasepack.cleanupcCr`rrar&r!r!r"r,prczbasepack.__iter__cCr`rrar&r!r!r" iterentriessrczbasepack.iterentriesr)r-r.r/rrtr#r propertycacherrrrdrhrr,rr!r!r!r"ry s    ryc@s`eZdZdddZddZddZdd Zd d Zdd dZddZ ddZ ddZ ddZ d S)mutablebasepackrcCs||d|_t|}d|_||_i|_t|||j |j dd\|_ |_ |j |j dd\|_|_t|j d|_ t|jd|_t|_d|_|||j |||jtd|j}||dS)NsGZi$s-tmp)suffixzwb+Frz)rx _compressorvfsmodr createmodeopenerentriesr mkstickygroupdirmkstemprDpackfpr}rCidxfpidxpathrJfdopenr sha1sha_closed _fixfilemoderKrr%ruwriteraw)rr3packdirrwr versionbufr!r!r"r#xs*    zmutablebasepack.__init__cCs|Srr!r&r!r!r" __enter__szmutablebasepack.__enter__cCs |dur |dS|dSr)rabort)rexc_type exc_value tracebackr!r!r"__exit__s  zmutablebasepack.__exit__cCs |dSr)_cleantemppacksr&r!r!r"rs zmutablebasepack.abortcCs|j||j|dSr)rwriterupdate)rdatar!r!r"rs zmutablebasepack.writerawNc Cs|jrdSz_t|j}|j|t|jdkr'| d|_WdS|j |j ||j z |j |j||jWn#tyb}zz |j ||j W|ty]Y|wd}~wwWn typ| wd|_|j |}|r|||S)NrT)rrrdigestrr writeindexrrrrrenamer}rDrrCr8unlinkrK addcreated)rrirr?resultr!r!r"rsB     zmutablebasepack.closecCsPz |j|jWn tyYnwz |j|jWdSty'YdSwr)rrr}r8rr&r!r!r"rs  zmutablebasepack._cleantemppackscCs2t|jtk}|rtt|j}ntt|j}tg|j}i}d}t |jD]'}||j }|||<|d7}t |j |d|jd}||tkrL|||<q%d} d} |D]} | tkr[| n| } | } | t d| 7} qSt dt|j} ||dt| } |||j| |j| |j| |jdS)Nrr rrr)rrSMALLFANOUTCUTOFFrrrur EMPTYFANOUTrrXrrr fanoutstruct fanoutprefixr% createindex _writeheaderrrr)r largefanoutrr locationsr]nodelocation fanoutkeyrawfanouttablelastoffsetrawentrieslengthrawindexr!r!r"rs@        zmutablebasepack.writeindexcCr`rra)r nodelocationsr!r!r"rrczmutablebasepack.createindexcCs.d}|jtkr d}|jtd|j|dS)Nrr|r{)rrrrrr%ru)rrrr!r!r"rs zmutablebasepack._writeheader)rr) r-r.r/r#rrrrrrrrrr!r!r!r"rws " % + rc@seZdZdZddZdS)r)rrrrrcCsj||_|tkr d|_n|tkrd|_ntd|d|d|_|jd|_t|j|_|jd7_dS)Nrzs!Hsinvalid fanout prefix size: %srrr) rrrr ValueErrorrrrr)r prefixsizerwr!r!r"r#s   zindexparams.__init__N)r-r.r/ __slots__r#r!r!r!r"rs r)- __future__rrEr2rrJrrmmercurial.i18nrmercurial.pycompatrrmercurial.noder mercurialrrr r rmercurial.utilsr r importmodrrrrrrrrrnisposixispy3robjectrr0rsryrrr!r!r!r"sB        .W