U
��.e�9 � @ s� d Z ddlZddlZddlZddlZddlZddlmZ ddlm Z ddl
mZ dgZe�
e�Ze�dej�Ze�d ejejB �Zejdd
� ZG dd� de�ZdS )zu
Class representing the list of files in a distribution.
Equivalent to distutils.filelist, but fixes some problems.
� N� )�DistlibException)�fsdecode��convert_path�Manifestz\\w*
z#.*?(?=
)|
(?=$)� c @ sz e Zd ZdZddd�Zdd� Zdd� Zd d
� Zddd
�Zdd� Z dd� Z
dd� Zddd�Zd dd�Z
d!dd�Zdd� ZdS )"r z~A list of files built by on exploring the filesystem and filtered by
applying various patterns to what we find there.
Nc C s> t j�t j�|pt �� ��| _| jt j | _d| _t � | _
dS )zd
Initialise an instance.
:param base: The base directory to explore under.
N)�os�path�abspath�normpath�getcwd�base�sep�prefix�allfiles�set�files)�selfr � r �@/usr/lib/python3.8/site-packages/pip/_vendor/distlib/manifest.py�__init__* s zManifest.__init__c C s� ddl m}m}m} g | _}| j}|g}|j}|j}|r�|� }t� |�} | D ]R}
tj
�||
�}t� |�}|j}
||
�r�|�t
|�� qN||
�rN||
�sN||� qNq6dS )zmFind all files under the base and set ``allfiles`` to the absolute
pathnames of files found.
r )�S_ISREG�S_ISDIR�S_ISLNKN)�statr r r r r �pop�appendr �listdirr
�join�st_moder )r r r r r �root�stackr �push�names�name�fullnamer �moder r r �findall9 s"
zManifest.findallc C s4 |� | j�stj�| j|�}| j�tj�|�� dS )zz
Add a file to the manifest.
:param item: The pathname to add. This can be relative to the base.
N) �
startswithr r r
r r r �addr )r �itemr r r r* T s zManifest.addc C s |D ]}| � |� qdS )z�
Add a list of files to the manifest.
:param items: The pathnames to add. These can be relative to the base.
N)r* )r �itemsr+ r r r �add_many^ s zManifest.add_manyFc sb � �fdd�� t �j�}|rFt � }|D ]}� |tj�|�� q&||O }dd� tdd� |D ��D �S )z8
Return sorted files in directory order
c s> | � |� t�d|� |�jkr:tj�|�\}}� | |� d S )Nzadd_dir added %s)r* �logger�debugr r r
�split)�dirs�d�parent�_��add_dirr r r r6 l s
z Manifest.sorted..add_dirc S s g | ]}t jj|� �qS r )r r
r )�.0Z
path_tupler r r �
z s z#Manifest.sorted..c s s | ]}t j�|�V qd S )N)r r
r0 )r7 r
r r r � { s z"Manifest.sorted..)r r r r
�dirname�sorted)r Zwantdirs�resultr1 �fr r5 r r; g s
�zManifest.sortedc C s t � | _g | _dS )zClear all collected files.N)r r r )r r r r �clear} s zManifest.clearc C sj | � |�\}}}}|dkrB|D ]}| j|dd�st�d|� q�n$|dkrf|D ]}| j|dd�}qN�n |dkr�|D ]}| j|dd�srt�d|� qrn�|d kr�|D ]}| j|dd�}q�n�|d
kr�|D ] }| j||d�s�t�d||� q�n�|d
k�r
|D ]}| j||d�}q�n\|dk�r2| jd|d��sft�d|� n4|dk�rZ| jd|d��sft�d|� ntd| ��dS )av
Process a directive which either adds some files from ``allfiles`` to
``files``, or removes some files from ``files``.
:param directive: The directive to process. This should be in a format
compatible with distutils ``MANIFEST.in`` files:
http://docs.python.org/distutils/sourcedist.html#commands
�includeT)�anchorzno files found matching %r�exclude�global-includeFz3no files found matching %r anywhere in distribution�global-exclude�recursive-include)r z-no files found matching %r under directory %r�recursive-exclude�graftNz no directories found matching %r�prunez4no previously-included directories found matching %rzinvalid action %r)�_parse_directive�_include_patternr. Zwarning�_exclude_patternr )r � directive�action�patterns�thedirZ
dirpattern�pattern�foundr r r �process_directive� sP � �
�
��zManifest.process_directivec C s |� � }t|�dkr,|d dkr,|�dd� |d }d } }}|dkrxt|�dk r`td| ��d d
� |dd� D �}n~|dkr�t|�dk r�td
| ��t|d �}dd
� |dd� D �}n:|dkr�t|�dkr�td| ��t|d �}ntd| ��||||fS )z�
Validate a directive.
:param directive: The directive to validate.
:return: A tuple of action, patterns, thedir, dir_patterns
r r )r? rA rB rC rD rE rF rG r? N)r? rA rB rC r z$%r expects ...c S s g | ]}t |��qS r r �r7 Zwordr r r r8 � s z-Manifest._parse_directive..)rD rE � z*%r expects ...c S s g | ]}t |��qS r r rR r r r r8 � s )rF rG z!%r expects a single zunknown action %r)r0 �len�insertr r )r rK ZwordsrL rM rN Zdir_patternr r r rH � s4 ���zManifest._parse_directiveTc C sP d}| � ||||�}| jdkr&| �� | jD ]}|�|�r,| j�|� d}q,|S )a� Select strings (presumably filenames) from 'self.files' that
match 'pattern', a Unix-style wildcard (glob) pattern.
Patterns are not quite the same as implemented by the 'fnmatch'
module: '*' and '?' match non-special characters, where "special"
is platform-dependent: slash on Unix; colon, slash, and backslash on
DOS/Windows; and colon on Mac OS.
If 'anchor' is true (the default), then the pattern match is more
stringent: "*.py" will match "foo.py" but not "foo/bar.py". If
'anchor' is false, both of these will match.
If 'prefix' is supplied, then only filenames starting with 'prefix'
(itself a pattern) and ending with 'pattern', with anything in between
them, will match. 'anchor' is ignored in this case.
If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and
'pattern' is assumed to be either a string containing a regex or a
regex object -- no translation is done, the regex is just compiled
and used as-is.
Selected strings will be added to self.files.
Return True if files are found.
FNT)�_translate_patternr r( �searchr r* )r rO r@ r �is_regexrP �
pattern_rer% r r r rI s
zManifest._include_patternc C sB d}| � ||||�}t| j�D ]}|�|�r| j�|� d}q|S )at Remove strings (presumably filenames) from 'files' that match
'pattern'.
Other parameters are the same as for 'include_pattern()', above.
The list 'self.files' is modified in place. Return True if files are
found.
This API is public to allow e.g. exclusion of SCM subdirs, e.g. when
packaging source distributions
FT)rV �listr rW �remove)r rO r@ r rX rP rY r= r r r rJ ) s
zManifest._exclude_patternc
C sv |rt |t�rt�|�S |S tdkr:| �d��d�\}}}|rR| �|�}tdkrVnd}t�tj �
| jd��} |dk �r4tdkr�| �d�}
| �|�dt|
� � }n&| �|�}|t|�t|�t|� � }tj
}tj
dkr�d}tdk�rd| |�
|d| f� }n0|t|�t|�t|� � }d || ||||f }n8|�rltdk�rRd| | }nd
|| |t|�d� f }t�|�S )a Translate a shell-like wildcard pattern to a compiled regular
expression.
Return the compiled regex. If 'is_regex' true,
then 'pattern' is directly compiled to a regex (if it's a string)
or just returned as-is (assumes it's a regex object).
)rS r r4 � N�\z\\�^z.*z%s%s%s%s.*%s%sz%s%s%s)�
isinstance�str�re�compile�_PYTHON_VERSION�_glob_to_re� partition�escaper r
r r rT r )
r rO r@ r rX �startr4 �endrY r Z
empty_patternZ prefix_rer r r r rV = sF
�
�
zManifest._translate_patternc C s8 t �|�}tj}tjdkrd}d| }t�d||�}|S )z�Translate a shell-like glob pattern to a regular expression.
Return a string containing the regex. Differs from
'fnmatch.translate()' in that '*' does not match "special characters"
(which are platform-specific).
r] z\\\\z\1[^%s]z((?