a
    &0_J                     @   s<  d dl mZ d dlZd dlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZ ddlmZ e
jZe
jZe
jZe
jZe
jZe
jZe
jZe
j Z e
j!Z!dd	 Z"d
d Z#dd Z$dd Z%dd Z&dd Z'dd Z(dd Z)dd Z*dd Z+dd Z,e
j-Z-e.e-Z/e/dded d!d" Z0e/d#ded d$d% Z1e/d&ded d'd( Z2e/d)ded d*d+ Z3e/d,ded d-d. Z4e/d/ded d0d1 Z5e/d2ded d3d4 Z6e/d5ded d6d7 Z7e/d8d9d: Z8e/d;ed<d=d> Z9e/d?d@dA Z:e/dBdCdD Z;e/dEed<dFdG Z<e/dHed<dIdJ Z=e/dKed<dLdM Z>e/dNed<dOdP Z?e/dQed<dRdS Z@dTdU ZAdVdW ZBe/dXed<dYdZ ZCe/d[ed<d\d] ZDe/d^ed<d_d` ZEe/dadbdc ZFe/dded<dedf ZGe/dged<dhdi ZHe/djdkdl ZIe#e$e$e%e&e'e(e*e+e)e,dmZJG dndo doeKZLdtdpdqZdrds ZMe-N ZOdS )u    )absolute_importN   )_getattr)errorfilesetlangmatch
mergestatepycompat	registrarscmutilutil)
stringutilc                 C   s2   |st tdt|d  | g|dd  R  S )Ns   missing argumentr   r   )r   
ParseErrorr   methodsmctxx r   3/usr/lib/python3/dist-packages/mercurial/fileset.pygetmatch)   s    r   c                 C   s"   t t|d }t| ||S )Ns   status hint must be a string)set	getstringsplitr   
withstatus)r   r   hintkeysr   r   r   getmatchwithstatus/   s    r   c                 C   s   |  |gS N)matcherr   r   r   r   stringmatch4   s    r!   c                 C   s   t | t||tjtdS )N   pattern must be a string)r!   _getkindpatmatchmodallpatternkindsr   )r   r   yr   r   r   kindpatmatch8   s    r'   c                    s"   t j  fdd|D }| |S )Nc                    s   g | ]}t | td qS )r"   )
getpatternr   .0r   Zallkindsr   r   
<listcomp>C   s   z!patternsmatch.<locals>.<listcomp>)r$   r%   r    )r   xspatternsr   r+   r   patternsmatchA   s
    
r/   c                 C   s&   t | |}t | ||}t||S r   )r   narrowedr$   Zintersectmatchersr   r   r&   ZxmZymr   r   r   andmatchI   s    
r2   c                    s    fdd|D }t |S )Nc                    s   g | ]}t  |qS r   )r   r)   r   r   r   r,   P       zormatch.<locals>.<listcomp>)r$   unionmatcher)r   r-   msr   r3   r   ormatchO   s    r7   c                    s$   t | | | j fddd fdS )Nc                    s
    |  S r   r   fmr   r   <lambda>V   r4   znotmatch.<locals>.<lambda>s   <not %r>predrepr)r   	predicater   r   r:   r   notmatchT   s    
r@   c                 C   s&   t | |}t | ||}t||S r   )r   r0   r$   Zdifferencematcherr1   r   r   r   
minusmatchY   s    
rA   c                 G   s   t jtdtddd S )Ns    can't use a list in this contexts   see 'hg help "filesets.x or y"')r   )r   r   r   )r   r-   r   r   r   	listmatch_   s    rB   c                    sL   t |}|tv rt| | |S dd   fddt D }t||d S )Nc                 S   s   t | dd d uS )N__doc__r   )fnr   r   r   r<   k   r4   zfunc.<locals>.<lambda>c                    s   g | ]\}} |r|qS r   r   )r*   srD   Zkeepr   r   r,   m   r4   zfunc.<locals>.<listcomp>)	getsymbolsymbolsitemsr   ZUnknownIdentifier)r   abfuncnameZsymsr   rF   r   funcf   s    rM   s
   modified()T)Z
