Ë +«¹…—=�ãóÈ—dZddlmZddlmZddlmZmZmZdZ dZ dZ dZ e d e d e d iZ d „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zej.Gd„d««Zd„Zd„Zy )a>supports walking the history as DAGs suitable for graphical output The most basic format we use is that of:: (id, type, data, [parentids]) The node and parent ids are arbitrary integers which identify a node in the context of the graph returned. Type is a constant specifying the node type. Data depends on type. é)Únullrev)Úattr)ÚdagopÚsmartsetÚutilóCóPóGóMó|ó:Nc #ó~‡ K—i}|D�]¡}||}|j«D�chc]%}|j«|vsŒ|j«’Œ'c}Š |j«D�cgc];}|j«tk7r"|j«‰ vr|j«‘Œ=}}t‰ «D�cgc] }t|f‘Œ }}|D]É}|j |«} | €^t |tj«stj|«}tttj|||g«««x} ||<| s)|jt|f«‰ j|«ŒŸ|jˆ fd„| D««‰ j!| «ŒË|j«t"||f–—�Œ¤ycc}wcc}wcc}w­w)aÍcset DAG generator yielding (id, CHANGESET, ctx, [parentinfo]) tuples This generator function walks through revisions (which should be ordered from bigger to lower). It returns a tuple for each node. Each parentinfo entry is a tuple with (edgetype, parentid), where edgetype is one of PARENT, GRANDPARENT or MISSINGPARENT. The node and parent ids are arbitrary integers which identify a node in the context of the graph returned. Nc3ó8•K—|]}|‰vsŒt|f–—Œy­w©N)Ú GRANDPARENT)Ú.0ÚgÚpsets €ú6usr/lib/python3.12/site-packages/mercurial/graphmod.pyÚ zdagwalker..Qsøèø€ÐM¹°A¸qȺ}¤ ¨QÔ/¹ùsƒ � )ÚparentsÚrevrÚsortedÚPARENTÚgetÚ isinstancerÚbasesetÚsetrÚreachablerootsÚappendÚ MISSINGPARENTÚaddÚextendÚupdateÚ CHANGESET) ÚrepoÚrevsÚgpcacherÚctxÚpÚmparsrÚmparÚgprs @rÚ dagwalkerr.(sˆøèø€ð€GäˆØ�3‰iˆð"%§¡¤ÓB¡˜A°!·%±%³'¸T²/�—‘• ÑBˆð—[‘[”]ó á"�Ø�u‰u‹wœ'Ò! a§e¡e£g°TÑ&9ð �E‰E�GØ"ð ð ô )/¨t¬ Ó5©  1”F˜A’;¨ ˆÐ5ãˆDØ—‘˜TÓ"ˆB؈zô" $¬×(8Ñ(8Ô9Ü#×+Ñ+¨DÓ1�DÜ%+Üœ×,Ñ,¨T°4¸$¸Ó@ÓAó&ð��W˜T‘]ñØ—‘¤ ¨tÐ4Ô5Ø—‘˜•à—‘ÓM¹ÓMÔMØ— ‘ ˜B•ðð"�w‰w‹yœ) S¨'Ð2Ô2ñ=ùò Cùò ùò 6ùs/ƒ F=£F.»F.Á F=Á"AF3Â"F=Â1F8ÃC=F=c#óK—t|«}|D]n}||}|j«D�chc]+}|j«|vsŒt|j «f’Œ-}}|j «t |t |«f–—Œpycc}w­w)z±cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples This generator function walks the given nodes. It only returns parents that are in nodes, too. N)rrÚnoderrr%r)r&ÚnodesÚincluder0r)r*rs rr1r1Ws~èø€ô �%‹j€GÛˆØ�4‰jˆà'*§{¡{¤}ó Ù'4 !¸¿¹»ÀGÒ8KŒV�Q—U‘U“WÒ  }ð ð ð�w‰w‹yœ) S¬&°«/Ð:Ó:ñ ùò ùs‚(BªBÁBÁ-Bc #󀇇K—g}i}d}iЉjjd«D]\}}d|vsŒ |jdd«\}}|dk(r/|j«rt |«‰j |i«|<ŒT|dk(sŒZ|j «sŒk|‰j |i«|<Œ�‰rtjˆˆfd„«} nd„} |D�]h\} } } } | |vr|j| «||| <|dz }|j| «}|j| «}|dd}| D��cgc] \}}||vsŒ |‘Œ}}}||||dzt|«D]\}}|s|||<Œ|||<|dz }Œg}t|«D]·\}}||vrQ| |«}|j||j|«|||jdd «|jdd «f«Œ[|| k(sŒa| D]R\}}| |«}|j||j|«||jdd «|jdd «f«ŒTŒ¹| | | ||f|f–—|}�Œkycc}}w­w) axannotates a DAG with colored edge information For each DAG node this function emits tuples:: (id, type, data, (col, color), [(col, nextcol, color)]) with the following new elements: - Tuple (col, color) with column and color index for the current node - A list of tuples indicating the edges between the current node and its parents. rsgraphó.swidthscolorcóJ•—‰j‰|j«i«Sr)rÚbranch)rÚconfigr&s €€rÚzcolored..ƒsø€˜Ÿ ™  4¨¡9×#3Ñ#3Ó#5°rÔ:ócó—iSr©)rs rr8zcolored..†s€™br9Néÿÿÿÿr9)ÚuiÚ configitemsÚrsplitÚisdigitÚintÚ setdefaultÚisalnumrÚ lrucachefuncr ÚindexÚpopÚ enumerater)Údagr&ÚseenÚcolorsÚnewcolorÚkeyÚvalr6ÚsettingÚgetconfÚcurÚtypeÚdatarÚcolÚcolorÚnextÚptr*Ú addparentsÚiÚedgesÚecolÚeidÚbconfÚptyper7s ` @rÚcoloredr^fsqùèø€ð €DØ €FØ€HØ €Fà—G‘G×'Ñ'¨Ö1‰ˆˆSØ �3Š;Ø!Ÿj™j¨¨qÓ1‰OˆF�Gà˜(Ò" s§{¡{¤}Ü9<¸S»�×!Ñ! &¨"Ó-¨gÒ6ؘHÓ$¨¯©­Ø9<�×!Ñ! &¨"Ó-¨gÒ6ð2ñÜ×#Ñ#Ü :ó ‰ñ!ˆä&)Ñ"ˆˆd�D˜'ð �d‰?Ø �K‰K˜Ô Ø"ˆF�3‰KØ ˜‰MˆHà�j‰j˜‹oˆØ— ‘ ˜3“ˆØ‘Aˆwˆñ&-Ô>¡W™E˜B °¸² ’a Wˆ Ñ>Ø(ˆˆS�3˜‘7Ðô˜jÖ)‰DˆAˆqÙØ!��q’ à$��q‘ ؘA‘ ‘ð *ðˆÜ" 4ž‰IˆD�#Ø�d‰{Ù › �Ø— ‘ àØŸ ™  3›Ø˜s™ ØŸ ™  (¨BÓ/ØŸ ™  (¨CÓ0ð õð˜“Û '‘H�E˜1Ù# A›J�EØ—L‘Là Ø ŸJ™J q›MØ!Ø!ŸI™I h°Ó3Ø!ŸI™I h°Ó4ð õñ!(ð)ð4�D˜$  e  ¨eÐ4Ò4ØŠñk'*ùó?ùs2„.H>³AH>ÂH>ÂB H>Ä H8Ä,H8Ä0BH>ÇA0H>c#óªK—|j}||vr|j|«|j|«}g}g}|D][\} } | |k(rŒ | |vr|j| «Œ"|j| «|jj | d«|j | <Œ]t |«} d| dzz} |dd} || ||dz|D�cgc]}|| j|«f‘Œ}}| |ddt |«dkDr\|j||f«|j||dzf«d}| dz } ||| ||| |ff–—d}|dz }| dz } g}|d=t |«dkDrŒ\t |«dkDr|j||f«t |«dkDr|j||dzf«t | «| z }|dkDr| dz } |j j|d«||| ||| |ff–—ycc}w­w)z9adds edge info to changelog DAG walk suitable for ascii()r réNó\é)rIr rEÚstylesrrYÚlenrF)rQÚcharÚstaterrrIÚnodeidxÚ knownparentsÚ newparentsr]ÚparentÚncolsÚwidthÚnextseenr*rYÚ nmorecolss rÚ asciiedgesroÀsèø€à �:‰:€DØ �$�Ø � ‰ �CÔØ�j‰j˜‹o€Gà€LØ€JÛ ‰ ˆˆvØ �SŠ=à Ø �T‰>Ø × Ñ  Õ 'à × Ñ ˜fÔ %Ø"'§,¡,×"2Ñ"2°5¸$Ó"?ˆE�K‰K˜Ò ð!ô �‹I€EØ �˜‘ ‰M€EØ‘Aˆw€HØ&0€HˆW�w ‘{Ð#Ù3?Ó @±<¨aˆg�x—~‘~ aÓ(Ò )°<€EÐ @à€D‰€GÜ ˆj‹/˜AÒ ð � ‰ �g˜wÐ'Ô(Ø � ‰ �g˜w¨™{Ð+Ô,؈ Ø �‰ ˆØ�T˜5 7¨E°5¸)Ð"DÐEÒE؈Ø�1‰ ˆØ �‰ ˆØˆØ �qˆMô ˆj‹/˜AÓ ô  ˆ:ƒ˜ÒØ � ‰ �g˜wÐ'Ô(Ü ˆ:ƒ˜ÒØ � ‰ �g˜w¨™{Ð+Ô,Ü�H“  Ñ%€IØ�1‚}Ø �‰ ˆà ‡K�K‡O�O�C˜ÔØ ��u˜w¨¨u°iÐ@Ð AÓAùò9 Aùs‚B;GÂ=GÃA0GÅB GcóP—t|«D]\}\}}||kDsŒ||dzf||<Œy)Nr)rG)rYrXÚstartÚends rÚ_fixlongrightedgesrsös3€Ü& uÖ-ш‰LˆU�CØ �‹;ؘs Q™wÐ'ˆE�!ŠHñ.r9cóÞ—|rT||k(rO|dk7rJ|dk(r8t|dz|«}||dz|dz dz}|jddg||z z«|Sddg||z dz zS||z dz } | dkDr || dz dSgS)Nrbr<rr`ó/ó ra)Úmaxr#) ÚecharsÚidxÚpidxrkÚcoldiffÚpdiffÚfix_tailrqÚtailÚ remainders rÚ_getnodelineedgestailr€üs£€Ù�G˜uÒ$¨°Aªà �bŠ=ܘ˜a™ Ó&ˆEؘ# ™' U¨Q¡Y°!¡OÐ4ˆDØ �K‰K˜˜t˜ ¨°© Ñ6Ô 7؈Kà˜4�= E¨C¡K°!¡OÑ4Ð 4à˜C‘K !‘Oˆ Ø-6¸ª]ˆv˜  A™ Ð&Ð(Ð)ÐBÀÐBr9có&—|D]Œ\}}||dzk(r d|d|zdz<Œ||dz k(r d|d|zdz<Œ.||k(r|d|z|d|z<ŒBd|zt|«k\rŒTd|d|z<||kDr||}}td|zdzd|z«D]}||dk7sŒ d||<ŒŒŽy)Nrrur`raó+ó-)rdÚrange)rxrYÚnodelineÚ interlinerqrrrXs rÚ _drawedgesr‡ sÍ€Û‰ ˆ�Ø �C˜!‘GÒ Ø%)ˆI�a˜#‘g ‘kÒ "Ø �c˜A‘gÒ Ø',ˆI�a˜%‘i !‘mÒ $Ø �cŠ\Ø#)¨!¨e©)Ñ#4ˆI�a˜%‘iÒ à�3‰wœ#˜h›-Ò'ØØ $ˆH�Q˜‘WÑ Ø�sŠ{Ø # U˜�ܘ1˜u™9 q™=¨!¨c©'Ö2�ؘA‘; $Ó&Ø"&�H˜Q’Kñ3ñr9cóà—|d|dz}||dz f|vs||f|vr|j||dz|dzdz«n|jddg«||z dz }|dkDr|j||dz d«|S)Nr`rrvrb)r#)rxryrkrYÚliners rÚ_getpaddinglinerŠs’€à �)�C˜!‘GÐ €Dà ˆS�1‰W€~˜Ñ 3¨ *°Ñ"5ð � ‰ �F˜3 ™7 c¨A¡g°¡]Ð3Õ4à � ‰ �T˜4�LÔ!à˜‘ ˜a‘€IØ�1‚}Ø � ‰ �F˜Y¨™]Ð+Ð-Ð.Ô/Ø €Kr9c óh—d|j«vry|ddd…}|r|d€|j«|r|d€Œt|jd«dzdz d«}|jsdnd}t |«||zkr&|j |dd«t |«||zkrŒ&|rïg}g} |jd«} t|| dd…| dz«D]0\} } | €|j | dz«Œ| j | dz«Œ2tt| | t | «dzzd««} | dd}|| dD]_}dgt |«| z z|| dtt |««D]1} || dz }t|| | «|| <|| | kDrdn|| | ||<Œ3Œa|jsd d d œndd i}t|«D]1\} }d|vrŒ |D� cgc]} | xs|j| d«‘Œc} |ddŒ3|j«D�� cgc] \}} | �Œ |‘Œ }}} |D]}||=|j|«Œycc} wcc} }w) zÑDraw ending lines for missing parent edges None indicates an edge that ends at between this node and the next Replace with a short line ending in ~ and add / lines to any edges to the right. Nr`r<rrbérvrur ó~)rr`)ÚvaluesrFrwÚcountÚ graphshortenrdr rErGÚlistr„rÚitemsÚremove)ÚlinesÚextraÚedgemaprIrfÚ edgecharsÚ shift_sizeÚminlinesÚemptiesÚtoshiftÚ first_emptyrXÚcÚtargetsÚ positionsr‰ÚposÚmapr*r“rjs rÚ_drawendinglinesr¢3so€ð �7—>‘>Ó#Ñ#Øð‘c˜�c‘ €IÙ ˜  "™ Ð-Ø� ‰ Œñ ˜  "™ Ñ-ä�i—o‘o dÓ+¨aÑ/°1Ñ4°aÓ8€JØ×*Ò*‰q°€HÜ ˆe‹*�x *Ñ,Ò ,Ø � ‰ �U™1�XÔô ˆe‹*�x *Ñ,Ó ,ñ؈؈ؗk‘k $Ó'ˆ ܘe K N° NÑ3°[ÀAÑ5EÖF‰DˆAˆq؈yØ—‘˜q 1™uÕ%à—‘˜q 1™uÕ%ð Gô ”u˜[¨+¼¸G» ÀqÑ8HÑ*HÈ!ÓLÓMˆØ™A�Jˆ ؘ:˜+˜,Ó'ˆDØ"& ¬3¨t«9°{Ñ+BÑ!CˆD��Ð Üœ3˜y›>Ö*�Ø ‘l QÑ&�Ü" 3¨°© Ó3� ˜!‘ Ø$'¨'°!©*Ò$4™D¸%ÀÈÁ Ñ:K��S’ ñ+ð(ð%*×$6Ò$6ˆd�tÒ ¸QÀ¸I€CܘUÖ#‰ˆˆ4Ø �tÑ Ø Ù26Ó7±$¨Q�1Ò(˜Ÿ™  4Ó(Ñ(°$Ñ7ˆ‰Q‰ð$ð $ŸM™MœOÔ 9™O‘D�A�q¨q©yŠa˜O€FÑ 9ÛˆØ �FˆOØ � ‰ �FÕñùò 8ùó:sÇH)Ç; H.ÈH.cót—eZdZdZej dej e«¬«Zej dej e «¬«Z ej dd¬«Z ej dd¬«Z ej dej e j«¬«Zej dd¬«Zy)Ú asciistatez State of ascii() graph renderingF)ÚinitÚdefaultrbN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚibÚFactoryr‘rIÚdictrYÚ lastcoldiffÚ lastindexÚEDGESÚcopyrcr�r;r9rr¤r¤gs–„á*à ˆ4�7‰7˜ | t§|¡|°DÓ'9Ô :€DØ ˆD�G‰G˜¨ ¨¯ © °TÓ(:Ô ;€EØ�$—'‘'˜u¨aÔ0€KØ�—‘˜U¨AÔ.€IØ ˆT�W‰W˜%¨¨¯©°e·j±jÓ)AÔ B€FØ�4—7‘7 ¨uÔ5�Lr9r¤cób—|D]*\}}|j||zj«dz«Œ,y)aXoutputs an ASCII graph of a DAG this is a helper function for 'ascii' below. takes the following arguments: - ui to write to - graph data: list of { graph nodes/edges, text } this function can be monkey-patched by extensions to alter graph display without needing to mimic all of the edge-fixup logic in ascii() ó N)ÚwriteÚrstrip)r=ÚgraphÚlnÚlogstrs rÚ outputgraphr¹ss0€ó‰ ˆˆVØ �‰�"�v‘+×%Ñ%Ó'¨%Ñ/Õ0ñr9c ó—|\}}}} d| cxkrdksJ‚J‚|j|j} } | D� � cgc]} | j| d«dfD]} | ‘ŒŒ}} } |jdt || zt | «z d«z«| dk(r t |«t |«dkDxr%| dk(xr|D��cgc]\}}|dz|ksŒ|‘Œc}}}t |«dkxr| }|d |dz}|j|dg«|jt|||j|| |j|««|d |dz}td| z«D]}|jd«Œ||z dz }| dk(r$t|«D]}|jd dg«ŒnF| dk(r|j||dzdz|dz«n#t|«D]}|jd dg«Œt||||«|g}|r|jt||||««|jr$td „|D««r#|j|«n|j|«|d || zdz}t |«t |«krCt |«t |«kr,|j|d d «t |«t |«krŒ,t!||| | |«t |«t |«kr)|jd «t |«t |«krŒ)t ||| z«}|D�cgc]}dd|zd j#|«fz‘Œ}}t%|t'||««| |_ ||_y cc} } wcc}}wcc}w)a™prints an ASCII graph of the DAG takes the following arguments (one call per node in the graph): - ui to write to - Somewhere to keep the needed state in (init to asciistate()) - Column of the current node in the set of ongoing edges. - Type indicator of node data, usually 'C' for changesets. - Payload: (char, lines): - Character to use as node's symbol. - List of lines to display as the node's text. - Edges; a list of (col, next_col) indicating the edges between the current node and its parents. - Number of columns (ongoing edges) in the current revision. - The difference between the number of columns (ongoing edges) in the next revision and the number of columns (ongoing edges) in the current revision. That is: -1 means one column removed; 0 means no columns added or removed; 1 means one column added. éþÿÿÿr`r rv)r rvrbr<rNrurac3ó*K—|] }|sŒ|dv–—Œ y­w)s\/Nr;)rr�s rrzascii..èsèø€Ð9¡O˜q²qˆq�FŒ{¡Oùs‚Š r9s%-*s )rYrIrr#rwrdrsr€r¯r®r„r r‡rŠr�Úanyr¢Újoinr¹Úzip)r=rfrQreÚtextÚcoldataryrYrkr{r–rIr*r�rxÚxÚyÚadd_padding_lineÚfix_nodeline_tailr…Úshift_interlinerXr�r”Úextra_interlineÚindentation_levelr‰s rÚasciirÉ„sz€ð(")Ñ€Cˆ��wØ �Ô ˜!Ò ÐÑ ÐÐ à—K‘K §¡ˆT€GñÔ D™�A¨¯ © °A°tÓ(<¸dÓ'C !ŠaÐ'Cˆa˜€FÑ DØ ‡M�M�,¤ U¨W¡_´s¸4³yÑ%@À!Ó!DÑDÔEà�"‚}ô ˜5Ô!ô ˆD‹ �A‰ ÒP˜' R™-ÒP¹UÔ,P¹U±6°A°qÀaÈ!ÁeÈaÃiªQ¸UÒ,Pðô˜D›  Q™Ò?Ð/?Ð+?Ðð�i˜˜a™Ð €HØ ‡O�O�T˜4�LÔ!à ‡O�OÜØ Ø Ø �O‰OØ Ø Ø × Ñ Ø ó ô ð˜Y˜s Q™wÐ'€OÜ �1�w‘;Ö ˆØ×јtÕ$ð à �C‰K˜!‰O€EØ�"‚}Ü�u–ˆAØ × "Ñ " D¨$ <Õ 0ñà �AŠØ×јv s¨Q¡w°!¡m°e¸a±iÐ@ÕAä�u–ˆAØ × "Ñ " E¨4 =Õ 1ðôˆv�u˜h¨Ô8ðˆJ€EÙØ � ‰ ”_ V¨S°%¸Ó?Ô@ð ×ÒÜ Ñ9¡OÓ9Ô 9Ø �L‰L˜Õ )ð � ‰ �_Ô%ðÐ4 ¨¡°1Ñ4Ð5€OÜ ˆ5ƒz”C˜“IÒÜ�%‹jœ3˜t›9Ò$Ø �L‰L˜©Ð+Ô ,ô�%‹jœ3˜t›9Ó$ô�U˜O¨W°d¸EÔBä ˆd‹)”c˜%“jÒ Ø � ‰ �CÔô ˆd‹)”c˜%“jÓ ô˜E 5¨7¡?Ó3ÐáGLó ÙGL¸tˆ�AÐ)Ñ)¨3¯8©8°D«>Ð:Ó:Àuð ð ô�”C˜˜tÓ$Ô%ð €EÔØ€E…OùóKEùó(-QùòT sµ"MÂ3MÃMÌ M)rªr0rÚ thirdpartyrÚrrrr%rrr!r°r.r1r^rorsr€r‡rŠr¢Úsr¤r¹rÉr;r9rÚrÍs¢ðñ õÝ÷ñð € Ø €Ø€ Ø€ ð ��{ D¨-¸Ð>€ò,3ò^ ;òWòt3Bòl(ò Cò'ò&ò*1ðh‡�÷6ð6óð6ò1ó"r9