When we remove an exclude pattern, we need to scan for new subdirectories which might not be ignored any more. Index: beagled/FileSystemQueryable/FileSystemQueryable.cs =================================================================== RCS file: /cvs/gnome/beagle/beagled/FileSystemQueryable/FileSystemQueryable.cs,v retrieving revision 1.66 diff -u -B -p -r1.66 FileSystemQueryable.cs --- beagled/FileSystemQueryable/FileSystemQueryable.cs 11 Aug 2005 07:38:19 -0000 1.66 +++ beagled/FileSystemQueryable/FileSystemQueryable.cs 11 Aug 2005 17:28:51 -0000 @@ -358,6 +358,9 @@ namespace Beagle.Daemon.FileSystemQuerya if (filter.Ignore (parent, name, true)) return; + if (parent != null && parent.HasChildWithName (name)) + return; + string path; path = (parent == null) ? name : Path.Combine (parent.FullName, name); @@ -667,9 +670,10 @@ namespace Beagle.Daemon.FileSystemQuerya ThisScheduler.Add (tree_crawl_task); if (path_is_registered) - SetDirectoryState_Recursive (dir, DirectoryState.PossiblyClean); + Recrawl_Recursive (dir, DirectoryState.PossiblyClean); ActivateFileCrawling (); + ActivateDirectoryCrawling (); } public void RecrawlEverything () @@ -677,22 +681,30 @@ namespace Beagle.Daemon.FileSystemQuerya Logger.Log.Debug ("Re-crawling all directories"); foreach (DirectoryModel root in roots) - SetDirectoryState_Recursive (root, DirectoryState.PossiblyClean); + Recrawl_Recursive (root, DirectoryState.PossiblyClean); ActivateFileCrawling (); + ActivateDirectoryCrawling (); } - private void SetDirectoryState_Recursive (DirectoryModel dir, DirectoryState state) + private void Recrawl_Recursive (DirectoryModel dir, DirectoryState state) { dir.State = state; + tree_crawl_task.Add (dir); foreach (DirectoryModel sub_dir in dir.Children) - SetDirectoryState_Recursive (sub_dir, state); + Recrawl_Recursive (sub_dir, state); } private void ActivateFileCrawling () { if (! file_crawl_task.IsActive) ThisScheduler.Add (file_crawl_task); + } + + private void ActivateDirectoryCrawling () + { + if (! tree_crawl_task.IsActive) + ThisScheduler.Add (tree_crawl_task); } ////////////////////////////////////////////////////////////////////////// Index: beagled/FileSystemQueryable/TreeCrawlTask.cs =================================================================== RCS file: /cvs/gnome/beagle/beagled/FileSystemQueryable/TreeCrawlTask.cs,v retrieving revision 1.2 diff -u -B -p -r1.2 TreeCrawlTask.cs --- beagled/FileSystemQueryable/TreeCrawlTask.cs 10 Aug 2005 19:22:41 -0000 1.2 +++ beagled/FileSystemQueryable/TreeCrawlTask.cs 11 Aug 2005 17:28:51 -0000 @@ -38,6 +38,7 @@ namespace Beagle.Daemon.FileSystemQuerya public delegate void Handler (DirectoryModel parent, string name); private object big_lock = new object (); + private bool is_active = false; private Handler handler; private Queue to_be_crawled = new Queue (); @@ -48,6 +49,10 @@ namespace Beagle.Daemon.FileSystemQuerya this.Priority = Scheduler.Priority.Delayed; } + public bool IsActive { + get { lock (big_lock) return is_active; } + } + // Returns 'true' if the queue was empty before adding // this item. public bool Add (DirectoryModel dir) @@ -55,6 +60,10 @@ namespace Beagle.Daemon.FileSystemQuerya lock (big_lock) { bool was_empty; was_empty = (to_be_crawled.Count == 0); + + if (!was_empty && to_be_crawled.Contains (dir)) + return false; + to_be_crawled.Enqueue (dir); Description = String.Format ("Pending directories: {0}", to_be_crawled.Count); return was_empty; @@ -66,9 +75,12 @@ namespace Beagle.Daemon.FileSystemQuerya DirectoryModel dir; lock (big_lock) { - if (to_be_crawled.Count == 0) + if (to_be_crawled.Count == 0) { + is_active = false; return; + } dir = to_be_crawled.Dequeue () as DirectoryModel; + is_active = true; } if (FileSystemQueryable.Debug) @@ -84,6 +96,8 @@ namespace Beagle.Daemon.FileSystemQuerya lock (big_lock) { if (to_be_crawled.Count != 0) Reschedule = true; + else + is_active = false; } } }