callstatusweightc                 C   s0   t |ddtd t|  j}| j|jddS )z5File that is modified according to :hg:`status`.
    r   s   modified takes no argumentss   modifiedr=   )getargsr   r   statusmodifiedr?   __contains__r   r   rE   r   r   r   rQ   {   s    rQ   s   added()c                 C   s0   t |ddtd t|  j}| j|jddS )z2File that is added according to :hg:`status`.
    r   s   added takes no argumentss   addedr=   )rO   r   r   rP   addedr?   rR   rS   r   r   r   rT      s    rT   s	   removed()c                 C   s0   t |ddtd t|  j}| j|jddS )z4File that is removed according to :hg:`status`.
    r   s   removed takes no argumentss   removedr=   )rO   r   r   rP   removedr?   rR   rS   r   r   r   rU      s    rU   s	   deleted()c                 C   s0   t |ddtd t|  j}| j|jddS )zAlias for ``missing()``.
    r   s   deleted takes no arguments   deletedr=   rO   r   r   rP   deletedr?   rR   rS   r   r   r   rX      s    rX   s	   missing()c                 C   s0   t |ddtd t|  j}| j|jddS )z4File that is missing according to :hg:`status`.
    r   s   missing takes no argumentsrV   r=   rW   rS   r   r   r   missing   s    rY   s	   unknown()c                 C   s0   t |ddtd t|  j}| j|jddS )z/File that is unknown according to :hg:`status`.r   s   unknown takes no arguments   unknownr=   )rO   r   r   rP   unknownr?   rR   rS   r   r   r   r[      s    r[   s	   ignored()c                 C   s0   t |ddtd t|  j}| j|jddS )z/File that is ignored according to :hg:`status`.r   s   ignored takes no arguments   ignoredr=   )rO   r   r   rP   ignoredr?   rR   rS   r   r   r   r]      s    r]   s   clean()c                 C   s0   t |ddtd t|  j}| j|jddS )z2File that is clean according to :hg:`status`.
    r   s   clean takes no arguments   cleanr=   )rO   r   r   rP   cleanr?   rR   rS   r   r   r   r_      s    r_   s	   tracked()c                 C   s$   t |ddtd | j| jjddS )z%File that is under Mercurial control.r   s   tracked takes no argumentss   trackedr=   )rO   r   r?   ctxrR   r   r   r   r   tracked   s    ra   s   binary())rN   c                 C   s&   t |ddtd | jdd dddS )z9File that appears to be binary (contains NUL bytes).
    r   s   binary takes no argumentsc                 S   s   |   S r   )isbinaryfctxr   r   r   r<      r4   zbinary.<locals>.<lambda>s   binaryTr>   cacherO   r   
fpredicater   r   r   r   binary   s    
ri   s   exec()c                    s.   t |ddtd | j | j fddddS )z'File that is marked as executable.
    r   s   exec takes no argumentsc                    s     | dkS )N   xflagsr8   r`   r   r   r<      r4   zexec_.<locals>.<lambda>s   execr=   rO   r   r`   r?   r   r   rm   r   exec_   s    ro   s	   symlink()c                    s.   t |ddtd | j | j fddddS )z&File that is marked as a symlink.
    r   s   symlink takes no argumentsc                    s     | dkS )N   lrk   r8   rm   r   r   r<      r4   zsymlink.<locals>.<lambda>s   symlinkr=   rn   r   r   rm   r   symlink   s    rq   s
   resolved()c                    sP   t |ddtd | j dur(|  S tj| j  | j	 fddddS )z@File that is marked resolved according to :hg:`resolve -l`.
    r   s   resolved takes no argumentsNc                    s   |  v o |  dkS )N   rr   r8   r6   r   r   r<      r4   zresolved.<locals>.<lambda>s   resolvedr=   
