o ]Lb])@sddlmZddlmZddlmZddlmZmZmZdZ dZ dZ d Z d d d d d dddddddddddZ hdZiZdZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Z d7d8Z!d9S):)absolute_import)_)getattr)errorparserpycompatg? 2)N)groupr))funcrrN)NN)kindpatrN)N)negate)minusrN)r N)notr NN)rNN)andrN)NN)orrN)NN)listrN)rNNNN)rsymbolNNN)rstringNNN)(:-r!r&r|+,rrrend>rrrs .*{}[]?/\_ccsdt|}}t|}||kr||}|rn|dvr%|d|fVn|dvs7|dkr|||ddvr|dkrH|d7}||}dd }ntj}|d7}|}||kr{||}|d krb|d7}qQ||krsd |||||fVn|d7}||ksUttd |nW| s|t vst |d kr|}|d7}||kr||}| s|t vst |d ksn|d7}||ks|||}|t vr|d|fVnd||fV|d8}nttd||d7}||ksdd|fVdS)Nrs (),-:|&+!s"'rr)sr'sr"rcSs|SNxr)r)7/usr/lib/python3/dist-packages/mercurial/filesetlang.pyDsztokenize..\rsunterminated stringrs syntax errorr&) lenrbytestrisspacer unescapestrr ParseErrorrisalnum globcharsordkeywords)programposlcdecodesdsymr)r)r,tokenize3sb      0rAcCsHtt}|t|\}}|t|krttd|t|ddhS)Ns invalid tokenrr) relementsparserAr0rr4rsimplifyinfixops)exprptreer:r)r)r,rCis  rCcCs&|r |ddkr |dSttd)Nrrrs not a symbol)rr4rr*r)r)r, getsymbolqsrHcCs.|r|ddks|ddkr|dSt|)Nrrrr)rr4)r+errr)r)r, getstringws rJcCs8t|}t||}||vrttd|d||fS)Nsinvalid pattern kind: %ss%s:%s)rHrJrr4r)r+yallkindsrIkindpatr)r)r, getkindpat}s   rOcCs0|r|ddkrt|d|d||St||S)Nrrrr)rOrJ)r+rLrIr)r)r, getpatterns rPcCs*|sgS|ddkrt|ddS|gS)Nrrr)listr*r)r)r,getlists  rRcCs.t|}t||kst||krt||Sr()rRr0rr4)r+minmaxrIr;r)r)r,getargss rUcCsH|dur|S|d}|dvr|S|dkr't|dt|d}||d|fS|dkr1t|dS|dkrz_analyze..rinvalid operator %r)rHrYrr4rtupleProgrammingError)r+opttatbtsr)r)r,rYs<          rYc Cs|durd|fS|d}|dvrd|fS|dkr&t|d\}}|||ffS|dkrXt|d\}}t|d\}}||}|rQ|rQ|d |||fd d |fffS||||ffS|d krtd d|ddD\} } t| d}tdd| Ddkr|d |f| d d |fffS||f| fS|dkrtdd|ddD\} } t| d|f| fS|dkrt|d} t|d\}}tt| ddr| fd ||d|fd | fffSd||d|ffSt d|)amInsert hint nodes where status should be calculated (first path) This works in bottom-up way, summing up status names and inserting hint nodes at 'and' and 'or' as needed. Thus redundant hint nodes may be left. Returns (status-names, new-tree) at the given subtree, where status-names is a sum of status names referenced in the given subtree. Nr)rrrrrrrr withstatusr rcsrXr(_insertstatushintsrZr)r)r,r\r]z%_insertstatushints..csrXr()bool)r[hr)r)r,r\r]rcsrXr(rirZr)r)r,r\r]r _callstatusFr^) rjjoinzipsumrHrsymbolsgetrr`) r+rarlrbharchbrdhrhsrefr)r)r,rjs>    rjcs|dur|S|d}|dkr&rt|dSt|ddd}|||dfS|dvr,|S|d kr;t|d}||fS|d krRt|d}t|d}|||fS|d vrjtfd d |ddD}|f|S|dkr}t|ddd}||d|fStd|)zsRemove redundant status hint nodes (second path) This is the top-down path to eliminate inner hint nodes. NrrgrTinstatusrrfrrrWc3s|]}t|VqdSr()_mergestatushintsrZrxr)r,r\sz$_mergestatushints..rFr^)rzr_rr`)r+ryrarbrcrdrer)rxr,rzs0  rzcCs t|}t|\}}t|ddS)zTransform raw parsed tree to evaluatable tree which can be fed to optimize() or getmatch() All pseudo operations should be mapped to real operations or functions defined in methods or symbols table respectively. Frx)rYrjrz)r+rb_hr)r)r,analyze s  r|cCs,|dur|ddkrd||dfS|||fS)Nrrrrr))rarcrdr)r)r,_optimizeandopss r}cCsggg}}}|D]"}t|\}}|dur"|ddvr"||q ||||q |r=|t|dt|||fS)Nrrf)spatterns) _optimizeappendWEIGHT_CHECK_FILENAMEr_)xswsressr+wrbr)r)r,_optimizeunions     rc s|durd|fS|d}|dkr!t|d\}}||||dffS|dvr)t|fS|dkr>t|d\}}|||d|ffS|dkrPt|d\}}|||ffS|dkrxt|d\}}t|d\}}||krp|t|||fS|t|||fS|d krt|dd\}t|dkrd|dfStd d tt|fd d dD}t|f|fS|dkrt dd |ddD\}t |f|fS|dkrt |d} t t | dd}t|d\}}||||d|ffStd|)NrrgrrrVrrrrcss|]}|dVqdS)rNr))r[itr)r)r,r\Gs z_optimize..cs |dS)Nrr))rrr)r,r-Hs z_optimize..)keyrcsrXr(r~rZr)r)r,r\Lr]r_weightr^)r~rr}rr0r_sorted enumeraterTrorprHrrqrrrr`) r+rarrbwarcwbrdrerwr)rr,r~,sJ   r~cCst|\}}|S)zsReorder/rewrite evaluatable tree for optimization All pseudo operations should be transformed beforehand. r)r+_wrbr)r)r,optimizeVs rcCs t|dS)N)rr)r prettyformat)rGr)r)r,r_s rN)" __future__ri18nrrrrrrWEIGHT_READ_CONTENTS WEIGHT_STATUSWEIGHT_STATUS_THOROUGHrBr8rqr6rArCrHrJrOrPrRrUrYrjrzr|r}rr~rrr)r)r)r,sX   6"," *