o ]Lb @sxddlmZddlZddlZddlmZddlmZmZ m Z m Z m Z ddZ Gdd d eZd d ZGd d d eZdS))absolute_importN)_)errormatchpycompatscmutilutilc csd}d}|t|krZ|||}|sdS|\}}||d||d7}|d||dp0|}|d|dp>t|d}|d}||||||||fV|t|ks dSdS)Nr r)lensearchspancountrfindfind) bodyregexpbeginlinenumrmstartmendlstartlendr0/usr/lib/python3/dist-packages/mercurial/grep.py matchliness   rc@s,eZdZddZddZddZddZd S) linestatecCs||_||_||_||_dSN)linercolstartcolend)selfrrrr rrr__init__(s zlinestate.__init__cCs t|jSr)hashr)r!rrr__hash__.s zlinestate.__hash__cCs |j|jkSr)r)r!otherrrr__eq__1s zlinestate.__eq__ccsx|j|jfV|j}|t|jkr:||j|}|sdS||kr(|d7}n |V|}|t|jksdSdS)z+Iterate all (start, end) indices of matchesrN)rr r rr endr )r!rpmrrrfindpos4s   zlinestate.findposN)__name__ __module__ __qualname__r"r$r&r*rrrrr's  rc cstd||}|D]U\}}}}}|dkr(t||D] }d||fVqq |dkr=t||D] }d||fVq2q |dkrat||D] }d||fVqGt||D] }d||fVqWq dS)Ninsert+delete-replace)difflibSequenceMatcher get_opcodesrxrange) absmtagaloahiblobhiirrrdifflinestatesCs$r@c@sDeZdZdZ dddZddZddZd d Zd d Zd dZ dS) grepsearcheraSearch files and revisions for lines matching the given pattern Options: - all_files to search unchanged files at that revision. - diff to search files in the parent revision so diffs can be generated. - follow to skip files across copies and renames. FcCs\||_||_||_||_||_||_t|j|_ t ||_ i|_ i|_t|_i|_dSr)_ui_repo_regexp _all_files_diff_followr lrucachefuncfile_getfiler getrenamedfn _getrenamed_matches_copiesset_skip _revfiles)r!uirepor all_filesdifffollowrrrr"\s  zgrepsearcher.__init__cCs8|j|i|}|j||r|j|dSdS)zZExclude the given file (and the copy at the specified revision) from future searchN)rNgetrPadd)r!fnrevcopyrrrskipfilens  zgrepsearcher.skipfilec cst|j|||jD][}|}|}t|j|gD]9}|j ||}|j |i|}||j vrA|r@|j |q |j |i|pK|g} | sR|rY||| |fVq |j|=|jsf|j q dS)zWalk files and revisions to yield (fn, ctx, pstates, states) matches states is a list of linestate objects. pstates may be empty unless diff is True. N)rwalkchangerevsrC_preprZp1sortedrQrWrMrNrPrXclear) r!revsmakefilematcherctxrZparentrYstatesr[pstatesrrr searchfilesvs,     zgrepsearcher.searchfilesc Csb|j||g|j||}|durdSt||jD]\}}}}t||||} || qdSr)rM setdefaultrrDrappend) r!rYrZrr)lnumcstartcendrsrrr _grepbodys zgrepsearcher._grepbodyc Cs|}|dur,||}z|WSty+}z|jtjkr WYd}~dSd}~ww||}||}z||WStj yW|j t d|t |dYdSw)Ns8cannot search in censored file: %(filename)s:%(revnum)s )sfilenamesrevnum)rZdataIOErrorerrnoENOENTrJfilenodereadrCensoredNodeErrorrBwarnrrbytestr)r!rdrYrZfctxeflogfnoderrr _readfiles0      zgrepsearcher._readfilec s|}|}|j|i|jr|}|j|i|j|g}|dur/|jjjj }nt j }||j rGt dd|}n fdd|D}|D]f} |dur_| |vr_qTd} |jr|| |} | r| |j|i| <| |jvr|j| | |jvrqT|| | |j|vr|| |||| |jr| p| } | |j|vr| |vr|| |||| qTWddS1swYdS)NcSsdSrr)fmsgrrrsz$grepsearcher._prep..c3s|] }|r|VqdSrr).0r~fmatchrr sz%grepsearcher._prep..)rZr_rMrirFrQrCwvfsauditcachedr nullcontextmanagerrEmatchmodbadmatchmatchesfilesrGrLrNrPrXrjror}) r!rdrrZpctxrercontextmanager filenamesrYr[pfnrrrr^sJ      "zgrepsearcher._prepN)FFF) r+r,r-__doc__r"r\rhror}r^rrrrrASs  rA) __future__rr3rri18nrrrrrrr robjectrr@rArrrrs