rO   r   r`   revnevermergestatemodr
   readrepor?   r   r   rs   r   resolved   s    rz   s   unresolved()c                    sP   t |ddtd | j dur(|  S tj| j  | j	 fddddS )zBFile that is marked unresolved according to :hg:`resolve -l`.
    r   s   unresolved takes no argumentsNc                    s   |  v o |  dkS )N   ur   r8   rs   r   r   r<     r4   zunresolved.<locals>.<lambda>s
   unresolvedr=   rt   r   r   rs   r   
unresolved   s    r|   s
   hgignore()c                 C   s    t |ddtd | j jjS )z4File that matches the active .hgignore pattern.
    r   s   hgignore takes no arguments)rO   r   r`   ry   Zdirstate_ignorer   r   r   r   hgignore  s    r~   s
   portable()c                 C   s$   t |ddtd | jdd ddS )z^File that has a portable name. (This doesn't include filenames with case
    collisions.)
    r   s   portable takes no argumentsc                 S   s   t | d u S r   )r   Zcheckwinfilenamer8   r   r   r   r<     r4   zportable.<locals>.<lambda>s   portabler=   )rO   r   r?   r   r   r   r   portable  s    r   s   grep(regex)c              
      sv   zt t|td W n> t jyV } z$ttdt| W Y d}~n
d}~0 0 | j fddd j	fddS )	z0File contains the given regular expression.
    s   grep requires a patterns   invalid match pattern: %sNc                    s     |  S r   )searchdatarc   rr   r   r<   -  r4   zgrep.<locals>.<lambda>s   grep(%r)Tre   )
recompiler   r   r   r   r   Zforcebytestrrh   pattern)r   r   er   r   r   grep!  s    
r   c                 C   s   z|    } tjD ]h\}}| |r| d t|  }d}d|v r^|dt|dd   }tt|| | d   W S qt| W S  t	y   t
td|  Y n0 d S )Ng      ?   .
   r   s   couldn't parse size: %s)striplowerr   Z
_sizeunitsendswithlenr   intfloat
ValueErrorr   r   r   )rE   kvnZincr   r   r   
_sizetomax3  s    
 
r   c                    s  |   } d| v rB| dd\ t  t fddS | drjt| dd   fddS | d	rt| dd   fd
dS | drt| dd   fddS | drt| dd   fddS t|  t|  fddS dS )z>Return a function(size) -> bool from the ``size()`` expression   -r   c                    s   |  ko| kS r   r   r   rJ   rK   r   r   r<   K  r4   zsizematcher.<locals>.<lambda>s   <=   Nc                    s   |  kS r   r   r   rJ   r   r   r<   N  r4      <c                    s   |  k S r   r   r   r   r   r   r<   Q  r4   s   >=c                    s   |  kS r   r   r   r   r   r   r<   T  r4      >c                    s   |  kS r   r   r   r   r   r   r<   W  r4   c                    s   |  ko| kS r   r   r   r   r   r   r<   [  r4   )r   r   r   Z	sizetoint
startswithr   )exprr   r   r   sizematcherD  s*    






r   s   size(expression)c                    s2   t |td}t| | j fddd|fddS )a  File size matches the given expression. Examples:

    - size('1k') - files from 1024 to 2047 bytes
    - size('< 20k') - files less than 20480 bytes
    - size('>= .5MB') - files at least 524288 bytes
    - size('4k - 1MB') - files from 4096 bytes to 1048576 bytes
    s   size requires an expressionc                    s    |   S r   )sizerc   r:   r   r   r<   k  r4   zsize.<locals>.<lambda>s   size(%r)Tre   )r   r   r   rh   )r   r   r   r   r:   r   r   ^  s
    
r   s   encoding(name)c                    s.   t |td  fdd}| j|d fddS )zFile can be successfully decoded with the given character
    encoding. May not be useful for encodings other than ASCII and
    UTF-8.
    s"   encoding requires an encoding namec                    sZ   |   }z|t  W dS  tyB   ttd  Y n tyT   Y dS 0 d S )NTs   unknown encoding '%s'F)	r   decoder   ZsysstrLookupErrorr   Abortr   UnicodeDecodeErrorrd   dencr   r   encpy  s    zencoding.<locals>.encps   encoding(%r)Tre   r   r   rh   )r   r   r   r   r   r   encodingo  s    
