mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-02-05 02:29:44 +00:00
100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
|
|
||
|
# Most of this is copied from Twisted 11.0. The reason for this hack is that
|
||
|
# twisted.internet.inotify can't be imported when the platform does not support inotify.
|
||
|
|
||
|
|
||
|
# from /usr/src/linux/include/linux/inotify.h
|
||
|
|
||
|
IN_ACCESS = 0x00000001L # File was accessed
|
||
|
IN_MODIFY = 0x00000002L # File was modified
|
||
|
IN_ATTRIB = 0x00000004L # Metadata changed
|
||
|
IN_CLOSE_WRITE = 0x00000008L # Writeable file was closed
|
||
|
IN_CLOSE_NOWRITE = 0x00000010L # Unwriteable file closed
|
||
|
IN_OPEN = 0x00000020L # File was opened
|
||
|
IN_MOVED_FROM = 0x00000040L # File was moved from X
|
||
|
IN_MOVED_TO = 0x00000080L # File was moved to Y
|
||
|
IN_CREATE = 0x00000100L # Subfile was created
|
||
|
IN_DELETE = 0x00000200L # Subfile was delete
|
||
|
IN_DELETE_SELF = 0x00000400L # Self was deleted
|
||
|
IN_MOVE_SELF = 0x00000800L # Self was moved
|
||
|
IN_UNMOUNT = 0x00002000L # Backing fs was unmounted
|
||
|
IN_Q_OVERFLOW = 0x00004000L # Event queued overflowed
|
||
|
IN_IGNORED = 0x00008000L # File was ignored
|
||
|
|
||
|
IN_ONLYDIR = 0x01000000 # only watch the path if it is a directory
|
||
|
IN_DONT_FOLLOW = 0x02000000 # don't follow a sym link
|
||
|
IN_MASK_ADD = 0x20000000 # add to the mask of an already existing watch
|
||
|
IN_ISDIR = 0x40000000 # event occurred against dir
|
||
|
IN_ONESHOT = 0x80000000 # only send event once
|
||
|
|
||
|
IN_CLOSE = IN_CLOSE_WRITE | IN_CLOSE_NOWRITE # closes
|
||
|
IN_MOVED = IN_MOVED_FROM | IN_MOVED_TO # moves
|
||
|
IN_CHANGED = IN_MODIFY | IN_ATTRIB # changes
|
||
|
|
||
|
IN_WATCH_MASK = (IN_MODIFY | IN_ATTRIB |
|
||
|
IN_CREATE | IN_DELETE |
|
||
|
IN_DELETE_SELF | IN_MOVE_SELF |
|
||
|
IN_UNMOUNT | IN_MOVED_FROM | IN_MOVED_TO)
|
||
|
|
||
|
|
||
|
_FLAG_TO_HUMAN = [
|
||
|
(IN_ACCESS, 'access'),
|
||
|
(IN_MODIFY, 'modify'),
|
||
|
(IN_ATTRIB, 'attrib'),
|
||
|
(IN_CLOSE_WRITE, 'close_write'),
|
||
|
(IN_CLOSE_NOWRITE, 'close_nowrite'),
|
||
|
(IN_OPEN, 'open'),
|
||
|
(IN_MOVED_FROM, 'moved_from'),
|
||
|
(IN_MOVED_TO, 'moved_to'),
|
||
|
(IN_CREATE, 'create'),
|
||
|
(IN_DELETE, 'delete'),
|
||
|
(IN_DELETE_SELF, 'delete_self'),
|
||
|
(IN_MOVE_SELF, 'move_self'),
|
||
|
(IN_UNMOUNT, 'unmount'),
|
||
|
(IN_Q_OVERFLOW, 'queue_overflow'),
|
||
|
(IN_IGNORED, 'ignored'),
|
||
|
(IN_ONLYDIR, 'only_dir'),
|
||
|
(IN_DONT_FOLLOW, 'dont_follow'),
|
||
|
(IN_MASK_ADD, 'mask_add'),
|
||
|
(IN_ISDIR, 'is_dir'),
|
||
|
(IN_ONESHOT, 'one_shot')
|
||
|
]
|
||
|
|
||
|
|
||
|
|
||
|
def humanReadableMask(mask):
|
||
|
"""
|
||
|
Auxiliary function that converts an hexadecimal mask into a series
|
||
|
of human readable flags.
|
||
|
"""
|
||
|
s = []
|
||
|
for k, v in _FLAG_TO_HUMAN:
|
||
|
if k & mask:
|
||
|
s.append(v)
|
||
|
return s
|
||
|
|
||
|
|
||
|
# This class is not copied from Twisted; it acts as a mock.
|
||
|
class INotify(object):
|
||
|
def startReading(self):
|
||
|
pass
|
||
|
|
||
|
def stopReading(self):
|
||
|
pass
|
||
|
|
||
|
def watch(self, filepath, mask=IN_WATCH_MASK, autoAdd=False, callbacks=None, recursive=False):
|
||
|
self.callbacks = callbacks
|
||
|
|
||
|
def event(self, filepath, mask):
|
||
|
for cb in self.callbacks:
|
||
|
cb(None, filepath, mask)
|
||
|
|
||
|
|
||
|
__all__ = ["INotify", "humanReadableMask", "IN_WATCH_MASK", "IN_ACCESS",
|
||
|
"IN_MODIFY", "IN_ATTRIB", "IN_CLOSE_NOWRITE", "IN_CLOSE_WRITE",
|
||
|
"IN_OPEN", "IN_MOVED_FROM", "IN_MOVED_TO", "IN_CREATE",
|
||
|
"IN_DELETE", "IN_DELETE_SELF", "IN_MOVE_SELF", "IN_UNMOUNT",
|
||
|
"IN_Q_OVERFLOW", "IN_IGNORED", "IN_ONLYDIR", "IN_DONT_FOLLOW",
|
||
|
"IN_MASK_ADD", "IN_ISDIR", "IN_ONESHOT", "IN_CLOSE",
|
||
|
"IN_MOVED", "IN_CHANGED"]
|