cc-4105: fixed moving watched directory
This commit is contained in:
parent
166a724d9d
commit
7db4573d10
|
@ -121,8 +121,10 @@ class MoveFile(BaseEvent, HasMetaData):
|
|||
return [req_dict]
|
||||
|
||||
def map_events(directory, constructor):
|
||||
for f in mmp.walk_supported(directory.replace("-unknown-path",""),
|
||||
clean_empties=True):
|
||||
# This hack is actually not necessary:
|
||||
#for f in mmp.walk_supported(directory.replace("-unknown-path",""),
|
||||
#clean_empties=False)
|
||||
for f in mmp.walk_supported(directory, clean_empties=False):
|
||||
try:
|
||||
for e in constructor( FakePyinotify(f) ).pack(): yield e
|
||||
except BadSongFile as e: yield e
|
||||
|
@ -142,7 +144,7 @@ class DeleteDirWatch(BaseEvent):
|
|||
def pack(self):
|
||||
req_dict = {}
|
||||
req_dict['mode'] = u'delete_dir'
|
||||
req_dict['MDATA_KEY_FILEPATH'] = unicode( self.path )
|
||||
req_dict['MDATA_KEY_FILEPATH'] = unicode( self.path + "/" )
|
||||
return [req_dict]
|
||||
|
||||
class ModifyFile(BaseEvent, HasMetaData):
|
||||
|
|
|
@ -38,6 +38,7 @@ class ProblemFileHandler(Handles, Loggable):
|
|||
self.logger.info("Initialized problem file handler. Problem dir: '%s'" % self.problem_dir)
|
||||
|
||||
def handle(self, sender, event, exception=None):
|
||||
# TODO : use the exception parameter for something
|
||||
self.logger.info("Received problem file: '%s'. Supposed to move it to problem dir", event.path)
|
||||
import ipdb; ipdb.set_trace()
|
||||
try: mmp.move_to_dir(dir_path=self.problem_dir, file_path=event.path)
|
||||
|
|
|
@ -5,7 +5,7 @@ from pydispatch import dispatcher
|
|||
import media.monitor.pure as mmp
|
||||
from media.monitor.pure import IncludeOnly
|
||||
from media.monitor.events import OrganizeFile, NewFile, MoveFile, DeleteFile, \
|
||||
ModifyFile, DeleteDir, EventRegistry, MoveDir,\
|
||||
DeleteDir, EventRegistry, MoveDir,\
|
||||
DeleteDirWatch
|
||||
from media.monitor.log import Loggable, get_logger
|
||||
|
||||
|
@ -118,19 +118,27 @@ class StoreWatchListener(BaseListener, Loggable, pyinotify.ProcessEvent):
|
|||
evt = self.process_delete(event)
|
||||
if hasattr(event,'cookie'): EventRegistry.register(evt)
|
||||
def process_IN_DELETE(self,event): self.process_delete(event)
|
||||
def process_IN_MOVE_SELF(self, event):
|
||||
if '-unknown-path' in event.pathname:
|
||||
event.pathname = event.pathname.replace('-unknown-path','')
|
||||
self.delete_watch_dir(event)
|
||||
# Capturing modify events is too brittle and error prone
|
||||
# def process_IN_MODIFY(self,event): self.process_modify(event)
|
||||
|
||||
def delete_watch_dir(self, event):
|
||||
e = DeleteDirWatch(event)
|
||||
dispatcher.send(signal='watch_move', sender=self, event=e)
|
||||
dispatcher.send(signal=self.signal, sender=self, event=e)
|
||||
# TODO : Remove this code. Later decided we will ignore modify events
|
||||
# since it's too difficult to tell which ones should be handled. Much
|
||||
# easier to just intercept IN_CLOSE_WRITE and decide what to do on the php
|
||||
# side
|
||||
@mediate_ignored
|
||||
@IncludeOnly(mmp.supported_extensions)
|
||||
def process_modify(self, event):
|
||||
FileMediator.skip_next('IN_MODIFY','IN_CLOSE_WRITE',key='maskname')
|
||||
evt = ModifyFile(event)
|
||||
dispatcher.send(signal=self.signal, sender=self, event=evt)
|
||||
#@mediate_ignored
|
||||
#@IncludeOnly(mmp.supported_extensions)
|
||||
#def process_modify(self, event):
|
||||
#FileMediator.skip_next('IN_MODIFY','IN_CLOSE_WRITE',key='maskname')
|
||||
#evt = ModifyFile(event)
|
||||
#dispatcher.send(signal=self.signal, sender=self, event=evt)
|
||||
|
||||
@mediate_ignored
|
||||
@IncludeOnly(mmp.supported_extensions)
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
import pyinotify
|
||||
from pydispatch import dispatcher
|
||||
|
||||
from os.path import normpath
|
||||
from media.monitor.events import PathChannel
|
||||
from media.monitor.log import Loggable
|
||||
from media.monitor.listeners import StoreWatchListener, OrganizeListener
|
||||
|
@ -34,16 +36,27 @@ class Manager(Loggable):
|
|||
'organizer' : None,
|
||||
'problem_handler' : None,
|
||||
}
|
||||
def dummy(sender, event): self.watch_move( event.path, sender=sender )
|
||||
dispatcher.connect(dummy, signal='watch_move', sender=dispatcher.Any,
|
||||
weak=False)
|
||||
# A private mapping path => watch_descriptor
|
||||
# we use the same dictionary for organize, watch, store wd events.
|
||||
# this is a little hacky because we are unable to have multiple wd's
|
||||
# on the same path.
|
||||
self.__wd_path = {}
|
||||
# The following set isn't really necessary anymore. should be
|
||||
# The following set isn't really necessary anymore. Should be
|
||||
# removed...
|
||||
self.watched_directories = set([])
|
||||
Manager.global_inst = self
|
||||
|
||||
# This is the only event that we are unable to process "normally". I.e.
|
||||
# through dedicated handler objects. Because we must have access to a
|
||||
# manager instance. Hence we must slightly break encapsulation.
|
||||
def watch_move(self, watch_dir, sender=None):
|
||||
self.logger.info("Watch dir '%s' has been renamed (hence removed)" %
|
||||
watch_dir)
|
||||
self.remove_watch_directory(normpath(watch_dir))
|
||||
|
||||
def watch_signal(self):
|
||||
return self.watch_listener.signal
|
||||
|
||||
|
|
|
@ -107,6 +107,8 @@ class WatchSyncer(ReportHandler,Loggable):
|
|||
tc.start()
|
||||
super(WatchSyncer, self).__init__(signal=signal)
|
||||
|
||||
# TODO : get rid of this useless property. WatchSyncer is now uncoupled
|
||||
# from any particular watch directory
|
||||
@property
|
||||
def target_path(self): return self.path
|
||||
|
||||
|
|
Loading…
Reference in New Issue