Ë jej/Œ~Qãó¬—ddlmZddlmZmZddlmZGd„d«Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zdd„Zd„ZGd„d«ZGd„d«Zy)é)Ú_)ÚerrorÚutil)Ú stringutilcóH—eZdZd d„Zd„Zd„Zd„Zd d„Zd d„Zd„Z d „Z d „Z y) ÚparserNcó.—||_||_d|_y©N)Ú _elementsÚ_methodsÚcurrent)ÚselfÚelementsÚmethodss ú4usr/lib/python3.12/site-packages/mercurial/parser.pyÚ__init__zparser.__init__s€Ø!ˆŒØˆŒ ؈� ócóT—|j}t|jd«|_|S)zadvance the tokenizerN)r ÚnextÚ_iter)rÚts rÚ_advancezparser._advance"s"€à �L‰LˆÜ˜DŸJ™J¨Ó-ˆŒ ؈rcóR—t|j|jddd«S)z%True if next token may start new terméré)Úanyr r )rs rÚ _hasnewtermzparser._hasnewterm(s%€ä�4—>‘> $§,¡,¨q¡/Ñ2°1°QÐ7Ó8Ð8rcóÀ—|jd|k7rÐ?‰Dä×"Ñ"¤1Ð%8Ó#9¸EÑ#AÀ3ÓGÐ Gà�T—^‘^ D§L¡L°¡OÑ4°QÑ7Ò7Ø $§ ¡ £Ñ ˆE�5˜#à ŸN™N¨5Ñ1°!°"Ð5‰MˆE�6Ù™u¨×)9Ñ)9Ô);Ø �~‘ÙØ˜a™ $Ð(:¨×(:Ñ(:¸EÀ!À"¸IÐ(FÐG‘ä×&Ñ&¤qÐ)<Ó'=ÀÑ'EÀsÓKÐKð�T—^‘^ D§L¡L°¡OÑ4°QÑ7Ó7ðˆ rcóx—||_|j«|j«}|j\}}}||fS)z!generate a parse tree from tokens)rrr$r )rÚ tokeniterÚresr)r*r+s rÚparsez parser.parseVs6€àˆŒ Ø � ‰ ŒØ�k‰k‹mˆØ ŸL™Lшˆu�cØ�Cˆxˆrcóš—t|t«s|S|j|d|ddD�cgc]}|j|«‘Œc}ŽScc}w)z4recursively evaluate a parse tree using node methodsrrN)Ú isinstanceÚtupler Úeval)rÚtreers rr7z parser.eval^sK€ä˜$¤Ô&؈KØ%ˆt�}‰}˜T !™WÑ%¸dÀ1À2¹hÓ'G¹h¸¨¯ © °!­ ¸hÑ'GÐHÐHùÒ'Gs¬Acób—|j|«}|jr|j|«S|S)z>> splitargspec(b'') ([], None, [], None) >>> splitargspec(b'foo bar') ([], None, ['foo', 'bar'], None) >>> splitargspec(b'foo *bar baz **qux') (['foo'], 'bar', ['baz'], 'qux') >>> splitargspec(b'*foo') ([], 'foo', [], None) >>> splitargspec(b'**foo') ([], None, [], 'foo') Ns**sno **optkey name providedrs!excessive **optkey names providedró*sno *varkey name provided)Ú partitionÚsplitrÚProgrammingErrorÚlen)ÚspecÚoptkeyÚpreÚsepÚpostÚpostsÚpress rÚ splitargspecrLlsЀð€FØ—^‘^ EÓ*�N€CˆˆdÙ Ø— ‘ “ ˆÙÜ×(Ñ(Ð)EÓFÐ FÜ ˆu‹:˜Š>Ü×(Ñ(Ð)MÓNÐ NØ�q‘ˆà—]‘] 4Ó(�N€CˆˆdØ �9‰9‹;€DØ �J‰J‹L€EÙ ÙÜ×(Ñ(Ð)DÓEÐ EØ�U˜1‘X˜u Q R˜y¨&Ð0Ð0Ø ˆt�T˜6Ð !Ð!rcóà‡—|\}}}}tˆfd„t|«D«t|««} | t|«kr-tjt d«|t|«dœz«‚|sS| t|«t|«zkDr9tjt d«|t|«t|«zdœz«‚t j«} t||d| «D] \} } | | | <Œ |r|t| «| | |<n%t||t| «| «D] \} } | | | <Œ |rt j«| |<|| dD]¤} | r| d‰k7s | dd|k7r#tjt d«d |iz«‚| dd} | |vr| } n+|s$tjt d «|| d œz«‚| |} | | vr$tjt d «|| d œz«‚| d | | <Œ¦| S)a¡Build dict from list containing positional and keyword arguments Arguments are specified by a tuple of ``(poskeys, varkey, keys, optkey)`` where - ``poskeys``: list of names of positional arguments - ``varkey``: optional argument name that takes up remainder - ``keys``: list of names that can be either positional or keyword arguments - ``optkey``: optional argument name that takes up excess keyword arguments If ``varkey`` specified, all ``keys`` must be given as keyword arguments. Invalid keywords, too few positional arguments, or too many positional arguments are rejected, but missing keyword arguments are just omitted. c3ó@•K—|]\}}|sŒ |d‰k(sŒ|–—Œy­w©rNr>)Ú.0ÚiÚxÚ keyvaluenodes €rÚ z buildargsdict.. s%øèø€ÐFÑ'‰tˆq�!ª1°°1±¸Ó1EŒÑ'ùs ƒ Ž—s6%(func)s takes at least %(nargs)d positional arguments)ófuncsnargss5%(func)s takes at most %(nargs)d positional argumentsNrrs %(func)s got an invalid argumentrUs5%(func)s got an unexpected keyword argument '%(key)s')rUskeys;%(func)s got multiple values for keyword argument '%(key)s'r) rÚ enumeraterDrr rrÚsortdictÚzip)ÚtreesÚfuncnameÚargspecrSÚkeynodeÚposkeysÚvarkeyÚkeysrFÚkwstartÚargsÚkrRÚds ` rÚ buildargsdictrdŽs2ø€ð %,Ñ!€GˆV�T˜6ÜÛF”y Ô'ÓFÜ ˆE‹ ó€Gð”�W“ÒÜ×ÑÜ ÐGÓ HØ ¬C°«LÑ9ñ :ó ð ñ �g¤ G£ ¬s°4«yÑ 8Ò8Ü×ÑÜ ÐFÓ GØ ¬C°«L¼3¸t»9Ñ,DÑEñ Fó ð ô �=‰=‹?€Dä�G˜U 8 G˜_Ö-‰ˆˆ1؈ˆQŠð.á ØœS ›Y¨Ð1ˆˆVŠ ä˜˜e¤C¨£I°Ð8Ö9‰DˆAˆq؈D�ŠGð:ñÜ—}‘}“ˆˆV‰ Ø �7�8‹_ˆÙ�A�a‘D˜LÒ(¨A¨a©D°©G°wÒ,>Ü×"Ñ"ÜÐ5Ó6¸'À8Ð9LÑLóð ð ˆa‰D�‰GˆØ �‰9؉AÙÜ×"Ñ"ÜÐJÓKØ$¨aÑ0ñ1óð ð �V‘ ˆAØ �‰6Ü×"Ñ"Üð*óð%¨aÑ0ñ 1óð ð�‰tˆˆ!Šð/ð0 €Krcó¼— tj|«S#t$r;}tjtj |«j ««‚d}~wwxYwr )rÚ unescapestrÚ ValueErrorrr Ú forcebytestrÚlower)ÚsÚes rrfrfÔsR€ðCÜ×%Ñ% aÓ(Ð(øÜ òCô ×Ñœz×6Ñ6°qÓ9×?Ñ?ÓAÓBÐBûð Cús‚— A 6AÁAcó¦—t|t«s'|j|tj|«f«y|d|vrHt tj|dd«}|j|d|ddj |«fzf«y|j|d|dzf«|ddD]}t|||dz|«Œ|dd|dddzfg|ddy)Nrrs(%s %s)ó s(%séÿÿÿÿó))r5r6ÚappendrÚpprintÚmapÚjoinÚ _prettyformat)r8Ú leafnodesÚlevelÚlinesÚrsrjs rrtrtàs×€Ü �dœEÔ "Ø � ‰ �eœZ×.Ñ.¨tÓ4Ð5Õ6Ø ˆa‰�IÑ Ü ”×"Ñ" D¨¨ HÓ -ˆØ � ‰ �e˜Z¨4°©7°D·I±I¸b³MÐ*BÑBÐCÕDà � ‰ �e˜V d¨1¡gÑ-Ð.Ô/Ø�a�b“ˆAÜ ˜!˜Y¨°© °5Õ 9ðà˜R‘y ‘| U¨2¡Y¨q¡\°DÑ%8Ð9Ð:ˆˆbˆc‰ rcóV—g}t||d|«djd„|D««}|S)Nró c3ó2K—|]\}}d|z|z–—Œy­w)s Nr>)rPÚlrjs rrTzprettyformat..ðsèø€Ð:±E©D¨A¨q˜ ™ Q�±Eùs‚)rtrs)r8rurwÚoutputs rÚ prettyformatr~ís.€Ø €EÜ�$˜  1 eÔ,Ø �Z‰ZÑ:±EÓ:Ó :€FØ €Mrcód‡—t|t«s|S|d}|‰vr|ftˆfd„|ddD««zSg}|}|d|k(r.|dd\}}|jt|‰««|}|d|k(rŒ.|jt|‰««|j|«tt |««S)a_Flatten chained infix operations to reduce usage of Python stack >>> from . import pycompat >>> def f(tree): ... s = prettyformat(simplifyinfixops(tree, (b'or',)), (b'symbol',)) ... print(pycompat.sysstr(s)) >>> f((b'or', ... (b'or', ... (b'symbol', b'1'), ... (b'symbol', b'2')), ... (b'symbol', b'3'))) (or (symbol '1') (symbol '2') (symbol '3')) >>> f((b'func', ... (b'symbol', b'p1'), ... (b'or', ... (b'or', ... (b'func', ... (b'symbol', b'sort'), ... (b'list', ... (b'or', ... (b'or', ... (b'symbol', b'1'), ... (b'symbol', b'2')), ... (b'symbol', b'3')), ... (b'negate', ... (b'symbol', b'rev')))), ... (b'and', ... (b'symbol', b'4'), ... (b'group', ... (b'or', ... (b'or', ... (b'symbol', b'5'), ... (b'symbol', b'6')), ... (b'symbol', b'7'))))), ... (b'symbol', b'8')))) (func (symbol 'p1') (or (func (symbol 'sort') (list (or (symbol '1') (symbol '2') (symbol '3')) (negate (symbol 'rev')))) (and (symbol '4') (group (or (symbol '5') (symbol '6') (symbol '7')))) (symbol '8'))) rc3ó6•K—|]}t|‰«–—Œy­wr )Úsimplifyinfixops)rPrRÚ targetnodess €rrTz#simplifyinfixops..4søèø€ÐPÁxÀ!Ô-¨a°×=ÁxùsƒrN)r5r6rpr�Úreversed)r8r‚ÚopÚ simplifiedrRr|Úrs ` rr�r�ôsÈø€ôx �dœEÔ "؈ Ø ˆa‰€BØ �ÑØˆu”uÓPÀtÈAÈBÁxÓPÓPÑPÐPð €JØ €AØ ˆA‰$�"Š*Ø��ˆu‰ˆˆ1Ø×ÑÔ*¨1¨kÓ:Ô;Ø ˆð ˆA‰$�"‹*ð×ÑÔ& q¨+Ó6Ô7Ø×Ñ�bÔÜ ”˜*Ó%Ó &Ð&rcó~‡‡—|‰k(r‰j«St|t«s|Stˆˆfd„|D««S)Nc3ó8•K—|]}t|‰‰«–—Œy­wr )Ú _buildtree)rPrRÚ placeholderÚ replstacks €€rrTz_buildtree..Isøèø€ÐIÁ¸1”˜A˜{¨I×6Áùsƒ)Úpopr5r6)ÚtemplaterŠr‹s ``rr‰r‰Ds7ù€Ø�;ÒØ�}‰}‹ÐÜ �h¤Ô &ØˆÜ ÔIÁÓIÓ IÐIrcóÀ—t|t«stjd«‚t t |««}t |||«}|rtjd«‚|S)aéCreate new tree by substituting placeholders by replacements >>> _ = (b'symbol', b'_') >>> def f(template, *repls): ... return buildtree(template, _, *repls) >>> f((b'func', (b'symbol', b'only'), (b'list', _, _)), ... ('symbol', '1'), ('symbol', '2')) ('func', ('symbol', 'only'), ('list', ('symbol', '1'), ('symbol', '2'))) >>> f((b'and', _, (b'not', _)), (b'symbol', b'1'), (b'symbol', b'2')) ('and', ('symbol', '1'), ('not', ('symbol', '2'))) ó placeholder must be a node tuplestoo many replacements)r5r6rrCÚlistrƒr‰)r�rŠÚreplsr‹r†s rÚ buildtreer’LsV€ô �k¤5Ô )Ü×$Ñ$Ð%HÓIÐIÜ”X˜e“_Ó%€IÜ�8˜[¨)Ó4€AÙÜ×$Ñ$Ð%=Ó>Ð>Ø €Hrc󇇇—||k(ryt|t«rt|t«sy|‰k(r|d‰vr‰j|«yt|«t|«k7ryt ˆˆˆfd„t ||«D««S)NTFrc3óB•K—|]\}}t||‰‰‰«–—Œy­wr )Ú _matchtree)rPÚprRÚincompletenodesÚmatchesrŠs €€€rrTz_matchtree..ks*øèø€ðá&‰DˆAˆqô �1�a˜ o°w×?Ù&ùóƒ)r5r6rprDÚallrX©Úpatternr8rŠr—r˜s ```rr•r•asyú€Ø�$‚ØÜ �gœuÔ %¬Z¸¼eÔ-DØØ�+Ò $ q¡'°Ñ"@Ø�‰�tÔØÜ ˆ7ƒ|”s˜4“yÒ ØÜ õ䘠Ô&óó ðrNcóz—|�%t|t«stjd«‚|g}t |||||«r|Sy)a If a tree matches the pattern, return a list of the tree and nodes matched with the placeholder; Otherwise None >>> def f(pattern, tree): ... m = matchtree(pattern, tree, _, {b'keyvalue', b'list'}) ... if m: ... return m[1:] >>> _ = (b'symbol', b'_') >>> f((b'func', (b'symbol', b'ancestors'), _), ... (b'func', (b'symbol', b'ancestors'), (b'symbol', b'1'))) [('symbol', '1')] >>> f((b'func', (b'symbol', b'ancestors'), _), ... (b'func', (b'symbol', b'ancestors'), None)) >>> f((b'range', (b'dagrange', _, _), _), ... (b'range', ... (b'dagrange', (b'symbol', b'1'), (b'symbol', b'2')), ... (b'symbol', b'3'))) [('symbol', '1'), ('symbol', '2'), ('symbol', '3')] The placeholder does not match the specified incomplete nodes because an incomplete node (e.g. argument list) cannot construct an expression. >>> f((b'func', (b'symbol', b'ancestors'), _), ... (b'func', (b'symbol', b'ancestors'), ... (b'list', (b'symbol', b'1'), (b'symbol', b'2')))) The placeholder may be omitted, but which shouldn't match a None node. >>> _ = None >>> f((b'func', (b'symbol', b'ancestors'), None), ... (b'func', (b'symbol', b'ancestors'), (b'symbol', b'0'))) Nr�)r5r6rrCr•r›s rÚ matchtreeržqsH€ðDФz°+¼uÔ'EÜ×$Ñ$Ð%HÓIÐI؈f€GÜ�'˜4 ¨o¸wÔG؈ðHrcóz—|j�$td«|j|jfzS|jS)z6Compose error message from specified ParseError objects at %d: %s)ÚlocationrÚmessage)Úinsts rÚparseerrordetailr£šs2€à ‡}�}Ð Ü�‹ $§-¡-°·±Ð!>Ñ>Ð>à�|‰|Ðrcó—eZdZdZd„Zy)ÚaliaszParsed result of aliascóJ—||_||_||_||_d|_y)NF)ÚnamerarÚ replacementÚwarned)rr§raÚerrr¨s rrzalias.__init__¥s(€ØˆŒ ؈Œ ؈Œ Ø&ˆÔðˆ� rN)r;r<r=Ú__doc__rr>rrr¥r¥¢s „Ù órr¥cóΗeZdZdZdZdZd„Zed„«Zed„«Z e d„«Z e d„«Z e d „«Z e d „«Ze d „«Ze d „«Ze d „«Ze d„«Ze d„«Zy)ÚbasealiasrulesawParsing and expansion rule set of aliases This is a helper for fileset/revset/template aliases. A concrete rule set should be made by sub-classing this and implementing class/static methods. It supports alias expansion of symbol and function-call styles:: # decl = defn h = heads(default) b($1) = ancestors($1) - ancestors(default) Nssymbolcó2—td|jz«‚)Ns'%s' is not instantiatable)Ú TypeErrorr;)Úclss rÚ__new__zbasealiasrules.__new__Âs€ÜÐ5¸¿ ¹ ÑDÓEÐErcó—t‚)z-Parse an alias name, arguments and definition©ÚNotImplementedError)rEs rr$zbasealiasrules._parseÅó €ô"Ð!rcó—t‚)z9Return (name, args) if tree is a function; otherwise Noner³)r8s rÚ _trygetfunczbasealiasrules._trygetfuncÊrµrcóf‡— ‰j|«}|d‰jk(r,|d}|j d«r|dt d«|zfS|ddfS‰j|«}|r�|\}}|j d«r|dt d«|zfStˆfd„|D««r|dt d«fSt|«tt|««k7r|dt d «fS||D�cgc]}|d‘Œ c}dfS|dt d «fS#tj$r}|dt|«fcYd}~Sd}~wwxYwcc}w) a� Parse an alias declaration into ``(name, args, errorstr)`` This function analyzes the parsed tree. The parsing rule is provided by ``_parse()``. - ``name``: of declared alias (may be ``decl`` itself at error) - ``args``: list of argument names (or None for symbol declaration) - ``errorstr``: detail about detected error (or None) >>> sym = lambda x: (b'symbol', x) >>> symlist = lambda *xs: (b'list',) + tuple(sym(x) for x in xs) >>> func = lambda n, a: (b'func', sym(n), a) >>> parsemap = { ... b'foo': sym(b'foo'), ... b'$foo': sym(b'$foo'), ... b'foo::bar': (b'dagrange', sym(b'foo'), sym(b'bar')), ... b'foo()': func(b'foo', None), ... b'$foo()': func(b'$foo', None), ... b'foo($1, $2)': func(b'foo', symlist(b'$1', b'$2')), ... b'foo(bar_bar, baz.baz)': ... func(b'foo', symlist(b'bar_bar', b'baz.baz')), ... b'foo(bar($1, $2))': ... func(b'foo', func(b'bar', symlist(b'$1', b'$2'))), ... b'foo($1, $2, nested($1, $2))': ... func(b'foo', (symlist(b'$1', b'$2') + ... (func(b'nested', symlist(b'$1', b'$2')),))), ... b'foo("bar")': func(b'foo', (b'string', b'bar')), ... b'foo($1, $2': error.ParseError(b'unexpected token: end', 10), ... b'foo("bar': error.ParseError(b'unterminated string', 5), ... b'foo($1, $2, $1)': func(b'foo', symlist(b'$1', b'$2', b'$1')), ... } >>> def parse(expr): ... x = parsemap[expr] ... if isinstance(x, Exception): ... raise x ... return x >>> def trygetfunc(tree): ... if not tree or tree[0] != b'func' or tree[1][0] != b'symbol': ... return None ... if not tree[2]: ... return tree[1][1], [] ... if tree[2][0] == b'list': ... return tree[1][1], list(tree[2][1:]) ... return tree[1][1], [tree[2]] >>> class aliasrules(basealiasrules): ... _parse = staticmethod(parse) ... _trygetfunc = staticmethod(trygetfunc) >>> builddecl = aliasrules._builddecl >>> builddecl(b'foo') ('foo', None, None) >>> builddecl(b'$foo') ('$foo', None, "invalid symbol '$foo'") >>> builddecl(b'foo::bar') ('foo::bar', None, 'invalid format') >>> builddecl(b'foo()') ('foo', [], None) >>> builddecl(b'$foo()') ('$foo()', None, "invalid function '$foo'") >>> builddecl(b'foo($1, $2)') ('foo', ['$1', '$2'], None) >>> builddecl(b'foo(bar_bar, baz.baz)') ('foo', ['bar_bar', 'baz.baz'], None) >>> builddecl(b'foo($1, $2, nested($1, $2))') ('foo($1, $2, nested($1, $2))', None, 'invalid argument list') >>> builddecl(b'foo(bar($1, $2))') ('foo(bar($1, $2))', None, 'invalid argument list') >>> builddecl(b'foo("bar")') ('foo("bar")', None, 'invalid argument list') >>> builddecl(b'foo($1, $2') ('foo($1, $2', None, 'at 10: unexpected token: end') >>> builddecl(b'foo("bar') ('foo("bar', None, 'at 5: unterminated string') >>> builddecl(b'foo($1, $2, $1)') ('foo', None, 'argument names collide with each other') Nrró$óinvalid symbol '%s'sinvalid function '%s'c3óB•K—|]}|d‰jk7–—Œy­wrO)Ú _symbolnode)rPrr°s €rrTz,basealiasrules._builddecl...søèø€Ð9±D¨q�1�Q‘4˜3Ÿ?™?Õ*±Dùr™sinvalid argument lists&argument names collide with each othersinvalid format) r$rr r£r¼Ú startswithrr·rrDÚset)r°Údeclr8r¢r§Úfuncrars` rÚ _builddeclzbasealiasrules._builddeclÏsSø€ðZ 8Ø—:‘:˜dÓ#ˆDð �‰7�c—o‘oÒ %à˜‘7ˆDØ�‰˜tÔ$ؘd¤AÐ&<Ó$=ÀÑ$DÐEÐEؘ$ Ð%Ð %à�‰˜tÓ$ˆÙ à‰JˆD�$Ø�‰˜tÔ$ؘd¤AÐ&>Ó$?À$Ñ$FÐGÐGÜÓ9±DÓ9Ô9ؘd¤AÐ&>Ó$?Ð@Ð@Ü�4‹yœC¤ D£ ›NÒ*àØÜÐ?Ó@ððð ©Ó.© A˜1˜Q›4¨Ñ.°Ð5Ð 5à�dœAÐ/Ó0Ð1Ð1øô5×Ñò 8ؘ$Ô 0°Ó 6Ð7Õ 7ûð 8üò0/s#ƒDÃ! D.ÄD+Ä D&Ä D+Ä&D+có4‡‡—t|t«s|S|d}|‰jk7r|ftˆˆfd„|ddD««zSt|«dk(sJ‚|d}|‰vrd}||fS|j d«r!t j td«|z«‚||fS) z%Mark alias arguments as ``_aliasarg``rc3óB•K—|]}‰j|‰«–—Œy­wr )Ú _relabelargs)rPrRrar°s €€rrTz.basealiasrules._relabelargs..Asøèø€Ð MÁH¸q ×!1Ñ!1°!°T×!:ÁHùr™rNró _aliasargr¹rº)r5r6r¼rDr½rr r)r°r8rar„Úsyms` ` rrÄzbasealiasrules._relabelargs:s¬ù€ô˜$¤Ô&؈KØ �!‰WˆØ �—‘Ò Ø�5œ5Ô MÀDÈÈÁHÓ MÓMÑMÐ Mä�4‹y˜AŠ~Ј~Ø�1‰gˆØ �$‰;؈Bð�CˆyÐð�^‰^˜DÔ !Ü×"Ñ"¤1Ð%;Ó#<¸sÑ#BÓCÐ CØ�CˆyÐrcóx—|j|«}|r t|«}n t«}|j||«S)aåParse an alias definition into a tree and marks substitutions This function marks alias argument references as ``_aliasarg``. The parsing rule is provided by ``_parse()``. ``args`` is a list of alias argument names, or None if the alias is declared as a symbol. >>> from . import pycompat >>> parsemap = { ... b'$1 or foo': (b'or', (b'symbol', b'$1'), (b'symbol', b'foo')), ... b'$1 or $bar': ... (b'or', (b'symbol', b'$1'), (b'symbol', b'$bar')), ... b'$10 or baz': ... (b'or', (b'symbol', b'$10'), (b'symbol', b'baz')), ... b'"$1" or "foo"': ... (b'or', (b'string', b'$1'), (b'string', b'foo')), ... } >>> class aliasrules(basealiasrules): ... _parse = staticmethod(parsemap.__getitem__) ... _trygetfunc = staticmethod(lambda x: None) >>> builddefn = aliasrules._builddefn >>> def pprint(tree): ... s = prettyformat(tree, (b'_aliasarg', b'string', b'symbol')) ... print(pycompat.sysstr(s)) >>> args = [b'$1', b'$2', b'foo'] >>> pprint(builddefn(b'$1 or foo', args)) (or (_aliasarg '$1') (_aliasarg 'foo')) >>> try: ... builddefn(b'$1 or $bar', args) ... except error.ParseError as inst: ... print(pycompat.sysstr(parseerrordetail(inst))) invalid symbol '$bar' >>> args = [b'$1', b'$10', b'foo'] >>> pprint(builddefn(b'$10 or baz', args)) (or (_aliasarg '$10') (symbol 'baz')) >>> pprint(builddefn(b'"$1" or "foo"', args)) (or (string '$1') (string 'foo')) )r$r¾rÄ)r°Údefnrar8s rÚ _builddefnzbasealiasrules._builddefnKs9€ð^�z‰z˜$ÓˆÙ Ü�t“9‰Dä“5ˆDØ×Ñ  dÓ+Ð+rcó(—dx}}|j|«\}}}|r td«}n |j||«}|r||j ||dœz}t||||«S#tj$r }t |«}td«}Yd}~ŒQd}~wwxYw)z>Parse an alias declaration and definition into an alias objectNs4bad declaration of %(section)s "%(name)s": %(error)ss3bad definition of %(section)s "%(name)s": %(error)s)ósectionónameserror)rÁrrÉrr r£Ú_sectionr¥) r°r¿rÈÚreplÚefmtr§rarªr¢s rÚbuildzbasealiasrules.build�s©€ðЈˆtØŸ.™.¨Ó.‰ˆˆd�CÙ ÜÐLÓM‰Dð QØ—~‘~ d¨DÓ1�ñ ØØŸL™LØØññˆCô �T˜4  dÓ+Ð+øô×#Ñ#ò QÜ& tÓ,�ÜÐOÓP•ûð Qús©AÁBÁ1B  Bcó`—i}|D]&\}}|j||«}|||j<Œ(|S)zTParse a list of alias (name, replacement) pairs into a dict of alias objects)rÐr§)r°ÚitemsÚaliasesr¿rÈÚas rÚbuildmapzbasealiasrules.buildmap–s;€ðˆÛ‰JˆD�$Ø— ‘ ˜$ Ó%ˆA؈G�A—F‘FŠOð ðˆrcó—t|t«sy|d|jk(r(|d}|j|«}|r|j€|dfS|j |«}|r(|\}}|j|«}|r|j�||fSy)zrIf tree looks like an unexpanded alias, return (alias, pattern-args) pair. Return None otherwise. Nrr)r5r6r¼Úgetrar·)r°rÓr8r§rÔrÀras rÚ _getaliaszbasealiasrules._getalias sŒ€ô ˜$¤Ô&ØØ �‰7�c—o‘oÒ %ؘ‘7ˆDØ— ‘ ˜DÓ!ˆAÙ�Q—V‘V�^ؘ$�w�Ø�‰˜tÓ$ˆÙ ؉JˆD�$Ø— ‘ ˜DÓ!ˆAÙ�Q—V‘VÐ'ؘ$�w�Ørcóx‡‡—t|t«s|S|ddk(r |d}‰|Stˆˆfd„|D««S)zoReplace _aliasarg instances with the substitution value of the same name in args, recursively. rrÅrc3óB•K—|]}‰j|‰«–—Œy­wr )Ú _expandargs)rPrrar°s €€rrTz-basealiasrules._expandargs..¾søèø€Ð<±t°!�S—_‘_ Q¨×-±tùr™)r5r6)r°r8rarÆs` ` rrÛzbasealiasrules._expandargs´sDù€ô ˜$¤Ô&؈KØ �‰7�lÒ "Ø�q‘'ˆCؘ‘9Ð ÜÔ<±tÓ<Ó<Ð.Æs$øèø€ðÙCG¸a�— ‘ ˜G Q¨ °5×9Á4ùsƒ!s5infinite expansion of %(section)s "%(name)s" detected)rËrÌsinvalid number of arguments: %d)r5r6rØrÚAbortr rrÍr§rprßr¨rŒrarDrÛÚdictrX) r°rÓr8ráràr†rÔr|Úresultrs `` `` rrßzbasealiasrules._expandÀs†û€ä˜$¤Ô&؈KØ �M‰M˜' 4Ó (ˆØ ˆ9ÜöÙCGóóð ð‰ˆˆ1Ø �7Š7Ü—+‘+˜aŸg™gÓ&Ð &Ø � ‰>Ü×"Ñ"ÜÐJÓKØ"Ÿ|™|°a·f±fÑ=ñ>óð ð ×Ñ˜ÔØ �6‰6˜Ñ ØŸK™KؘŸ™¨ °5óˆE�!—&‘&‰Mð�q—v‘v‘ˆØ� ‰ ŒØ �6‰6ˆ>؈Mä ˆq‹6”S˜Ÿ™“[Ò Ü×"Ñ"ÜÐ4Ó5¼¸A»Ñ>óð ñ:;Ó ;¹°AˆS�[‰[˜ ! R¨Õ /¸ˆÐ ;Ø�‰˜v¤t¬C°·±¸«NÓ';Ó<Ð<ùò rrr­r­°sú„ñ ð€Hà€KòFðñ"óð"ðñ"óð"ðñh2óðh2ðTñóðð ñ3,óð3,ðjñ,óð,ð(ñóððñóðð&ñ =óð =ðñ =óð =ðDñ2óñ2rr­)Nr>)Úi18nrÚrrÚutilsrrrLrdrfrtr~r�r‰r’r•ržr£r¥r­r>rrÚrìsvðõ(÷õ÷MñMò`"òDCòLCò ;òòM'ò`Jò ò* ó &òR÷ ñ ÷y2òy2r