Ë ç(8ÑõW1¯ã óÈ—ddlZddlmZmZmZddlmZmZmZm Z m Z m Z ddl m Z mZe jr0ddlmZmZmZmZmZmZmZmZmZddlmZeeeeeeeeeeef «sJ‚e j8Zej:Zej<Zej>ZGd„d «Z d „Z!d „Z"Gd „d «Z#Gd„de#«Z$dZ%de%zZ&de%zZ'dZ(ee(«Z)de)zZ*dZ+dZ,dZ-Gd„d«Z.y)éNé)ÚbinÚhexÚnullrev)ÚencodingÚerrorÚobsoleteÚpycompatÚscmutilÚutil)Ú repoviewutilÚ stringutil) ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚSetÚTupleÚUnion)Ú localrepocó4—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z y) ÚBranchMapCachez8mapping of filtered views of repo with their branchcachecó—i|_y©N)Ú _per_filter©Úselfs ú7usr/lib/python3.12/site-packages/mercurial/branchmap.pyÚ__init__zBranchMapCache.__init__Ds €ØˆÕócóV—|j|«|j|jSr)Ú updatecacherÚ filtername©rÚrepos r Ú __getitem__zBranchMapCache.__getitem__Gs%€Ø ×Ñ˜ÔØ×Ñ §¡Ñ0Ð0r"c󲇗|j}|j}|jj|«Š‰�‰j |«st j |«Šg}‰€„tj|«}|�b|j|«}||j«Š|jj|jz }|jˆfd„|D««n t |«Š|j|j‰jdz¬««|r‰j||«‰j |«sJ|«‚‰|j|j<y)zz-BranchMapCache.updatecache..bsøèø€ÐG¡y !°A¸¿¹Ó4FœA¡yùsƒ˜r)Ústart)Ú changelogr%rÚgetÚvalidforÚ branchcacheÚfromfileÚ subsettableÚfilteredÚcopyÚ filteredrevsÚextendÚrevsr+Úupdate) rr'Úclr%r;Ú subsetnameÚsubsetÚ extrarevsr.s @r r$zBranchMapCache.updatecacheKs!ø€ð �^‰^ˆØ—_‘_ˆ Ø×!Ñ!×%Ñ% jÓ1ˆØ ˆ> §¡°Ô!6ä ×)Ñ)¨$Ó/ˆFàˆØ ˆ>ô%Ÿ™¨Ó4ˆJØÐ%ØŸ™ zÓ2�ؘf™×*Ñ*Ó,�Ø"×,Ñ,×9Ñ9¸B¿O¹OÑK� Ø— ‘ ÓG¡yÓGÕGô% TÓ*�à � ‰ �B—G‘G &§-¡-°!Ñ"3�GÓ4Ô5Ù Ø �M‰M˜$ Ô %à�‰˜tÔ$Ð0 jÓ0Ð$Ø,2ˆ×јŸ™Ò)r"cóü‡—|j}|jŠ|j}g}t«}|j «D]5}||z }|D])}‰|«} || «\} } | sŒ|j |«Œ+Œ7|r�t ˆfd„|D««} t|||| j«| |¬«} dD]F}|j|«}| j|«sŒ&| |j|<| j|«yyy)z¡Replace the branchmap cache for a repo with a branch mapping. This is likely only called during clone with a branch map from a remote. c3ó@•K—|]}t‰|««–—Œy­wr)Úint)r,ÚnodeÚclrevs €r r/z)BranchMapCache.replace..ƒsøèø€Ð@¹°œ3™u T›{×+¹ùóƒ)Ú closednodes)sbases immutablesservedN) r1ÚrevÚ branchinfoÚsetÚvaluesÚaddÚmaxr4rDr7r3rÚwrite)rr'Úremotebranchmapr=Ú clbranchinfoÚrbheadsÚclosedÚbheadsÚhr-ÚbÚcÚrtiprevÚcacheÚ candidateÚrviewrEs @r ÚreplacezBranchMapCache.replacensþø€ð�^‰^ˆØ—‘ˆØ—}‘}ˆ ؈ܓˆØ%×,Ñ,Ö.ˆFØ �vÑ ˆGÛ�Ù˜!“H�Ù# A“‘��1ÚØ—J‘J˜q•Mñ ð/ñ ÜÓ@¹Ó@ÓAˆGÜØØØ�W‘ ×"Ñ"Ó$ØØ"ô ˆEó@� ØŸ ™  iÓ0�Ø—>‘> %Õ(Ø27�D×$Ñ$ YÑ/Ø—K‘K Ô&Ùñ @ð r"có8—|jj«yr)rÚclearrs r r]zBranchMapCache.clear•s€Ø ×Ñ×ÑÕ r"cóÆ—|j«}|jj«D]4\}}|jsŒ|j |«}|j |«Œ6yr)Ú unfilteredrÚitemsÚ_delayedr7rN)rr'Úunfir%rXs r Ú write_delayedzBranchMapCache.write_delayed˜sM€Ø�‰Ó ˆØ!%×!1Ñ!1×!7Ñ!7Ö!9Ñ ˆJ˜Ø�~‹~Ø—}‘} ZÓ0�Ø— ‘ ˜DÕ!ñ":r"N) Ú__name__Ú __module__Ú __qualname__Ú__doc__r!r(r$r[r]rc©r"r rrAs%„ÙBòò1ò!3òF%òN!ó"r"rcó:—td|j«z«‚)zEraises ValueError when branchcache found a node which does not existsznode %s does not exist)Ú ValueErrorr)rDs r Ú _unknownnoderk s€ä Ð-°·±³ Ñ:Ó ;Ð;r"có:—|j�d|jzSy)Nsbranch cache (%s)s branch cache©r%)r's r Ú_branchcachedescrn¥s€Ø ‡�Ð"Ø# d§o¡oÑ5Ð5àr"có—eZdZdZddedddfd„Zd„Zd„Zd„Zd„Z d „Z d „Z d „Z d „Z e Zd „Zed„«Zd„Zed„«Zd„Zd„Zd„Zd„Zdd„Zd„Zd„Zd„Zd„Zd„Zy)r4a<A dict like object that hold branches heads cache. This cache is used to avoid costly computations to determine all the branch heads of a repo. The cache is serialized on disk in the following format: [optional filtered repo hex hash] ... The first line is used to check if the cache is still valid. If the branch cache is for a filtered repo view, an optional third hash is included that hashes the hashes of all filtered and obsolete revisions. The open/closed state is represented by a single letter 'o' or 'c'. This field can be used to avoid changelog reads when determining if a branch head closes a branch or not. rhNcó(—||_d|_|€|j|_n||_||_||_|€t «|_n||_t|«|_ d|_ t «|_ ||_ |j€ d„|_ yy)z¸hasnode is a function which can be used to verify whether changelog has a given node or not. If it's not provided, we assume that every node we have exists in changelogFNcó—y)NTrh)Úxs r Úz&branchcache.__init__..æs€ dr") Ú_reporaÚnullidÚtipnoder+Ú filteredhashrJÚ _closednodesÚdictÚ_entriesÚ_closedverifiedÚ_verifiedbranchesÚ_hasnode)rr'Úentriesrvr+rwrGÚhasnodes r r!zbranchcache.__init__ÂsŒ€ðˆŒ ؈Œ Ø ˆ?ØŸ;™;ˆD�Là"ˆDŒL؈Œ Ø(ˆÔð Ð Ü #£ˆDÕ à +ˆDÔ Ü˜W› ˆŒ à$ˆÔä!$£ˆÔ؈Œ Ø �=‰=Ð Ù*ˆD�Mð !r"cóˆ—|jry|jD]}|j|«rŒt|«Œ!d|_y)zverify the closed nodes we haveNT)r{rxr}rk)rrDs r Ú _verifyclosedzbranchcache._verifyclosedès<€à × Ò Ø Ø×%Ô%ˆDØ—=‘= Õ&ܘTÕ"ð&ð $ˆÕr"cóÖ—||jvs||jvry|j|D]}|j|«rŒt|«Œ!|jj |«y)z'verify head nodes for the given branch.N)rzr|r}rkrL)rÚbranchÚns r Ú _verifybranchzbranchcache._verifybranchòsZ€à ˜Ÿ™Ñ &¨&°D×4JÑ4JÑ*JØ Ø—‘˜vÔ&ˆAØ—=‘= Õ#ܘQ•ð'ð ×Ñ×"Ñ" 6Õ*r"có”—t|jj««|jz }|D]}|j |«Œy)z"verifies nodes of all the branchesN)rJrzÚkeysr|r…)rÚneedverificationrUs r Ú _verifyallzbranchcache._verifyallüs=€ä˜tŸ}™}×1Ñ1Ó3Ó4°t×7MÑ7MÑMÐÛ!ˆAØ × Ñ ˜qÕ !ñ"r"có,—t|j«Sr)Úiterrzrs r Ú__iter__zbranchcache.__iter__s€Ü�D—M‘MÓ"Ð"r"có"—||j|<yr)rz)rÚkeyÚvalues r Ú __setitem__zbranchcache.__setitem__s€Ø"ˆ� ‰ �cÒr"cóB—|j|«|j|Sr©r…rz©rrŽs r r(zbranchcache.__getitem__s€Ø ×ј3ÔØ�}‰}˜SÑ!Ð!r"có@—|j|«||jvSrr’r“s r Ú __contains__zbranchcache.__contains__ s€Ø ×ј3ÔØ�d—m‘mÐ#Ð#r"c#ó~K—|jj«D]\}}|j|«||f–—Œy­wr)rzr`r…)rÚkÚvs r Ú iteritemszbranchcache.iteritemss8èø€Ø—M‘M×'Ñ'Ö)‰DˆAˆqØ × Ñ ˜qÔ !Ø�Q�$‹Jñ*ùs‚;=có@—|j|«||jvS)z2checks whether a branch of this name exists or notr’)rÚlabels r Ú hasbranchzbranchcache.hasbranchs€à ×ј5Ô!ؘŸ ™ Ð%Ð%r"cóB—d} |j|j|««}t|«}t|«j d«j dd«}|dd\}}t |«t|«}}d}|jj}t|«dkDrt |d«}||||||¬«} | j|«s td«‚| j||«|r|j!«| S#ttf$rY|r|j!«yyt"$r`} |j$j&r>d} |j$j)| t+|«t-j.| «fz«d} Yd} ~ Œ›d} ~ wwxYw#|r|j!«wwxYw)Nó ó é)rvr+rwrz tip differssinvalid %s: %s )ÚcachevfsÚ _filenamer‹ÚnextÚrstripÚsplitrrCr1rÚlenr3rjÚloadÚIOErrorÚOSErrorÚcloseÚ ExceptionÚuiÚ debugflagÚdebugrnrÚ forcebytestr) Úclsr'ÚfÚlineiterÚcachekeyÚlastÚlrevrwrr.ÚinstÚmsgs r r5zbranchcache.fromfiles…€à ˆð& Ø— ‘ ˜cŸm™m¨DÓ1Ó2ˆAܘA“wˆHܘH“~×,Ñ,¨UÓ3×9Ñ9¸$ÀÓBˆHØ! " 1˜‰JˆD�$ܘT›¤C¨£I�$ˆD؈LØ—n‘n×,Ñ,ˆGÜ�8‹}˜qÒ Ü" 8¨A¡;Ó/� ÙØØØØ)Øô ˆFð—?‘? 4Ô(ä  Ó/Ð/Ø �K‰K˜˜hÔ 'ñ"Ø—‘” àˆ øô'œÐ!ò ØñØ—‘• ðôò Ø�w‰w× Ò Ø)�Ø—‘— ‘ Øä(¨Ó.Ü"×/Ñ/°Ó5ðñôð�Fûð ûñØ—‘• ðús7„C"C:Ã:FÄ F ÄFÄ&AFÅ<F ÆFÆF Æ Fcóx—|D]µ}|jd«}|sŒ|jdd«\}}}|dvr td«‚tj|j ««}t |«}|jj|g«j|«|dk(sŒ›|jj|«Œ·y)z[fully loads the branchcache by reading from the file using the line iterator passedržrŸr soczinvalid branch stateócN) r¤r¥rjrÚtolocalÚstriprrzÚ setdefaultÚappendrxrL)rr'r²ÚlinerDÚstater›s r r§zbranchcache.loadIs¦€óˆDØ—;‘;˜uÓ%ˆDÙØØ!%§¡¨D°!Ó!4Ñ ˆD�%˜Ø˜EÑ!Ü Ð!7Ó8Ð8Ü×$Ñ$ U§[¡[£]Ó3ˆEÜ�t“9ˆDØ �M‰M× $Ñ $ U¨BÓ /× 6Ñ 6°tÔ <ؘ‹}Ø×!Ñ!×%Ñ% dÕ+ñr"cóD—d}|jrd||jfz}|S)z7name of a branchcache file for a given repo or repoviewsbranch2s%s-%srm)r'Úfilenames r r¢zbranchcache._filenameYs(€ðˆØ �?Š?Ø 8¨T¯_©_Ð"=Ñ=ˆH؈r"cóî— |jj|j«}|j|k7ryt j ||jd¬«}|j |k(S#t$rYywxYw)zÚcheck that cache contents are valid for (a subset of) this repo - False when the order of changesets changed or if we detect a strip. - True when cache is up-to-date for the current repo or its subset.FT©Ú needobsolete)r1rDr+Ú IndexErrorrvr rw)rr'rDÚtiphashs r r3zbranchcache.validforass€ð  Ø—>‘>×&Ñ& t§{¡{Ó3ˆDð �<‰<˜4Ò ðÜ×&Ñ& t¨T¯[©[ÀtÔLˆð× Ñ  GÑ+Ð+øôò ñð ús‚%A(Á( A4Á3A4cóf—|d}d}t|«D]}||jvsŒ|}d}||fS||fS)zhReturn tuple with last open head in heads and false, otherwise return last closed head and true.éÿÿÿÿTF)Úreversedrx)rÚheadsÚtiprRrTs r Ú _branchtipzbranchcache._branchtipvsQ€ð�B‰iˆØˆÜ˜%–ˆAؘ×)Ñ)Ò)Ø�Ø�ØØ�Fˆ{Ðð !ð �Fˆ{Ðr"có0—|j||«dS)z“Return the tipmost open head on branch head, otherwise return the tipmost closed head on branch. Raise KeyError for unknown branch.r)rÌ)rrƒs r Ú branchtipzbranchcache.branchtip‚s€ð�‰˜t F™|Ó,¨QÑ/Ð/r"có‡—ˆfd„|D«S)Nc3ó@•K—|]}|‰jvsŒ|–—Œy­wr)rx)r,r„rs €r r/z'branchcache.iteropen..‰søèø€Ð?™5�a A¨T×->Ñ->Ò$>”™5ùsƒ—rh)rÚnodess` r Úiteropenzbranchcache.iteropenˆsø€Û?™5Ó?Ð?r"có~—|j|«|j|}|st|j|««}|Sr)r…rzÚlistrÒ)rrƒrRrÊs r Ú branchheadszbranchcache.branchheads‹s9€Ø ×ј6Ô"Ø— ‘ ˜fÑ%ˆÙܘŸ™ uÓ-Ó.ˆE؈ r"c#ólK—|j«D]\}}||f|j|«z–—Œy­wr)r`rÌ)rÚbnrÊs r Ú iterbrancheszbranchcache.iterbranches’s2èø€ØŸ™ž‰IˆB�Ø�u�+ §¡°Ó 6Ñ6Ó 6ñ&ùs‚24cóV—|j«|jj«S)zreturns all the heads)r‰rzrKrs r Ú iterheadszbranchcache.iterheads–s€à �‰ÔØ�}‰}×#Ñ#Ó%Ð%r"có¦—t|«|j|j|j|j|j |j «S)z-return an deep copy of the branchcache object)Útypertrzrvr+rwrxrs r r8zbranchcache.copy›sC€àŒt�D‹zØ �J‰JØ �M‰MØ �L‰LØ �K‰KØ × Ñ Ø × Ñ ó  ð r"c óò—|j«}t|dd«sd|_y |j|«}|j |dd¬«5}t |j «d|jzg}|j�$|jt |j««|jdj|«dz«d}t|jj««D]Y\}}tj |«}|D]:} |d z }| |j"vrd } nd } |jd t | «| |fz«Œ<Œ[ ddd«|j$j'd dt)|«t+|j««d|_y#1swYŒLxYw#t,t.t0j2f$r;} |j$j5dt7j8| «z«Yd} ~ yd} ~ wwxYw)NÚ finalizedTów)Ú atomictemps%drŸržrrr¹óos %s %s %s ó branchcaches%wrote %s with %d labels and %d nodes Fs couldn't write branch cache: %s )ÚcurrenttransactionÚgetattrrar¢r¡rrvr+rwr½rNÚjoinÚsortedrzr`rÚ fromlocalrxr¬Úlogrnr¦r¨r©rÚAbortr®rr¯) rr'ÚtrrÁr±r³Ú nodecountr›rÑrDr¿r¶s r rNzbranchcache.write¦s´€Ø × $Ñ $Ó &ˆÜ�r˜;¨Ô-ð!ˆDŒMØ ð Ø—~‘~ dÓ+ˆHØ—‘˜x¨¸$�Ô?À1Ü § ¡ Ó-¨u°t·{±{Ñ/BÐC�Ø×$Ñ$Ð0Ø—O‘O¤C¨×(9Ñ(9Ó$:Ô;Ø—‘˜Ÿ ™  (Ó+¨eÑ3Ô4Ø� Ü$*¨4¯=©=×+>Ñ+>Ó+@Ö$A‘L�E˜5Ü$×.Ñ.¨uÓ5�EÛ %˜Ø! Q™˜ Ø 4×#4Ñ#4Ñ4Ø$(™Eà$(˜EØŸ™  ´°T³¸EÀ5Ð0IÑ IÕJñ !&ñ%B÷ @ð �G‰G�K‰KØØ9Ü  Ó&Ü�D—M‘MÓ"Øô  ð"ˆD�M÷-@Ð?ûô.œ¤%§+¡+Ð.ò à �G‰G�M‰MØ4Ü×)Ñ)¨$Ó/ñ0÷ ñ ûð ús1§%FÁ C9FÅA FÆFÆFÆG6Æ;1G1Ç1G6cój‡—tj«}|jŠi}|j«j}|D][}||«\}}|j |g«j |«|sŒ2|jj‰j|««Œ]|j} d} |j«jj} tj|d«} |j«D�]\}} |j j#|g«}|D�chc]}‰j%|«’Œ}}t'«}t)| «D�]}|| vrŒ |s|j|«Œ| |«D�cgc]}|t*k7sŒ |‘Œ}}t'«}t'«}t'«}|D]M}|| vr|j|«Œ||vs||«d|k(r|j|«Œ=|j|«ŒOt-|«t-|«cxk(rdk(s$n|j/|«|j/|«|j1|«|j|«�Œ|rY| €t'‰j3««} || z r9t5|«}|t7|«kr t'‰j9||««}||z}|r+t)|«D�cgc]}‰j|«‘Œc}||<t7| «}|| kDs�Œ|} �Œ| |jkDr| |_ ‰j| «|_|j=|«su|j>|_t*|_ |jA«D]F}|sŒt7ˆfd„|D««}||jkDsŒ*‰j|«|_||_ ŒHtCjD||jd¬«|_"tj«|z }|jFjIdd tK|«|«|jM|«ycc}wcc}wcc}w) zÙGiven a branchhead cache, self, that may have extra nodes or be missing heads, and a generator of nodes that are strictly a superset of heads missing, this function updates self to be correct. Nsobsoleterrc3ó@•K—|]}‰j|«–—Œy­wr)rH)r,rDr=s €r r/z%branchcache.update..Rsøèø€Ð<±e¨d˜RŸV™V DŸ\±eùrFTrÃrâsupdated %s in %.4f seconds )'r Útimerr1ÚrevbranchcacherIr¼r½rxrLrDr+r_Ú parentrevsr Úgetrevsr`rzr2rHrJrærr¦r<Údifference_updateÚheadrevsÚminrMÚ ancestorsrvr3rurÚr rwr¬rèrnrN)rr'ÚrevgenÚ starttimeÚ newbranchesÚ getbranchinfor-rƒÚ closesbranchÚntiprevÚ topoheadsrðÚobsrevsÚ newheadrevsrSrDÚbheadsetÚ uncertainÚnewrevÚpÚparentsÚ samebranchÚ otherbranchÚ obsparentsÚfloorrevrõrHr+rÊÚdurationr=s @r r<zbranchcache.updateÎs·ø€ô —J‘J“Lˆ Ø �^‰^ˆàˆ Ø×+Ñ+Ó-×8Ñ8ˆ ÛˆAÙ#0°Ó#3Ñ ˆF�LØ × "Ñ " 6¨2Ó .× 5Ñ 5°aÔ 8ÚØ×!Ñ!×%Ñ% b§g¡g¨a£jÕ1ð ð—+‘+ˆðˆ ð—_‘_Ó&×0Ñ0×;Ñ;ˆ ô×"Ñ" 4¨Ó5ˆà#.×#4Ñ#4×#6Ñ ˆF�KðH—]‘]×&Ñ& v¨rÓ2ˆFÙ17Ó8±¨˜Ÿ™˜t� °ˆHÐ8Ü›ˆIÜ  ×-�ؘWÑ$ðáØ—L‘L Ô(Øá&0°Ô&8ÓIÑ&8 ¸AÄ»Lš1Ð&8�ÐIÜ ›U� Ü!›e� Ü ›U� Û �AؘG‘|ð #Ÿ™ qÕ)ؘh™©-¸Ó*:¸1Ñ*=ÀÒ*GØ"Ÿ™ qÕ)à#Ÿ™¨Õ*ð!ô˜H› ¬¨Z«Ô=¸AÔ=Ø×$Ñ$ [Ô1Ø×$Ñ$ ZÔ0Ø×*Ñ*¨:Ô6Ø— ‘ ˜VÖ$ð=.ñ@ØÐ$Ü # B§K¡K£MÓ 2�IؘiÒ'Ü" 8›}�Hؤ3 y£>Ò1Ü$'¨¯ © °YÀÓ(IÓ$J˜ Ø  IÑ-˜ÙÜ8>¸xÔ8HÓIÑ8H° §¡¨¥ Ð8HÑI��V‘ ܘÓ%ˆFØ˜ÔØ ’ðg$7ðj �T—[‘[Ò Ø!ˆDŒKØŸ7™7 7Ó+ˆDŒLà�}‰}˜TÔ"ð Ÿ;™;ˆDŒLÜ!ˆDŒKØŸ™Ö)�ÙàôÓ<±eÓ<Ó<�ؘDŸK™KÓ'Ø#%§7¡7¨6£?�D”LØ"(�D•Kð*ô$×0Ñ0Ø �$—+‘+¨Dô ˆÔô—:‘:“< )Ñ+ˆØ �‰� ‰ Ø Ø +Ü ˜TÓ "Ø ô  ð � ‰ �4Õùòa9ùòJùò> JsÄP&Å3P+ÆP+ËP0)F)rdrerfrgrr!r�r…r‰rŒr�r(r•r™r`rœÚ classmethodr5r§Ú staticmethodr¢r3rÌrÎrÒrÕrØrÚr8rNr<rhr"r r4r4¬s¸„ñð0ØØØØØó$+òL$ò+ò"ò #ò#ò"ò$òð €Eò&ð ñ*óð*òX,ð ñóðò,ò* ò0ò @óò7ò&ò  ò&óPTr"r4có—eZdZdZd„Zy)Úremotebranchcachez@Branchmap info for a remote connection, should not write locallycó—yrrhr&s r rNzremotebranchcache.writehs€Ø r"N)rdrerfrgrNrhr"r r r es „ÙJó r"r s-v1s rbc-namessrbc-revss>4sIé@éiÿÿÿlcón—eZdZdZd d„Zd„Zejd„«Zd„Z d„Z d„Z d„Z dd „Z d „Zd „Zy )rïa™Persistent cache, mapping from revision number to branch name and close. This is a low level cache, independent of filtering. Branch names are stored in rbc-names in internal encoding separated by 0. rbc-names is append-only, and each branch name is only stored once and will thus have a unique index. The branch info for each revision is stored in rbc-revs as constant size records. The whole file is read into memory, but it is only 'parsed' on demand. The file is usually append-only but will be truncated if repo modification is detected. The record for each revision contains the first 4 bytes of the corresponding node hash, and the record is only used if it still matches. Even a completely trashed rbc-revs fill thus still give the right result while converging towards full recovery ... assuming no incorrectly matching node hashes. The record also contains 4 bytes where 31 bits contains the index of the branch and the last bit indicate that it is a branch close commit. The usage pattern for rbc-revs is thus somewhat similar to 00changelog.i and will grow with it but be 1/8th of its size. có€—|j�J‚||_g|_t«|_d|_ |j jt«}t|«|_|r7|jd«D�cgc]}tj|«‘Œc}|_|jr/ |j jt«}||jddt+t|j«t,zt|j.««|_|j0dk(rg|_t|j«|_ycc}w#ttf$r|r|j|_YŒÓwxYw#ttf$r;}|j"j%dt'j(|«z«Yd}~Œád}~wwxYw)Nrós(couldn't read revision branch cache: %s )r%rtÚ_namesÚ bytearrayÚ_rbcrevsÚ _rbcsnameslenr¡ÚreadÚ _rbcnamesr¦r¥rrºr¨r©Ú _branchinforIr¬r®rr¯rôÚ _rbcrecsizer1Ú _rbcrevslenÚ_rbcnamescount)rr'ÚreadonlyÚbndatar×Údatar¶s r r!zrevbranchcache.__init__‘sy€Ø�‰Ð&Ð&Ð&؈Œ ؈Œ Ü!› ˆŒ ؈Ôð 3Ø—]‘]×'Ñ'¬ Ó2ˆFÜ!$ V£ˆDÔ Ùà39·<±<ÀÔ3FóÙ3F¨R”H×$Ñ$ RÕ(Ð3Fñ�” ð �;Š;ð Ø—}‘}×)Ñ)¬(Ó3�Ø#'�— ‘ ™aÐ ôÜ �— ‘ Ó ¤+Ñ -¬s°4·>±>Ó/Bó ˆÔð × Ñ ˜qÒ ØˆDŒKÜ! $§+¡+Ó.ˆÕùò/øôœÐ!ò 3Ùà"&×"2Ñ"2�”ùð 3ûôœWÐ%ò Ø—‘— ‘ Ø@Ü ×-Ñ-¨dÓ3ñ4÷ñûð ús<´AE Á8EÂE Â).E3ÅE Å "E0Å/E0Å3F=Æ1F8Æ8F=cóô—d|_|jdd…=d|_t|jj «|_t|j tz«|_ tj|d«y)Nrs _namesreverse) rrrr¦rtr1rrrrr Úclearcachedpropertyrs r Ú_clearzrevbranchcache._clearµs\€ØˆÔØ �K‰KšˆN؈ÔܘtŸz™z×3Ñ3Ó4ˆÔÜ! $×"2Ñ"2´[Ñ"@ÓAˆŒ Ü × Ñ  Ð'7Õ8r"có`—t|j«D��cic]\}}||“Œ c}}Scc}}wr)Ú enumerater)rr-rUs r Ú _namesreversezrevbranchcache._namesreverse½s-€ä!*¨4¯;©;Ô!7Ô8Ñ!7™˜˜A��1‘Ð!7Ò8Ð8ùÓ8s™ *có:—|jj}|tz}|tk(r|j |«St |j «|tzkr|j|«S|j|«dt}tttj|j «|«\}}t|tz«}|r |t z}|dk(rnr||k(r |j"||fS|jj&j)d|z«|tz}|j |d…=t-|j.|«|_|j|«S#t$$r8|jj&j)d«|j+«YŒQwxYw)zWReturn branch name and close flag for rev, using and updating persistent cache.NssRreferenced branch names not found - rebuilding revision branch cache from scratch sPhistory modification detected - truncating revision branch cache to revision %d )rtr1rrrIr¦rrrDÚ _rbcnodelenÚ unpack_fromÚ _rbcrecfmtr ÚbufferÚboolÚ _rbccloseflagÚ_rbcbranchidxmaskrrÅr¬r®r"rôr) rrHr1Ú rbcrevidxÚreponodeÚ cachenodeÚ branchidxrªÚtruncates r rIzrevbranchcache.branchinfoÁs…€ð—J‘J×(Ñ(ˆ Øœ+Ñ%ˆ ð ”'Š>Ø×'Ñ'¨Ó,Ð ,ô ˆt�}‰}Ó   ¬KÑ 7Ò 7Ø×#Ñ# CÓ(Ð (ð—>‘> #Ó& |¬ Ð4ˆÜ*Ü œŸ ™  D§M¡MÓ2°Ió ш �9ô�Y¤Ñ.Ó/ˆÙ Ø Ô*Ñ *ˆIØ ˜ Ò #Ø Ø ˜(Ò "ð Ø—{‘{ 9Ñ-¨uÐ4Ð4ð �J‰J�M‰M× Ñ ð:؈DÔ ð×Ñ Ó$Ð$øô%ò à— ‘ — ‘ ×#Ñ#ðJôð— ‘ – ð  úsÃEÅ>FÆFcóv—|jj}|j|«\}}||jvr|j|}n?t |j «}|j j |«||j|<|j|«}|r |tz}|j|||«||fS)z7Retrieve branch info from changelog and update _rbcrevs) rtr1rIr%r¦rr½rDr,Ú _setcachedata)rrHr1rUrªr1r/s r rzrevbranchcache._branchinfoðs©€à—J‘J×(Ñ(ˆ Ø×'Ñ'¨Ó,‰ˆˆ5Ø �×"Ñ"Ñ "Ø×*Ñ*¨1Ñ-‰Iä˜DŸK™KÓ(ˆIØ �K‰K× Ñ ˜qÔ !Ø$-ˆD× Ñ ˜qÑ !Ø—>‘> #Ó&ˆÙ Ø œÑ &ˆIØ ×ј3 ¨)Ô4Ø�%ˆxˆr"có~—|j\}}||jvr|j|}n?t|j«}|jj |«||j|<|r |t z}|j ||jjj|«|«dt|«vr|`yy)z%add new data information to the cacherIN) rIr%r¦rr½r,r4rtr1rDÚvars)rrHÚchangelogrevisionrƒrªr1s r Úsetdatazrevbranchcache.setdatas«€à)×4Ñ4‰ ˆ�à �T×'Ñ'Ñ 'Ø×*Ñ*¨6Ñ2‰Iä˜DŸK™KÓ(ˆIØ �K‰K× Ñ ˜vÔ &Ø)2ˆD× Ñ ˜vÑ &Ù Ø œÑ &ˆIØ ×ј3 § ¡ × 4Ñ 4× 9Ñ 9¸#Ó >À ÔJð œ4 ›:Ñ %Ø‘ð &r"cóª—|tk(ry|tz}|tz}t|j«}||kr,|jj dt t |«z«tt|j|||«t|j|«|_ |jj«}|r|jd|j«yy)z:Writes the node's branch data to the in-memory cache data.Nrswrite-revbranchcache)rrr¦rr:rMÚ _rbcminincÚ pack_intor)rôrrtrãÚ addfinalizerN)rrHrDr1r.Ú requiredsizeÚrbccurrês r r4zrevbranchcache._setcachedatas¬€à ”'Š>Ø Øœ+Ñ%ˆ Ø ¤;Ñ.ˆ Ü�T—]‘]Ó#ˆØ �LÒ ð �M‰M× Ñ  ¬¬Z¸Ó)FÑ!FÔ GÜ”*˜dŸm™m¨Y¸¸iÔHܘt×/Ñ/°Ó5ˆÔà �Z‰Z× *Ñ *Ó ,ˆÙ Ø �N‰NÐ2°D·J±JÕ ?ð r"NcóŠ—|j}d}d} |jt|j«kr%|j d¬«}d}|j |«|j tz}|t|j«k7r(d}|€|j d¬«}|j||«|�|j'«yy#tttjtjf$r=}|jj!d|t#j$|«fz«Yd}~Œyd}~wwxYw#|�|j'«wwxYw)z!Save branch cache if it is dirty.Nr"F)Úwaits namess+couldn't write revision branch cache%s: %s )rtrr¦rÚwlockÚ _writenamesrrrÚ _writerevsr¨r©rréÚ LockErrorr¬r®rr¯Úrelease)rrêr'rAÚstepr0r¶s r rNzrevbranchcache.write+s€à�z‰zˆØˆØˆð à×"Ñ"¤S¨¯©Ó%5Ò5ØŸ ™ ¨˜ Ó.�Ø �Ø× Ñ  Ô&ð×$Ñ$¤{Ñ2ˆEØœ˜DŸM™MÓ*Ò*Ø�Ø�=Ø ŸJ™J¨E˜JÓ2�EØ—‘  eÔ,ðÐ Ø— ‘ •ð!øô œ¤%§+¡+¬u¯©Ð?ò Ø �G‰G�M‰MØ?Øœ×0Ñ0°Ó6Ð7ñ8÷ ñ ûð ûð Ð Ø— ‘ •ð!ús*’BCÃ-D*Ã-3D%Ä D-Ä%D*Ä*D-Ä-EcóÚ—|jdk7r�|jjtd«}|j «|j k(r|j d«n@|j«|jjdtz«d|_d|_ |jdk(rA|jjtd¬«|jjtd«}j djd„|j|jd D«««|j «|_|j«t|j«|_y ) z,write the new branch names to revbranchcacheróabrs%s changed - rewriting it T)Ú ignoremissingswbc3óFK—|]}tj|«–—Œy­wr)rrç)r,rUs r r/z-revbranchcache._writenames..Xs#èø€ðá;�Aô×"Ñ" 1×%Ù;ùs‚!N)rr¡ÚopenrÚtellrrNrªr¬r®rÚ unlinkpathrrårr¦)rr'r±s r rBzrevbranchcache._writenamesHs€à × Ñ  !Ò #Ø— ‘ ×"Ñ"¤9¨eÓ4ˆAØ�v‰v‹x˜4×-Ñ-Ò-Ø—‘˜•à—‘” Ø—‘— ‘ Ð<¼yÑHÔIØ&'�Ô#Ø#$�Ô Ø × Ñ  !Ò #à �M‰M× $Ñ $¤X¸TÐ $Ô BØ— ‘ ×"Ñ"¤9¨eÓ4ˆAØ �‰Ø �J‰JñàŸ™ T×%8Ñ%8Ð%:Ñ;óó ô ð ŸV™V›XˆÔØ �‰Œ Ü! $§+¡+Ó.ˆÕr"cóF—tt|j«t|j«tz«}|j j td«5}|j«|k7rk|jjdt|fz«|j|«|j«|k7rd}|j|«|j«|tz}|j|j||«ddd«||_ y#1swY||_ yxYw)z$write the new revs to revbranchcacherHstruncating cache/%s to %d rN)rôr¦r1rrr¡rKrLr¬r®Úseekr2rNr)rr'r0r;r±Úends r rCzrevbranchcache._writerevsasÚ€ä”3�t—~‘~Ó&¬¨D¯M©MÓ(:¼kÑ(IÓJˆØ �]‰]× Ñ ¤¨%Ô 0°AØ�v‰v‹x˜5Ò Ø—‘— ‘ Ø2´hÀÐ5FÑFôð—‘�u” Ø—6‘6“8˜uÒ$Ø�EØ—F‘F˜5”MØ— ‘ ” ØœÑ$ˆCØ �G‰G�D—M‘M %¨Ð,Ô -÷1ð ˆÕ÷1ð ˆÕús ÁB&DÄD )Tr)rdrerfrgr!r"r Ú propertycacher%rIrr8r4rNrBrCrhr"r rïrïzsQ„ñó,!/òH9ð ×Ññ9óð9ò-%ò^ò  ò,@ó* ò:/ó2 r"rï)/ÚstructrDrrrÚrrr r r r Úutilsr rÚ TYPE_CHECKINGÚtypingrrrrrrrrrrÚanyr6Úcalcsizer;r(rrkrnr4r Ú _rbcversionrrr)rr:r'r-r,rïrhr"r ÚrZs#ðó÷ñ÷ ÷÷ð  ×Ò÷ ÷ õ õá à Ø Ø Ø Ø Ø Ø Ø Ø Ø ð ô ð ð ð×&Ñ&€ à �?‰?€Ø × Ñ € Ø× Ñ € ÷\"ñ\"ò~<ò ÷vñvôr  ˜ ô ð€ Ø ˜;Ñ &€ Ø ˜Ñ $€à € Ù�zÓ"€ Ø �+Ñ € Ø€ ØÐØ€ ÷v òv r"