inotify: proper fix for issue1542 (partially reverting 67e59a9886d5)
authorNicolas Dumazet <nicdumz.commits@gmail.com>
Sat, 23 May 2009 18:44:01 +0900
changeset 8600 d46cdfcecaf1
parent 8599 1f706b1b62f3
child 8601 021de2d12355
inotify: proper fix for issue1542 (partially reverting 67e59a9886d5) issue1542 description: Unknown files (?) placed in a directory are still marked as present and unknown when the containing directory is moved out of the repository scope. Why 67e59a9886d5 was bad: * When the problem we're addressing only deals with unknown files, the fix to updatestatus applies for all statuses * The only reason to move the call schedule_work(wpath, 'd') seems to be that it allowed an updatestatus call on the deleted directory, in deleted(). But deleted() should not be called on directories in the first place. * After fixing an independant issue (1371), test-inotify-issue1542 was failing Fix: When processing a deletion of a directory, walk the tree of the unknown files and remove the entries from repowatcher. This step does not need to be added in the generic scan() routine: it is only necessary on a directory deletion.
hgext/inotify/server.py
--- a/hgext/inotify/server.py	Sun May 24 18:43:05 2009 +0900
+++ b/hgext/inotify/server.py	Sat May 23 18:44:01 2009 +0900
@@ -311,10 +311,6 @@
                         dd[fn] = newstatus
             else:
                 d.pop(fn, None)
-        elif not newstatus:
-            # a directory is being removed, check its contents
-            for subfile, b in oldstatus.copy().iteritems():
-                self._updatestatus(wfn + '/' + subfile, None)
 
 
     def check_deleted(self, key):
@@ -483,8 +479,12 @@
                          (self.event_time(), wpath))
 
         if evt.mask & inotify.IN_ISDIR:
+            tree = self.dir(self.tree, wpath).copy()
+            for wfn, ignore in self.walk('?', tree):
+                self.deletefile(join(wpath, wfn), '?')
             self.scan(wpath)
-        self.schedule_work(wpath, 'd')
+        else:
+            self.schedule_work(wpath, 'd')
 
     def process_modify(self, wpath, evt):
         if self.ui.debugflag: