def watcher_callback(self, path, action): """ callback for the filewatcher """ # need to test and refactor this anyway # pylint: disable=too-many-nested-blocks logger.debug('Raw windows event: %s, %s', path, action) # happens when the handler is closed if not path: return path = convert_long_path(path) logger.debug(path) relative_path = os.path.relpath(path, self.root) filename = os.path.basename(relative_path) if file_ignored(os.path.basename(path)) \ or file_ignored(filename) or file_ignored(relative_path): logger.info("File %s ignored", relative_path) return if action == 0: logger.debug("stopping") return event_props = None with contextlib.suppress(FileNotFoundError): event_props = get_eventprops_from_stat(path) cc_path = fs_to_cc_path(path, self.root) if event_props is not None: if action == winapi.FILE_ACTION_ADDED: self._event_sink.storage_create( storage_id=self.storage_id, path=cc_path, event_props=remove_private_props(event_props)) # this might trigger events double, but the syncengine knows how to # handle that if os.path.isdir(path): self.generate_events_for_tree(path) elif action == winapi.FILE_ACTION_MODIFIED: self._event_sink.storage_modify( storage_id=self.storage_id, path=cc_path, event_props=remove_private_props(event_props)) elif action == winapi.FILE_ACTION_RENAMED_NEW_NAME: self.rename_folder(cc_path=cc_path, event_props=event_props) if action == winapi.FILE_ACTION_REMOVED: self._event_sink.storage_delete(storage_id=self.storage_id, path=cc_path) elif action == winapi.FILE_ACTION_RENAMED_OLD_NAME: self.old_path = cc_path elif action == winapi.FILE_ACTION_OVERFLOW: logger.error('Well, this is an overflow message')
def on_created(self, event): """Handle a create event.""" cc_path = fs_to_cc_path(event.src_path, self.storage.root) event_props = get_eventprops_from_stat(event.src_path) self.storage.event_sink.storage_create( storage_id=self.storage.storage_id, path=cc_path, event_props=remove_private_props(event_props))
def rename_folder(self, cc_path, event_props): """ helper function to rename sp folder """ if self.old_path: logger.debug('Move from %s -> %s', self.old_path, cc_path) self._event_sink.storage_move( storage_id=self.storage_id, source_path=self.old_path, target_path=cc_path, event_props=remove_private_props(event_props)) self.old_path = None else: logger.critical('Was not able to reconstruct filename')
def on_moved(self, event): """handle move events.""" logger.debug("move handler '%s' -> '%s'", event.src_path, event.dest_path) cc_path_src = fs_to_cc_path(event.src_path, self.storage.root) cc_path_target = fs_to_cc_path(event.dest_path, self.storage.root) event_props = get_eventprops_from_stat(event.dest_path) self.storage.event_sink.storage_move( storage_id=self.storage.storage_id, source_path=cc_path_src, target_path=cc_path_target, event_props=remove_private_props(event_props))
def on_modified(self, event): """Handle a file modification event.""" cc_path = fs_to_cc_path(event.src_path, self.storage.root) try: event_props = get_eventprops_from_stat(event.src_path) except FileNotFoundError: logger.info("can't stat file, ignoring event", exc_info=True) return self.storage.event_sink.storage_modify( storage_id=self.storage.storage_id, path=cc_path, event_props=remove_private_props(event_props))
def generate_events_for_tree(self, path): """ walks down a a directory and emits create events for all files """ logger.debug('walking down the line for %s', path) for dirpath, dirnames, filenames in os.walk(path): for entry in dirnames + filenames: try: path = os.path.join(dirpath, entry) logger.debug('triggering artificial event for %s', path) event_props = get_eventprops_from_stat(path) cc_path = fs_to_cc_path(path, self.root) self._event_sink.storage_create( storage_id=self.storage_id, path=cc_path, event_props=remove_private_props(event_props)) except OSError: logger.debug('Cannot stat %s', path, exc_info=True)