Пример #1
0
    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')
Пример #2
0
    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))
Пример #3
0
 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')
Пример #4
0
    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))
Пример #5
0
    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))
Пример #6
0
 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)