a
    &0É_  ã                   @   sx   d dl mZ d dlZd dlZddlmZ ddlmZmZ	m
Z
mZmZ dd„ ZG dd	„ d	eƒZd
d„ ZG dd„ deƒZdS )é    )Úabsolute_importNé   )Ú_)ÚerrorÚmatchÚpycompatÚscmutilÚutilc           	      c   s¦   d}d}|t | ƒk r¢| | |¡}|s&q¢| ¡ \}}||  d||¡d 7 }|  d||¡d p\|}|  d|¡d pxt | ƒd }|d }||| || | ||… fV  qd S )Nr   ó   
r   )ÚlenÚsearchÚspanÚcountÚrfindÚfind)	ÚbodyÚregexpZbeginÚlinenumr   ZmstartZmendZlstartZlend© r   ú0/usr/lib/python3/dist-packages/mercurial/grep.pyÚ
matchlines   s    r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú	linestatec                 C   s   || _ || _|| _|| _d S ©N)Úliner   ÚcolstartÚcolend)Úselfr   r   r   r   r   r   r   Ú__init__(   s    zlinestate.__init__c                 C   s
   t | jƒS r   )Úhashr   )r   r   r   r   Ú__hash__.   s    zlinestate.__hash__c                 C   s   | j |j kS r   )r   )r   Úotherr   r   r   Ú__eq__1   s    zlinestate.__eq__c                 c   sd   | j | jfV  | j}|t| jƒk r`| | j|¡}|s6q`| ¡ |krL|d7 }q| ¡ V  | ¡ }qdS )z+Iterate all (start, end) indices of matchesr   N)r   r   r   r   r   Úendr   )r   r   ÚpÚmr   r   r   Úfindpos4   s    

zlinestate.findposN)Ú__name__Ú
__module__Ú__qualname__r   r   r!   r%   r   r   r   r   r   '   s   r   c           	      c   sÆ   t  d | |¡}| ¡ D ]ª\}}}}}|dkrNt ||¡D ]}d|| fV  q8q|dkrxt ||¡D ]}d| | fV  qbq|dkrt ||¡D ]}d| | fV  qŒt ||¡D ]}d|| fV  q¬qd S )NÚinsertó   +Údeleteó   -Úreplace)ÚdifflibZSequenceMatcherZget_opcodesr   Zxrange)	ÚaÚbZsmÚtagZaloZahiZbloZbhiÚir   r   r   ÚdifflinestatesC   s    r3   c                   @   sB   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )Ú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.
    Fc                 C   s\   || _ || _|| _|| _|| _|| _t |j¡| _	t
 |¡| _i | _i | _tƒ | _i | _d S r   )Ú_uiÚ_repoÚ_regexpÚ
_all_filesÚ_diffÚ_followr	   ZlrucachefuncÚfileÚ_getfiler   ZgetrenamedfnÚ_getrenamedÚ_matchesÚ_copiesÚsetÚ_skipÚ	_revfiles)r   ZuiZrepor   Z	all_filesZdiffZfollowr   r   r   r   \   s    zgrepsearcher.__init__c                 C   s4   | j  |i ¡ |¡}| j |¡ |r0| j |¡ dS )zZExclude the given file (and the copy at the specified revision)
        from future searchN)r?   ÚgetrA   Úadd)r   ÚfnÚrevÚcopyr   r   r   Úskipfilen   s    zgrepsearcher.skipfilec           
      c   sÐ   t  | j||| j¡D ]¶}| ¡ }| ¡  ¡ }t| j |g ¡ƒD ]r}| j	| | }| j
 |i ¡ |¡}|| jv r€|r>| j |¡ q>| j	 |i ¡ |p”|g ¡}	|	s¢|r>|||	|fV  q>| j|= | js| j	 ¡  qdS )z·Walk 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   Zwalkchangerevsr6   Ú_preprF   Úp1ÚsortedrB   rC   r>   r?   rA   rD   Úclear)
r   ZrevsZmakefilematcherÚctxrF   ÚparentrE   ZstatesrG   Zpstatesr   r   r   Úsearchfilesv   s$    ÿ
zgrepsearcher.searchfilesc           
      C   sb   | j |  |g ¡ | j | | }|d u r,d S t|| jƒD ]$\}}}}t||||ƒ}	| |	¡ q8d S r   )r>   Ú
setdefaultr   r7   r   Úappend)
r   rE   rF   r   r$   ÚlnumZcstartZcendr   Úsr   r   r   Ú	_grepbody’   s    zgrepsearcher._grepbodyc              
   C   s²   |  ¡ }|d u rX|| }z
| ¡ W S  tyT } z|jtjkr@‚ W Y d }~q®d }~0 0 nV|  |¡}| |¡}z| |¡W S  tj	y¬   | j
 tdƒ|t |¡dœ ¡ Y n0 d S )Ns8   cannot search in censored file: %(filename)s:%(revnum)s
)s   filenames   revnum)rF   ÚdataÚIOErrorÚerrnoZENOENTr<   ZfilenodeÚreadr   ZCensoredNodeErrorr5   Úwarnr   r   Zbytestr)r   rM   rE   rF   ZfctxÚeZflogZfnoder   r   r   Ú	_readfileœ   s(    


ÿüÿzgrepsearcher._readfilec              
      s¨  |  ¡ }| ¡ }| j |i ¡ | jr:|  ¡ }| j |i ¡ | j |g ¡}|d u r^| jjjj	}nt
j}|ƒ & | jrt ˆ dd„ ¡‰ | ˆ ¡}n‡ fdd„| ¡ D ƒ}|D ]Ø}	|d urÀ|	|vrÀqªd }
| jr|  |	|¡}
|
r|
| j |i ¡|	< |	| jv r| j |
¡ |	| jv rqª| |	¡ |	| j| vrF|  |	||  ||	¡¡ | jrª|
pT|	}|| j| vrª||v rª|  |||  ||¡¡ qªW d   ƒ n1 sš0    Y  d S )Nc                 S   s   d S r   r   )ÚfÚmsgr   r   r   Ú<lambda>Ä   ó    z$grepsearcher._prep.<locals>.<lambda>c                 3   s   | ]}ˆ |ƒr|V  qd S r   r   )Ú.0r\   ©Úfmatchr   r   Ú	<genexpr>Ç   r_   z%grepsearcher._prep.<locals>.<genexpr>)rF   rJ   r>   rP   r9   rB   r6   ZwvfsÚauditÚcachedr	   Znullcontextmanagerr8   ÚmatchmodZbadmatchZmatchesÚfilesr:   r=   r?   rA   rD   rQ   rT   r[   )r   rM   rb   rF   ZpctxrN   rg   ÚcontextmanagerÚ	filenamesrE   rG   Zpfnr   ra   r   rI   ³   sD    


zgrepsearcher._prepN)FFF)
r&   r'   r(   Ú__doc__r   rH   rO   rT   r[   rI   r   r   r   r   r4   S   s   	 ÿ

r4   )Z
__future__r   r.   rW   Zi18nr   Ú r   r   rf   r   r   r	   r   Úobjectr   r3   r4   r   r   r   r   Ú<module>   s   	