Ë ›í]=Eâå*ãón—ddlZddlZddlmZddlmZmZddlmZd„Z d d„Z d d„Z y) éNé)Ú_)ÚerrorÚpycompat)Ú stringutilc#óð‡‡‡‡‡‡‡‡K—|sytjtjtjz«ŠiŠdŠdŠˆˆˆfd„}tj |«Šˆfd„Šˆfd„Šˆfd„Šˆˆˆˆfd„}‰«}|d k7�rh|tjtj «vr-‰«}|tjtj «vrŒ-|d k(rd ‰‰gff–—‰Š‰d z Љ«}�nð|d k(r`‰‰«tjtj««\}}t|«}td|«D]}d ‰‰gff–—‰Š‰d z ŠŒ�n‹|dvrl|dk(r‰«}||«\}}|g}|dk(r'|‰««\}}|j|«|dk(rŒ'|D� cgc] } || «‘Œ } } d ‰| ff–—‰Š‰d z Š�n|dk(r|‰««\}} || «Šný|dk(r|‰««\}} ‰‰| <d‰| ff–—nÚ|dk(r|‰««\}} d| f–—n¾|dk(rC‰«}|dk(r%d} ‰«}|dvr| |z } ‰«}|dvrŒd| f–—nˆ||«\}} d| f–—nv|dk(r|dvrm‰«}|dvrŒ n`|dk(r dЉ«}nQ|d k(ryd}d}|d k7r!|dkr||z }|d z }‰«}|d k7r|dkrŒtjtd«|z«‚|d k7r�Œgyycc} w­w)a#parses a DAG from a concise textual description; generates events "+n" is a linear run of n nodes based on the current default parent "." is a single node based on the current default parent "$" resets the default parent to -1 (implied at the start); otherwise the default parent is always the last node created ">> len(list(parsedag(b""" ... ... +3 # 3 nodes in linear run ... :forkhere # a label for the last of the 3 nodes from above ... +5 # 5 more nodes on one branch ... :mergethis # label again ... >> list(parsedag(b"")) [] A simple linear run: >>> list(parsedag(b"+3")) [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [1]))] Some non-standard ways to define such runs: >>> list(parsedag(b"+1+2")) [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [1]))] >>> list(parsedag(b"+1*1*")) [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [1]))] >>> list(parsedag(b"*")) [('n', (0, [-1]))] >>> list(parsedag(b"...")) [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [1]))] A fork and a join, using numeric back references: >>> list(parsedag(b"+2*2*/2")) [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [0])), ('n', (3, [2, 1]))] >>> list(parsedag(b"+2<2+1/2")) [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [0])), ('n', (3, [2, 1]))] Placing a label: >>> list(parsedag(b"+1 :mylabel +1")) [('n', (0, [-1])), ('l', (0, 'mylabel')), ('n', (1, [0]))] An empty label (silly, really): >>> list(parsedag(b"+1:+1")) [('n', (0, [-1])), ('l', (0, '')), ('n', (1, [0]))] Fork and join, but with labels instead of numeric back references: >>> list(parsedag(b"+1:f +1:p2 *f */p2")) [('n', (0, [-1])), ('l', (0, 'f')), ('n', (1, [0])), ('l', (1, 'p2')), ('n', (2, [0])), ('n', (3, [2, 1]))] >>> list(parsedag(b"+1:f +1:p2 >> list(parsedag(b"+1 $ +1")) [('n', (0, [-1])), ('n', (1, [-1]))] Annotations, which are meant to introduce sticky state for subsequent nodes: >>> list(parsedag(b"+1 @ann +1")) [('n', (0, [-1])), ('a', 'ann'), ('n', (1, [0]))] >>> list(parsedag(b'+1 @"my annotation" +1')) [('n', (0, [-1])), ('a', 'my annotation'), ('n', (1, [0]))] Commands, which are meant to operate on the most recently created node: >>> list(parsedag(b"+1 !cmd +1")) [('n', (0, [-1])), ('c', 'cmd'), ('n', (1, [0]))] >>> list(parsedag(b'+1 !"my command" +1')) [('n', (0, [-1])), ('c', 'my command'), ('n', (1, [0]))] >>> list(parsedag(b'+1 !!my command line\n +1')) [('n', (0, [-1])), ('C', 'my command line'), ('n', (1, [0]))] Comments, which extend to the end of the line: >>> list(parsedag(b'+1 # comment\n+1')) [('n', (0, [-1])), ('n', (1, [0]))] Error: >>> try: list(parsedag(b'+1 bad')) ... except Exception as e: print(pycompat.sysstr(bytes(e))) invalid character in dag description: bad... Néÿÿÿÿrcó‚•—|s‰S|dtjtj«vr‰t |«z S‰|S)Nr)rÚbytestrÚstringÚdigitsÚint)ÚrefÚlabelsÚp1Úrs €€€ú7usr/lib/python3.12/site-packages/mercurial/dagparser.pyÚresolvezparsedag..resolve²s>ø€Ù؈Ià �‰V”x×'Ñ'¬¯ © Ó6Ñ 6à”s˜3“x‘<Ð à˜#‘;Ð ócó•—t‰d«S)Nó)Únext)Úchiters€rÚnextchzparsedag..nextch¾sø€Ü�F˜EÓ"Ð"rcó:•—d}||vr||z }‰«}||vrŒ||fS©Nr©)ÚcÚallowÚsrs €rÚnextrunzparsedag..nextrunÁs3ø€Ø ˆØ�5‰jØ �‰FˆAÙ“ˆAð�5Šjð�!ˆtˆ rcó`•—d}||k7r||k(r‰«}||z }‰«}||k7rŒ‰«|fSrr)rÚlimitÚescaper rs €rÚ nextdelimitedzparsedag..nextdelimitedÈsDø€Ø ˆØ�5ŠjØ�FŠ{Ù“H�Ø �‰FˆAÙ“ˆAð �5‹jñ ‹x˜ˆ{Ðrcó>•—|dk(r‰‰«dd«S‰|‰«S)Nó"ó\r)rrr%r!Ú wordcharss €€€€rÚ nextstringzparsedag..nextstringÑs(ø€Ø �Š9Ù ¡£¨4°Ó7Ð 7á˜1˜iÓ(Ð (rró.ónró+s*/ó*ó/ó<ó:óló@óaó!rs óCócó#ó$é s+invalid character in dag description: %s...) rr r Ú ascii_lettersr Ú iterbytestrÚ whitespacerÚrangeÚappendrÚAbortr)Údescrr*rÚdigsÚnÚiÚprefÚprefsrÚpsÚnameÚtextÚcmdr rrrr%r!rrr)s @@@@@@@@rÚparsedagrKsRÿèø€ñf Øô× Ñ ¤×!5Ñ!5¼¿ ¹ Ñ!EÓF€Ið€FØ €BØ €Aöô× !Ñ ! $Ó '€Fô#ôô÷)ñ ‹€AØ ˆu‹*à”8×#Ñ#¤F×$5Ñ$5Ó6Ñ6ᓈAð”8×#Ñ#¤F×$5Ñ$5Ó6Ò6ð �Š9ؘ˜R˜D˜ �/Ò !؈BØ �‰FˆAÙ“ŠAØ �$ŠYá™f›h¬×(8Ñ(8¼¿¹Ó(GÓH‰GˆAˆtä�D“ ˆAܘ1˜a–[�ؘQ  ˜I�oÒ%Ø�Ø�Q‘‘ò!ð�%‰ZØ�DŠyÙ“H�Ù  “m‰GˆAˆtØ�FˆEØ�t’)Ù$¡V£XÓ.‘��4Ø— ‘ ˜TÔ"ð�t“)ñ+0Ó0©% 3‘'˜#•,¨%ˆBÐ0ؘ˜B˜�-Ò ØˆBØ �‰FŠAØ �$ŠYÙ¡£Ó)‰FˆAˆsÙ˜“‰BØ �$ŠYÙ ¡£Ó*‰GˆAˆt؈F�4‰Lؘ˜T˜ Ð"Ó "Ø �$ŠYÙ ¡£Ó*‰GˆAˆtؘ�*Ó Ø �$ŠYÙ“ˆAØ�DŠyØ�Ù“H�ؘyÑ(ؘ1‘H�CÙ›�Að˜yÒ(ð˜C�i“á# A›‘��3ؘC�i“Ø �$ŠYؘ9Ñ$Ù“H�ð˜9Ó$à �$ŠY؈BÙ“‰AØ �%ŠZØ àˆA؈AØ�u’*  R¢Ø�Q‘�Ø�Q‘�Ù“H�ð�u’*  R£ô—+‘+ÜÐ@ÓAÀAÑEóð ðI ˆuŽ*ùò61ùs8ŠCK6ÃC K6Æ'K6Æ+K1Æ:BK6É-K6Ê?K6Ë&K6Ë/K6c#󿇇‡‡‡‡‡ K—d„Š ˆˆˆˆˆˆˆ fd„}d} |«D]E} | dk(r | sŒ | –—d} Œt| «t| «z|k\r| –—d} n|r | r | dk7r| dz } | | z } ŒG| r| –—yy­w)z$generates single lines for dagtext()có‚—tjd|«r|Sd|jdd«jdd«zdzS)Ns ^[0-9a-z]*$r'r(s\\)ÚreÚmatchÚreplace)rIs rÚ wrapstringz dagtextlines..wrapstring-s=€Ü �8‰8�N DÔ )؈KØ�d—l‘l 5¨'Ó2×:Ñ:¸4ÀÓGÑGÈ$ÑNÐNrc3ób•K—i}d}d}d}‰ D�]\}}|dk(�r:|\}}||k7r#tjtd«||fz«‚|sdg}n/|D]*}||k\sŒ tjtd«||fz«‚|dz }|dz } t|«dk(r$|ddk(r|r|r d|z–—d}‰rd –—d –—d} nd }t|«dk(r|d| k(r ‰rd –—ŒÈ|dz }ŒÎ|r d|z–—d}‰rd –—g} |D]I}|| k(r| j d «Œ||vr| j ||«Œ3| j d||z z«ŒKddj | «z–—�ŒG|r d|z–—d}|dk(r|\} } | || <d| z–—‰s�Œld –—�Œr|dk(rd‰|«z–—‰s�Œˆd –—�ŒŽ|dk(r d|z–—d –—�Œ |dk(r‰rd –—d‰|«z–—�Œº|dk(r d|z–—d –—�ŒÌtjtd«t j|«t j|«fz«‚|rd|z–—yy­w)NrFr,sexpected id %i, got %ir s)parent id %i is larger than current id %irs+%dó r9Tr+rs%dr.r/r2r1r7r5r6s!!r4r3r8s'invalid event type in dag: ('%s', '%s'))rr@rÚlenr?ÚjoinrÚ escapestr)rÚrunÚwantrÚneedrootÚkindÚdatarrGÚprrFÚridrHÚeventsÚusedotsÚwrapannotationsÚ wrapcommandsÚ wraplabelsÚ wrapnonlinearrQs €€€€€€€rÚgenzdagtextlines..gen2sžøèø€ØˆØˆØˆØˆÜ ‰JˆD�$Ø�t‹|Ø‘��2ð˜’:ÜŸ+™+¤aÐ(AÓ&BÀeÈQÀZÑ&OÓPÐPÙØ˜‘Bã˜Ø ›6Ü"'§+¡+Ü !ð%5ó!"ð$% a &ñ !)ó#ðð 𘑠�ð˜‘U�Ü�r“7˜a’< B q¡E¨R¢KÙÙØ"(¨3¡,Ò.Ø"#˜CÙ(Ø"'šKØ"š Ø™à#'˜Ü�r“7˜a’< B q¡E¨R¢KÙØ"› à˜q™™áØ$ s™lÒ*ؘÙ$Ø#š Ø�Eۘؠš7Ø!ŸL™L¨Õ-Ø &™[Ø!ŸL™L¨°©Õ3à!ŸL™L¨°!°a±%©Õ9ð  ð §¡¨5Ó!1Ñ1Ô1áØ  3™,Ò&Ø�Cؘ4’<Ø $‘I�C˜Ø"&�F˜3‘KØ ™+Ò%Û!Ø#œ ؘT’\Ø¡¨DÓ!1Ñ1Ò1Û#Ø#œ ؘT’\Ø $™,Ò&Ø”KؘT’\Ù&Ø#š Ø¡¨DÓ!1Ñ1Ô1ؘT’\Ø ™+Ò%Ø”KäŸ+™+ÜÐDÓEä&×0Ñ0°Ó6Ü&×0Ñ0°Ó6ðñóðð_!ñl ؘ3‘,Ó ð ùsƒAH/ÁDH/Å:H/ÆBH/rrSr+ó N)rT) r^Ú addspacesrbr`rarcr_Ú maxlinewidthrdÚlineÚpartrQs ` ````` @rÚ dagtextlinesrj!sŒþèø€òO÷ \ò\ð| €DÙ–ˆØ �5Š=ÚØ’ Ø‘ä�4‹yœ3˜t›9Ñ$¨ Ò4Ø’ ؑٙt¨°ª ؘ‘ �Ø �D‰L‰Dðñ Ø‹ ð ùs ‰"A1¬AA1c óD—djt||||||||««S)aÒgenerates lines of a textual representation for a dag event stream events should generate what parsedag() does, so: ('n', (id, [parentids])) for node creation ('l', (id, labelname)) for labels on nodes ('a', text) for annotations ('c', text) for commands ('C', text) for line commands ('!!') ('#', text) for comment lines Parent nodes must come before child nodes. Examples -------- Linear run: >>> dagtext([(b'n', (0, [-1])), (b'n', (1, [0]))]) '+2' Two roots: >>> dagtext([(b'n', (0, [-1])), (b'n', (1, [-1]))]) '+1 $ +1' Fork and join: >>> dagtext([(b'n', (0, [-1])), (b'n', (1, [0])), (b'n', (2, [0])), ... (b'n', (3, [2, 1]))]) '+2 *2 */2' Fork and join with labels: >>> dagtext([(b'n', (0, [-1])), (b'l', (0, b'f')), (b'n', (1, [0])), ... (b'l', (1, b'p2')), (b'n', (2, [0])), (b'n', (3, [2, 1]))]) '+1 :f +1 :p2 *f */p2' Annotations: >>> dagtext([(b'n', (0, [-1])), (b'a', b'ann'), (b'n', (1, [0]))]) '+1 @ann +1' >>> dagtext([(b'n', (0, [-1])), ... (b'a', b'my annotation'), ... (b'n', (1, [0]))]) '+1 @"my annotation" +1' Commands: >>> dagtext([(b'n', (0, [-1])), (b'c', b'cmd'), (b'n', (1, [0]))]) '+1 !cmd +1' >>> dagtext([(b'n', (0, [-1])), ... (b'c', b'my command'), ... (b'n', (1, [0]))]) '+1 !"my command" +1' >>> dagtext([(b'n', (0, [-1])), ... (b'C', b'my command line'), ... (b'n', (1, [0]))]) '+1 !!my command line\n+1' Comments: >>> dagtext([(b'n', (0, [-1])), (b'#', b' comment'), (b'n', (1, [0]))]) '+1 # comment\n+1' >>> dagtext([]) '' Combining parsedag and dagtext: >>> dagtext(parsedag(b'+1 :f +1 :p2 *f */p2')) '+1 :f +1 :p2 *f */p2' rS)rUrj)Údagrfrbr`rarcr_rgs rÚdagtextrm¡s6€ðn �:‰:ÜØ Ø Ø Ø Ø Ø Ø Ø ó ó ð r)TFFFFFéF) rNr Úi18nrÚrrÚutilsrrKrjrmrrrÚrrs\ðó Û å÷õòJð^ØØØØØ Øó}ðDØØØØØ Øôbr