From: Matthew M. <mma...@us...> - 2004-07-07 17:45:32
|
Update of /cvsroot/nant/nant/src/NAnt.Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19124 Modified Files: DirectoryScanner.cs Log Message: Compile and cache regexes as necessary Big win for big projects, break-even on small ones Index: DirectoryScanner.cs =================================================================== RCS file: /cvsroot/nant/nant/src/NAnt.Core/DirectoryScanner.cs,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** DirectoryScanner.cs 6 Jul 2004 19:28:19 -0000 1.32 --- DirectoryScanner.cs 7 Jul 2004 17:45:22 -0000 1.33 *************** *** 130,133 **** --- 130,135 ---- private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + private static Hashtable cachedCaseSensitiveRegexes = new Hashtable(); + private static Hashtable cachedCaseInsensitiveRegexes = new Hashtable(); #endregion Private Static Fields *************** *** 278,281 **** --- 280,298 ---- _scannedDirectories = new DirScannerStringCollection(); + #if DEBUG_REGEXES + Console.WriteLine("*********************************************************************"); + Console.WriteLine("DirectoryScanner.Scan()"); + Console.WriteLine("*********************************************************************"); + Console.WriteLine(new System.Diagnostics.StackTrace().ToString()); + + + Console.WriteLine("Includes:"); + foreach (string strPattern in _includes) + Console.WriteLine(strPattern); + Console.WriteLine("Excludes:"); + foreach (string strPattern in _excludes) + Console.WriteLine(strPattern); + #endif + // convert given NAnt patterns to regex patterns with absolute paths // side effect: searchDirectories will be populated *************** *** 286,289 **** --- 303,310 ---- ScanDirectory(_searchDirectories[index], (bool) _searchDirIsRecursive[index]); } + + #if DEBUG_REGEXES + Console.WriteLine("*********************************************************************"); + #endif } *************** *** 496,511 **** } } private bool IsPathIncluded(string path, bool caseSensitive) { bool included = false; - RegexOptions regexOptions = RegexOptions.None; CompareOptions compareOptions = CompareOptions.None; CompareInfo compare = CultureInfo.InvariantCulture.CompareInfo; ! if (!caseSensitive) { ! regexOptions |= RegexOptions.IgnoreCase; compareOptions |= CompareOptions.IgnoreCase; ! } // check path against include names --- 517,546 ---- } } + + private bool TestRegex(string path, string pattern, bool caseSensitive) { + Hashtable regexCache = caseSensitive ? cachedCaseSensitiveRegexes : cachedCaseInsensitiveRegexes; + Regex r = (Regex)regexCache[pattern]; + + if (r == null) { + RegexOptions regexOptions = RegexOptions.Compiled; + + if (!caseSensitive) + regexOptions |= RegexOptions.IgnoreCase; + + regexCache[pattern] = r = new Regex(pattern, regexOptions); + } + + return r.IsMatch(path); + } private bool IsPathIncluded(string path, bool caseSensitive) { bool included = false; CompareOptions compareOptions = CompareOptions.None; CompareInfo compare = CultureInfo.InvariantCulture.CompareInfo; ! if (!caseSensitive) compareOptions |= CompareOptions.IgnoreCase; ! // check path against include names *************** *** 520,525 **** if (!included) { foreach (string pattern in _includePatterns) { ! Match m = Regex.Match(path, pattern, regexOptions); ! if (m.Success) { included = true; break; --- 555,559 ---- if (!included) { foreach (string pattern in _includePatterns) { ! if (TestRegex(path, pattern, caseSensitive)) { included = true; break; *************** *** 541,546 **** if (included) { foreach (string pattern in _excludePatterns) { ! Match m = Regex.Match(path, pattern, regexOptions); ! if (m.Success) { included = false; break; --- 575,579 ---- if (included) { foreach (string pattern in _excludePatterns) { ! if (TestRegex(path, pattern, caseSensitive)) { included = false; break; |