cc-4105: added the hack to identify move events

This commit is contained in:
Rudi Grinberg 2012-08-03 14:35:24 -04:00
parent 5fa6def111
commit b3e928c7a6
2 changed files with 34 additions and 4 deletions

View File

@ -10,6 +10,22 @@ class PathChannel(object):
self.signal = signal self.signal = signal
self.path = path self.path = path
class EventRegistry(object):
registry = {}
@staticmethod
def register(evt):
EventRegistry.registry[evt.cookie] = evt
@staticmethod
def unregister(evt):
del EventRegistry.registry[evt.cookie]
@staticmethod
def registered(evt):
return evt.cookie in EventRegistry.registry
@staticmethod
def matching(evt):
return EventRegistry.registry[evt.cookie]
# It would be good if we could parameterize this class by the attribute # It would be good if we could parameterize this class by the attribute
# that would contain the path to obtain the meta data. But it would be too much # that would contain the path to obtain the meta data. But it would be too much
# work # work
@ -29,10 +45,16 @@ class BaseEvent(object):
self.__raw_event = raw_event self.__raw_event = raw_event
self.path = os.path.normpath(raw_event.pathname) self.path = os.path.normpath(raw_event.pathname)
else: self.path = raw_event else: self.path = raw_event
self.cookie = getattr( raw_event, 'cookie', None )
def exists(self): return os.path.exists(self.path) def exists(self): return os.path.exists(self.path)
def __str__(self): def __str__(self):
return "Event. Path: %s" % self.__raw_event.pathname return "Event. Path: %s" % self.__raw_event.pathname
def morph_move(self, evt):
self.__raw_event = evt
self.path = evt.path
self.__class__ = evt.__class__
class OrganizeFile(BaseEvent, HasMetaData): class OrganizeFile(BaseEvent, HasMetaData):
def __init__(self, *args, **kwargs): super(OrganizeFile, self).__init__(*args, **kwargs) def __init__(self, *args, **kwargs): super(OrganizeFile, self).__init__(*args, **kwargs)
def pack(self): def pack(self):
@ -83,3 +105,4 @@ class ModifyFile(BaseEvent, HasMetaData):
# path to directory that is to be removed # path to directory that is to be removed
req_dict['MDATA_KEY_FILEPATH'] = unicode( self.path ) req_dict['MDATA_KEY_FILEPATH'] = unicode( self.path )
return req_dict return req_dict

View File

@ -4,7 +4,8 @@ from pydispatch import dispatcher
import media.monitor.pure as mmp import media.monitor.pure as mmp
from media.monitor.pure import IncludeOnly from media.monitor.pure import IncludeOnly
from media.monitor.events import OrganizeFile, NewFile, DeleteFile, ModifyFile, DeleteDir from media.monitor.events import OrganizeFile, NewFile, MoveFile, DeleteFile, \
ModifyFile, DeleteDir, EventRegistry
from media.monitor.log import Loggable, get_logger from media.monitor.log import Loggable, get_logger
# We attempt to document a list of all special cases and hacks that the # We attempt to document a list of all special cases and hacks that the
@ -104,13 +105,19 @@ class OrganizeListener(BaseListener, pyinotify.ProcessEvent, Loggable):
class StoreWatchListener(BaseListener, Loggable, pyinotify.ProcessEvent): class StoreWatchListener(BaseListener, Loggable, pyinotify.ProcessEvent):
def process_IN_CLOSE_WRITE(self, event): self.process_create(event) def process_IN_CLOSE_WRITE(self, event): self.process_create(event)
def process_IN_MOVED_TO(self, event): self.process_create(event) def process_IN_MOVED_TO(self, event):
if EventRegistry.registered(event):
EventRegistry.matching(event).morph_move(MoveFile(event))
EventRegistry.unregister(event)
else: self.process_create(event)
def process_IN_MOVED_FROM(self, event): def process_IN_MOVED_FROM(self, event):
# Is either delete dir or delete file # Is either delete dir or delete file
if event.is_dir: self.process_delete_dir(event) if event.dir: self.process_delete_dir(event)
else: self.process_delete(event) else: self.process_delete(event)
if hasattr(event.cookie): EventRegistry.register(event)
def process_IN_DELETE(self,event): self.process_delete(event) def process_IN_DELETE(self,event): self.process_delete(event)
def process_IN_MODIFY(self,event): self.process_modify(event) # Capturing modify events is too brittle and error prone
# def process_IN_MODIFY(self,event): self.process_modify(event)
@mediate_ignored @mediate_ignored
@IncludeOnly(mmp.supported_extensions) @IncludeOnly(mmp.supported_extensions)