� ��abc@s�dZddlZddlZddlZddlZddlZddlmZddlm Z ddl m Z dgZ ej e�Zejdej�Zejd ejejB�Zejd Zdefd ��YZdS( su Class representing the list of files in a distribution. Equivalent to distutils.filelist, but fixes some problems. i����Ni(tDistlibException(tfsdecode(t convert_pathtManifests\\w* s#.*?(?= )| (?=$)icBs�eZdZd d�Zd�Zd�Zd�Zed�Z d�Z d�Z d�Z e d ed �Ze d ed �Ze d ed �Zd �ZRS(s~A list of files built by on exploring the filesystem and filtered by applying various patterns to what we find there. cCsYtjjtjj|p!tj���|_|jtj|_d|_ t �|_ dS(sd Initialise an instance. :param base: The base directory to explore under. N( tostpathtabspathtnormpathtgetcwdtbasetseptprefixtNonetallfilestsettfiles(tselfR ((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyt__init__*s- cCs�ddlm}m}m}g|_}|j}|g}|j}|j}x�|r�|�}tj |�} x�| D]{} tj j || �} tj| �} | j } || �r�|jt | ��qu|| �ru|| � ru|| �ququWqPWdS(smFind all files under the base and set ``allfiles`` to the absolute pathnames of files found. i����(tS_ISREGtS_ISDIRtS_ISLNKN(tstatRRRR R tpoptappendRtlistdirRtjointst_modeR(RRRRR troottstackRtpushtnamestnametfullnameRtmode((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pytfindall9s"          cCsM|j|j�s-tjj|j|�}n|jjtjj|��dS(sz Add a file to the manifest. :param item: The pathname to add. This can be relative to the base. N( t startswithR RRRR RtaddR(Rtitem((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyR$TscCs"x|D]}|j|�qWdS(s� Add a list of files to the manifest. :param items: The pathnames to add. These can be relative to the base. N(R$(RtitemsR%((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pytadd_many^s cs���fd��t�j�}|rgt�}x'|D]}�|tjj|��q7W||O}ngtd�|D��D]}tjj|�^q~S(s8 Return sorted files in directory order csj|j|�tjd|�|�jkrftjj|�\}}|dksVt��||�ndS(Nsadd_dir added %stt/(R(R)(R$tloggertdebugR RRtsplittAssertionError(tdirstdtparentt_(tadd_dirR(s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyR2ls  css!|]}tjj|�VqdS(N(RRR,(t.0R((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pys {s(RRRRtdirnametsortedR(RtwantdirstresultR.tft path_tuple((R2Rs@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyR5gs   cCst�|_g|_dS(sClear all collected files.N(RRR (R((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pytclear}s cCs|j|�\}}}}|dkrcx�|D].}|j|dt�s.tjd|�q.q.Wn�|dkr�x�|D]}|j|dt�}qvWn{|dkr�xl|D].}|j|dt�s�tjd|�q�q�Wn3|dkrx$|D]}|j|dt�}q�Wn�|dkr`x�|D]1}|j|d |�s(tjd ||�q(q(Wn�|d kr�x�|D]}|j|d |�}qsWn~|d kr�|jdd |�stjd |�qnG|dkr|jdd |�stjd|�qntd|��dS(sv 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 tincludetanchorsno files found matching %rtexcludesglobal-includes3no files found matching %r anywhere in distributionsglobal-excludesrecursive-includeR s-no files found matching %r under directory %rsrecursive-excludetgrafts no directories found matching %rtprunes4no previously-included directories found matching %rsinvalid action %rN( t_parse_directivet_include_patterntTrueR*twarningt_exclude_patterntFalseR R(Rt directivetactiontpatternstthedirt dirpatterntpatterntfound((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pytprocess_directive�sD                    c Cs{|j�}t|�dkrA|ddkrA|jdd�n|d}d}}}|dkr�t|�d kr�td |��ng|dD]}t|�^q�}n�|dkrt|�d kr�td|��nt|d�}g|d D]}t|�^q�}nT|dkr[t|�d krHtd|��nt|d�}ntd|��||||fS(s� Validate a directive. :param directive: The directive to validate. :return: A tuple of action, patterns, thedir, dir_patterns iiR;R=sglobal-includesglobal-excludesrecursive-includesrecursive-excludeR>R?is$%r expects ...is*%r expects ...s!%r expects a single sunknown action %r(R;R=sglobal-includesglobal-excludesrecursive-includesrecursive-excludeR>R?N(R;R=sglobal-includesglobal-exclude(srecursive-includesrecursive-exclude(R>R?(R,tlentinsertR RR(RRFtwordsRGRHRIt dir_patterntword((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyR@�s:    & & cCszt}|j||||�}|jdkr:|j�nx9|jD].}|j|�rD|jj|�t}qDqDW|S(s�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. N( REt_translate_patternR R R"tsearchRR$RB(RRKR<R tis_regexRLt pattern_reR((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyRAs  cCsdt}|j||||�}x?t|j�D].}|j|�r.|jj|�t}q.q.W|S(stRemove 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 (RERStlistRRTtremoveRB(RRKR<R RURLRVR8((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyRD)s  c CsH|r)t|t�r"tj|�S|Sntd krY|jd�jd�\}}}n|r�|j|�}td kr�|j|�r�|j|�s�t �q�nd}tj t j j |jd��} |d k r�tdkr|jd�} |j|�t| � } nV|j|�} | j|�r<| j|�sBt �| t|�t| �t|�!} t j} t jdkr�d} ntdkr�d| | j | d|f�}q;|t|�t|�t|�!}d || | | ||f}nC|r;tdkrd| |}q;d || |t|�f}ntj|�S(sTranslate 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). iiR1R(s\s\\t^s.*s%s%s%s%s.*%s%ss%s%s%s(ii(iiN(ii(ii(ii(t isinstancetstrtretcompilet_PYTHON_VERSIONt _glob_to_ret partitionR#tendswithR-tescapeRRRR R RNR ( RRKR<R RUtstartR1tendRVR t empty_patternt prefix_reR ((s@/usr/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyRS=sB   $ *!  $#   #  cCsStj|�}tj}tjdkr0d}nd|}tjd||�}|S(s�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). s\s\\\\s\1[^%s]s((? s