cc-4105: added the hack to identify move events
This commit is contained in:
parent
5fa6def111
commit
b3e928c7a6
|
@ -10,6 +10,22 @@ class PathChannel(object):
|
|||
self.signal = signal
|
||||
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
|
||||
# that would contain the path to obtain the meta data. But it would be too much
|
||||
# work
|
||||
|
@ -29,10 +45,16 @@ class BaseEvent(object):
|
|||
self.__raw_event = raw_event
|
||||
self.path = os.path.normpath(raw_event.pathname)
|
||||
else: self.path = raw_event
|
||||
self.cookie = getattr( raw_event, 'cookie', None )
|
||||
def exists(self): return os.path.exists(self.path)
|
||||
def __str__(self):
|
||||
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):
|
||||
def __init__(self, *args, **kwargs): super(OrganizeFile, self).__init__(*args, **kwargs)
|
||||
def pack(self):
|
||||
|
@ -83,3 +105,4 @@ class ModifyFile(BaseEvent, HasMetaData):
|
|||
# path to directory that is to be removed
|
||||
req_dict['MDATA_KEY_FILEPATH'] = unicode( self.path )
|
||||
return req_dict
|
||||
|
||||
|
|
|
@ -4,7 +4,8 @@ from pydispatch import dispatcher
|
|||
|
||||
import media.monitor.pure as mmp
|
||||
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
|
||||
|
||||
# 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):
|
||||
|
||||
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):
|
||||
# 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)
|
||||
if hasattr(event.cookie): EventRegistry.register(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
|
||||
@IncludeOnly(mmp.supported_extensions)
|
||||
|
|
Loading…
Reference in New Issue