o
    f                     @   s  d Z ddlZddlZddlZddlZddlZddlZddlZg dZddddddZ	dddd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dd Zd d! Zed"Zed#Zd$d% Zd&d' Zd(d) Zd*d+ Zejeed,dB Z dS )-zFilename globbing utility.    N)globiglobescapeFroot_dirdir_fd	recursivec                C   s   t t| |||dS )ay  Return a list of paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    r   )listr   )pathnamer   r   r    r   /usr/lib/python3.10/glob.pyr      s   r   c                C   s   t d| | t d| ||| |durt|}n| dd }t| |||d}| r4|rRt| dd rRzt|}|rEt|f|}W |S W |S  t	yQ   Y |S w |S )a  Return an iterator which yields the paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    z	glob.globzglob.glob/2Nr   F   )
sysauditosfspath_iglob_isrecursivenext	itertoolschainStopIteration)r
   r   r   r   itsr   r   r   r      s&   r   c           
      c   s   t j| \}}t| s-|rJ |r tt|| |r| V  d S tt|||r+| V  d S |sM|rAt|rAt||||E d H  d S t	||||E d H  d S || kr^t|r^t
||||d}n|g}t|rq|rnt|rnt}nt	}nt}|D ]}|t|||||D ]
}	t j||	V  qqud S )NT)r   pathsplit	has_magic_lexists_join_isdirr   _glob2_glob1r   _glob0join)
r
   r   r   r   dironlydirnamebasenamedirsglob_in_dirnamer   r   r   r   5   s<   r   c                 C   s.   t | ||}t|sdd |D }t||S )Nc                 s   s    | ]	}t |s|V  qd S N)	_ishidden).0xr   r   r   	<genexpr>`   s    z_glob1.<locals>.<genexpr>)_listdirr+   fnmatchfilter)r%   patternr   r$   namesr   r   r   r!   ]   s   r!   c                 C   s2   |rt t| ||r|gS g S t| |r|gS g S r*   )r   r   r   )r%   r&   r   r$   r   r   r   r"   c   s   
r"   c                 C      t | |d dS NF)r"   r%   r2   r   r   r   glob0p      r7   c                 C   r4   r5   )r!   r6   r   r   r   glob1s   r8   r9   c                 c   s2    t |sJ |d d V  t| ||E d H  d S )Nr   )r   	_rlistdir)r%   r2   r   r$   r   r   r   r    y   s   r    c              
   c   s,   zd }d }|d ur"| rt j| t|d }}n|}t| tr!t j}n| r'| }nt| tr3tt jd}nt j}zJt |-}|D ]"}z|rH| rW|d urS||j	V  n|j	V  W q? t
ya   Y q?w W d    n1 slw   Y  W |d ur~t | W d S W d S |d urt | w w  t
y   Y d S w )Nr   ASCII)r   open_dir_open_flags
isinstancebytesfsencodecurdirscandiris_dirr)   OSErrorclose)r%   r   r$   fdrA   argr   entryr   r   r   _iterdir   sN   

rJ   c                 C   s>   t t| ||}t|W  d    S 1 sw   Y  d S r*   )
contextlibclosingrJ   r	   )r%   r   r$   r   r   r   r   r/      s   $r/   c                 c   sZ    t | ||}|D ]!}t|s*|V  | rt| |n|}t|||D ]}t||V  q!q	d S r*   )r/   r+   r   r:   )r%   r   r$   r3   r-   r   yr   r   r   r:      s   r:   c              	   C   sB   |d u r
t j| S z
t j| |d W dS  ttfy    Y dS w )Nr;   FT)r   r   lexistslstatrE   
ValueError)r
   r   r   r   r   r      s   r   c              	   C   sL   |d u r
t j| S z	t j| |d}W n ttfy   Y dS w t|jS )Nr;   F)r   r   isdirstatrE   rP   S_ISDIRst_mode)r
   r   str   r   r   r      s   r   c                 C   s   | r|s| p|S t j| |S r*   )r   r   r#   )r%   r&   r   r   r   r      s   r   z([*?[])s   ([*?[])c                 C   s.   t | trt| }|d uS t| }|d uS r*   )r?   r@   magic_check_bytessearchmagic_check)r   matchr   r   r   r      s
   


r   c                 C   s   | d dv S )Nr   )..   r   )r   r   r   r   r+      s   r+   c                 C   s   t | tr	| dkS | dkS )Ns   **z**)r?   r@   )r2   r   r   r   r      s   
r   c                 C   sB   t j| \}} t| trtd| } ||  S td| } ||  S )z#Escape all special characters.
    s   [\1]z[\1])r   r   
splitdriver?   r@   rV   subrX   )r
   driver   r   r   r      s   
r   O_DIRECTORY)!__doc__rK   r   rer0   r   rR   r   __all__r   r   r   r!   r"   r7   r9   r    rJ   r/   r:   r   r   r   compilerX   rV   r   r+   r   r   O_RDONLYgetattrr>   r   r   r   r   <module>   s<    ("


