ó ŸçƒQc@sÿddlZddlZddlZddlZddlmZd„Zd„Zdefd„ƒYZ de fd„ƒYZ d e fd „ƒYZ d e fd „ƒYZ d „Z d„Zd„Zd„Zd„Zd„Zd„Zd„Zd„ZdS(iÿÿÿÿN(t_cCs6tj|ƒ}y |jSWntk r1|jSXdS(N(tutilt compileret test_matchtAttributeErrortmatch(tpattm((s3/sys/lib/python2.7/site-packages/mercurial/match.pyt _rematcher s   cCsŒtƒ}g}xp|D]h\}}|dkrk|sFtjdƒ‚ntj||ƒ}|j|ƒqn|j||fƒqW||fS(s?convert set: patterns into a list of files in the given contexttsets"fileset expression with no context(R RtAborttfilesett getfilesettupdatetappend(tpatstctxtfsettothertkindtexprts((s3/sys/lib/python2.7/site-packages/mercurial/match.pyt _expandsetss   RcBs}eZggded d d„Zd„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „ZRS( tglobc s5||_||_g|_t|p'|ƒ|_| |_t|_|r~t|d|||ƒ} t | | dƒ\|_ ‰n|rºt|d|||ƒ} t | | dƒ\|_ ‰n|röt |t ƒrÛ||_nt |ƒ|_|j‰nc|rYt|||||ƒ} t| ƒ|_|jp5t| ƒ|_t | | dƒ\|_‰n|se|rÂ|rž|r‰‡‡‡fd†} q¿‡‡fd†} q|r¹‡‡fd†} qˆ} nT|rì|r㇇fd†} qˆ} n*|r‡fd†} nd „} t|_| |_t|jƒ|_d S( s§build an object to match a set of file patterns arguments: root - the canonical root of the tree you're matching against cwd - the current working directory, if relevant patterns - patterns to find include - patterns to include exclude - patterns to exclude default - if a pattern in names has no explicit type, assume this one exact - patterns are actually literals a pattern is one of: 'glob:' - a glob relative to cwd 're:' - a regular expression 'path:' - a path relative to repository root 'relglob:' - an unrooted glob (*.c matches C files in all dirs) 'relpath:' - a path relative to cwd 'relre:' - a regexp that needn't match the start of a name 'set:' - a fileset expression '' - a pattern of the specified default type Rs(?:/|$)t$cs#ˆ|ƒo"ˆ|ƒ o"ˆ|ƒS(N((tf(temtimtpm(s3/sys/lib/python2.7/site-packages/mercurial/match.pytXscsˆ|ƒoˆ|ƒS(N((R(RR(s3/sys/lib/python2.7/site-packages/mercurial/match.pyRZscsˆ|ƒ oˆ|ƒS(N((R(RR(s3/sys/lib/python2.7/site-packages/mercurial/match.pyR]scsˆ|ƒoˆ|ƒ S(N((R(RR(s3/sys/lib/python2.7/site-packages/mercurial/match.pyRcscs ˆ|ƒ S(N((R(R(s3/sys/lib/python2.7/site-packages/mercurial/match.pyRhscSstS(N(tTrue(R((s3/sys/lib/python2.7/site-packages/mercurial/match.pyRjsN(t_roott_cwdt_filestboolt_anypatst_ctxtFalset_alwayst _normalizet _buildmatcht includepatt excludepatt isinstancetlisttexactt_rootst patternspatRtmatchfnR t_fmap( tselftroottcwdtpatternstincludetexcludetdefaultR-tauditorRRR((RRRs3/sys/lib/python2.7/site-packages/mercurial/match.pyt__init__$sP             cCs |j|ƒS(N(R0(R2tfn((s3/sys/lib/python2.7/site-packages/mercurial/match.pyt__call__psccsx|jD] }|Vq WdS(N(R!(R2R((s3/sys/lib/python2.7/site-packages/mercurial/match.pyt__iter__rscCsdS(sdcallback for each explicit file that can't be found/accessed, with an error message N((R2Rtmsg((s3/sys/lib/python2.7/site-packages/mercurial/match.pytbaduscCsdS(N((R2R((s3/sys/lib/python2.7/site-packages/mercurial/match.pytdirzscCsdS(N((R2R((s3/sys/lib/python2.7/site-packages/mercurial/match.pytmissing|scCs ||jkS(N(R1(R2R((s3/sys/lib/python2.7/site-packages/mercurial/match.pyR-~scCstj|j|j|ƒS(N(RtpathtoRR (R2R((s3/sys/lib/python2.7/site-packages/mercurial/match.pytrel€scCs|jS(N(R!(R2((s3/sys/lib/python2.7/site-packages/mercurial/match.pytfiles‚scCs|jS(N(R#(R2((s3/sys/lib/python2.7/site-packages/mercurial/match.pytanypats„scCs|jS(N(R&(R2((s3/sys/lib/python2.7/site-packages/mercurial/match.pytalways†sN(t__name__t __module__R%tNoneR:R<R=R?R@RAR-RCRDRERF(((s3/sys/lib/python2.7/site-packages/mercurial/match.pyR#sK         R-cBseZd„ZRS(cCs tj||||dtƒdS(NR-(RR:R(R2R3R4RD((s3/sys/lib/python2.7/site-packages/mercurial/match.pyR:Šs(RGRHR:(((s3/sys/lib/python2.7/site-packages/mercurial/match.pyR-‰sRFcBseZd„ZRS(cCs#tj|||gƒt|_dS(N(RR:RR&(R2R3R4((s3/sys/lib/python2.7/site-packages/mercurial/match.pyR:Žs(RGRHR:(((s3/sys/lib/python2.7/site-packages/mercurial/match.pyRFst narrowmatchercBs eZdZd„Zd„ZRS(sqAdapt a matcher to work on a subdirectory only. The paths are remapped to remove/insert the path as needed: >>> m1 = match('root', '', ['a.txt', 'sub/b.txt']) >>> m2 = narrowmatcher('sub', m1) >>> bool(m2('a.txt')) False >>> bool(m2('b.txt')) True >>> bool(m2.matchfn('a.txt')) False >>> bool(m2.matchfn('b.txt')) True >>> m2.files() ['b.txt'] >>> m2.exact('b.txt') True >>> m2.rel('b.txt') 'b.txt' >>> def bad(f, msg): ... print "%s: %s" % (f, msg) >>> m1.bad = bad >>> m2.bad('x.txt', 'No such file') sub/x.txt: No such file cs­ˆjˆ_ˆjˆ_|ˆ_ˆˆ_ˆjˆ_gˆjD]-}|j|dƒr@|t|ƒd^q@ˆ_ˆjˆ_‡‡fd†ˆ_ t ˆjƒˆ_ dS(Nt/icsˆjˆjd|ƒS(NRK(R0t_path(R;(tmatcherR2(s3/sys/lib/python2.7/site-packages/mercurial/match.pyR¸s( RR RLt_matcherR&R!t startswithtlenR#R0R R1(R2tpathRMR((RMR2s3/sys/lib/python2.7/site-packages/mercurial/match.pyR:®s     0 cCs"|jj|jd||ƒdS(NRK(RNR?RL(R2RR>((s3/sys/lib/python2.7/site-packages/mercurial/match.pyR?»s(RGRHt__doc__R:R?(((s3/sys/lib/python2.7/site-packages/mercurial/match.pyRJ’s cCst|dƒdS(Ni(t _patsplitRI(R((s3/sys/lib/python2.7/site-packages/mercurial/match.pytpatkind¾sc CsGd|kr=|jddƒ\}}|d kr=||fSn||fS( sOSplit a string into an optional pattern kind prefix and the actual pattern.t:itreRRQtrelglobtrelpathtrelretlistfilet listfile0R ( sresglobspathRWsrelpathRYRZR[sset(tsplit(RR8Rtval((s3/sys/lib/python2.7/site-packages/mercurial/match.pyRSÁs    c sšdtˆƒ‰‰d}d}tj}‡‡‡fd†}xVˆˆkr•ˆˆ}ˆd7‰|dkr|||ƒ7}q@|dkr¾|ƒdkr±ˆd7‰|d7}q’|d7}q@|d kr×|d 7}q@|d kr̈}|ˆkrˆ|d kr|d7}nx*|ˆkr>ˆ|d kr>|d7}qW|ˆkrX|d7}q’ˆˆ|!jddƒ}|d‰|ddkrœd|d}n|ddkr¹d|}nd||f}q@|dkrï|d7}|d7}q@|dkr|r|d7}|d8}q@|dkr7|r7|d7}q@|dkr‚|ƒ}|roˆd7‰|||ƒ7}q’|||ƒ7}q@|||ƒ7}q@W|S(s$convert a glob pattern into a regexpitcsˆˆkoˆˆS(N(((titnR(s3/sys/lib/python2.7/site-packages/mercurial/match.pytpeekÑsis*?[{},\t*s.*s[^/]*t?t.t[s!]t]s\[s\s\\t!t^s%s[%s]t{s(?:t}t)t,t|(RPRVtescapetreplace( RtrestgroupRnRatctjtstufftp((R_R`Rs3/sys/lib/python2.7/site-packages/mercurial/match.pyt_globreËs`                         cCs«|s dS|dkr|S|dkr;dtj|ƒdS|dkrYdt|ƒ|S|dkrvtj|ƒdS|d kr|jdƒr•|Sd |St|ƒ|S( s+convert a pattern into a regular expressionR^RVRQRhs(?:/|$)RWs(?:|.*/)RXRYs.*(RVRnRvRO(Rtnamettail((s3/sys/lib/python2.7/site-packages/mercurial/match.pyt_regexs     csct||ƒ\‰}|s(dˆjfSt||ƒ\}‰ˆrY|‡‡fd†fS|ˆfS(NR^cs|ˆkpˆ|ƒS(N((R(Rtmf(s3/sys/lib/python2.7/site-packages/mercurial/match.pyRs(Rt __contains__t_buildregexmatch(RRRxR((RRzs3/sys/lib/python2.7/site-packages/mercurial/match.pyR(s cs}ygddjg|D]\}}t|||ƒ^qƒ}t|ƒdkrVt‚n|t|ƒfSWntk råt|ƒ}|dkr•‚nt||d |ƒ\}‰t||d|ƒ\}‰|‡‡fd†fStjk rxxh|D]`\}}ytdt|||ƒƒWqütjk r[tj t dƒ||fƒ‚qüXqüWtj t dƒƒ‚nXdS( s0build a matching function from a set of patternss(?:%s)Rmi Nicsˆ|ƒpˆ|ƒS(N((R(tatb(s3/sys/lib/python2.7/site-packages/mercurial/match.pyR/ssinvalid pattern (%s): %ssinvalid patternN( tjoinRyRPt OverflowErrorRR|RVterrorRR R(RRxtkRuRtltpatatpatb((R}R~s3/sys/lib/python2.7/site-packages/mercurial/match.pyR|s&8    'c CsLg}x?g|D]}t||ƒ^qD]\}}|d kr\tj||||ƒ}nÕ|d krztj|ƒ}n·|d kr1y\tj|ƒ} |dkr¶| jdƒ} n | jƒ} g| D]} | rÉ| ^qÉ} Wn*tk rtj t dƒ|ƒ‚nX|t | ||||ƒ7}q)n|j ||fƒq)W|S( NRRXRWRQRZR[tsunable to read file list (%s)(sglobsrelpath(srelglobspath(slistfiles listfile0( RStscmutilt canonpathRtnormpathtreadfileR\t splitlinestEnvironmentErrorR RR'R( tnamesR8R3R4R9RRuRRwRDR((s3/sys/lib/python2.7/site-packages/mercurial/match.pyR'8s&/     # cCsÜg}xÏ|D]Ç\}}|dkr¥g}xX|jdƒD]G}d|ksqd|ksqd|ksqd|kruPn|j|ƒq;W|jdj|ƒpždƒq |d krÇ|j|pÀdƒq |jdƒq W|S( NRRKReRiRbRcRdRXRQ(srelpathspath(R\RR(R5trRRwR3Ru((s3/sys/lib/python2.7/site-packages/mercurial/match.pyR.Os 0 cCs+x$|D]\}}|dkrtSqWdS(NRRVRWRYR (sglobsresrelglobsrelresset(R(R5RRw((s3/sys/lib/python2.7/site-packages/mercurial/match.pyR#_s (RVR‡RR ti18nRRRtobjectRR-RFRJRTRSRvRyR(R|R'R.R#(((s3/sys/lib/python2.7/site-packages/mercurial/match.pyts" $  f,  8