Ë etžÝ¾Gòãó¤—ddlZddlZddlZddlZddlmZddlmZmZddl m Z ddl m Z m Z mZddlmZddlmZmZGd „d «ZGd „d «Zy) éN)Ú_)ÚbinÚhex)Úopen)ÚerrorÚpycompatÚutil)Úhashutilé)Ú constantsÚ shallowutilcóp—eZdZdd„Zd„Zdd„Zd„Zd„Zd„Zd„Z d „Z d „Z d „Z d „Z d „Zd„Zd„Zd„Zd„Zy)Ú basestorecóÖ—||_|j|_||_||_||_t j stj«nd|_ |jjdd«|_ |jjddd«|_ |jdvrd|_ |jdk(rd|_ |r!tj|j|«yy) a­Creates a remotefilelog store object for the given repo name. `path` - The file path where this store keeps its data `reponame` - The name of the repo. This is used to partition data from many repos. `shared` - True if this store is a shared cache of data from the central server, for many repos on this machine. False means this store is for the local data for one repo. Nó remotefilelogsvalidatecachelogs validatecacheóon)róstrictóoffrF)ÚrepoÚuiÚ_pathÚ _reponameÚ_sharedrÚ iswindowsÚosÚgetuidÚ_uidÚconfigÚ_validatecachelogÚ_validatecacher Úmkstickygroupdir)ÚselfrÚpathÚreponameÚshareds úAusr/lib/python3.12/site-packages/hgext/remotefilelog/basestore.pyÚ__init__zbasestore.__init__sÇ€ðˆŒ Ø—'‘'ˆŒØˆŒ Ø!ˆŒØˆŒ Ü'/×'9Ò'9”B—I‘I”K¸tˆŒ à!%§¡§¡Ø Ð1ó" ˆÔð#Ÿg™gŸn™nØ Ð.°ó ˆÔð × Ñ Ð&@Ñ @Ø"'ˆDÔ Ø × Ñ  &Ò (Ø"'ˆDÔ á Ü × (Ñ (¨¯©°$Õ 7ð ócóö—g}|D]q\}}|j||«}tjj|«}|r#|jdk(r|j |d«sd}|rŒ_|j ||f«Œs|S)NrscontainsF)Ú _getfilepathrr#Úexistsr Ú _validatekeyÚappend)r"ÚkeysÚmissingÚnameÚnodeÚfilepathr+s r&Ú getmissingzbasestore.getmissing5sy€ØˆÛ‰JˆD�$Ø×(Ñ(¨¨tÓ4ˆHÜ—W‘W—^‘^ HÓ-ˆFáØ×'Ñ'¨9Ò4Ø×)Ñ)¨(°KÔ@à�ÚØ—‘  d˜|Õ,ððˆr(Ncóì—|r |jtj«ry|jrF|j «D]2\}}|D](}|j |||«|j |||«Œ*Œ4yy©N)Úgetr ÚOPTION_PACKSONLYrÚ _getfilesÚ markdataentryÚmarkhistoryentry)r"ÚledgerÚoptionsÚfilenameÚnodesr1s r&Ú markledgerzbasestore.markledgerGsh€Ù �w—{‘{¤9×#=Ñ#=Ô>Ø Ø �<Š<Ø#'§>¡>Ö#3‘�˜%Û!�DØ×(Ñ(¨¨x¸Ô>Ø×+Ñ+¨D°(¸DÕAñ"ñ$4ð r(cóú—|j}|jj|g«}d}|jt d«dt |«¬«}|D]w}|j s|jrX|jrL|j|«|j|j|j«}tj|«|dz }Œy|j«|j!|j#««y)Nrs cleaning upófiles©ÚunitÚtotalr )rÚsourcesr6Ú makeprogressrÚlenÚgcedÚ datarepackedÚhistoryrepackedÚupdater*r=r1r Ú tryunlinkÚcompleteÚ_cleanupdirectoryÚ_getrepocachepath)r"r;rÚentriesÚcountÚprogressÚentryr#s r&Úcleanupzbasestore.cleanupPsÎ€Ø �W‰WˆØ—.‘.×$Ñ$ T¨2Ó.ˆØˆØ—?‘?Ü ˆnÓ  H´C¸³Lð#ó ˆóˆEØ�zŠz˜e×0Ò0°U×5JÒ5JØ—‘ Ô&Ø×(Ñ(¨¯©¸¿¹ÓD�Ü—‘˜tÔ$Ø �Q‰J‰Eð ð ×ÑÔð ×јt×5Ñ5Ó7Õ8r(cór—t«}t«}tjj|«D]¯\}}t j |«rHt jj||«}|j|« t j|«Œct j|«sŒy|jd«r|j|dd«ŒŸ|j|«Œ±||z D]:}t jj||dz«}tj|«Œ<y#t$rY�ŒwxYw)z«Removes the empty directories and unnecessary files within the root directory recursively. Note that this method does not remove the root directory itself.ó_oldNéüÿÿÿ)Úsetr ÚosutilÚlistdirÚstatÚS_ISDIRrr#ÚjoinrNÚrmdirÚOSErrorÚS_ISREGÚendswithÚaddrL) r"ÚrootdirÚoldfilesÚ otherfilesr0ÚmodeÚdirpathr=r2s r&rNzbasestore._cleanupdirectorydsò€ô “5ˆÜ“Uˆ ôŸ+™+×-Ñ-¨gÖ6‰JˆD�$Ü�|‰|˜DÔ!ÜŸ'™'Ÿ,™, w°Ó5�Ø×&Ñ& wÔ/ðÜ—H‘H˜WÕ%ô—‘˜dÕ#Ø—=‘= Ô)Ø—L‘L  c r Õ+à—N‘N 4Õ(ð!7ð*! :Ô-ˆHÜ—w‘w—|‘| G¨X¸Ñ-?Ó@ˆHÜ �N‰N˜8Õ $ñ.øôòÚðúsÂD)Ä) D6Ä5D6c#óK—i}|j«D]&\}}|j|g«j|«Œ(|j|j ««}|j «D]\}}|||f–—Œy­w)a8Return a list of (filename, [node,...]) for all the revisions that exist in the store. This is useful for obtaining a list of all the contents of the store when performing a repack to another store, since the store API requires name+node keys and not namehash+node keys. N)Ú _listkeysÚ setdefaultr-Ú_resolvefilenamesr.Úitems)r"ÚexistingÚ filenamehashr1Ú filenamemapr=Úshas r&r8zbasestore._getfiles†s|èø€ðˆØ"&§.¡.Ö"2Ñ ˆL˜$Ø × Ñ   ¨bÓ 1× 8Ñ 8¸Õ >ð#3ð×,Ñ,¨X¯]©]«_Ó=ˆ à(×.Ñ.Ö0‰MˆH�cؘX c™]Ð+Ó +ñ1ùs‚A=A?có@—|siSi}t|«}|jdj«D]@}tj|«j «}||vsŒ+|||<|j |«ŒB|jj«j}tt|«dz dd«D]l}|s|S|j|j|««}|D]@}tj|«j «}||vsŒ+|||<|j |«ŒBŒn|S)zãGiven a list of filename hashes that are present in the remotefilelog store, return a mapping from filename->hash. This is useful when converting remotefilelog blobs into other storage formats. stipr éÿÿÿÿ) rXrÚmanifestr Úsha1ÚdigestÚdiscardÚ unfilteredÚ changelogÚrangerGÚ readfilesr1) r"ÚhashesÚ filenamesÚmissingfilenamer=rpÚclÚrevÚfiless r&rkzbasestore._resolvefilenames—s€ñ؈Iàˆ Ü˜f›+ˆðŸ ™  &Ñ)×2Ñ2Ö4ˆHÜ—-‘- Ó)×0Ñ0Ó2ˆCØ�oÒ%Ø&)� ˜(Ñ#Ø×'Ñ'¨Õ,ð 5ð�Y‰Y× !Ñ !Ó #× -Ñ -ˆÜœ˜R› 1™ b¨"Ö-ˆCÙ"ØðÐð—L‘L §¡¨£Ó.ˆEÛ!�Ü—m‘m HÓ-×4Ñ4Ó6�ؘ/Ò)Ø*-�I˜hÑ'Ø#×+Ñ+¨CÕ0ñ "ð .ðÐr(cóš—|jr4tjj|j|j «S|jSr5)rrr#r]rr)r"s r&rOzbasestore._getrepocachepath¹s:€ð�|Š|ô �G‰G�L‰L˜Ÿ™ T§^¡^Ó 4ð ð—‘ð r(c#óþK—tj|j««D]S\}}}|D]H}t|«dk7rŒ|}|jr |dd|ddz}n|dd}t |«t |«f–—ŒJŒUy­w)zŠList all the remotefilelog keys that exist in the store. Returns a iterator of (filename hash, filecontent hash) tuples. é(i×ÿÿÿiÙÿÿÿiÚÿÿÿNiØÿÿÿ)rÚwalkrOrGrr)r"ÚrootÚdirsr€r=r1rns r&rizbasestore._listkeysÀs†èø€ô "$§¡¨×)?Ñ)?Ó)AÖ!BÑ ˆD�$˜Û!�Ü�x“= BÒ&ØØ�Ø—<’<à#'¨¨C =°4¸¸°:Ñ#=‘Là#'¨¨ :�Lܘ<Ó(¬#¨d«)Ð4Ó4ñ"ñ"Cùs‚A;A=cóô—t|«}|jr"tj|j||«}ntj ||«}t jj|j|«Sr5) rrr Ú getcachekeyrÚ getlocalkeyrr#r]r)r"r0r1Úkeys r&r*zbasestore._getfilepathÒsU€Ü�4‹yˆØ �<Š<Ü×)Ñ)¨$¯.©.¸$ÀÓE‰Cä×)Ñ)¨$°Ó5ˆCä�w‰w�|‰|˜DŸJ™J¨Ó,Ð,r(c óÄ—|j||«} tj|«}|jrx|j ||«sf|j r3t |j d«5}|jd|z«ddd«tj||dz«td|z«‚|S#1swYŒ2xYw#t$rtd||t|«fz«‚wxYw)Nóab+scorrupt %s during read ó.corruptscorrupt local cache file %ssno file found at %s for %s:%s) r*r Úreadfiler Ú _validatedatarrÚwriterÚrenameÚKeyErrorÚIOErrorr)r"r0r1r2ÚdataÚfs r&Ú_getdatazbasestore._getdataÛs×€Ø×$Ñ$ T¨4Ó0ˆð Ü×'Ñ'¨Ó1ˆDØ×"Ò"¨4×+=Ñ+=¸dÀHÔ+MØ×)Ò)ܘd×4Ñ4°fÔ=ÀØŸ™Ð ;¸hÑ FÔG÷>ä— ‘ ˜( H¨{Ñ$:Ô;ÜÐ=ÀÑHÓIÐIð ˆ ÷>Ð=ûôò ÜØ0°H¸dÄCÈÃIÐ3NÑNóð ð ús$”AB;Á)B/Á>/B;Â/B8Â4B;Â;$Ccó¶—|j||«}tjd«} tjj |«rO|dz}tjj |«rt j |«tj||«t j|jtjj|««t j||d¬«|jr3|j|d«s!tj t#d«|z«‚tj|«y#tj|«wxYw)NérVT)Úreadonlyswrites"local cache write was corrupted %s)r*rÚumaskr#r+r Ú unlinkfileÚshutilÚcopyr!rÚdirnameÚ writefiler r,rÚAbortr)r"r0r1r”r2ÚoldumaskÚ newfilenames r&Úaddremotefilelognodezbasestore.addremotefilelognodeìsö€Ø×$Ñ$ T¨4Ó0ˆä—8‘8˜E“?ˆð ô�w‰w�~‰~˜hÔ'Ø&¨Ñ0� ô—7‘7—>‘> +Ô.Ü×*Ñ*¨;Ô7Ü— ‘ ˜H kÔ2ä × (Ñ (¨¯©´"·'±'·/±/À(Ó2KÔ LÜ × !Ñ ! (¨D¸4Õ @à×"Ò"Ø×(Ñ(¨°8Ô<ÜŸ+™+ÜÐ?Ó@À8ÑKóðô �H‰H�XÕ øŒB�H‰H�XÕ ús ©DEÅEcó†—tjj|jd«}t |d«5}|j tjj |«dz«ddd«tj|«}|j|jk(rtj|d«yy#1swYŒOxYw)aCall this to add the given repo path to the store's list of repositories that are using it. This is useful later when doing garbage collection, since it allows us to insecpt the repos to see what nodes they want to be kept alive in the store. órepossabó Ni´) rr#r]rrr�ržr[Úst_uidrÚchmod)r"r#Ú repospathÚ reposfileÚ repospathstats r&Úmarkrepozbasestore.markrepos‰€ô —G‘G—L‘L §¡¨XÓ6ˆ Ü �)˜UÔ # yØ �O‰OœBŸG™GŸO™O¨DÓ1°EÑ9Ô :÷$ôŸ™  Ó*ˆ Ø × Ñ  4§9¡9Ò ,Ü �H‰H�Y Õ 'ð -÷ $Ð #ús ·2B7Â7CcóX—t|d«5}|j«}ddd«|j|«ry|jr5t|jd«5}|j d||fz«ddd«t j ||dz«y#1swYŒwxYw#1swYŒ/xYw)NsrbTrŒscorrupt %s during %s r�F)rÚreadr�rr�rr‘)r"r#Úactionr•r”s r&r,zbasestore._validatekeys“€Ü �$˜Ô  !Ø—6‘6“8ˆD÷ð × Ñ ˜d DÔ )Øà × !Ò !Ü�d×,Ñ,¨fÔ5¸Ø—‘Ð1°T¸6°NÑBÔC÷6ô � ‰ �$˜˜{Ñ*Ô+Ø÷Ð ú÷6Ð5ús�BÁB ÂB B)có&— t|«dkDrbtj|«\}}}t|«|kry||z }|||dz}tjj |«t |«k(ryy y#ttjf$rYywxYw)NrFéT) rGr Úparsesizeflagsrr#ÚbasenamerÚ ValueErrorÚBadRemotefilelogHeader)r"r”r#ÚoffsetÚsizeÚflagsÚdatanodes r&r�zbasestore._validatedata"s¢€ð Ü�4‹y˜1Š}ä&1×&@Ñ&@ÀÓ&FÑ#�˜˜eÜ�t“9 Ò$à ð˜$‘�Ø ¨°"©Ð5�ô—7‘7×#Ñ# DÓ)¬S°«]Ò:àØðð&øôœK×>Ñ>Ð?ò Ø àð ús‚5A4¸8A4Á4BÂBc ó^—|j}|j}tjj «}d}d}d}d}t j «dz } |j td«d¬«} | jd«tj|«D]ï\} } } | D]ä}|dk(rŒ d| vrŒ| j|«tjj| |«}tjj||«}|dz } tj|«}||j"z }||vs|j$| kDr.|j'|j$||f«||j"z }ŒÊ t)j*|«|dz }ŒæŒñ| j-«|j/d d «} || kDr«|| z }|j td «d |¬«} d}|ru|| kDrp|dkDrk| j|«|j1«\}}} t)j*|«||j"z}|dz }||j"z }|r || kDr|dkDrŒk| j-«|j3td«||t5|«dz dz dz t5|«dz dz dz fz«y#t$r#td «}|j!||z«Y�Œ,wxYw#t$r#td «}|j!||z«Y�Œ[wxYw#t$r#td «}|j!||z«Y�ŒwxYw)Nri€Qsremoving unnecessary filesrA)rCr¥s/packs/r s0warning: file %s was removed by another process rs cachelimitsenforcing cache limitsbytesrBs8finished: removed %d of %d files (%0.2f GB to %0.2f GB) g�@)rrrÚqueueÚ PriorityQueueÚtimerFrrKrr„r#r]Úrelpathr[ÚFileNotFoundErrorÚwarnÚst_sizeÚst_atimeÚputr r›rMÚ configbytesr6ÚstatusÚfloat)r"ÚkeepkeysrÚ cachepathr»Ú originalsizer·rQÚremovedÚlimitrRr…r†r€Úfiler#rŠÚpathstatÚmsgÚexcessÚ removedexcessÚatimeÚoldpathÚ oldpathstats r&Úgcz basestore.gc9s?€Ø �W‰WˆØ—J‘Jˆ ô—‘×,Ñ,Ó.ˆØˆ ؈؈؈ô— ‘ “ ˜|Ñ,ˆà—?‘?Ü Ð+Ó ,°8ð#ó ˆð �‰˜ÔÜ!#§¡¨Ö!3Ñ ˆD�$˜Û�ؘ8Ò#Øð Ñ%Øà—‘ Ô&Ü—w‘w—|‘| D¨$Ó/�Ü—g‘g—o‘o d¨IÓ6�ؘ‘ �ðÜ!Ÿw™w t›}�Hð × 0Ñ 0Ñ0� à˜(‘? h×&7Ñ&7¸%Ò&?Ø—I‘I˜x×0Ñ0°$¸ÐAÔBؘH×,Ñ,Ñ,‘Dð!Ü#×.Ñ.¨tÔ4ð˜q‘L‘GñIð"4ðL ×ÑÔð—‘Ð/°Ó?ˆØ �%Š<ؘE‘\ˆFØ—‘ÜÐ*Ó+°(À&ð'óˆHðˆMÙ˜D 5šL¨T°AªXØ—‘  Ô.Ø.3¯i©i«kÑ+��w  ð+Ü×*Ñ*¨7Ô3ð ˜ ×+Ñ+Ñ+�ؘ1‘ �Ø ×!4Ñ!4Ñ4� ñ˜D 5šL¨T°A«Xð × Ñ Ô à � ‰ Ü ÐJÓ KàØÜ�lÓ# fÑ,¨vÑ5¸Ñ>Ü�d“ ˜fÑ$ vÑ-°Ñ6ð ñ õ øôa)òÜØLó�Cð—G‘G˜C $™JÔ'Úð ûô-ò!Üð)ó˜ðŸ™  d¡ Ô+Ú ð !ûô.)ò+ÜØLó�Cð—G‘G˜C '™M×*ð +ús6ÄJ"Å,KÈLÊ"(KË KË(K=Ë<K=Ì(L,Ì+L,)Fr5)Ú__name__Ú __module__Ú __qualname__r'r3r?rTrNr8rkrOrir*r–r£r¬r,r�rÔ©r(r&rrsV„ó8ò>ó$Bò9ò( %òD,ò" òD ò5ò$-òò"ò4 (ò òó.Y r(rcó(—eZdZd„Zd„Zed„«Zy)Úbaseunionstorecóf—|jdd«dz|_|jdd«|_y)NÚ numretriesrr Úretrylog)r6Ú numattemptsrÝ)r"ÚargsÚkwargss r&r'zbaseunionstore.__init__–s0€ð "Ÿ:™: l°AÓ6¸Ñ:ˆÔ🠙  :¨tÓ4ˆ� r(cót—|jD])}tj|d«sŒ|j«Œ+y)Nsmarkforrefresh)Ústoresr Ú safehasattrÚmarkforrefresh)r"Ústores r&räzbaseunionstore.markforrefresh s-€Ø—[”[ˆEÜ×Ñ Ð'8Õ9Ø×$Ñ$Õ&ñ!r(c󇇗d„Šˆˆfd„}|S)Ncó—yr5rØ)rßs r&Únoopz&baseunionstore.retriable..noop§s€Ø r(c󌕗|jxs‰}‰j}d}||jkrH|dkDr0|d|tj|«fz«|j «|dz } ‰|g|¢­i|¤ŽSyy#t $r1||jk(r|dtj|«z«‚YnwxYw||jkrŒ–ŒP)Nrsre-attempting (n=%d) %s r s*retries exhausted in %s, raising KeyError )rÝrÕrÞrÚsysbytesrär’)r"rßràrÝÚfuncnameÚiÚfnrès €€r&Úwrappedz)baseunionstore.retriable..wrappedªsæø€Ø—}‘}Ò,¨ˆHØ—{‘{ˆH؈AØ�d×&Ñ&Ò&Ø�q’5ÙØ4Øœh×/Ñ/°Ó9Ð:ñ;ôð×'Ñ'Ô)Ø�Q‘�ð Ù˜dÐ4 TÒ4¨VÑ4Ð4øð'øô òؘD×,Ñ,Ò,á ØJÜ&×/Ñ/°Ó9ñ:ôðñ -ðúð�d×&Ñ&Ó&øsÁ* A8Á87B2Â1B2rØ)rírîrès` @r&Ú retriablezbaseunionstore.retriable¥sù€ò õ ð.ˆr(N)rÕrÖr×r'räÚ staticmethodrïrØr(r&rÚrÚ•s „ò5ò'ð ñóñr(rÚ)rrœr[r½Úmercurial.i18nrÚmercurial.noderrÚmercurial.pycompatrÚ mercurialrrr Úmercurial.utilsr Úr r rrÚrØr(r&Úr÷sEðÛ Û Û Û åß#Ý#÷ñõ %÷÷ } ñ} ÷@ ,ò,r(