r   s
   eol(style)c                    s.   t |td  fdd}| j|d fddS )zFile contains newlines of the given style (dos, unix, mac). Binary
    files are excluded, files with mixed line endings match multiple
    styles.
    s   eol requires a style namec                    sd   |   rdS |  } dks$ dkr0d|v r0dS  dkrHtd|rHdS  dkr`td	|r`dS dS )
NFs   doss   wins   
Ts   unixs   (?<!)
s   macs   (?!
))rb   r   r   r   r   r   r   r   eolp  s    zeol.<locals>.eolps   eol(%r)Tre   r   )r   r   r   r   r   r   eol  s    r   s   copied()c                 C   s*   t |ddtd dd }| j|dddS )z+File that is recorded as being copied.
    r   s   copied takes no argumentsc                 S   s    |   }|o|d  |  kS )Nr   )parentspath)rd   pr   r   r   copiedp  s    zcopied.<locals>.copiedps   copiedTre   rg   )r   r   r   r   r   r   copied  s    r   s   revs(revs, pattern)c           	      C   s   t |ddtd\}}t|td}| j }t||g}g }|D ],}|| }| | |}|	t
|| qD|s~|  S t|dkr|d S t|S )zEvaluate set in the specified revisions. If the revset match multiple
    revs, this will return file matching pattern in any of the revision.
    r   s   revs takes two argumentss)   first argument to revs must be a revisionr   r   )rO   r   r   r`   ry   r   Zrevrangeswitchp1appendr   rv   r   r$   r5   )	r   r   r   revspecry   revsZmatchersr`   mcr   r   r   r     s    
r   s   status(base, rev, pattern)c                 C   s   | j  }t|ddtd\}}}td}t||}|sBt|td}t||}|sbt|t|||g\}	}
| 	|	|
}t
||S )zEvaluate predicate using status change between ``base`` and
    ``rev``. Examples:

    - ``status(3, 7, added())`` - matches files added from "3" to "7"
       s   status takes three argumentss+   first argument to status must be a revisions,   second argument to status must be a revision)r`   ry   rO   r   r   r   r   r   Zrevpairr   r   )r   r   ry   rK   r   ZbaseerrZbaserevspecZreverrr   basectxr`   r   r   r   r   rP     s    




rP   s   subrepo([pattern])c                    s   t |ddtd | j}|j|rt|tjtdt }|rRfdd ntj|	 j
dg|d | j fd	d
dfdS | jjddS dS )z9Subrepositories whose paths match the given pattern.
    r   r   s"   subrepo takes at most one arguments*   subrepo requires a pattern or no argumentsc                    s   |  kS r   r   )rE   )patr   r   r;     s    zsubrepo.<locals>.mr4   rm   c                    s   | v o | S r   r   r8   )r;   sstater   r   r<     r4   zsubrepo.<locals>.<lambda>s   subrepo(%r)r=   s   subrepoN)rO   r   r`   Zsubstater(   r$   r%   Zpatkindr	   ry   rootr?   rR   )r   r   r`   Zfastr   )r;   r   r   r   subrepo  s"    r   )s
   withstatuss   strings   symbols   kindpats   patternss   ands   ors   minuss   lists   nots   funcc                   @   sb   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dddZ
