^cq ddlZddlmZddlmZddlmZddlmZm Z mZm Z m Z ddl m Z idd d d d d ddddddddddddddddddddd dd!d"d#d$d%d$d$d&d'd(d(d)d*d(d+Zhd,ZiZd-d.hZeejd/Zeejejejejejzd0zeeejed1d2zZeeejd3zZd]d4ZeZd5Z d6Z!efd7Z"d8Z#d9Z$d:Z%eefd;Z&d<Z'd=Z(iZ)d>Z*d?Z+d@Z,dAZ-dBZ.dCZ/dDZ0dEZ1dFZ2edGhzZ3d^dHZ4GdIdJe j5Z6d_dKZ7dLZ8d_dMZ9dNZ:dOZ;dPZedSZ?dTZ@dUZAdVZBdWZCdXZDdYZEe jFGdZZHd[ZId\ZJdS)`N)_)getattrhex)errorparserpycompatsmartsetutil) stringutil()N)groupr))funcrrN[)rNN) subscriptr]N#)rNN)relationrN##)NN)_concatrN~)NN)ancestorrN^)rNN)parentr parentpost-)N)negate)minusr"N::) dagrangeall) dagrangeprer')dagranger' dagrangepost..:)rangeall)rangeprer.)ranger. rangepostnot) N)r3r4NN!and)r"NN)r6r"N&%)r"NN)onlyr"onlypostor)NN)r;r<N|)NN)keyvaluer>N)NN)listr@N)rNNNN)rsymbolNNN)rstringNNN)+=,rrrBrCend>r;r6r3"'s()[]#:=,-|&+!~^%s._@s-/c#Kt|tstjd|zt j|}|t }|t}|rr|dd}tfd|Drr|dr d|ddfVt|dkr4t|d}dd|fV|drd|d|dzfVddt|fVdSdt|}}||krd||}| rn:|dkr|||d zd krd d|fV|dz }n|d kr|||d zd krd d|fV|dz }n|d kr|||d zdkrdd|fV|dz }n|tvr |d|fVn|tvs|dkr|||d zdvr|dkr|dz }||}d} n tj} |dz }|}||kr>||} | dkr|d z }| |krd| ||||fVn-|dz }||k>tjt#d|n ||vr|}|dz }||kr3||} | |vrn&| d kr||dz d kr|dz}n |dz }||k3|||} | t$vr| d|fVnd| vrtr| rd| |fVnf| d}|ddD])} | rd| |fV|t| z }dd|fV|dz }*|dr d|d|fVnd| |fV|dz}n%tjt#d|z||dz }||kddd|fVdS)a Parse a revset statement into a stream of tokens ``syminitletters`` is the set of valid characters for the initial letter of symbols. By default, character ``c`` is recognized as valid for initial letter of symbols, if ``c.isalnum() or c in '._@' or ord(c) > 127``. ``symletters`` is the set of valid characters for non-initial letters of symbols. By default, character ``c`` is recognized as valid for non-initial letters of symbols, if ``c.isalnum() or c in '-._/@' or ord(c) > 127``. Check that @ is a valid unquoted token character (issue3686): >>> list(tokenize(b"@::")) [('symbol', '@', 0), ('::', None, 1), ('end', None, 3)] s&revset statement must be bytes, got %rNr-rc32K|]}||VdSN).0symlookups 6/usr/lib/python3/dist-packages/mercurial/revsetlang.py ztokenize..ws033ss3vvc{{333333rrBrGr@r&.r,rrr)sr'sr"c|SrNrOxs rSztokenize..s1rU\rCsunterminated stringr!ssyntax error in revset '%s') isinstancebytesrProgrammingErrorr bytestr_syminitletters _symletterssplitalllenisspace_simpleopletters _quotelettersr unescapestr ParseErrorrkeywords) programrRsyminitletters symletterspartssposlcdecodedrQps ` rStokenizerxTs,* gu % % $ 5 ?   w''G(  6  dA&& 3333e333 3 3 Qx / %(A....5zzA~~aMMT1o%%%87$eAhA66664W. . . . F G C '' CL 99;;R   II'#a-0E99$$ $ $ $ 1HCC II'#a-0E99$$ $ $ $ 1HCC II'#a-0E99$$ $ $ $ 1HCC " " "dC.   DyycAg &.88DyyqCL$+ 1HCA''CL::1HC66$ffWQsU^&<&>$  D |"'++- 44 KrUcFt|}tj|dg|RS)zCreate raw parsed tree from a template revset statement >>> _build(b'f(_) and _', (b'string', b'1'), (b'symbol', b'2')) ('and', ('func', ('symbol', 'f'), ('string', '1')), ('symbol', '2')) rB_)rr buildtree)tmplspecreplstemplates rS_buildr>s- 8$$H  H&7 @% @ @ @@rUcRt|}tj||dddhS)aTest if a tree matches the given pattern statement; return the matches >>> _match(b'f(_)', parse(b'f()')) >>> _match(b'f(_)', parse(b'f(1)')) [('func', ('symbol', 'f'), ('symbol', '1')), ('symbol', '1')] >>> _match(b'f(_)', parse(b'f(1, 2)')) rr?rA)rr matchtree)patspecrpatterns rS_matchrHs5'""G  (;*@  rUc(tdd||fS)Ns!ancestors(_) and not ancestors(_)r6)r)revsbasess rS _matchonlyrVs 6u8M N NNrUct|ts|S|d}|dkrd|df}|dddkrtd||ddfS|dddkrtd |fS|ddd krtd ||ddfS|ddd krtd |fSnk|dkr|td|ddzfS|dkrC|dddkr1td|dd|dd|dfS|ftd|ddDzS)zrRewrite raw parsed tree to resolve ambiguous syntax which cannot be handled well by our simple top-down parserrrr rr@r)r*r(r+r0r1r/r2r;rANrr relsubscriptc34K|]}t|VdSrN)_fixopsrPys rSrTz_fixops..us(33333333rU)r^tupler)rZrposts rSrrZs a   1B Yqt$ Q47n $ $KqtAw788 8 qT!W & &OT233 3 qT!W # #HdAaDG455 5 qT!W # #L$/00 0$ uGJ122.//00 |  !Q; 6 61a!A$q'1Q4@AAA 5533QqrrU33333 33rUc ||S|d}|dkr"ttdg|ddRS|dkr"ttdg|ddRS|dkr#ttd|dS|d kr!tjt d |d kr#ttd |dS|d kr#ttd|dS|dkr7t |dt d}tdd|zfS|dvr|S|dkr|dfS|dvr|t|dfS|dkrt|dS|dvr/t|d}t|d}|||fS|dkrEt|d}t|d}t|d}||||fS|dkr%|ft d|ddDzS|dkr||dt|dfS|dkr||dt|dfStd|z) Nrr%s _ and not _rr9 only(_, _)r:sonly(_)r(scan't use '::' in this contextr)s ancestors(_)r+sdescendants(_)r#scan't negate thatrCr!rCrBsmartsetr/>r;r3r0r2r r>r6r1rrr*rrr@rr>rAc34K|]}t|VdSrN_analyzers rSrTz_analyze..s(88QXa[[888888rUr?rinvalid operator %r)rrrrkrr~rr)rZrrqtatbtcs rSrrxsy 1B X~~~6!""666777 w}5qu555666 {  z1Q400111 ~  q!BCCDDD ~  !55666   0!A$77888 y adA233 4 4D1H-... 2 2 2 {  Dz H H HHQqTNN## x!~~   ad^^ ad^^B|    ad^^ ad^^ ad^^BB wuu88!ABB%8888888 {  AaD(1Q4..)) wAaD(1Q4..)) +b0 1 11rUc t|S)zTransform raw parsed tree to evaluatable tree which can be fed to optimize() or getset() All pseudo operations should be mapped to real operations or functions defined in methods or symbols table respectively. rrYs rSanalyzers A;;rUc |d|fS|d}|dvrd|fS|dkrt|d\}}t|d\}}t||}tdd||f}|r6t|ddvr|t d |d|dfSt ||pt ||}|r|t d g|ddRfStd |}|r |d ||dffS||krd }||||ffS|dkrgggc fd}t |dD]z} t| \}} | 0| ddks | ddkr || fF||| {|tdkrddfSt|dtzffS|dkritd|dr,tt d} | d| dfSt|d} | d|| dffS|dkrd|fS|dvr't|d} | d|| dffS|dvr:t|d\}}t|d\}}||z|||ffS|dvr%t|d\}} ||| |dffS|dkr,t|d\}} ||| |d|dffS|dkr3td|ddD\t|fzfS|dkr%t|d\}} |||d| ffS|dkrt|d} t|d\}}tt| d d}td!|}| d"kr|r||zt d#|dfS||z||d|ffSt!d$|z)%Nrrg?r6rr@s_() & ancestors(_)>draftsecret _notpublics_phaseandancestors(_, _)rsnot _s differences andsmallyr;c2sdStdkr d\}}nCddD}tdd|f}t|\}}||dd=dS)Nrrc3,K|]\}}|dVdS)rNrO)rPwts rSrTz-_optimize..flushss..s*331qt333333rUs_list(_)rC)rfjoinr _optimizeappend)rrrqrsstswss rSflushssz_optimize..flushsss 2ww!||!u11JJ3333333;A77 ||1 IIaLLL IIaLLL111rUrCrBrr3spublic()s _notpublic()r/)r0r2r )r*r1)rrrrrr>rAc34K|]}t|VdSrNrrs rSrTz_optimize.. s(33y||333333rUr?r_weightscommonancestors(_)sheadss_commonancestorheads(_)r)rrrrzrrrrrfrrzipsumrsymbolsrr)rZrwarwbrrmrrrofrrrs @@@rSrrsy!t 1B 000Av v1Q4B1Q4B BKK (62r*: ; ;  F1Q4$HHHf8!A$!EEE E r2   4*R"4"4  4f]3QqrrU3333 3 8R   1 r1Q400 0 77B2r2, uR B       1  AQ<>> _parsewith(b'foo($1)', syminitletters=_aliassyminitletters) ('func', ('symbol', 'foo'), ('symbol', '$1')) >>> from . import error >>> from . import pycompat >>> try: ... _parsewith(b'$1') ... except error.ParseError as e: ... pycompat.sysstr(e.message) ... e.location "syntax error in revset '$1'" 0 >>> try: ... _parsewith(b'foo bar') ... except error.ParseError as e: ... pycompat.sysstr(e.message) ... e.location 'invalid token' 4 srevset(rN)rRrns invalid token)rAr;) startswithendswithr elementsrrxrfrrkrrsimplifyinfixops)rrRrnrwrrrs rS _parsewithr+s,$//*--$--2E2E hAf^DDDID# c$iiq!122C888 6*41ABB C CCrUcTeZdZdZedZedZedZdS) _aliasrulesz0Parsing and expansion rule set of revset aliasess revset aliasc.t|tS)aParse alias declaration/definition ``spec`` This allows symbol names to use also ``$`` as an initial letter (for backward compatibility), and callers of this function should examine whether ``$`` is used also for unexpected symbols or not. rn)r_aliassyminitletters)rs rS_parsez_aliasrules._parseQs$/CDDDDrUc|ddkr5|dddkr%|ddt|dfSdSdS)NrrrrBr@)rrs rS _trygetfuncz_aliasrules._trygetfunc[sP 7g  $q'!* "9"971:wtAw/// /  "9"9rUN) __name__ __module__ __qualname____doc__r_section staticmethodrrrOrUrSrrLs`::q!!HEE\E00\000rUrc,t|}t||}|\t|D]:\}}|jr.|js'|td|jzd|_;|S)zCExpand aliases in a tree, aliases is a list of (name, value) tuplesNs warning: %s T)rbuildmapexpandsorteditemsrwarnedr)raliaseswarnnamealiass rS expandaliasesras""7++G   gt , ,D !'--//22 $ $KD%{ $5< $Q'((EK8999# KrUct|tr |ddvr|S|ddkr|g}g}|r|}|ddkr+|t |ddnR|ddvr||dn,t d|dz}tj||dd |fStd |DS) z(Fold elements to be concatenated by `##`rrrrNrCrBs#"##" can't concatenate "%s" elementrCrUc34K|]}t|VdSrN) foldconcat)rPrs rSrTzfoldconcat..s(11qZ]]111111rU) r^rpopextendreversedrrrrkr)rpendingrsemsgs rSrrns dE " "d1g2''   Aw*&  , Atz!!x!""////1///1BCCqtL&s+++ ,388A;;''11D111111rUc t||S#tj$rP}|jC|j}|dd}|dzd|dzzzdzt dz|_d}~wwxYw)N)rR  rs^ shere)rrrklocationreplacerhint)rrRinstlocs rSrrs $v....      = $-C<<t,,D u tsQw'77%?!G**LDI  sA2A A--A2cTdtjtj|zS)zQuote a value in order to make it safe for the revset engine. >>> _quote(b'asdf') "'asdf'" >>> _quote(b"asdf'\"") '\'asdf\\\'"\'' >>> _quote(b'asdf\'') "'asdf\\''" >>> _quote(1) "'1'" s'%s')r escapestrr ra)rqs rS_quoter&s% Z)(*:1*=*=>> >>rUc|dkrdt|zS|dkrt|S|dkr0t|tstt |d|zS|dkrtt |S|dkr7 t|S#t$rtwxYwtj td|z) Nds_rev(%d)srWs(%s)nbs&unexpected revspec format character %s) rr&r^r_ TypeErrorrrbranchAttributeErrorrrkr)rtargs rS_formatargtyper0sDyySXX%% dc{{ d#u%% O c } dc#hh d #**,,'' '   O   1FGG!K L LLs B..Cc$t|}|dkrdS|dkrt||dS|dkrt|S|dkr%dtd|zS|dkr"d dd |DzS|d kr8 d dd |DzS#t $rt wxYw|dz}dt|d||t||d|fzS)Nr _list('')rr(r)s _list(%s)rr*s_hexlist('%s')c34K|]}t|VdSrNrrPrs rSrTz!_formatlistexp..s(-@-@c!ff-@-@-@-@-@-@rUr+s _list('%s')c3>K|]}|VdSrN)r-r4s rSrTz!_formatlistexp..s*.E.Eaqxxzz.E.E.E.E.E.ErUr@s (%s or %s))rfr0_formatintlistr&rr.r,_formatlistexp)rqrrsrs rSr7r7s7 AAAvv| aa1&&& da   dfUZZ]]3333 d 5::-@-@a-@-@-@#@#@@@ d !EJJ.E.E1.E.E.E$E$EE E   O  QA N1RaR5!44nQqrrUA6N6NO OOs #!CCc t|}|dkrdS|dkrtd|dSddd|DzS#ttf$r"t jtdwxYw) Nrr2rr(s_intlist('%s')rc3:K|]}dt|zVdS)s%dN)rr4s rSrTz!_formatintlist..s,-K-Kec!ffn-K-K-K-K-K-KrUinvalid argument for revspec)rfr0rr,rrrkr)datarss rSr6r6sC II 66< !VV!$Q00 0 5::-K-Kd-K-K-K#K#KKK z "CCCq!@AABBBCsAA!A3B cFdfd|DS)Ns, c38K|]}t|VdSrN)r0)rPrrs rSrTz"_formatparamexp..s-99qnQ**999999rU)r)argsrs `rS_formatparamexpr?s* ::9999D999 9 99rU)lpcpt||}g}|D]\}}||||dkrTt|trt |}|t t |wtjd|zd |S)a; This is a convenience function for using revsets internally, and escapes arguments appropriately. Aliases are intentionally ignored so that intended expression behavior isn't accidentally subverted. Supported arguments: %r = revset expression, parenthesized %d = rev(int(arg)), no quoting %s = string(arg), escaped and single-quoted %b = arg.branch(), escaped and single-quoted %n = hex(arg), single-quoted %% = a literal '%' Prefixing the type with 'l' specifies a parenthesized list of that type, and 'p' specifies a list of function parameters of that type. >>> formatspec(b'%r:: and %lr', b'10 or 11', (b"this()", b"that()")) '(10 or 11):: and ((this()) or (that()))' >>> formatspec(b'%d:: and not %d::', 10, 20) '_rev(10):: and not _rev(20)::' >>> formatspec(b'%ld or %ld', [], [1]) "_list('') or _rev(1)" >>> formatspec(b'keyword(%s)', b'foo\xe9') "keyword('foo\\xe9')" >>> b = lambda: b'default' >>> b.branch = b >>> formatspec(b'branch(%b)', b) "branch('default')" >>> formatspec(b'root(%ls)', [b'a', b'b', b'c', b'd']) "root(_list('a\\x00b\\x00c\\x00d'))" >>> formatspec(b'sort(%r, %ps)', b':', [b'desc', b'user']) "sort((:), 'desc', 'user')" >>> formatspec(b'%ls', [b'a', b"'"]) "_list('a\\x00\\'')" Nbasesetunknown revspec item type: %rrU) _parseargsrr^setr r6rrr`r)exprr>parsedretrr/s rS formatspecrJsJd # #F COO3 9 JJsOOOO *__#s## "Skk JJ~d3ii00 1 1 1 1()IA)MNN N 88C==rUct||}g}g}|D]z\}}||||dkrAdtj|f}|||ddt jd|zd|}t|t}tj |dg|R}t|}t|}t|}|S) zrHrIinputsrr/rrs rSspectreerNs d # #F C FOO3 9 JJsOOOO *__"H$4S$9$9:G MM' " " " JJt    ()IA)MNN N 88C==D d+? @ @ @D  D"3 =f = = =D d  D 4==D D>>D KrUctj|}t|}g}d}|t|kra|d|}|dkr!|d||dfn$|d|||f|dz} ||}n/#t $r"tjtdwxYw|dkr|d|f|dz } t|}n/#t$r"tjtdwxYwt |}|r|dz }|dk} ||}n/#t $r"tjtdwxYw| r&|dkr |r|d |f|dz } |d|t||fn#tt f$r"tjtd wxYw |dt#||fn6#tt f$r"tjtd wxYw|dz }|t|ka t|tjtd #t$rYnwxYw|S) zparse the expression and replace all inexpensive args return a list of tuple [(arg-type, arg-value)] Arg-type can be: * None: a string ready to be concatenated into a final spec * 'baseset': an iterable of revisions rr8Nrs#incomplete revspec format charactersmissing argument for revspecr@r(rCr:s$too many revspec arguments specified)r raiterrffindr IndexErrorrrkrnext StopIteration_formatlistfuncsrrr,rr0) rGr>argiterrIrrqrvr/rislists rSrErE0sU  D ! !D4jjG C C D // IIdC  q55 JJd344j) * * *  D$s1u+&'''!e NS AA N N N"1%K#L#LMM M N 99 JJay ! ! ! 1HC  Gw--CC G G G"1%D#E#EFF F G   # #  K 1HC$YF I   &<==  !t))) J,---q K D!!DIIq//23333z* K K K&q)H'I'IJJJ K K D.C"8"89::::z* K K K&q)H'I'IJJJ K qa D //d  W q!HIIJJJ      JsNB'',C:D ,D6!E**,F.G113H$(%I3J0K KKc,tj|dS)Nr)r prettyformatrs rSrZrZws  t%; < <>> gethashlikesymbols(parse(b'3::abe3ff')) ['3', 'abe3ff'] >>> gethashlikesymbols(parse(b'precursors(.)')) [] >>> gethashlikesymbols(parse(b'precursors(34)')) ['34'] >>> gethashlikesymbols(parse(b'abe3ffZ')) [] rrBrr>N)rfrfgethashlikesymbols)rresultssubtrees rSrhrhs   Aw) T!W % % G9   TaABBx 3 3G )'22 2GG IrU)NNNrrN)Kstringi18nrr rnoderrr r r utilsr rrlrrirF iterbytestrrhsysbytes ascii_lettersdigitsr\bytechrrangerbrcrxobjectrrzr~rrrrrrrrrrrrrrrrrrrbasealiasrulesrrrrr&r0r7r6r?rUrJrNrErZr]r_recompilercrfrhrOrUrSrzs '  C'  9'  3 '   3 '   3 '  :'  9'   '    !' . L/' 0 01' 2 .3' 4 .5' 6 ,7' 8 49' : ,;' < +=' > , 1 - % %// 'M' ' ' R # " " t 3+x+,?@@AA#H&.// ( FM * * +   CH eeCoo..// 0$8H$8$?$? @ @@ EEEET &((///    '$$$$       )0 G G G G    AAA   OOO444<323232lb2b2b2J'$/DDDDB00000&'000*    2222     ? ? ?MMM(PPP, C C C:::   000f.DDDN===    '/// 0 0!!! rU