
    q&fs                     h    d dl Z ddlmZ ddlmZmZmZmZm	Z	 d Z
 G d d      Zd Z G d	 d
      Zy)    N   )_)errormatchpycompatscmutilutilc              #   |  K   d}d}|t        |       k  r|j                  | |      }|sy |j                         \  }}|| j                  d||      dz   z  }| j	                  d||      dz   xs |}| j                  d|      dz   xs t        |       dz   }|dz
  }|||z
  ||z
  | || f |t        |       k  ry y w)Nr      
r   )lensearchspancountrfindfind)	bodyregexpbeginlinenumr   mstartmendlstartlends	            0/usr/lib/python3/dist-packages/mercurial/grep.py
matchlinesr      s     EG
#d)
dE*zz|4::eUF3a77E5&1A5>		%&*;c$i!mqyvvtF47HHH #d)
s   B7B<:B<c                   $    e Zd Zd Zd Zd Zd Zy)	linestatec                 <    || _         || _        || _        || _        y N)liner   colstartcolend)selfr    r   r!   r"   s        r   __init__zlinestate.__init__&   s    	     c                 ,    t        | j                        S r   )hashr    )r#   s    r   __hash__zlinestate.__hash__,   s    DIIr%   c                 4    | j                   |j                   k(  S r   )r    )r#   others     r   __eq__zlinestate.__eq__/   s    yyEJJ&&r%   c              #   p  K   | j                   | j                  f | j                  }|t        | j                        k  rt|j	                  | j                  |      }|sy|j                         |k(  r|dz  }n"|j                          |j                         }|t        | j                        k  rsyyw)z+Iterate all (start, end) indices of matchesr   N)r!   r"   r   r    r   endr   )r#   r   pms       r   findposzlinestate.findpos2   s     mmT[[((KK#dii. dii+Auuw!|QffhEEG #dii. s   B1B64B6N)__name__
__module____qualname__r$   r(   r+   r0    r%   r   r   r   %   s    'r%   r   c              #   d  K   t        j                  d | |      }|j                         D ]  \  }}}}}|dk(  rt        ||      D ]  }d||   f  )|dk(  rt        ||      D ]  }d| |   f  I|dk(  sOt        ||      D ]  }d| |   f  t        ||      D ]  }d||   f   y w)Ninsert   +delete   -replace)difflibSequenceMatcherget_opcodesrange)	absmtagaloahiblobhiis	            r   difflinestatesrH   A   s     		 	 q!	,B#%>>#3 #S#sC(?3_ #QqTl"#H_3_ #QqTl"#I3_ #QqTl"#3_ #QqTl"##s   A6B097B0c                   8    e Zd ZdZ	 d	dZd Zd Zd Zd Zd Z	y)
grepsearchera  Search 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.
    c                    || _         || _        || _        || _        || _        || _        t        j                  |j                        | _	        t        j                  |      | _        i | _        i | _        t               | _        i | _        y r   )_ui_repo_regexp
_all_files_diff_followr	   lrucachefuncfile_getfiler   getrenamedfn_getrenamed_matches_copiesset_skip	_revfiles)r#   uirepor   	all_filesdifffollows          r   r$   zgrepsearcher.__init__Z   su     
#
))$))4"//5U
r%   c                     | j                   j                  |i       j                  |      }| j                  j                  |       |r| j                  j                  |       yy)zZExclude the given file (and the copy at the specified revision)
        from future searchN)rX   getrZ   add)r#   fnrevcopys       r   skipfilezgrepsearcher.skipfilel   sM     ||R(,,R0