dddZdd ZdS )matchctxNc                 C   s(   || _ || _|| _d | _d | _|| _d S r   )_basectxr`   _badfn_match_statuscwd)selfr   r`   r   badfnr   r   r   __init__  s    zmatchctx.__init__c                 C   s(   t | j| j| j| j}||_| j|_|S )z<Create matchctx for a sub-tree narrowed by the given matcher)r   r   r`   r   r   r   r   )r   r	   r   r   r   r   r0     s    zmatchctx.narrowedc                 C   s   t ||| j| j}| j|_|S r   )r   r   r   r   )r   r   r`   r   r   r   r   r     s    zmatchctx.switchc                 C   s,   t | j| j| j| j}| j|_|| |S )zBCreate matchctx which has precomputed status specified by the keys)r   r   r`   r   r   r   _buildstatus)r   r   r   r   r   r   r      s    
zmatchctx.withstatusc                 C   s,   | j j| j| jd|v d|v d|v d| _d S )Nr\   r^   rZ   )ZlistignoredZ	listcleanZlistunknown)r   rP   r`   r   r   )r   r   r   r   r   r   '  s    zmatchctx._buildstatusc                 C   s   | j S r   )r   r   r   r   r   rP   0  s    zmatchctx.statusc                 C   s   | j j|| j| jdS )N)r   r   )r`   r	   r   r   )r   r.   r   r   r   r    3  s    zmatchctx.matcherFc                 C   s    |rt |}tj||| jdS )z4Create a matcher to select files by predfn(filename))r>   r   )r   Z	cachefuncr$   Zpredicatematcherr   )r   predfnr>   rf   r   r   r   r?   6  s
    
zmatchctx.predicatec                    s@   | j    du r" fdd}n fdd}| j|||dS )z}Create a matcher to select files by predfn(fctx) at the current
        revision

        Missing files are ignored.
        Nc              
      s   z |  }W n t jy"   Y dS 0 z|  W n t jyF   Y dS 0 z
|W S  ttfy } z6|jtjtjtj	tj
fv rW Y d }~dS  W Y d }~n
d }~0 0 d S NF)r   r   auditr   IOErrorOSErrorerrnoZENOENTZEACCESZENOTDIRZEISDIR)r9   rd   r   r`   r   r   r   
fctxpredfnG  s&    
z'matchctx.fpredicate.<locals>.fctxpredfnc                    s,   z |  }W n t jy"   Y dS 0 |S r   )r   r   )r9   rd   r   r   r   r   _  s
    re   )r`   ru   r?   )r   r   r>   rf   r   r   r   r   rh   >  s
    zmatchctx.fpredicatec                 C   s   t j| jdS )z"Create a matcher to select nothingr   )r$   rv   r   r   r   r   r   rv   h  s    zmatchctx.never)N)NF)NF)__name__
__module____qualname__r   r0   r   r   r   rP   r    r?   rh   rv   r   r   r   r   r   
  s   
	

*r   c                 C   s<   t |}t |}t |}t|  | ||d}t||S )z0Create a matcher for a single fileset expressionr   )r   parseZanalyzeoptimizer   r   r   )r`   r   r   r   Ztreer   r   r   r   r	   m  s
    


r	   c                 C   s"   t |jD ]\}}|t|< qdS )z8Load fileset predicates from specified registrarobj
    N)r   Z	iteritemsZ_tablerH   )ZuiZextnameZregistrarobjnamerM   r   r   r   loadpredicatev  s    r   )N)PZ
__future__r   r   r   Zi18nr   r   r    r   r   r	   r$   r
   rw   r   r   r   Zutilsr   ZWEIGHT_CHECK_FILENAMEZ_WEIGHT_CHECK_FILENAMEZWEIGHT_READ_CONTENTSZ_WEIGHT_READ_CONTENTSZWEIGHT_STATUSZ_WEIGHT_STATUSZWEIGHT_STATUS_THOROUGHZ_WEIGHT_STATUS_THOROUGHrG   r   Z
getkindpatr#   r(   rO   r   r   r!   r'   r/   r2   r7   r@   rA   rB   rM   rH   Zfilesetpredicater?   rQ   rT   rU   rX   rY   r[   r]   r_   ra   ri   ro   rq   rz   r|   r~   r   r   r   r   r   r   r   r   r   rP   r   r   objectr   r   valuesZi18nfunctionsr   r   r   r   <module>   s   (
	

	
	
	
	
	


	




	
	





















c
	