a �DOg 2�@s�dZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z Gdd�d�Z dd �Z ejfd d �Zd d �Zddd�ZdS)zsdistutils.filelist Provides the FileList class, used for poking about the filesystem and building lists of files. �N�� convert_path)�DistutilsTemplateError�DistutilsInternalError)�logc@s|eZdZdZddd�Zdd�Zejfdd�Zd d �Z d d �Z d d�Z dd�Z dd�Z dd�Zdd�Zddd�Zddd�ZdS) �FileLista�A list of files built by on exploring the filesystem and filtered by applying various patterns to what we find there. Instance attributes: dir directory from which files will be taken -- only used if 'allfiles' not supplied to constructor files list of filenames currently being built/filtered/manipulated allfiles complete list of files under consideration (ie. without any filtering applied) NcCsd|_g|_dS�N)�allfiles�files)�self�warn� debug_print�r�*/usr/lib64/python3.9/distutils/filelist.py�__init__szFileList.__init__cCs ||_dSr)r )r r rrr� set_allfiles#szFileList.set_allfilescCst|�|_dSr)�findallr )r �dirrrrr&szFileList.findallcCsddlm}|rt|�dS)z~Print 'msg' to stdout if the global DEBUG (taken from the DISTUTILS_DEBUG environment variable) flag is true. r)�DEBUGN)Zdistutils.debugr�print)r �msgrrrrr )s zFileList.debug_printcCs|j�|�dSr)r �append)r �itemrrrr3szFileList.appendcCs|j�|�dSr)r �extend)r �itemsrrrr6szFileList.extendcCs<tttjj|j��}g|_|D]}|j�tjj|��qdSr)�sorted�map�os�path�splitr r�join)r Zsortable_filesZ sort_tuplerrr�sort9sz FileList.sortcCs@tt|j�ddd�D]$}|j||j|dkr|j|=qdS)N�r�����)�range�lenr )r �irrr�remove_duplicatesCszFileList.remove_duplicatescCs�|��}|d}d}}}|dvrTt|�dkr ...cSsg|] }t|��qSrr��.0�wrrr� W�z1FileList._parse_template_line..r")�recursive-include�recursive-exclude�z,'%s' expects ...cSsg|] }t|��qSrrr-rrrr0]r1)�graft�prunez#'%s' expects a single zunknown action '%s')rr%rr)r �line�words�action�patternsr� dir_patternrrr�_parse_template_lineLs0  � �  � zFileList._parse_template_linecCs@|�|�\}}}}|dkrV|�dd�|��|D]}|j|dd�s2t�d|�q2�n�|dkr�|�dd�|��|D]}|j|dd�svt�d |�qv�n�|d kr�|�d d�|��|D]}|j|d d�s�t�d |�q��n^|dk�r(|�dd�|��|D]"}|j|d d��st�d|��q�n|dk�rv|�d|d�|�f�|D]$}|j||d��sNt�d||��qNn�|dk�r�|�d|d�|�f�|D]$}|j||d��s�t�d||��q�nx|dk�r�|�d|�|jd|d��swarning: no files found matching '%s' anywhere in distributionr+zglobal-exclude zRwarning: no previously-included files matching '%s' found anywhere in distributionr2zrecursive-include %s %s)�prefixz:warning: no files found matching '%s' under directory '%s'r3zrecursive-exclude %s %szNwarning: no previously-included files matching '%s' found under directory '%s'r5zgraft z+warning: no directories found matching '%s'r6zprune z6no previously-included directories found matching '%s'z'this cannot happen: invalid action '%s')r<r r �include_patternrr �exclude_patternr)r r7r9r:rr;�patternrrr�process_template_linehs|� � �  �   ��   ��  � ��zFileList.process_template_liner"rcCsld}t||||�}|�d|j�|jdur4|��|jD],}|�|�r:|�d|�|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, False otherwise. Fz%include_pattern: applying regex r'%s'Nz adding T)�translate_patternr rBr r�searchr r)r rBr>r?�is_regex� files_found� pattern_re�namerrrr@�s�    zFileList.include_patterncCsrd}t||||�}|�d|j�tt|j�ddd�D]4}|�|j|�r8|�d|j|�|j|=d}q8|S)aRemove 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, False otherwise. Fz%exclude_pattern: applying regex r'%s'r"r#z removing T)rDr rBr$r%r rE)r rBr>r?rFrGrHr&rrrrA�s�zFileList.exclude_pattern)NN)r"Nr)r"Nr)�__name__� __module__� __qualname__�__doc__rrr�curdirrr rrr!r'r<rCr@rArrrrrs    L ,�rcCs&dd�tj|dd�D�}ttjj|�S)z% Find all files under 'path' css,|]$\}}}|D]}tj�||�VqqdSr)rrr )r.�base�dirsr �filerrr� �s�z#_find_all_simple..T)� followlinks)r�walk�filterr�isfile)r�resultsrrr�_find_all_simple�s �rXcCs6t|�}|tjkr.tjtjj|d�}t||�}t|�S)z� Find all files under 'dir' and return the list of full filenames. Unless dir is '.', return full filenames with dir prepended. )�start) rXrrN� functools�partialr�relpathr�list)rr Zmake_relrrrrs   rcCs8t�|�}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). �\z\\\\z\1[^%s]z((?t|�}nd}|dur�t|�}|t|�t|�t|��}tj} tjdkr�d} |t|�t|�t|��}d||| ||f}n|r�d||t|�d�f}t�|�S)aTranslate 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). �_�Nr^z\\z%s\A%s%s.*%s%sz%s\A%s) � isinstance�strrb�compilere� partitionr%rra) rBr>r?rFrYrf�endrHZ prefix_rerarrrrD%s(   rD)r"Nr)rMrrbr_rZZdistutils.utilrZdistutils.errorsrrZ distutilsrrrXrNrrerDrrrr�s  i