Ë YÀ2b§Xãó®—ddlZddlmZddlmZddlmZmZmZm Z m Z m Z e jZ e jZ dZd„Zd&d„Zd&d „Zd „Z d'd „Zd „Zd „Zd„Zd(d„Zd„ZGd„d«Zd„Zd&d„Zd„Zd&d„Zd„Zej>dd¬«Gd„d««Z ej>dd¬«Gd„d««Z!d„Z"d„Z#d „Z$d(d!„Z%d)d"„Z&d#„Z'd(d$„Z(d%„Z)y)*éNé)Úattr)Únullrev)ÚerrorÚmdiffÚpatchÚpycompatÚscmutilÚsmartsetlc#óFK—|€d}|€t}|dk(ry|dkrtjd«‚|rd}nd}|j|«t |«}g}t |d«}|�t j|||zdf«d} |rŸt j|«\} } || z} | |k(r)t |d«}|�t j|||zdf«| | k7} | r | |k\r| } | –—| dz} | r7| |kr2|| «D]'}|tk7sŒ t j|||z| f«Œ)|rŒžyy­w)a(Walk DAG using 'pfunc' from the given 'revs' nodes 'pfunc(rev)' should return the parent/child revisions of the given 'rev' if 'reverse' is True/False respectively. Scan ends at the stopdepth (exlusive) if specified. Revisions found earlier than the startdepth are omitted. Nrsnegative stopdepthéÿÿÿÿr) Ú maxlogdepthrÚProgrammingErrorÚsortÚiterÚnextÚheapqÚheappushÚheappopr)ÚpfuncÚrevsÚ startdepthÚ stopdepthÚreverseÚheapsignÚirevsÚ pendingheapÚinputrevÚlastrevÚcurrevÚcurdepthÚfoundnewÚpdepthÚprevs ú3usr/lib/python3.12/site-packages/mercurial/dagop.pyÚ _walkrevtreer&sOèø€ðÐØˆ ØÐ܈ Ø�A‚~ØØ�1‚}Ü×$Ñ$Ð%:Ó;Ð;ÙØ‰àˆð ‡I�IˆgÔÜ �‹J€EØ€Kä�E˜4Ó €HØÐÜ �‰�{ X°Ñ%8¸!Ð$<Ô=à€GÙ Ü Ÿ=™=¨Ó5ш�ؘFÑ"ˆØ �XÒ Ü˜E 4Ó(ˆHØÐ#Ü—‘˜{¨X¸Ñ-@À!Ð,DÔEð˜WÑ$ˆÙ ˜ JÒ.؈GØŠLؘA‘ˆÙ ˜ Ò*Ù˜fž �Øœ7“?Ü—N‘N ;°¸D±À&Ð0IÕJð&ô ùs‚C.addvisit[sDø€Ü�n‰n˜TÓ"ˆØ �eÑ Ü›ˆE�#‰JÜ �N‰N˜9 s dÔ +Ø ˆc‰ �‰�tÕórN)rrÚpopÚparents) ÚfctxsÚ followfirstr1ÚcutÚcr ÚcurfctxsÚparentr/r0s @@r%Úfilectxancestorsr;RsŸùèø€ð €EØ€Iõñ؉àˆã ˆÙ�� ðá Ü—=‘= Ó+Ð,ˆØ—9‘9˜VÓ$ˆØ�hÐÒÛˆAØŸ)™)›+ d sÓ+�Ù˜Õ ñ,ðò ñЈ=ˆyùs „A9BÁ>BcóB—d„t||«D«}t|d¬«S)z�Like filectx.ancestors(), but can walk from multiple files/revisions, and includes the given fctxs themselves Returns a smartset. c3ó&K—|] \}}|–—Œ y­wr)©)Ú.0r.Ú_css r%Ú z#filerevancestors..ysèø€Ð DÑC‘8�3˜Œ3ÑCùs‚F©Úiterasc)r;Ú generatorset)r5r6Úgens r%ÚfilerevancestorsrFss$€ñ EÔ/°°{ÔCÓ D€CÜ ˜ UÔ +Ð+r2c󞇇‡‡‡ —|rdŠndЉjŠˆˆˆfd„Š ‰€‰ }nˆˆ fd„}|jˆfd„«}t||||d¬«S)Nrcóš•— ‰j|«d‰S#tj$r d„‰|j«d‰D«cYSwxYw)Nc3ó<K—|]}|j«–—Œy­wr)©r.©r?Úpctxs r%rAz7_genrevancestors..plainpfunc..ˆsèø€ÐEÑ+D 4�D—H‘H—JÑ+Dùó‚)Ú parentrevsrÚWdirUnsupportedr4)r.Úclr7Úrepos €€€r%Ú plainpfuncz$_genrevancestors..plainpfunc„sUø€ð FØ—=‘= Ó% d sÐ+Ð +øÜ×$Ñ$ò FÙE¨4°©9×+<Ñ+<Ó+>¸tÀÑ+DÓEÒ Eð Fúsƒ—0A Á A cóL•—‰|«D�cgc] }‰|«rŒ |‘Œc}Scc}wr)r>)r.ÚrÚcutfuncrRs €€r%Úz"_genrevancestors..�s!ø€© °3¬ÓJ© 1¹wÀq½zšQ¨ÒJùÒJsŒ !š!có•—‰|« Sr)r>)r.rUs €r%rVz"_genrevancestors..Žs ø€©7°3«<Ñ'7r2T©r)Ú changelogÚfilterr&) rQrr6rrrUrrPr7rRs ` ` @@@r%Ú_genrevancestorsr[}sRü€ÙØ‰àˆØ �‰€BöFð €Ø‰äJˆØ�{‰{Ó7Ó8ˆÜ ˜˜t Z°ÀDÔ IÐIr2có<—t||||||«}t|d¬«S)a”Like revlog.ancestors(), but supports additional options, includes the given revs themselves, and returns a smartset Scan ends at the stopdepth (exlusive) if specified. Revisions found earlier than the startdepth are omitted. If cutfunc is provided, it will be used to cut the traversal of the DAG. When cutfunc(X) returns True, the DAG traversal stops - revision X and X's ancestors in the traversal path will be skipped. This could be an optimization sometimes. Note: if Y is an ancestor of X, cutfunc(X) returning True does not necessarily mean Y will also be cut. Usually cutfunc(Y) also wants to return True in this case. For example, D # revancestors(repo, D, cutfunc=lambda rev: rev == B) |\ # will include "A", because the path D -> C -> A was not cut. B C # If "B" gets cut, "A" might want to be cut too. |/ A FrB)r[rD)rQrr6rrrUrEs r%Ú revancestorsr]’s*€ô0 Ø ˆd�K ¨Y¸ó €Cô ˜ UÔ +Ð+r2c#óTK—|rd}nd}|j}|j«}|tk(r|–—|D]}|–—Œyt|«}|j |«D]I}||vr|–—Œ |j |«d|D]'}|tk7sŒ ||vsŒ|j |«|–—ŒIŒKy­w)Nr)rYÚminrr+rrNr,) rQrr6r7rPÚfirstÚiÚseenÚxs r%Ú_genrevdescendantsrd°s«èø€Ù؉àˆà �‰€BØ �H‰H‹J€EØ ”ÒðŠ ÛˆAØ‹Gñô�4‹yˆØ—‘˜–ˆAØ�D‰yØ’ØØ—]‘] 1Ó% d sÓ+�Øœ“< A¨¢IØ—H‘H˜Q”KØ’GÙñ ,ñ  ùs‚BB(ÂB( B(cóR—|j}t|t|««D�cgc]}g‘Œ}}|j|dz«D]\}|j |«\}}||k\r|||z j |«|rŒ6|t k7sŒ@||k\sŒF|||z j |«Œ^|Scc}w)z6Build map of 'rev -> child revs', offset from startrevr)rYÚrangeÚlenrrNÚappendr) rQÚstartrevr6rPÚ_revÚdescmapr Úp1revÚp2revs r%Ú_builddescendantsmaprnËsª€à �‰€BÜ# H¬c°"«gÔ6Ó7Ñ6�dŠrÐ6€GÐ7Ø—'‘'˜( Q™,Ö'ˆØ—}‘} VÓ,‰ ˆˆuØ �HÒ Ø �E˜HÑ$Ñ %× ,Ñ ,¨VÔ 4Ú˜u¬Ó/°E¸XÓ4EØ �E˜HÑ$Ñ %× ,Ñ ,¨VÕ 4ð (ð €Nùò8s¤ B$cól‡‡—|j«Št|‰|«Šˆˆfd„}t||||d¬«S)Ncó•—‰|‰z Sr)r>)r.rkris €€r%rz(_genrevdescendantsofdepth..pfuncÜsø€Ø�s˜X‘~Ñ&Ð&r2FrX)r_rnr&)rQrr6rrrrkris @@r%Ú_genrevdescendantsofdepthrqØs6ù€Ø�x‰x‹z€HÜ" 4¨°;Ó?€Gõ'ô ˜˜t Z°ÀEÔ JÐJr2cóp—|€|� |tk\rt|||«}nt|||||«}t|d¬«S)zôLike revlog.descendants() but supports additional options, includes the given revs themselves, and returns a smartset Scan ends at the stopdepth (exlusive) if specified. Revisions found earlier than the startdepth are omitted. TrB)rrdrqrD)rQrr6rrrEs r%ÚrevdescendantsrsâsH€ðИyÐ0°IÄÒ4LÜ   t¨[Ó9‰ä'Ø �$˜  Z°ó ˆô ˜ TÔ *Ð*r2c#óòK—t|«}|tk(r|«D]}|–—Œyt|«}||dz¬«D]4}||«D]'}|tk7sŒ ||vsŒ|j|«|–—Œ4Œ6y­w)akGenerate revision number descendants in revision order. Yields revision numbers starting with a child of some rev in ``revs``. Results are ordered by revision number and are therefore topological. Each revision is not considered a descendant of itself. ``revsfn`` is a callable that with no argument iterates over all revision numbers and with a ``start`` argument iterates over revision numbers beginning with that value. ``parentrevsfn`` is a callable that receives a revision number and returns an iterable of parent revision numbers, whose values may include nullrev. Nr©Ústart)r_rr+r,)rÚrevsfnÚ parentrevsfnr`r.rbr$s r%Údescendantrevsryòsxèø€ô �‹I€Eà ”ÒÙ–8ˆCØ‹Iðàä ˆt‹9€DÙ˜E A™I×&ˆÙ  Ö%ˆDØ”w‹ 4¨4¢<Ø—‘˜” Ø’ Ùñ &ñ'ùs‚AA7ÁA7ÁA7có6—eZdZdZd d„Zd„Zd„Zd„Zd„Zd„Z y) ÚsubsetparentswalkeraScan adjacent ancestors in the graph given by the subset This computes parent-child relations in the sub graph filtered by a revset. Primary use case is to draw a revisions graph. In the following example, we consider that the node 'f' has edges to all ancestor nodes, but redundant paths are eliminated. The edge 'f'->'b' is eliminated because there is a path 'f'->'c'->'b' for example. - d - e - / \ a - b - c - f If the node 'c' is filtered out, the edge 'f'->'b' is activated. - d - e - / \ a - b -(c)- f Likewise, if 'd' and 'e' are filtered out, this edge is fully eliminated since there is a path 'f'->'c'->'b'->'a' for 'f'->'a'. (d) (e) a - b - c - f Implementation-wise, 'f' is passed down to 'a' as unresolved through the 'f'->'e'->'d'->'a' path, whereas we do also remember that 'f' has already been resolved while walking down the 'f'->'c'->'b'->'a' path. When processing the node 'a', the unresolved 'f'->'a' path is eliminated as the 'f' end is marked as resolved. Ancestors are searched from the tipmost revision in the subset so the results can be cached. You should specify startrev to narrow the search space to ':startrev'. NcóÒ—|�|jd|«|z}|j}|r|«}nR|j«s7|j«s't j |«}|j d¬«t|«}||_|j|_ ||_ g|_ i|_ i|_i|_t |_||_t |_|j)«y)Ns%d:nullTrX)rÚfastdescÚ isdescendingÚistopor ÚbasesetrrÚ_reporYÚ _changelogÚ_subsetÚ_tovisitÚ _pendingcntÚ _pointersÚ_parentsrÚ _inputheadÚ _inputtailÚ _bottomrevÚ _advanceinput)ÚselfrQÚsubsetrir}Údesciters r%Ú__init__zsubsetparentswalker.__init__8sÆ€Ø Ð Ø—Y‘Y˜z¨8Ó4°vÑ=ˆFð—?‘?ˆÙ Ù“z‰Hà×&Ñ&Ô(°·±´Ü!×)Ñ)¨&Ó1�Ø— ‘  D� Ô)ܘF“|ˆHàˆŒ ØŸ.™.ˆŒØˆŒ ðˆŒ ØˆÔØˆŒØˆŒ Ü!ˆŒØ"ˆŒÜ!ˆŒØ ×ÑÕr2cóJ—tj|j|««S)zVLook up parents of the given revision in the subset, and returns as a smartset)r r€r4)rŒr.s r%Ú parentssetzsubsetparentswalker.parentssetUs€ô×Ñ § ¡ ¨SÓ 1Ó2Ð2r2có —|j|«t|jj|g««D��cgc]\}}|‘Œ c}}Scc}}w)z€Look up parents of the given revision in the subset The returned revisions are sorted by parent index (p1/p2). )Ú _scanparentsÚsortedr‡Úget)rŒr.Ú_crTs r%r4zsubsetparentswalker.parentsZsF€ð ×ј#ÔÜ% d§m¡m×&7Ñ&7¸¸RÓ&@ÔAÔBÑA‘e�b˜!’ÐAÒBÐBùÓBsº A cóì— |jj|«}|dtk(r|ddS|S#tj$r0t d„|j dj«D««cYSwxYw)Nr c3ó<K—|]}|j«–—Œy­wr)rJrKs r%rAz2subsetparentswalker._parentrevs..isèø€ÐKÑ0J¨˜Ÿ™ŸÑ0JùrM)r‚rNrrrOÚtupler�r4)rŒr.rs r%Ú _parentrevszsubsetparentswalker._parentrevsbss€ð LØ—?‘?×-Ñ-¨cÓ2ˆDØ�B‰xœ7Ò"ؘC˜R�yР؈KøÜ×$Ñ$ò LÜÑK°· ± ¸4Ñ0@×0HÑ0HÔ0JÓKÓKÒ Kð Lús‚+0®0°AA3Á2A3có¾—|jtkry t|j«|_y#t$r"|j|_tdz |_YywxYw)zBAdvance the input iterator and set the next revision to _inputheadNr)rˆrrr‰Ú StopIterationrŠ)rŒs r%r‹z!subsetparentswalker._advanceinputksK€à �?‰?œWÒ $Ø ð *Ü" 4§?¡?Ó3ˆD�OøÜò *Ø"Ÿo™oˆDŒOÜ%¨™kˆDŽOð *ús–1±(AÁAcóJ‡—|jŠ|j}|j}|j}|j}|s|j t k\�rË|j|«dk(ry|s1tj||j «|j«|j |d k\rEtj||j «|j«|j |d k\rŒEtj|« }||jkry||vr||vrŒå|‰v}|j|d«|r ||vsJ‚g||<|j|it«f«\}} |rŒ|j!«D]Q\} } || xxdzcc<|| dk\sJ‚| | vrŒ"|| j#| |f«|| dkDsŒA| j%| «ŒS|j'«| D� chc] } || dkDsŒ | ’Œ} } |j)|«} t+ˆfd„| D««} | r|s| �rt-| «dkr|| fg}n^|| f|j/«| j/«fg}|D]5} || xxdz cc<|dd| xxdz cc<|dd| xxdz cc<Œ7t1| «D]œ\}}||ksJ‚tj|| «||vrm||\}}||\}} |j!«D]8\} } | |vr*|| xxdzcc<|| dkDsJ‚t3| || «|| <Œ4| || <Œ:|j5| «Œ•||||<Œžt-| «dkrdgnddg}|r:| r8t1| «D] \}}||} ||j#| |f«Œ"||dk(s{J‚|rwt1| «D]V\}}||\}} ||vsJ‚||} |‰vr(||j#| |f«| j%|«ŒE||xxdz cc<| ||<ŒXd||cxkrdksJ‚J‚|r�Œµ|j t k\r�ŒÊyycc} w) zNScan ancestors until the parents of the specified stoprev are resolvedrNrc3ó&•K—|]}|‰v–—Œ y­wr)r>)r?Úpr�s €r%rAz3subsetparentswalker._scanparents..½søèø€Ð#D¹°A A¨¤K¹ùsƒó1ó2r2é)rƒr„r…r†r‡rˆrr•rrr‹rrŠÚ setdefaultr3r+Úitemsrhr,ÚclearršÚallrgÚcopyÚ enumerater_Úupdate)rŒÚstoprevÚtovisitÚ pendingcntÚpointersr4r.Ú curactiveÚ unresolvedÚresolvedrTr8rNÚbothparentsactiveÚparentpointersrarŸÚknownunresolvedÚ knownresolvedÚ chaincodesr�s @r%r“z subsetparentswalker._scanparentsusŠø€ð,—‘ˆØ—-‘-ˆØ×%Ñ%ˆ Ø—>‘>ˆØ—-‘-ˆá˜Ÿ™¬GÓ3Ø�~‰~˜gÓ&¨!Ò+ØñÜ—‘˜w¨¯©Ð(8Ô9Ø×"Ñ"Ô$Ø—/‘/ g¨a¡j [Ò0Ü—‘˜w¨¯©Ð(8Ô9Ø×"Ñ"Ô$ð—/‘/ g¨a¡j [Ó0ô—=‘= Ó)Ð)ˆCØ�T—_‘_Ò$ØØ�jÑ  S°Ñ%8Øà˜v˜ ˆIØ × !Ñ ! # qÔ )ÙØ 'Ñ)Ð)Ð)Ø!�˜‘ Ø#+§<¡<°°b¼#»%°[Ó#AÑ ˆJ˜áà&×,Ñ,Ö.‘D�A�qؘq“M QÑ&“MØ% a™=¨AÒ-Ð-Ð-ؘH‘}Ø Ø˜A‘J×%Ñ% q¨# hÔ/ð" !‘} qÓ(Ø Ÿ ™  Q�ð/ð× Ñ Ô"ñ(0ÓE¡x !°:¸a±=À1Ó3DšA x�ÐEà×)Ñ)¨#Ó.ˆJÜ #Ó#D¹Ó#DÓ DÐ ñ %© ²hÜ�z“? aÒ'à'1°8Ð&<Ð%=‘Nð$ XÐ.Ø#Ÿ™Ó*¨H¯M©M«OÐ<ð&�Nó(˜Ø" 1› ¨Ñ*› Ø& qÑ)¨!Ñ,¨QÓ/°4Ñ7Ó/Ø& qÑ)¨!Ñ,¨QÓ/°4Ñ7Ô/ð(ô& jÖ1‘D�A�qؘsš7�N˜7Ü—N‘N 7¨Q¨BÔ/ؘH‘}ð:BÀ!¹Ñ6˜¨Ø/=¸aÑ/@Ñ,˜  HØ$.×$4Ñ$4Ö$6™D˜A˜qØ  OÑ3à *¨1£ °Ñ 2£ Ø'1°!¡}°qÒ'8Ð 8Ð'8ä58¸¸OÈAÑr2r%r{r{s)„ñ#óJò:3ò CòLò*óK0r2r{cóŒ—|sgSt|«}t|«}t«}i}|j}|j} |j} |r@| «} | |vr || «|sŒ|| «} | || <| D]} | |k\sŒ | |vsŒ| | «Œ|rŒ@|s t «S|s|St |«D]} || D]} | |vsŒ|| «ŒŒ|S©zSee revlog.reachableroots)r+Úlistr,rhr3r€r”)rÚminrootÚrootsÚheadsÚ includepathr/Ú reachablerbÚreachedÚdovisitÚ nextvisitr.r4r:s r%Ú_reachablerootspurerÅsã€á ؈ Ü �‹J€EÜ �‹K€EÜ“€IØ €Dà�m‰m€GØ�l‰l€GØ— ‘ €Iñ Ù‹kˆØ �%‰<Ù �CŒLÙØÙ˜“*ˆØˆˆS‰ ÛˆFØ˜Ó  V°4Ò%7Ù˜•ðò ñ Ü‹yÐÙ ØÐÜ�dŽ|ˆØ˜3”iˆFؘÒ"Ù˜• ñ ðð Ðr2cóÜ—|s t«S|j«}t|«}t|«}|jj ||||«}t|«}|j «|Sr»)r€r_r¼rYÚreachablerootsr)rQr¾r¿rÀr½rs r%rÇrÇ's[€á Ü‹yÐØ�i‰i‹k€GÜ �‹K€EÜ �‹K€EØ �>‰>× (Ñ (¨°%¸À Ó L€DÜ �4‹=€D؇I�I„KØ €Kr2cóÆ—tj|j«|j«|«}tj||«\}}t d„|D««}||fS)z³Return `(diffinrange, linerange1)` where `diffinrange` is True if diff from fctx2 to fctx1 has changes in linerange2 and `linerange1` is the new line range for fctx1. c3ó,K—|] \}}|dk(–—Œy­w)ó!Nr>)r?Ú_Ústypes r%rAz _changesrange..;sèø€ÐC±N©¨¨5�e˜t•m±Nùs‚)rÚ allblocksÚdataÚ blocksinrangeÚany)Úfctx1Úfctx2Ú linerange2ÚdiffoptsÚblocksÚfilteredblocksÚ linerange1Ú diffinranges r%Ú _changesrangerÙ4sT€ô �_‰_˜UŸZ™Z›\¨5¯:©:«<¸Ó B€FÜ!&×!4Ñ!4°V¸ZÓ!HÑ€N�JÜÑC±NÓCÓC€KØ ˜ Ð "Ð"r2c#ó,K—tj|jj«}|j «}|j «|j «f|||ffi}|r¯|jt|««\}}|j«}|r|dd}|s||f–—Œ?d} |D]_} t| |||«\} } | xs| } | d| dk(rŒ&|j«| _ | | f|| j «| j «f<Œa| r||f–—|rŒ®yy­w)zgYield ancestors of `fctx` with respect to the block of lines within `fromline`-`toline` range. NrFr) rrÔr�ÚuiÚ introfilectxÚlinkrevÚfilenoder3Úmaxr4rÙr.Ú_descendantrev) r-ÚfromlineÚtoliner6rÔr/r8rÓÚplÚinrangerŸÚinrangepr×s r%Úblockancestorsræ?sèø€ô�~‰~˜dŸj™jŸm™mÓ,€HØ × Ñ Ó €DØ�l‰l‹n˜dŸm™m›oÐ .°¸À&Ð7IÐ0JÐ K€EÙ ØŸ ™ ¤# e£*Ó-‰ ˆˆ:Ø �Y‰Y‹[ˆÙ Ø�B�Q�ˆBÙà�Z�-Ò Ø ØˆÛˆAÜ#0°°A°zÀ8Ó#LÑ ˆH�jØÒ) ˆGؘ!‰}  ¨1¡ Ò-ðð !Ÿu™u›wˆAÔ Ø/0°*¨}ˆE�!—)‘)“+˜qŸz™z›|Ð+Ò ,ðñ Ø�Z�-Ò ô1 ùs ‚DDÄDc#ó¤K— tt|||««\}}||k(r||f–— tj|j j «}|j«}|j«|||ffi}|j|j«g«D]•}|j|«}d} |j|«D]c} || \} } t|| | |«\} }| xs| } ||vr6||d|k7r+t|||d«\}}t|«t!|«f}||f||<Œe| sŒ�|f–—Œ—y#t$rY�ŒwxYw#t$rYŒ�wxYw­w)ziYield descendants of `fctx` with respect to the block of lines within `fromline`-`toline` range. FrN)rrærœrrÔr�rÛÚfilelogÚfilerevÚ descendantsÚfilectxrNÚKeyErrorrÙÚzipr_rß)r-rárâr8r×rÔÚflrbrarärcrŸrÓråÚlbsÚubss r%Úblockdescendantsrñashèø€ð  Üœ^¨D°(¸FÓCÓD‰ ˆˆ:ð �Š9Ø�Z�-Ó ä�~‰~˜dŸj™jŸm™mÓ,€HØ �‰‹€BØ �L‰L‹N˜T H¨fÐ#5Ð6Ð 7€DØ �^‰^˜TŸ\™\›^Ð,Ö -ˆØ �L‰L˜‹OˆØˆØ—‘˜qÖ!ˆAð Ø $ Q¡‘ ��:ô$1°°A°zÀ8Ó#LÑ ˆH�jØÒ) ˆGð �D‰y˜T !™W Q™Z¨:Ò5ܘz¨4°©7°1©:Ó6‘��SÜ  ›X¤s¨3£xÐ/� ؘ�mˆD�ŠGð"ò Ø�Z�-Ó ñ).øô ò Ú ð ûôò áð üsS‚E„D1�B%EÃEà AEÄ( EÄ1 D>Ä:EÄ=D>Ä>EÅ E Å EÅ E Å ET)ÚslotsÚfrozencóœ—eZdZej«Zej«Zejd¬«Zejd¬«Zy)Ú annotatelineF)ÚdefaultN) r¶r·r¸rÚibr-ÚlinenoÚskipÚtextr>r2r%rõrõ‰s<„à ˆ4�7‰7‹9€DØ ˆT�W‰W‹Y€Fà ˆ4�7‰7˜5Ô !€DØ ˆ4�7‰7˜4Ô �Dr2rõcó”—eZdZej«Zej«Zej«Zej«Zy)Ú_annotatedfileN) r¶r·r¸rr÷r5ÚlinenosÚskipsrúr>r2r%rürü’s8„ð ˆD�G‰G‹I€E؈d�g‰g‹i€GØ ˆD�G‰G‹I€Eà ˆ4�7‰7‹9�Dr2rücó’—|jd«r|jd«S|jd«tt|««zS)Nó )ÚendswithÚcountÚintÚbool)rús r%Ú _countlinesrœs9€Ø ‡}�}�UÔØ�z‰z˜%Ó Ð Ø �:‰:�eÓ œs¤4¨£:›Ñ .Ð.r2cóv—t|«}tjd|dz«}t|g|z|dg|z|«S)NrF)rr Ú rangelistrü)rúr-Únrýs r%Ú_decoratelinesr ¢s?€Ü�DÓ€AÜ× Ñ   A¨¡EÓ*€GÜ ˜4˜& 1™* g°¨w¸©{¸DÓ AÐAr2c óÜ—|D�cgc]0}|tj|j|j|¬«f‘Œ2}}|r|D��cgc]\}}|t|«f‘Œ}}}|D]n\}}|D]d\\} } } } } | dk(sŒ|j| | |j| | |j | | |j | | |j | | |j | | ŒfŒp|�rˆ|j«|D��cgc] \}}|gf‘Œ }}}t|«D]¾\}\}}|D]±\\} } } } }| | z | | z k\r�t| | «D]q}|j||k(sŒt| || z z| dz «}|j||j|<|j ||j |<d|j |<ŒsŒ—||dj| | | | f«Œ³ŒÀ|D]‘\}}|D]‡\} } } } t| | «D]q}|j||k(sŒt| || z z| dz «}|j||j|<|j ||j |<d|j |<ŒsŒ‰Œ“|Scc}wcc}}wcc}}w)ap Given parent and child fctxes and annotate data for parents, for all lines in either parent that match the child, annotate the child with the parent's data. Additionally, if `skipchild` is True, replace all other lines with parent annotate data as well such that child is never blamed for any lines. See test-annotate.py for unit tests. )Úoptsó=rT) rrÍrúr¼r5rýrþrr¨rfr_rh)r4Ú childfctxÚchildÚ skipchildrÔr:ÚpblocksrŸrÕÚa1Úa2Úb1Úb2ÚtÚ_blocksÚ remainingÚidxÚ_tÚbkÚaks r%Ú _annotatepairr¨s˜€ñóáˆFð ”—‘ §¡¨e¯j©j¸xÔHÒIØð ðñ á8?Ô@¹©¨!¨V�A”t˜F“|Ò$¸ˆÑ@ó"‰ˆ�Û#)Ñ Ñ ˆR��R˜˜að�D‹yØ%+§\¡\°"°RÐ%8�— ‘ ˜B˜rÐ"Ø'-§~¡~°b¸Ð'<�— ‘ ˜b Ð$Ø%+§\¡\°"°RÐ%8�— ‘ ˜B˜rÑ"ñ $*ð"òð �‰Ôñ:AÔA¹¡o f¨g�f˜b’\¸ˆ ÑAÜ%.¨wÖ%7Ñ !ˆCÑ!�&˜&Û(.Ñ$Ñ ��R˜˜R "ؘ‘7˜b 2™gÒ%Ü# B¨žm˜Ø Ÿ;™; r™?¨iÓ7Ü!$ R¨2°©7¡^°R¸!±VÓ!<˜BØ.4¯l©l¸2Ñ.>˜EŸK™K¨™OØ06·±¸rÑ0B˜EŸM™M¨"Ñ-Ø.2˜EŸK™K¨šOñ ,ð˜c‘N 1Ñ%×,Ñ,¨b°"°b¸"Ð-=Õ>ñ)/ð&8ó(‰NˆF�FÛ"(‘��B˜˜BÜ  Bž-�BØ—{‘{ 2‘¨)Ó3Ü   r¨B¡w¡°°a±Ó8˜Ø*0¯,©,°rÑ*:˜Ÿ ™  B™Ø,2¯N©N¸2Ñ,>˜Ÿ ™  bÑ)Ø*.˜Ÿ ™  Bšñ (ñ#)ð(ð €LùòqùóAùó4Bs…5IÁI"Ã(I(cóP—|g}i}|di}|rZ|j«}||vrŒ||«}|||<|D]0} |j| d«dz|| <| |vsŒ |j| «Œ2|rŒZ|g|ddi} |rÌ|d}|| vr|j«Œd} ||}|D]} | | vsŒd} |j| «Œ| r‡|j«t|j «|«} d} |�|j |v} t |D� cgc]} | | ‘Œ c} || | |«} |D]} || dk(r| | =|| =Œ|| xxdzcc<Œ | | |<||=|rŒÌ| |}t|j|j|jtj|j««D�cgc] }t|Ž‘Œ c}Scc} wcc}w)zrCore algorithm for filectx.annotate() `parents(fctx)` is a function returning a list of parent filectxs. rrNr TF)r3r•rhr rÎÚ _changeidrrír5rýrþrÚ splitnewlinesrúrõ)Úbaser4ÚskiprevsrÔr/ÚpcacheÚneededÚfrãrŸÚhistÚreadyÚcurrrÚarTs r%Úannotater)îsé€ðˆF€EØ €FØ�AˆY€FÙ Ø �I‰I‹KˆØ �‰;Ø Ù �Q‹ZˆØˆˆq‰ ÛˆAØŸ ™  1 aÓ(¨1Ñ,ˆF�1‰IØ˜ŠØ— ‘ ˜Q•ðò ðˆv€E‰!€HØ €DÙ Ø �"‰IˆØ �‰9Ø �I‰IŒKØ àˆØ �A‰YˆÛˆAؘŠ}Ø�Ø— ‘ ˜Q•ðñ Ø �I‰IŒKÜ! !§&¡&£(¨AÓ.ˆD؈IØÐ#ØŸK™K¨8Ð3� Ü Ù"$Ó%¡"˜Q��a“ "Ñ% q¨$° ¸8óˆDó�ؘ!‘9 ’>ؘQ˜Ø˜q™ à˜1“I ‘N”Ið ðˆD�‰GØ�q� ò; ð> ˆT‰ €Aô�Q—W‘W˜aŸi™i¨¯©´%×2EÑ2EÀaÇfÁfÓ2MÔNó áNˆAô �aÒØNñ ðùò&ùò s Ã7 FÆ F#c#ó’K—|jd¬«t|«}g|fg}g}t«}tj|«tj}tj }|D�]º} | |vr||| «|j | «d} | | k7sŒ+||« } |j| «t|«D� � cgc]\} } | | dvsŒ| ‘Œ} } } | rU| jd«}||\}}| D]#} || }|j|d«||dz}Œ%t| «D]} || =Œnt|«}|jg| hf«||}| | k(r|dj| «|dj| «|| «D�cgc]}|tkDsŒ |‘Œ}}|dj|«|D]"}||vsŒ|j |«||| «Œ$|st|«dkDrd}|d}n |d|zsd}|�$||dz}|dD]}|–—Œ|r||=ng|ddd| | k7r�Œ��Œ½|D]} | dD]}|–—ŒŒycc} } wcc}w­w)a"Yield revisions from heads to roots one (topo) branch at a time. This function aims to be used by a graph generator that wishes to minimize the number of parallel branches and their interleaving. Example iteration order (numbers show the "true" order in a changelog): o 4 | o 1 | | o 3 | | | o 2 |/ o 0 Note that the ancestors of merges are understood by the current algorithm to be on the same branch. This means no reordering will occur behind a merge. TrXNrr)rr+rÚheapifyrrr,Úremover¨r3ÚextendÚreversedrgrhrr©)rÚ parentsfuncÚ firstbranchÚ unblockedÚgroupsrÚ pendingsetrrÚ currentrevr.raÚgÚmatchingÚ targetidxÚtrevsÚtparentsÚgrrŸr4rTs r%Útoposortr;0s™èø€ðf ‡I�I�d€IÔô�KÓ €Ið2�9ˆoÐ €FØ€KÜ“€Jä ‡M�M�+ÔÜ�m‰m€GÜ�~‰~€H܈ à ˜ZÑ 'Ù �[ : +Ô .Ø �N‰N˜:Ô &ðˆØ�ZÓÙ˜;Ó'Ð'ˆCØ × Ñ ˜cÔ "ô'0°Ô&7ÔGÑ&7™d˜a ¸3À!ÀAÁ$º;šÐ&7ˆHÑGáð(%ŸL™L¨›O� Ø"(¨Ñ"3‘��xÛ!�AØ ™�BØ—L‘L  A¡Ô'Ø  1¡Ñ%‘Hð"ô" (Ö+�Aؘq™ ñ,ô  ›K� Ø— ‘ ˜r C 5˜kÔ*à˜ Ñ"ˆBð�jÒ Ø�1‘— ‘ ˜SÔ!Ø ˆq‰E�L‰L˜Ô Ù"-¨cÔ"2ÓBÑ"2˜Q°a¼'³k’qÐ"2ˆGÐBØ ˆq‰E�L‰L˜Ô !Û�ؘJÒ&Ø—N‘N 1Ô%Ù˜[¨1¨"Õ-ðñ Ü�v“; ’?Ø !�IØ ™‘Bؘ‘U˜YÒ&Ø�àˆ~ð˜R ™UÑ"� à˜Aœ�AØ“GðñؘyÑ)à!�B�q‘E™!�Hðw�ZÖðóLˆØ�1”ˆAØ‹GññùósHùòbCùs>‚BIÂ(IÂ;H<à H<ÃB5IÆIÆIÆIÆ7A*IÈ#$IcóŽ—t|«}th}|j}|D]}|||««Œ|j|«|S)a©Resolve the set of heads from a set of revisions. Receives an iterable of revision numbers and a callbable that receives a revision number and returns an iterable of parent revision numbers, possibly including nullrev. Returns a set of revision numbers that are DAG heads within the passed subset. ``nullrev`` is never included in the returned set, even if it is provided in the input set. )r+rr©Údifference_update)rÚ parentsfnÚheadrevsr4Úupr.s r%r?r?÷sF€ô�4‹y€H܈i€GØ �‰€BãˆÙ ‰9�S‹>Õðà ×јwÔ'Ø €Or2có—|€t}t|xsg«}|h}|h}||dz¬«D]T}||«D]G}||vr&||vr|j|«|j|«||vsŒ2||vsŒ7|j|«ŒIŒV|S)a¥Returns the set of all revs that have no children with control. ``revsfn`` is a callable that with no arguments returns an iterator over all revision numbers in topological order. With a ``start`` argument, it returns revision numbers starting at that number. ``parentrevsfn`` is a callable receiving a revision number and returns an iterable of parent revision numbers, where values can include nullrev. ``startrev`` is a revision number at which to start the search. ``stoprevs`` is an iterable of revision numbers that, when encountered, will stop DAG traversal beyond them. Parents of revisions in this collection will be heads. rru)rr+r,r,)rwrxriÚstoprevsrÁr¿r.r$s r%ÚheadrevssubsetrCs•€ð Ð܈ä�8’>˜rÓ"€Hà� €IØ ˆJ€Eá˜H q™L×)ˆÙ  Ö%ˆDØ�yÑ Ø˜hÑ&Ø—M‘M #Ô&Ø— ‘ ˜#”à�uŠ} ¨XÒ!5Ø— ‘ ˜TÕ"ñ&ð*ð €Lr2có¨—ttt||«d¬««}t«}g}|rŠ|j «}|dkr-| dz }||vrh|j |«|j |«nE|j | dz «||«D]%}|tk(s||vs||vrŒ|j |«Œ'|rŒŠt|«t|«k(sJ‚|S)a¹Linearize and topologically sort a list of revisions. The linearization process tries to create long runs of revs where a child rev comes immediately after its first parent. This is done by visiting the heads of the revs in inverse topological order, and for each visited rev, visiting its second parent, then its first parent, then adding the rev itself to the output list. Returns a list of revision numbers. TrXrr) r¼r”r?r+r3rhr,rrg)rr>r/ÚfinishedÚresultr.r$s r%Ú linearizerG3sЀô ”œ  yÓ1¸4Ô@Ó A€EÜ‹u€HØ €Fá Ø�i‰i‹kˆØ �Š7Ø�$˜‘(ˆCà˜(Ñ"Ø— ‘ ˜cÔ"Ø— ‘ ˜SÕ!ð �L‰L˜#˜ ™Ô "á! #ž�Øœ7’? d°$Ñ&6¸$À(Ñ:JØà— ‘ ˜TÕ"ð 'ò ô$ ˆv‹;œ#˜d›)Ò #Ð#Ð #à €Mr2)F)FNNN)NN)r>)*rÚ thirdpartyrÚnoderÚrrrr r r r€rDrr&r;rFr[r]rdrnrqrsryr{rÅrÇrÙrærñÚsrõrürr rr)r;r?rCrGr>r2r%ÚrLsðó åÝ÷÷ð × Ñ €Ø×$Ñ$€ ð€ ò2KójóB,òJð,MQó,ò<ò6 òKó +ò ÷@n0ñn0òb!óH ò#ó òD% ðP€‡�ˆd˜4Ô ÷!ð!ó!ð!ð€‡�ˆd˜4Ô ÷ðó!ðò/ò Bò CóL?óDDòNó."óJ#r2