rJJNN4  r%   c              #     K   t        j                  | j                  ||| j                        D ]6  }|j	                         }|j                         j	                         }t        | j                  j                  |g             D ]  }| j                  |   |   }| j                  j                  |i       j                  |      }|| j                  v r|r| j                  j                  |       l| j                  j                  |i       j                  |xs |g       }	|	s|s|||	|f  | j                  |= | j                  r| j                  j                          9 yw)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)r   walkchangerevsrM   _prepre   p1sortedr[   rb   rW   rX   rZ   rc   clear)
r#   revsmakefilematcherctxre   parentrd   statesrf   pstatess
             r   searchfileszgrepsearcher.searchfilest   s.     ))JJotzz
 	&C '')CVVX\\^FT^^//R89 	3s+B/||''R044R8#

t,--++FB7;;DJBKfc7F22	3 s# >>##%'	&s   D$E*'#E*E*c                     | j                   |   j                  |g        | j                   |   |   }|y t        || j                        D ]&  \  }}}}t	        ||||      }	|j                  |	       ( y r   )rW   
setdefaultr   rN   r   append)
r#   rd   re   r   r/   lnumcstartcendr    ss
             r   	_grepbodyzgrepsearcher._grepbody   st    c%%b"-MM#r"<(24(F 	$D&$$fd3AHHQK	r%   c                    |j                         }|||   }	 |j                         S | j                  |      }|j	                  |      }	 |j                  |      S # t        $ r Y y w xY w# t        j                  $ r@ | j                  j                  t        d      |t        j                  |      dz         Y y w xY w)Ns8   cannot search in censored file: %(filename)s:%(revnum)s
)s   filenames   revnum)re   dataFileNotFoundErrorrT   filenodereadr   CensoredNodeErrorrL   warnr   r   bytestr)r#   rp   rd   re   fctxflogfnodes          r   	_readfilezgrepsearcher._readfile   s    ggi;r7Dyy{" ==$DLL$E	yy'' %  ** 5 %'83C3CC3HI	Js$   A A, 	A)(A),AB?>B?c           
         |j                         }|j                         }| j                  j                  |i        | j                  r,|j                         }| j                  j                  |i        | j
                  j                  |g       }|+| j                  j                  j                  j                  }nt        j                  } |       5  | j                  r)t        j                  d       |j                        }nfd|j!                         D        }|D ]  }	||	|vrd }
| j"                  r\| j%                  |	|      }
|
rH|
| j&                  j                  |i       |	<   |	| j(                  v r| j(                  j+                  |
       |	| j(                  v r|j-                  |	       |	| j                  |   vr#| j/                  |	|| j1                  ||	             | j                  s|
xs |	}|| j                     vs||v s| j/                  ||| j1                  ||              	 d d d        y # 1 sw Y   y xY w)Nc                      y r   r4   )fmsgs     r   <lambda>z$grepsearcher._prep.<locals>.<lambda>   s    r%   c              3   4   K   | ]  } |      s|  y wr   r4   ).0r   fmatchs     r   	<genexpr>z%grepsearcher._prep.<locals>.<genexpr>   s     A1vayQAs   )re   rk   rW   rv   rP   r[   rM   wvfsauditcachedr	   nullcontextmanagerrO   matchmodbadmatchmatchesfilesrQ   rV   rX   rZ   rc   rw   r|   r   )r#   rp   r   re   pctxrq   r   contextmanager	filenamesrd   rf   pfns     `         r   rj   zgrepsearcher._prep   s   ggivvx  b)::XXZFMM$$VR0))#r2; "ZZ__2299N!44N 	O!**63FGKK/	A		A	 O ?r}<<++B4D?C//R8<+ JJNN40#R T]]3//NN2sDNN3,CD::*"C$--"77C4KsFDNN44MN1O	O 	O 	Os   D&I
=I
I
&I

IN)FFF)
r1   r2   r3   __doc__r$   rg   rt   r|   r   rj   r4   r%   r   rJ   rJ   Q   s-     EJ$!&8,-Or%   rJ   )r;   i18nr    r   r   r   r   r   r	   r   r   rH   rJ   r4   r%   r   <module>r      s:      I 8# LO LOr%   