; License: This software is released for unlimited distribution under the terms of the MIT license. See the LICENSE file. Version: $Revision: 1.12 $ Start Date: 2001/09/26 Last Revision Date: $Date: 2005/11/02 22:26:07 $ s!Tavis Rudd s$Revision: 1.12 $i i(sglobN(slistdir(s StringType(smktemps ([\$\^\*\+\.\?\{\}\[\]\(\)\|\\])cCs|id|SdS(Ns\\\1(sescapeREssubstxt(stxtsescapeRE((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys_escapeRegexCharsscOst||iSdS(sRecursively find all the files matching a glob pattern. This function is a wrapper around the FileFinder class. See its docstring for details about the accepted arguments, etc.N(s FileFindersargsskwsfiles(sargsskw((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys findFilesscCs&t|}t|||iSdS(s/Replace all instances of 'theStr' with 'repl' for each file in the 'files' list. Returns a dictionary with data about the matches found. This is like string.replace() on a multi-file basis. This function is a wrapper around the FindAndReplace class. See its docstring for more details.N(s_escapeRegexCharsstheStrspatternsFindAndReplacesfilessreplsresults(sfilesstheStrsreplspattern((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysreplaceStrInFiles&s cCst|||iSdS(s,Replace all instances of regex 'pattern' with 'repl' for each file in the 'files' list. Returns a dictionary with data about the matches found. This is like re.sub on a multi-file basis. This function is a wrapper around the FindAndReplace class. See its docstring for more details.N(sFindAndReplacesfilesspatternsreplsresults(sfilesspatternsrepl((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysreplaceRegexInFiles3ss FileFindercBsktZdZdfddffdZdeieiieiidZ dZ e dZ d Z RS( sgTraverses a directory tree and finds all files in it that match one of the specified glob patterns.s*sCVSs.svncCs>||_||_||_||_g|_ |i |dS(N( srootPathsselfs _rootPaths globPatternss _globPatternssignoreBasenamess_ignoreBasenamess ignoreDirss _ignoreDirss_filess walkDirTree(sselfsrootPaths globPatternssignoreBasenamess ignoreDirs((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys__init__Hs      s.c Cs|i}|i} |g}|i}|i}xt|ol|}||xR||D]D} ||| } || o"| | | o|| qqWqWWq0WdS(sBRecursively walk through a directory tree and find matching files.N(sselfs processDirs filterDirsdirs pendingDirssappendsaddDirspopsgetDirslistdirsbaseNamesjoinsfullPathsisdir( sselfsdirslistdirsisdirsjoinsgetDirs pendingDirss processDirsaddDirsfullPathsbaseNames filterDir((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys walkDirTreeVs          cCs"||ijp ||ij SdS(s'A hook for filtering out certain dirs. N(sbaseNamesselfs_ignoreBasenamessfullPaths _ignoreDirs(sselfsbaseNamesfullPath((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys filterDirqscCsC|ii}x0|iD]%}||tii||qWdS(N( sselfs_filessextends _globPatternsspatternsglobsosspathsjoinsdir(sselfsdirsglobsextendspattern((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys processDirxs  cCs |iSdS(N(sselfs_files(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysfiles}s(s__name__s __module__s__doc__s__init__sosslistdirspathsisdirsjoins walkDirTrees filterDirsglobs processDirsfiles(((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys FileFinderCs $  s_GenSubberFunccBstZdZeidZeidZdZdZdZ dZ dZ dd Z e d Zd Zd Zd ZdZdZdZdZdZdZdZdZdZRS(sConverts a 'sub' string in the form that one feeds to re.sub (backrefs, groups, etc.) into a function that can be used to do the substitutions in the FindAndReplace class.s\\([1-9][0-9]*)s\\g<([a-zA-Z_][a-zA-Z_]*)>cCs)||_d|_g|_|idS(Ni(s replaceStrsselfs_srcs_poss _codeChunkssparse(sselfs replaceStr((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys__init__s   cCs |iSdS(N(sselfs_src(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pyssrcscCs |iSdS(N(sselfs_pos(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysposscCs ||_dS(N(spossselfs_pos(sselfspos((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pyssetPosscCs|it|ijSdS(N(sselfs_posslens_src(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysatEndsicCs|i|7_dS(N(sselfs_possoffset(sselfsoffset((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysadvancescCsQ|tjo |i}n||_|io|i|Sn|i||!SdS(N(sstartsNonesselfs_posstosatEnds_src(sselfstosstart((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysreadTos     cCs#|ii|i|iSdS(N(sselfs backrefREsmatchssrcspos(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys matchBackrefscCs0|i}|i|i|idSdS(Ni(sselfs matchBackrefsmssetPossendsgroup(sselfsm((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys getBackrefs cCs#|ii|i|iSdS(N(sselfsgroupREsmatchssrcspos(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys matchGroupscCs0|i}|i|i|idSdS(Ni(sselfs matchGroupsmssetPossendsgroup(sselfsm((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysgetGroups cCsZxS|i oD|io|iq|io|iq|iqWdS(N(sselfsatEnds matchBackrefs eatBackrefs matchGroupseatGroups eatStrConst(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysparses  cCs}|i}x<|i o-|ip |ioPq|iqW|i|id|}|i t |dS(Nsstart( sselfspossstartPossatEnds matchBackrefs matchGroupsadvancesreadTosstrConstsaddChunksrepr(sselfsstartPossstrConst((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys eatStrConsts cCs|id|iddS(Nsm.group(s)(sselfsaddChunks getBackref(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys eatBackrefscCs|id|iddS(Ns m.group("s")(sselfsaddChunksgetGroup(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pyseatGroupscCs|ii|dS(N(sselfs _codeChunkssappendschunk(sselfschunk((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysaddChunkscCsdi|iSdS(Ns, (sjoinsselfs _codeChunks(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pyscodeBodyscCsd|iSdS(Ns%def subber(m): return ''.join([%s]) (sselfscodeBody(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pyscodescBs|idUeSdS(N(sselfscodessubber(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys subberFuncs(s__name__s __module__s__doc__srescompiles backrefREsgroupREs__init__ssrcsposssetPossatEndsadvancesNonesreadTos matchBackrefs getBackrefs matchGroupsgetGroupsparses eatStrConsts eatBackrefseatGroupsaddChunkscodeBodyscodes subberFunc(((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys_GenSubberFuncs,                sFindAndReplacecBs5tZdZedZdZdZdZRS(s`Find and replace all instances of 'patternOrRE' with 'replacement' for each file in the 'files' list. This is a multi-file version of re.sub(). 'patternOrRE' can be a raw regex pattern or a regex object as generated by the re module. 'replacement' can be any string that would work with patternOrRE.sub(replacement, fileContents). cCs3t|tjoti||_n ||_t|tjot|i |_ n ||_ |ii |_ }||_h|_||_t|_tiddiidodt}t|didtid|d|di o t|_nti|n|idS(NspgrepisUsage:sws#spgrep "s" (stypes patternOrREs StringTypesrescompilesselfs_regexs replacements_GenSubberFuncs subberFuncs_subberspatterns_patternsfiless_filess_resultss recordResultss_recordResultssFalses _usePgrepsosspopen3sreads startswithsmktempstmpFilesopenswritesTruesremoves_run(sselfsfiless patternOrREs replacements recordResultsstmpFilespattern((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys__init__s$      # ' cCs |iSdS(N(sselfs_results(sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysresults sc CsC|i}|i}|i}|i}x|i D] }t i i | oq.n||_t}tido~n|io0t id|d|io t}qn-t|i}|i|o t}n|oVtid ot|i}n|i||}t|di|q.q.WdS(Nsorigspgrep "s" sw(sselfs_regexsregexs_subDispatcherssubbers _usePgrepsusePgreps_patternspatterns_filessfilesosspathsisfiles _currFilesFalsesfoundslocalsshas_keysorigspopensreadsTruesopenssearchssubsnewswrite( sselfsregexspatternssubbersusePgrepsfilesnewsfoundsorig((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys_runs.       " cCs|io|ii|i o,h}|i|i}||d7}||d7}||d7}||d7}q+Whd|<d|<d|<d|<}|SdS(Nis codeLiness blankLiness commentLiness totalLines( s codeLiness blankLiness commentLiness totalLinessselfsrawStatssvaluess fileStatssstats(sselfs totalLinessstatss blankLiness commentLiness codeLiness fileStats((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pyssummaryJs*cCsdS(N((sself((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys printStats\sc Csd}d}d}tid}tid}t|i i }t |}xT|D]L} |i| o|d7}q[|i| o|d7}q[|d7}q[Whd|<d|<d|<d|<} | SdS( Nis\s#.*$s\s$is codeLiness blankLiness commentLiness totalLines(s codeLiness blankLiness commentLinessrescompiles commentLineRes blankLineResopensfileNamesreads splitlinesslinesslens totalLinesslinesmatchsstats( sselfsfileNames totalLiness blankLineRes blankLiness commentLineRes commentLinessliness codeLinessstatssline((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys getFileStats_s  *( s__name__s __module__s__doc__sNones _fileStatss__init__srawStatsssummarys printStatss getFileStats(((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pysSourceFileStats;s     (s__doc__s __author__s __revision__sglobsosslistdirsos.pathsrestypess StringTypestempfilesmktempscompiles_escapeRegexCharss findFilessreplaceStrInFilessreplaceRegexInFiless FileFinders_GenSubberFuncsFindAndReplacesSourceFileStats(smktemps StringTypeslistdirs __revision__sSourceFileStatss_GenSubberFuncsglobs __author__sresFindAndReplaces_escapeRegexCharss FileFindersreplaceStrInFilessreplaceRegexInFilessoss findFiles((sE/mnt/gmirror/ports/devel/py-cheetah/work/Cheetah-2.0/src/FileUtils.pys? s"          =dW