Skip to content

Commit

Permalink
[mac] Return byte paths if a byte path was given in fsevents (#726)
Browse files Browse the repository at this point in the history
  • Loading branch information
SamSchott committed Dec 11, 2020
1 parent b5c8cc1 commit 44b9618
Showing 1 changed file with 21 additions and 13 deletions.
34 changes: 21 additions & 13 deletions src/watchdog/observers/fsevents.py
Expand Up @@ -80,6 +80,7 @@ def queue_events(self, timeout):
i = 0
while i < len(events):
event = events[i]
src_path = self._encode_path(event.path)

# For some reason the create and remove flags are sometimes also
# set for rename and modify type events, so let those take
Expand All @@ -94,33 +95,34 @@ def queue_events(self, timeout):
if (i + 1 < len(events) and events[i + 1].is_renamed
and events[i + 1].event_id == event.event_id + 1):
cls = DirMovedEvent if event.is_directory else FileMovedEvent
self.queue_event(cls(event.path, events[i + 1].path))
self.queue_event(DirModifiedEvent(os.path.dirname(event.path)))
self.queue_event(DirModifiedEvent(os.path.dirname(events[i + 1].path)))
dst_path = self._encode_path(events[i + 1].path)
self.queue_event(cls(src_path, dst_path))
self.queue_event(DirModifiedEvent(os.path.dirname(src_path)))
self.queue_event(DirModifiedEvent(os.path.dirname(dst_path)))
i += 1
elif os.path.exists(event.path):
cls = DirCreatedEvent if event.is_directory else FileCreatedEvent
self.queue_event(cls(event.path))
self.queue_event(DirModifiedEvent(os.path.dirname(event.path)))
self.queue_event(cls(src_path))
self.queue_event(DirModifiedEvent(os.path.dirname(src_path)))
else:
cls = DirDeletedEvent if event.is_directory else FileDeletedEvent
self.queue_event(cls(event.path))
self.queue_event(DirModifiedEvent(os.path.dirname(event.path)))
self.queue_event(cls(src_path))
self.queue_event(DirModifiedEvent(os.path.dirname(src_path)))
# TODO: generate events for tree

elif event.is_modified or event.is_inode_meta_mod or event.is_xattr_mod :
elif event.is_modified or event.is_inode_meta_mod or event.is_xattr_mod:
cls = DirModifiedEvent if event.is_directory else FileModifiedEvent
self.queue_event(cls(event.path))
self.queue_event(cls(src_path))

elif event.is_created:
cls = DirCreatedEvent if event.is_directory else FileCreatedEvent
self.queue_event(cls(event.path))
self.queue_event(DirModifiedEvent(os.path.dirname(event.path)))
self.queue_event(cls(src_path))
self.queue_event(DirModifiedEvent(os.path.dirname(src_path)))

elif event.is_removed:
cls = DirDeletedEvent if event.is_directory else FileDeletedEvent
self.queue_event(cls(event.path))
self.queue_event(DirModifiedEvent(os.path.dirname(event.path)))
self.queue_event(cls(src_path))
self.queue_event(DirModifiedEvent(os.path.dirname(src_path)))
i += 1

def run(self):
Expand Down Expand Up @@ -162,6 +164,12 @@ def callback(pathnames, flags, ids, emitter=self):
except Exception:
pass

def _encode_path(self, path):
"""Encode path only if bytes were passed to this emitter. """
if isinstance(self.watch.path, bytes):
return os.fsencode(path)
return path


class FSEventsObserver(BaseObserver):

Expand Down

0 comments on commit 44b9618

Please sign in to comment.