cc-4105: fixed the gross hack to identify moved files
This commit is contained in:
parent
b3e928c7a6
commit
632f2ab470
|
@ -3,6 +3,7 @@ import os
|
||||||
import abc
|
import abc
|
||||||
from media.monitor.pure import LazyProperty
|
from media.monitor.pure import LazyProperty
|
||||||
from media.monitor.metadata import Metadata
|
from media.monitor.metadata import Metadata
|
||||||
|
from media.monitor.log import Loggable
|
||||||
|
|
||||||
class PathChannel(object):
|
class PathChannel(object):
|
||||||
"""a dumb struct; python has no record types"""
|
"""a dumb struct; python has no record types"""
|
||||||
|
@ -23,7 +24,10 @@ class EventRegistry(object):
|
||||||
return evt.cookie in EventRegistry.registry
|
return evt.cookie in EventRegistry.registry
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def matching(evt):
|
def matching(evt):
|
||||||
return EventRegistry.registry[evt.cookie]
|
event = EventRegistry.registry[evt.cookie]
|
||||||
|
# Want to disallow accessing the same event twice
|
||||||
|
EventRegistry.unregister(event)
|
||||||
|
return event
|
||||||
|
|
||||||
|
|
||||||
# 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
|
||||||
|
@ -35,23 +39,28 @@ class HasMetaData(object):
|
||||||
def metadata(self):
|
def metadata(self):
|
||||||
return Metadata(self.path)
|
return Metadata(self.path)
|
||||||
|
|
||||||
class BaseEvent(object):
|
class BaseEvent(Loggable):
|
||||||
__metaclass__ = abc.ABCMeta
|
__metaclass__ = abc.ABCMeta
|
||||||
def __init__(self, raw_event):
|
def __init__(self, raw_event):
|
||||||
# TODO : clean up this idiotic hack
|
# TODO : clean up this idiotic hack
|
||||||
# we should use keyword constructors instead of this behaviour checking
|
# we should use keyword constructors instead of this behaviour checking
|
||||||
# bs to initialize BaseEvent
|
# bs to initialize BaseEvent
|
||||||
if hasattr(raw_event,"pathname"):
|
if hasattr(raw_event,"pathname"):
|
||||||
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)
|
||||||
|
@LazyProperty
|
||||||
|
def cookie(self):
|
||||||
|
return getattr( self._raw_event, 'cookie', None )
|
||||||
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):
|
# nothing to see here, please move along
|
||||||
self.__raw_event = evt
|
def morph_into(self, evt):
|
||||||
|
self.logger.info("Morphing '%s' into '%s'" % (self.__class__.__name__,
|
||||||
|
evt.__class__.__name__))
|
||||||
|
self._raw_event = evt
|
||||||
self.path = evt.path
|
self.path = evt.path
|
||||||
self.__class__ = evt.__class__
|
self.__class__ = evt.__class__
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ def mediate_ignored(fn):
|
||||||
if FileMediator.is_ignored(event.pathname):
|
if FileMediator.is_ignored(event.pathname):
|
||||||
FileMediator.logger.info("Ignoring: '%s' (once)" % event.pathname)
|
FileMediator.logger.info("Ignoring: '%s' (once)" % event.pathname)
|
||||||
FileMediator.unignore(event.pathname)
|
FileMediator.unignore(event.pathname)
|
||||||
else: fn(self, event, *args, **kwargs)
|
else: return fn(self, event, *args, **kwargs)
|
||||||
return wrapped
|
return wrapped
|
||||||
|
|
||||||
class BaseListener(object):
|
class BaseListener(object):
|
||||||
|
@ -107,14 +107,12 @@ 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):
|
def process_IN_MOVED_TO(self, event):
|
||||||
if EventRegistry.registered(event):
|
if EventRegistry.registered(event):
|
||||||
EventRegistry.matching(event).morph_move(MoveFile(event))
|
EventRegistry.matching(event).morph_into(MoveFile(event))
|
||||||
EventRegistry.unregister(event)
|
|
||||||
else: self.process_create(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.dir: self.process_delete_dir(event)
|
evt = self.process_delete_dir(event) if event.dir else self.process_delete(event)
|
||||||
else: self.process_delete(event)
|
if hasattr(event,'cookie'): EventRegistry.register(evt)
|
||||||
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)
|
||||||
# Capturing modify events is too brittle and error prone
|
# Capturing modify events is too brittle and error prone
|
||||||
# def process_IN_MODIFY(self,event): self.process_modify(event)
|
# def process_IN_MODIFY(self,event): self.process_modify(event)
|
||||||
|
@ -133,11 +131,15 @@ class StoreWatchListener(BaseListener, Loggable, pyinotify.ProcessEvent):
|
||||||
@mediate_ignored
|
@mediate_ignored
|
||||||
@IncludeOnly(mmp.supported_extensions)
|
@IncludeOnly(mmp.supported_extensions)
|
||||||
def process_delete(self, event):
|
def process_delete(self, event):
|
||||||
dispatcher.send(signal=self.signal, sender=self, event=DeleteFile(event))
|
evt = DeleteFile(event)
|
||||||
|
dispatcher.send(signal=self.signal, sender=self, event=evt)
|
||||||
|
return evt
|
||||||
|
|
||||||
@mediate_ignored
|
@mediate_ignored
|
||||||
def process_delete_dir(self, event):
|
def process_delete_dir(self, event):
|
||||||
dispatcher.send(signal=self.signal, sender=self, event=DeleteDir(event))
|
evt = DeleteDir(event)
|
||||||
|
dispatcher.send(signal=self.signal, sender=self, event=evt)
|
||||||
|
return evt
|
||||||
|
|
||||||
def flush_events(self, path):
|
def flush_events(self, path):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -42,7 +42,7 @@ class IncludeOnly(object):
|
||||||
def __call__(self, func):
|
def __call__(self, func):
|
||||||
def _wrap(moi, event, *args, **kwargs):
|
def _wrap(moi, event, *args, **kwargs):
|
||||||
ext = extension(event.pathname)
|
ext = extension(event.pathname)
|
||||||
if ext in self.exts: func(moi, event, *args, **kwargs)
|
if ext in self.exts: return func(moi, event, *args, **kwargs)
|
||||||
return _wrap
|
return _wrap
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue