qfc@sdZdZddlZddlZddlZddlmZddlmZm Z ddl m Z dddYZ ej d Zd Zd dd d ZdS(ssdistutils.filelist Provides the FileList class, used for poking about the filesystem and building lists of files. s$Id$iN(t convert_path(tDistutilsTemplateErrortDistutilsInternalError(tlogtFileListcBseZdZdddZdZejdZdZ dZ dZ dZ dZ d Zd Zd dd d Zd dd dZRS(sA 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) cCsd|_g|_dS(N(tNonetallfilestfiles(tselftwarnt debug_print((s*/usr/lib64/python2.7/distutils/filelist.pyt__init__s cCs ||_dS(N(R(RR((s*/usr/lib64/python2.7/distutils/filelist.pyt set_allfiles$scCst||_dS(N(tfindallR(Rtdir((s*/usr/lib64/python2.7/distutils/filelist.pyR 'scCs"ddlm}|r|GHndS(s~Print 'msg' to stdout if the global DEBUG (taken from the DISTUTILS_DEBUG environment variable) flag is true. i(tDEBUGN(tdistutils.debugR(RtmsgR((s*/usr/lib64/python2.7/distutils/filelist.pyR *scCs|jj|dS(N(Rtappend(Rtitem((s*/usr/lib64/python2.7/distutils/filelist.pyR4scCs|jj|dS(N(Rtextend(Rtitems((s*/usr/lib64/python2.7/distutils/filelist.pyR7scCs\ttjj|j}|jg|_x*|D]"}|jjtjj|q2WdS(N(tmaptostpathtsplitRtsortRtjoin(Rtsortable_filest sort_tuple((s*/usr/lib64/python2.7/distutils/filelist.pyR:s    cCsYxRtt|jdddD]1}|j||j|dkr |j|=q q WdS(Niii(trangetlenR(Rti((s*/usr/lib64/python2.7/distutils/filelist.pytremove_duplicatesEs&cCs|j}|d}d}}}|dkrht|dkrRtd|ntt|d}n|dkrt|d krtd |nt|d}tt|d}nN|dkrt|dkrtd|nt|d}n td|||||fS(Nitincludetexcludesglobal-includesglobal-excludeis&'%s' expects ...isrecursive-includesrecursive-excludeis,'%s' expects ...tgrafttprunes#'%s' expects a single sunknown action '%s'(sincludeR#sglobal-includesglobal-exclude(srecursive-includesrecursive-exclude(R$R%(RRRRRR(RtlinetwordstactiontpatternsRt dir_pattern((s*/usr/lib64/python2.7/distutils/filelist.pyt_parse_template_lineNs,         cCs&|j|\}}}}|dkr}|jddj|x|D].}|j|ddsHtjd|qHqHWn|dkr|jddj|x||D].}|j|ddstjd |qqWnC|d krE|jd dj|x|D]2}|j|dd s tjd d|q q Wn|dkr|jddj|x|D].}|j|dd srtjd|qrqrWn{|dkr|jd|dj|fxL|D]5}|j|d|stjd d||qqWn |dkr|jd|dj|fx|D]1}|j|d|sItjd||qIqIWn|dkr|jd||jdd|s"tjd|q"nY|dkr|jd||jdd|s"tjdd|q"n td |dS(!NR"sinclude t tanchoris%warning: no files found matching '%s'R#sexclude s9warning: no previously-included files found matching '%s'sglobal-includesglobal-include is&warning: no files found matching '%s' sanywhere in distributionsglobal-excludesglobal-exclude sRwarning: no previously-included files matching '%s' found anywhere in distributionsrecursive-includesrecursive-include %s %stprefixsunder directory '%s'srecursive-excludesrecursive-exclude %s %ssNwarning: no previously-included files matching '%s' found under directory '%s'R$sgraft s+warning: no directories found matching '%s'R%sprune s)no previously-included directories found s matching '%s's'this cannot happen: invalid action '%s'( R+R Rtinclude_patternRR texclude_patternRR(RR&R(R)RR*tpattern((s*/usr/lib64/python2.7/distutils/filelist.pytprocess_template_linepsh                         iicCsd}t||||}|jd|j|jdkrK|jnxJ|jD]?}|j|rU|jd||jj|d}qUqUW|S(sSelect 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 1 if files are found. is%include_pattern: applying regex r'%s's adding iN( ttranslate_patternR R1RRR tsearchRR(RR1R-R.tis_regext files_foundt pattern_retname((s*/usr/lib64/python2.7/distutils/filelist.pyR/s    cCsd}t||||}|jd|jxhtt|jdddD]G}|j|j|rO|jd|j||j|=d}qOqOW|S(sRemove 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 1 if files are found. is%exclude_pattern: applying regex r'%s'iis removing (R3R R1RRRR4(RR1R-R.R5R6R7R ((s*/usr/lib64/python2.7/distutils/filelist.pyR0s  &  N(t__name__t __module__t__doc__RR R RtcurdirR R RRRR!R+R2R/R0(((s*/usr/lib64/python2.7/distutils/filelist.pyRs     " K-cCsddlm}m}m}m}g}|g}|j}|j}x|r|}tj|} x| D]} |tj krtj j || } n| } tj| } | |} || r|j| qk|| rk||  rk|| qkqkWqFW|S(s^Find all files under 'dir' and return the list of full filenames (relative to 'dir'). i(tST_MODEtS_ISREGtS_ISDIRtS_ISLNK( tstatR=R>R?R@tpopRRtlistdirR<RR(RR=R>R?R@tlisttstackRBtpushtnamesR8tfullnameRAtmode((s*/usr/lib64/python2.7/distutils/filelist.pyR s&"        cCsStj|}tj}tjdkr0d}nd|}tjd||}|S(sTranslate 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((?t|}nd}|dk rtd}t|t| }tj}tjdkrd}nd|j |d|f}n|rd|}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). ts\s\\t^s.*N( t isinstancetstrRMtcompileRPRRRRLR(R1R-R.R5R7t empty_patternt prefix_reRL((s*/usr/lib64/python2.7/distutils/filelist.pyR38s"       ((R;t __revision__RRMRJtdistutils.utilRtdistutils.errorsRRt distutilsRRR<R RPRR3(((s*/usr/lib64/python2.7/distutils/filelist.pyts