diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f1a8a49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +build/ +dist/ +doc/html/ +doc/doctrees/ +src/pyfuse3.c +src/pyfuse3*.so +test/.cache/ +__pycache__ +test/.pytest_cache/ diff --git a/.hgignore b/.hgignore deleted file mode 100644 index 0525ec9..0000000 --- a/.hgignore +++ /dev/null @@ -1,12 +0,0 @@ -syntax: regexp -^src/llfuse\.egg-info$ -^build$ -\.pyc$ -^dist$ -^doc/html$ -^doc/doctrees$ - -syntax: glob -src/llfuse.c -src/llfuse*.so -test/.cache/ diff --git a/.hgtags b/.hgtags deleted file mode 100644 index 0067fdb..0000000 --- a/.hgtags +++ /dev/null @@ -1,28 +0,0 @@ -691da16d53c7f8ca74b48cf09c04883fa61d9baa release-0.29 -954ad9edc21f39d42fb11e135b4831b23f404dbe release-0.30 -675636bdd99c89d73c6045c265a465ac824e188f release-0.31 -7befaf08089a0bc450f2419a030002c7f5e2fda3 release-0.32 -c866138cb15fd9e49e5ff33b55b44267bdcf51f5 release-0.33 -bb654f81245205a4debbff01e71f9cc28783e549 release-0.33 -5eedba3af00ba97fb8bc3118667ef51bbff55ecd release-0.34 -b9d26564bedd5eccb378adb5099692995c5fb5a6 release-0.35 -4be9209d3e2bd9bab7568cbf198f823b7d22a211 release-0.36 -71a21e9ffdcdaae8f3b040ddca6eba9284667a8b release-0.37 -4aaaa736fd88b28162bfba92efd467e584ec3d31 release-0.37.1 -718230580a89f2158f7f42b67f406788547c2cc2 release-0.38 -d791589e8419e64fc668aa200b5f761feebb23f8 release-0.39 -fd013bad9c9196a275a680f729d55495d676872c release-0.40 -7704faaccaa22a13a75db5580ecdd892b30f183d release-0.41 -58de3a083f6c71ff8d91eea2ac5152f537b55803 release-0.41.1 -fe85dc44f0257c7028b56388078c5c9dbc2f1824 release-0.42 -a828c80f33159d978d717887c418aa4803b141e6 release-0.42.1 -81b64947d9a005db99f97931ca195b1f865b9098 release-0.43 -3a8fbb89c90133b6187a56f23262d4e0d59783ee release-1.0 -e871b544d53a59b4c56c8b84f634d29b0817df2c release-1.1 -8c1a88d600d0c0e79e87a629da693756e37c52c9 release-1.1.1 -395c984b5dc4957b18561a1f49d2323337c2edd4 release-1.2 -9fe7cb6c180eea9b08887d6271ab18d817b1f165 release-1.3 -e6d1aa7e01b4cbcbcf40d4dd84d2467de055af7c release-1.3.2 -c1d7a70499f3058439481564a97c7db390dff6a1 release-1.3.3 -cb1c23423190f750635f315cb93031bb621d5c99 release-1.3.4 -9ce913846f678ba5c2a85bc731af3161484623e8 release-1.3.5 diff --git a/.travis.yml b/.travis.yml index e50d7ad..adb3ded 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,6 @@ addons: - libattr1-dev - pkg-config - gcc - - libfuse-dev + - libfuse3-dev install: test/travis-install.sh script: test/travis-test.sh diff --git a/Changes.rst b/Changes.rst index 9b9b107..5b61855 100644 --- a/Changes.rst +++ b/Changes.rst @@ -2,348 +2,12 @@ Changelog =========== -.. currentmodule:: llfuse +.. currentmodule:: pyfuse -Release 1.3.5 (2018-08-30) -========================== +Unreleased Changes +================== -* Add `handle_signals` option to `llfuse.main` -* Several fixes to `examples/passthroughfs.py` -* Now compatible with Python 3.7 - -Release 1.3.4 (2018-04-29) -========================== - -* No-change rebuild with Cython 0.28.2. - -Release 1.3.3 (2018-03-31) -========================== - -* Dropped pytest-catchlog dependency and add support for Pytest 3.3.0. -* Minor bugfixes. - -Release 1.3.2 (2017-11-13) -========================== - -* Minor bugfixes. - -Release 1.3.1 (2017-09-22) -========================== - -* The main loop now terminates properly again when terminated - by a signal. - -Release 1.3 (2017-09-15) -======================== - -* The `StatvfsData` class now has an `!~StatvfsData.f_namemax` - attribute. - -* `EntryAttributes` and `StatvfsData` instances can now be pickled and - copied. Other llfuse classes now raise an exception when the do not - support pickling/copying. - -Release 1.2 (2017-01-22) -======================== - -* The *attr* argument of the `~Operations.setattr` handler now - contains valid values only for the attributes that are to be set. - - Previously, the documentation assorted that other attributes would - be set to the original (unchanged) values. However, that was - actually never the case. - -Release 1.1.1 (2016-07-27) -========================== - -* Fixed the description of the `~Operations.lookup` handler (should - return zero if there is no such entry, not a negative value). -* Fixed the description of the `EntryAttributes` structure - (descriptions of `~EntryAttributes.attr_timeout` and - `~EntryAttributes.entry_timeout` were switched). - -Release 1.1 (2016-05-23) -======================== - -* Added support for nanosecond resolution time-stamps in GNU/kFreeBSD. -* Fixed another set of build issues on FreeBSD. - -Release 1.0 (2016-03-08) -======================== - -**Note:** The 1.0 version number does not imply any special -stability or an API freeze. It's a consequence of switching to -semantic versioning, where backwards incompatible changes will -always result in increased major version. - -* Fixed an overflow when accessing the ``*st_xtime_ns`` attributes of - the `~llfuse.EntryAttributes` class from Python on 32-bit systems. - -* POTENTIAL COMPATIBILITY BREAK: The `~Operations.destroy` handler is now - called with the global lock acquired. - -Release 0.43 (2016-02-23) -========================= - -* Fixed build-failure under OS-X. -* Fixed some build failures under FreeBSD (hopefully all of them, but - no testers were available before the release). -* The *workers* parameter to `llfuse.main` may now be `None`. - -Release 0.42.1 (2016-02-01) -=========================== - -* Include HTML documentation. - -Release 0.42 (2016-01-30) -========================= - -* The documentation has been clarified and extended - please take a - look even if you're already familiar with Python-LLFUSE. - -* Extended coverage of unit tests. - -* Fixed a compile error under OS-X. - -* Added `notify_store` function. - -* Added `get_sup_groups` function. - -* The `~Operations.read` handler may now return arbitrary objects that - as long as they implement the buffer protocol. - -* Implemented a *forget_multi* handler (used behind the scenes). - -* Many classes were rewritten in Cython for improved performance. - -* Python thread-specific data is now initialized only once rather - than every time a handler is called. - -* SIGINT (Ctrl-C) now properly terminates `llfuse.main` also when - running with multiple workers. - -* The return value of `llfuse.main` now indicates if the loop was - terminated due to an unmount request or due to a signal. - -BACKWARDS INCOMPATIBLE CHANGES: - -* Ducktyping the `EntryAttributes` class is no longer allowed, - `Operations` methods must return instances of this class (rather - than any object that provides the necessary attributes). - -* The `!st_Xtime` attributes of the `EntryAttributes` have been - dropped in favor of the `!st_Xtime_ns` attributes. - -* The `setattr` method now always receives a completely filled - `EntryAttributes` instance. To determine which attributes should - be changed, a new *fields* argument has been introduced. - -* The `~Operations.setattr` method now also receives an *fh* - parameter. - -* The `llfuse.main` function now has a *workers* parameter, and - the *single* parameter was dropped. - -* Almost all request handlers now receive a `RequestContext` - instance in an additional parameter. - -Release 0.41.1 (2015-08-22) -=========================== - -* Added some files in :file:`test/` that were missing in the 0.41 - tarball. Tests now support the ``--installed`` option, produce - prettier output, and check for error messages printed to stderr or - stdout. - -* Python-LLFUSE can now also be built on NetBSD. - -* Added support for FUSE_SET_ATTR_ATIME_NOW and - FUSE_SET_ATTR_MTIME_NOW setattr flags. Previously, these would be - silently ignored. - -* Fixed an AssertionError in :file:`examples/passthroughfs.py` - -Release 0.41 (2015-08-20) -========================= - -* Fixed a syntax error in contrib/tmpfs.py -* Introduced an `!llfuse.__version__` attribute. -* Added more reasonable default values for `llfuse.EntryAttributes`. -* Added new minimal example, :file:`examples/lltest.py`. -* Added unit tests. -* Added an example for a pass-through file system, - :file:`examples/passthroughfs.py`. - -Release 0.40 (2013-11-26) -========================= - -* Re-raising an exception from a request handler now works - correctly under Python 3. Problems were caused by a Cython bug, - but llfuse now works around the issue. - -* File atime, ctime and mtime can now also be represented as - nanosecond integer values for increased resolution. Thanks to - nagy.attila@gmail.com for the initial patch. - -* Python-llfuse no longer includes the setuptools/distribute - bootstrap script. This module thus has to be installed manually - if not already present on the system. - -* Duck-typing of the Operations instance is now supported. - -* Python-llfuse no longer requires a re-compilation of the - Cython code (setup.py build_cython step) when compiling for MacOS - or FreeBSD. - -* Extended attributes are now properly supported under FreeBSD. - -Release 0.39 (2013-05-11) -========================= - -* When running under Python 3.x, several functions now work with - string objects rather than byte objects: - - - llfuse.init(): the *mountpoint* argument, and the elements of - the *fuse_opts* argument are expected to be of type str. - - - llfuse.listdir(): the *path* argument is expected to be of - type str, and the values returned by the iterator will be of - type str as well. - - - llfuse.getxattr(), llfuse.setxattr(): the *path* and *name* - arguments are expected to be of type str. - - When necessary, values will be converted to the file system - encoding using the surrogatescape handler as described in PEP 383 - (http://www.python.org/dev/peps/pep-0383/) - -* Renamed get_off_t_bytes() and get_ino_t_bytes() to - get_off_t_bits() and get_ino_t_bits() and documented them. - -Release 0.38 (2013-01-05) -========================= - -* Various small bugfixes. - -Release 0.37.1 (2011-12-10) -=========================== - -* Fixed a segfault-causing race condition in Lock.acquire() and - Lock.yield(). - -Release 0.37 (2011-12-05) -========================= - -* Explicitly call fuse_chan_destroy() in llfuse.close(), so - that the mountpoint becomes inaccessible right away, even - while the process is still running. - -* Added get_ino_t_bytes() and get_off_t_bytes() that return - the number of bytes used for representing inode numbers - and file offsets. - -* The yield_() method of the global lock now takes an additional - *count* argument that can be used to yield the lock more than - once. - -* Changed implementation of global lock. The global lock is - no longer a mutex, but a boolean variable protected by a mutex, - and changes are tracked with a condition object. This allows - lock.yield() to work properly: if there are other threads waiting - for the lock, they are guaranteed to run. If there are no other - threads waiting for the lock, execution of the active thread - continues immediately. - - The previous implementation using sched_yield() was mostly - broken: threads trying to acquire the global lock were calling - pthread_mutex_lock, so they got removed from the kernels - runqueue. However, calls to sched_yield() would just put the - active thread into the expired runqueue, and calls to - pthread_mutex_unlock apparently do not synchronously move the - threads waiting for the lock back to a runqueue. Therefore, most - of the time the active thread would be the only thread in any - runqueue and thus continue to run. - -* The Operations.forget() method now receives a list of - (inode, nlookup) tuples rather than just one such tuple. - -* invalidate_entry() and invalidate_inode() no longer work - synchronously. Instead, the message is put in a queue and send by - a background thread. - -* The acquire() method of the global lock now has an optional - *timeout* parameter. - -* The create() request handler now receives the open flags - as an additional parameter. - -Release 0.36 (2011-09-20) -========================= - -* Don't send SIGHUP if exception is encountered in destroy() - handler (since at that point, main loop has already terminated - and signal handling been reset). - -* Fix a problem with request handler exceptions being re-raised - not only in llfuse.main(), but also in llfuse.close() when - running single threaded. - -Release 0.35 (2011-09-14) -========================= - -* Explicitly initialize Python thread support. Previously, calling - llfuse.main() resulted in a crash if no Python threads were used - before the call. - -* Removed handle_exc() method. If request handle raise an exception, - the main loop now terminates and the exception is re-raised and - passed to the caller of llfuse.main(). - -* llfuse.close() can now leave the mountpoint in an inaccessible - state to signal a shutdown due to an internal file system - error. - -* The destroy() request handler is now called without the - global lock acquired. This makes sense, because it's not called - as part of the main loop but by llfuse.close(). - -Release 0.34 (2011-08-10) -========================= - -* Explicitly cast S_* constants to mode_t to prevent compiler - warnings on FreeBSD. - -* Fixed initialization error under Python 3. - -Release 0.33 (2011-07-03) -========================= - -* Various small bugfixes. - -Release 0.32 (2011-06-04) -========================= - -* Fixed unlink() bug in contrib/example.py - -* Include :file:`src/*.pxi` files in release tarball. Were - accidentally omitted in previous version. - -* Moved debian/ directory into separate repository. - -Release 0.31 (2011-05-12) -========================= - -* Use long for storing nanoseconds in file [amc]times, not int. - -Release 0.30 (2011-03-08) -========================= - -* Fixed compile errors with Python 3.0 and 3.1. -* Fixed error handling, errno is now read correctly. -* Documentation is now shipped in tarball rather than generated - during installation. - -Release 0.29 (2010-12-30) -========================= - -* Initial release +* First release +* pyfuse3 was forked from python-llfuse - thanks for all the work! +* If you need compatibility with Python 2.x or libfuse 2.x, you may + want to take a look at python-llfuse instead. diff --git a/Include/fuse_common.pxd b/Include/fuse_common.pxd index 03e4bca..0373c05 100644 --- a/Include/fuse_common.pxd +++ b/Include/fuse_common.pxd @@ -5,7 +5,7 @@ This file contains Cython definitions for fuse_common.h Copyright © 2010 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' diff --git a/Include/fuse_lowlevel.pxd b/Include/fuse_lowlevel.pxd index 63ffcbe..a027345 100644 --- a/Include/fuse_lowlevel.pxd +++ b/Include/fuse_lowlevel.pxd @@ -5,7 +5,7 @@ This file contains Cython definitions for fuse_lowlevel.h Copyright © 2010 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' diff --git a/Include/fuse_opt.pxd b/Include/fuse_opt.pxd index 6220080..1129ead 100644 --- a/Include/fuse_opt.pxd +++ b/Include/fuse_opt.pxd @@ -5,7 +5,7 @@ This file contains Cython definitions for fuse_opt.h Copyright © 2010 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' diff --git a/Include/libc/dirent.pxd b/Include/libc/dirent.pxd index 261fe7e..6384eeb 100644 --- a/Include/libc/dirent.pxd +++ b/Include/libc/dirent.pxd @@ -5,7 +5,7 @@ This file contains Cython definitions for dirent.h and sys/types.h Copyright © 2010 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' diff --git a/Include/libc/sys/statvfs.pxd b/Include/libc/sys/statvfs.pxd index 43b9e1e..74958ab 100644 --- a/Include/libc/sys/statvfs.pxd +++ b/Include/libc/sys/statvfs.pxd @@ -5,7 +5,7 @@ This file contains Cython definitions for sys/statvfs.h Copyright © 2010 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' diff --git a/Include/pthread.pxd b/Include/pthread.pxd index fead231..80f7cf2 100644 --- a/Include/pthread.pxd +++ b/Include/pthread.pxd @@ -5,14 +5,14 @@ This file contains Cython definitions for pthread.h Copyright © 2015 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' from posix.signal cimport sigset_t cdef extern from "" nogil: - # POSIX says this might be a struct, but CPython (and llfuse) + # POSIX says this might be a struct, but CPython (and pyfuse3) # rely on it being an integer. ctypedef int pthread_t @@ -44,7 +44,7 @@ cdef extern from "" nogil: # The sem_* functions actually need the semaphone.h header file. However, under # OS-X we use a compatibility layer that breaks if we include the native # semaphore.h file. Therefore, we pretend that no header file is required and -# conditionally include semaphore.h in llfuse.h. +# conditionally include semaphore.h in pyfuse3.h. cdef extern from * nogil: ctypedef struct sem_t: pass diff --git a/README.rst b/README.rst index 6abfba1..b5485c4 100644 --- a/README.rst +++ b/README.rst @@ -1,65 +1,62 @@ -.. - NOTE: We cannot use sophisticated ReST syntax (like - e.g. :file:`foo`) here because this isn't rendered correctly - by PyPi and/or BitBucket. - -The Python-LLFUSE Module -======================== - -.. start-intro - -Python-LLFUSE is a set of Python bindings for the low level FUSE_ -API. It requires at least FUSE 2.8.0 and supports both Python 2.x and -3.x. Like FUSE itself, Python-LLFUSE is developed for Linux -systems. However, we try to maintain compatibility with OS-X, FreeBSD -and NetBSD as well (but due to lack of pre-release testers we can't -guarantee that every Python-LLFUSE release will run on these -platforms - please report any bugs and we will try to fix them). - -Python-LLFUSE releases can be downloaded from PyPi_. The documentation -can be `read online`__ and is also included in the ``doc/html`` -directory of the Python-LLFUSE tarball. - - -Getting Help ------------- - -Please report any bugs on the `issue tracker`_. For discussion and -questions, please use the general `FUSE mailing list`_. A searchable -`mailing list archive`_ is kindly provided by Gmane_. - - -Development Status ------------------- - -The Python-LLFUSE API is not yet stable and may change from one -release to the other. Starting with version 0.42, Python-LLFUSE uses -semantic versioning. This means changes in the API will be reflected -in an increase of the major version number, i.e. the next -backwards-incompatible version will be 1.0. Projects designed for -e.g. version 0.42.1 of Python-LLFUSE are thus recommended to declare a -dependency on ``llfuse >= 0.42.1, < 1.0``. - - -Contributing ------------- - -The Python-LLFUSE source code is available both on GitHub_ and BitBucket_. - - -Professional Support --------------------- - -Professional support is offered via `Rath Consulting`_. - - -.. __: http://www.rath.org/llfuse-docs/ -.. _FUSE: http://github.com/libfuse/libfuse -.. _FUSE mailing list: https://lists.sourceforge.net/lists/listinfo/fuse-devel -.. _issue tracker: https://bitbucket.org/nikratio/python-llfuse/issues -.. _mailing list archive: http://dir.gmane.org/gmane.comp.file-systems.fuse.devel -.. _Gmane: http://www.gmane.org/ -.. _PyPi: https://pypi.python.org/pypi/llfuse/ -.. _BitBucket: https://bitbucket.org/nikratio/python-llfuse/ -.. _GitHub: https://github.com/python-llfuse/python-llfuse -.. _`Rath Consulting`: http://www.rath-consulting.biz/ +.. + NOTE: We cannot use sophisticated ReST syntax (like + e.g. :file:`foo`) here because this isn't rendered correctly + by PyPi and/or BitBucket. + + +The pyfuse3 Module +================== + +.. start-intro + +pyfuse3 is a set of Python bindings for libfuse_. It requires at least +libfuse 3 and Python 3. Like libfuse, pyfuse3 is developed for Linux +systems and we try to maintain compatibility with OS-X, FreeBSD and +NetBSD as well. However, due to lack of pre-release testers we can't +guarantee that every pyfuse3 release will run on these platforms - +please report any bugs and we will try to fix them. + +pyfuse3 releases can be downloaded from PyPi_. The documentation +can be `read online`__ and is also included in the ``doc/html`` +directory of the pyfuse3 tarball. + + +Getting Help +------------ + +Please report any bugs on the `issue tracker`_. For discussion and +questions, please use the general `FUSE mailing list`_. A searchable +`mailing list archive`_ is kindly provided by Gmane_. + + +Development Status +------------------ + +pyfuse3 is in beta. Bugs are likely. + +pyfuse3 uses semantic versioning. This means backwards incompatible +changes in the API will be reflected in an increase of the major +version number. + + +Contributing +------------ + +The pyfuse3 source code is available on GitHub_. + + +Professional Support +-------------------- + +Professional support is offered from `Rath Consulting`_. + + +.. __: http://www.rath.org/pyfuse3-docs/ +.. _libfuse: http://github.com/libfuse/libfuse +.. _FUSE mailing list: https://lists.sourceforge.net/lists/listinfo/fuse-devel +.. _issue tracker: https://github.com/libfuse/pyfuse3/issues +.. _mailing list archive: http://dir.gmane.org/gmane.comp.file-systems.fuse.devel +.. _Gmane: http://www.gmane.org/ +.. _PyPi: https://pypi.python.org/pypi/pyfuse3/ +.. _GitHub: https://github.com/libfuse/pyfuse3 +.. _`Rath Consulting`: http://www.rath-consulting.biz/ diff --git a/checkpatch.py b/checkpatch.py deleted file mode 100755 index 51f77cc..0000000 --- a/checkpatch.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python3 - -import re -import os -import subprocess -import sys -import shutil -from argparse import ArgumentParser - -trailing_w_re = re.compile(r'\s+\n$') -only_w_re = re.compile(r'^\s+\n$') - -def checkfile(name, correct=False): - found_problems = False - if correct: - dst = open(name + '.checkpatch.tmp', 'w+') - - with open(name, 'r+') as fh: - for (lineno, line) in enumerate(fh): - if only_w_re.search(line): - print('%s:%d: line consists only of whitespace' % (name, lineno+1)) - found_problems = True - elif trailing_w_re.search(line): - print('%s:%d: trailing whitespace' % (name, lineno+1)) - found_problems = True - if correct: - dst.write(line.rstrip() + '\n') - - if correct: - fh.seek(0) - dst.seek(0) - shutil.copyfileobj(dst, fh) - fh.truncate() - os.unlink(dst.name) - found_problems = False - - return found_problems - -def parse_args(): - parser = ArgumentParser( - description="Check tracked files for trailing whitespace") - - parser.add_argument("--fix", action="store_true", default=False, - help="Automatically correct problems") - - return parser.parse_args() - -options = parse_args() - -os.chdir(os.path.dirname(__file__)) -hg_out = subprocess.check_output(['hg', 'status', '--clean', '--modified', '--added', - '--no-status', '--print0']) -found_problems = False -for b_name in hg_out.split(b'\0'): - if not b_name: - continue - name = b_name.decode('utf-8', errors='surrogatescape') - if checkfile(name, correct=options.fix): - found_problems = True - -if found_problems: - sys.exit(1) -else: - sys.exit(0) diff --git a/developer-notes/lookup_counts.rst b/developer-notes/lookup_counts.rst index e2a571c..15e6b4d 100644 --- a/developer-notes/lookup_counts.rst +++ b/developer-notes/lookup_counts.rst @@ -1,8 +1,8 @@ =========================================== - Move Lookup Count Management into LLFUSE? + Move Lookup Count Management into PYFUSE3? =========================================== -It would be nice if LLFUSE could keep track of the lookup count +It would be nice if PYFUSE3 could keep track of the lookup count management. That way its users wouldn't need to worry about which handlers increase the lookup count, and `forget` would only be called when the lookup count reaches zero. @@ -16,7 +16,7 @@ inodes it generally wants to establish some internal lstate that survives as long as the corresponding inode is active. However, in order to maintain that state, it has to be protected by the same lock as the lookup count. This makes it impossible to update the lookup -count in LLFUSE after the python handler method has returned. +count in PYFUSE3 after the python handler method has returned. Example:: @@ -112,7 +112,7 @@ removal until `forget`. In this case, one correct implementation is:: Here, the operations that modify lookup_count as well as the complete -forget() function could be moved into llfuse. The price of this is +forget() function could be moved into pyfuse3. The price of this is that the application can no longer tell for sure if an inode is known to the kernel. This is a problem if e.g. inode numbers are generated dynamically - without forget(), how does the file system know when it diff --git a/examples/lltest.py b/examples/lltest.py index 44bc53c..e3e40dc 100755 --- a/examples/lltest.py +++ b/examples/lltest.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' -lltest.py - Example file system for Python-LLFUSE. +lltest.py - Example file system for pyfuse3. This program presents a static file system containing a single file. It is compatible with both Python 2.x and 3.x. Based on an example from Gerion Entrup. @@ -28,18 +28,18 @@ import os import sys -# If we are running from the Python-LLFUSE source directory, try +# If we are running from the pyfuse3 source directory, try # to load the module from there first. basedir = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '..')) if (os.path.exists(os.path.join(basedir, 'setup.py')) and - os.path.exists(os.path.join(basedir, 'src', 'llfuse.pyx'))): + os.path.exists(os.path.join(basedir, 'src', 'pyfuse3.pyx'))): sys.path.insert(0, os.path.join(basedir, 'src')) from argparse import ArgumentParser import stat import logging import errno -import llfuse +import pyfuse3 try: import faulthandler @@ -50,23 +50,23 @@ log = logging.getLogger(__name__) -class TestFs(llfuse.Operations): +class TestFs(pyfuse3.Operations): def __init__(self): super(TestFs, self).__init__() self.hello_name = b"message" - self.hello_inode = llfuse.ROOT_INODE+1 + self.hello_inode = pyfuse3.ROOT_INODE+1 self.hello_data = b"hello world\n" def getattr(self, inode, ctx=None): - entry = llfuse.EntryAttributes() - if inode == llfuse.ROOT_INODE: + entry = pyfuse3.EntryAttributes() + if inode == pyfuse3.ROOT_INODE: entry.st_mode = (stat.S_IFDIR | 0o755) entry.st_size = 0 elif inode == self.hello_inode: entry.st_mode = (stat.S_IFREG | 0o644) entry.st_size = len(self.hello_data) else: - raise llfuse.FUSEError(errno.ENOENT) + raise pyfuse3.FUSEError(errno.ENOENT) stamp = int(1438467123.985654 * 1e9) entry.st_atime_ns = stamp @@ -79,17 +79,17 @@ def getattr(self, inode, ctx=None): return entry def lookup(self, parent_inode, name, ctx=None): - if parent_inode != llfuse.ROOT_INODE or name != self.hello_name: - raise llfuse.FUSEError(errno.ENOENT) + if parent_inode != pyfuse3.ROOT_INODE or name != self.hello_name: + raise pyfuse3.FUSEError(errno.ENOENT) return self.getattr(self.hello_inode) def opendir(self, inode, ctx): - if inode != llfuse.ROOT_INODE: - raise llfuse.FUSEError(errno.ENOENT) + if inode != pyfuse3.ROOT_INODE: + raise pyfuse3.FUSEError(errno.ENOENT) return inode def readdir(self, fh, off): - assert fh == llfuse.ROOT_INODE + assert fh == pyfuse3.ROOT_INODE # only one entry if off == 0: @@ -97,9 +97,9 @@ def readdir(self, fh, off): def open(self, inode, flags, ctx): if inode != self.hello_inode: - raise llfuse.FUSEError(errno.ENOENT) + raise pyfuse3.FUSEError(errno.ENOENT) if flags & os.O_RDWR or flags & os.O_WRONLY: - raise llfuse.FUSEError(errno.EPERM) + raise pyfuse3.FUSEError(errno.EPERM) return inode def read(self, fh, off, size): @@ -139,18 +139,18 @@ def main(): init_logging(options.debug) testfs = TestFs() - fuse_options = set(llfuse.default_options) + fuse_options = set(pyfuse3.default_options) fuse_options.add('fsname=lltest') if options.debug_fuse: fuse_options.add('debug') - llfuse.init(testfs, options.mountpoint, fuse_options) + pyfuse3.init(testfs, options.mountpoint, fuse_options) try: - llfuse.main(workers=1) + pyfuse3.main(workers=1) except: - llfuse.close(unmount=False) + pyfuse3.close(unmount=False) raise - llfuse.close() + pyfuse3.close() if __name__ == '__main__': diff --git a/examples/passthroughfs.py b/examples/passthroughfs.py index 996177c..e3bc975 100755 --- a/examples/passthroughfs.py +++ b/examples/passthroughfs.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 ''' -passthroughfs.py - Example file system for Python-LLFUSE +passthroughfs.py - Example file system for pyfuse3 This file system mirrors the contents of a specified directory tree. It requires Python 3.3 (since Python 2.x does not support the follow_symlinks parameters for @@ -44,19 +44,19 @@ import os import sys -# If we are running from the Python-LLFUSE source directory, try +# If we are running from the pyfuse3 source directory, try # to load the module from there first. basedir = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '..')) if (os.path.exists(os.path.join(basedir, 'setup.py')) and - os.path.exists(os.path.join(basedir, 'src', 'llfuse.pyx'))): + os.path.exists(os.path.join(basedir, 'src', 'pyfuse3.pyx'))): sys.path.insert(0, os.path.join(basedir, 'src')) -import llfuse +import pyfuse3 from argparse import ArgumentParser import errno import logging import stat as stat_m -from llfuse import FUSEError +from pyfuse3 import FUSEError from os import fsencode, fsdecode from collections import defaultdict @@ -65,11 +65,11 @@ log = logging.getLogger(__name__) -class Operations(llfuse.Operations): +class Operations(pyfuse3.Operations): def __init__(self, source): super().__init__() - self._inode_path_map = { llfuse.ROOT_INODE: source } + self._inode_path_map = { pyfuse3.ROOT_INODE: source } self._lookup_cnt = defaultdict(lambda : 0) self._fd_inode_map = dict() self._inode_fd_map = dict() @@ -140,7 +140,7 @@ def _getattr(self, path=None, fd=None): except OSError as exc: raise FUSEError(exc.errno) - entry = llfuse.EntryAttributes() + entry = pyfuse3.EntryAttributes() for attr in ('st_ino', 'st_mode', 'st_nlink', 'st_uid', 'st_gid', 'st_rdev', 'st_size', 'st_atime_ns', 'st_mtime_ns', 'st_ctime_ns'): @@ -345,8 +345,8 @@ def mkdir(self, inode_p, name, mode, ctx): return attr def statfs(self, ctx): - root = self._inode_path_map[llfuse.ROOT_INODE] - stat_ = llfuse.StatvfsData() + root = self._inode_path_map[pyfuse3.ROOT_INODE] + stat_ = pyfuse3.StatvfsData() try: statfs = os.statvfs(root) except OSError as exc: @@ -447,24 +447,24 @@ def main(): operations = Operations(options.source) log.debug('Mounting...') - fuse_options = set(llfuse.default_options) + fuse_options = set(pyfuse3.default_options) fuse_options.add('fsname=passthroughfs') if options.debug_fuse: fuse_options.add('debug') - llfuse.init(operations, options.mountpoint, fuse_options) + pyfuse3.init(operations, options.mountpoint, fuse_options) try: log.debug('Entering main loop..') if options.single: - llfuse.main(workers=1) + pyfuse3.main(workers=1) else: - llfuse.main() + pyfuse3.main() except: - llfuse.close(unmount=False) + pyfuse3.close(unmount=False) raise log.debug('Unmounting..') - llfuse.close() + pyfuse3.close() if __name__ == '__main__': main() diff --git a/examples/tmpfs.py b/examples/tmpfs.py index 0ff052b..e92d498 100755 --- a/examples/tmpfs.py +++ b/examples/tmpfs.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' -tmpfs.py - Example file system for Python-LLFUSE. +tmpfs.py - Example file system for pyfuse3. This file system stores all data in memory. It is compatible with both Python 2.x and 3.x. @@ -27,21 +27,21 @@ import os import sys -# If we are running from the Python-LLFUSE source directory, try +# If we are running from the pyfuse3 source directory, try # to load the module from there first. basedir = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '..')) if (os.path.exists(os.path.join(basedir, 'setup.py')) and - os.path.exists(os.path.join(basedir, 'src', 'llfuse.pyx'))): + os.path.exists(os.path.join(basedir, 'src', 'pyfuse3.pyx'))): sys.path.insert(0, os.path.join(basedir, 'src')) -import llfuse +import pyfuse3 import errno import stat from time import time import sqlite3 import logging from collections import defaultdict -from llfuse import FUSEError +from pyfuse3 import FUSEError from argparse import ArgumentParser try: @@ -60,7 +60,7 @@ def next(it): else: buffer = memoryview -class Operations(llfuse.Operations): +class Operations(pyfuse3.Operations): '''An example filesystem that stores all data in memory This is a very simple implementation with terrible performance. @@ -115,11 +115,11 @@ def init_tables(self): now_ns = int(time() * 1e9) self.cursor.execute("INSERT INTO inodes (id,mode,uid,gid,mtime_ns,atime_ns,ctime_ns) " "VALUES (?,?,?,?,?,?,?)", - (llfuse.ROOT_INODE, stat.S_IFDIR | stat.S_IRUSR | stat.S_IWUSR + (pyfuse3.ROOT_INODE, stat.S_IFDIR | stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH, os.getuid(), os.getgid(), now_ns, now_ns, now_ns)) self.cursor.execute("INSERT INTO contents (name, parent_inode, inode) VALUES (?,?,?)", - (b'..', llfuse.ROOT_INODE, llfuse.ROOT_INODE)) + (b'..', pyfuse3.ROOT_INODE, pyfuse3.ROOT_INODE)) def get_row(self, *a, **kw): @@ -148,7 +148,7 @@ def lookup(self, inode_p, name, ctx=None): inode = self.get_row("SELECT * FROM contents WHERE name=? AND parent_inode=?", (name, inode_p))['inode'] except NoSuchRowError: - raise(llfuse.FUSEError(errno.ENOENT)) + raise(pyfuse3.FUSEError(errno.ENOENT)) return self.getattr(inode, ctx) @@ -156,7 +156,7 @@ def lookup(self, inode_p, name, ctx=None): def getattr(self, inode, ctx=None): row = self.get_row('SELECT * FROM inodes WHERE id=?', (inode,)) - entry = llfuse.EntryAttributes() + entry = pyfuse3.EntryAttributes() entry.st_ino = inode entry.generation = 0 entry.entry_timeout = 300 @@ -198,7 +198,7 @@ def unlink(self, inode_p, name,ctx): entry = self.lookup(inode_p, name) if stat.S_ISDIR(entry.st_mode): - raise llfuse.FUSEError(errno.EISDIR) + raise pyfuse3.FUSEError(errno.EISDIR) self._remove(inode_p, name, entry) @@ -206,14 +206,14 @@ def rmdir(self, inode_p, name, ctx): entry = self.lookup(inode_p, name) if not stat.S_ISDIR(entry.st_mode): - raise llfuse.FUSEError(errno.ENOTDIR) + raise pyfuse3.FUSEError(errno.ENOTDIR) self._remove(inode_p, name, entry) def _remove(self, inode_p, name, entry): if self.get_row("SELECT COUNT(inode) FROM contents WHERE parent_inode=?", (entry.st_ino,))[0] > 0: - raise llfuse.FUSEError(errno.ENOTEMPTY) + raise pyfuse3.FUSEError(errno.ENOTEMPTY) self.cursor.execute("DELETE FROM contents WHERE name=? AND parent_inode=?", (name, inode_p)) @@ -232,7 +232,7 @@ def rename(self, inode_p_old, name_old, inode_p_new, name_new, ctx): try: entry_new = self.lookup(inode_p_new, name_new) - except llfuse.FUSEError as exc: + except pyfuse3.FUSEError as exc: if exc.errno != errno.ENOENT: raise target_exists = False @@ -252,7 +252,7 @@ def _replace(self, inode_p_old, name_old, inode_p_new, name_new, if self.get_row("SELECT COUNT(inode) FROM contents WHERE parent_inode=?", (entry_new.st_ino,))[0] > 0: - raise llfuse.FUSEError(errno.ENOTEMPTY) + raise pyfuse3.FUSEError(errno.ENOTEMPTY) self.cursor.execute("UPDATE contents SET inode=? WHERE name=? AND parent_inode=?", (entry_old.st_ino, name_new, inode_p_new)) @@ -316,7 +316,7 @@ def mkdir(self, inode_p, name, mode, ctx): return self._create(inode_p, name, mode, ctx) def statfs(self, ctx): - stat_ = llfuse.StatvfsData() + stat_ = pyfuse3.StatvfsData() stat_.f_bsize = 512 stat_.f_frsize = 512 @@ -436,18 +436,18 @@ def parse_args(): init_logging(options.debug) operations = Operations() - fuse_options = set(llfuse.default_options) + fuse_options = set(pyfuse3.default_options) fuse_options.add('fsname=tmpfs') fuse_options.discard('default_permissions') if options.debug_fuse: fuse_options.add('debug') - llfuse.init(operations, options.mountpoint, fuse_options) + pyfuse3.init(operations, options.mountpoint, fuse_options) # sqlite3 does not support multithreading try: - llfuse.main(workers=1) + pyfuse3.main(workers=1) except: - llfuse.close(unmount=False) + pyfuse3.close(unmount=False) raise - llfuse.close() + pyfuse3.close() diff --git a/rst/conf.py b/rst/conf.py index 2290db6..20da309 100644 --- a/rst/conf.py +++ b/rst/conf.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Python-LLFUSE documentation build configuration file, created by +# pyfuse3 documentation build configuration file, created by # sphinx-quickstart on Sat Oct 16 14:14:40 2010. # # This file is execfile()d with the current directory set to its containing dir. @@ -47,7 +47,7 @@ nitpicky = True # General information about the project. -project = u'Python-LLFUSE' +project = u'pyfuse3' copyright = u'2010-2015, Nikolaus Rath' # The version info for the project you're documenting, acts as replacement for @@ -171,7 +171,7 @@ #html_file_suffix = '' # Output file base name for HTML help builder. -htmlhelp_basename = 'llfusedoc' +htmlhelp_basename = 'pyfuse3doc' # -- Options for LaTeX output -------------------------------------------------- @@ -185,7 +185,7 @@ # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'llfuse.tex', u'Python-LLFUSE Documentation', + ('index', 'pyfuse3.tex', u'pyfuse3 Documentation', u'Nikolaus Rath', 'manual'), ] diff --git a/rst/data.rst b/rst/data.rst index a07d146..96f0e58 100644 --- a/rst/data.rst +++ b/rst/data.rst @@ -2,12 +2,12 @@ Data Structures ================= -.. currentmodule:: llfuse +.. currentmodule:: pyfuse3 .. py:data:: ENOATTR This errorcode is unfortunately missing in the `errno` module, - so it is provided by Python-LLFUSE instead. + so it is provided by pyfuse3 instead. .. py:data:: ROOT_INODE @@ -17,8 +17,8 @@ .. py:data:: default_options This is a recommended set of options that should be passed to - `llfuse.init` to get reasonable behavior and - performance. Python-LLFUSE is compatible with any other combination + `pyfuse3.init` to get reasonable behavior and + performance. pyfuse3 is compatible with any other combination of options as well, but you should only deviate from the defaults with good reason. diff --git a/rst/example.rst b/rst/example.rst index 0855778..3d9bb8a 100644 --- a/rst/example.rst +++ b/rst/example.rst @@ -4,7 +4,7 @@ Example File Systems ====================== -Python-LLFUSE comes with several example file systems in the +pyfuse3 comes with several example file systems in the :file:`examples` directory of the release tarball. For completeness, these examples are also included here. diff --git a/rst/fuse_api.rst b/rst/fuse_api.rst index a239f90..962badc 100644 --- a/rst/fuse_api.rst +++ b/rst/fuse_api.rst @@ -2,7 +2,7 @@ FUSE API Functions ==================== -.. currentmodule:: llfuse +.. currentmodule:: pyfuse3 .. autofunction:: init .. autofunction:: main diff --git a/rst/general.rst b/rst/general.rst index 700df2a..e409548 100644 --- a/rst/general.rst +++ b/rst/general.rst @@ -2,24 +2,24 @@ General Information ===================== -.. currentmodule:: llfuse +.. currentmodule:: pyfuse3 .. _getting_started: Getting started =============== -A file system is implemented by subclassing the `llfuse.Operations` +A file system is implemented by subclassing the `pyfuse3.Operations` class and implementing the various request handlers. The handlers respond to requests received from the FUSE kernel module and perform functions like looking up the inode given a file name, looking up attributes of an inode, opening a (file) inode for reading or writing or listing the contents of a (directory) inode. -An instance of the operations class is passed to `llfuse.init` to +An instance of the operations class is passed to `pyfuse3.init` to mount the file system. To enter the request handling loop, run -`llfuse.main`. This function will return when the file system should -be unmounted again, which is done by calling `llfuse.close`. +`pyfuse3.main`. This function will return when the file system should +be unmounted again, which is done by calling `pyfuse3.close`. All character data (directory entry names, extended attribute names and values, symbolic link targets etc) are passed as `bytes` and must @@ -27,7 +27,7 @@ be returned as `bytes`. This applies to both running under Python 2.x and 3.x For easier debugging, it is strongly recommended that applications -using Python-LLFUSE also make use of the faulthandler_ module. +using pyfuse3 also make use of the faulthandler_ module. .. _faulthandler: http://docs.python.org/3/library/faulthandler.html @@ -73,7 +73,7 @@ file systems automatically take advantage of. Specifically: concurrently, but never at the same time as e.g. a rename or mkdir operation). -* Unless writeback caching is enabled (which Python-LLFUSE does not +* Unless writeback caching is enabled (which pyfuse3 does not yet allow), calls to `~Operations.write` for the same inode are automatically serialized (i.e., there are never concurrent calls for the same inode even when multithreading is enabled). diff --git a/rst/gotchas.rst b/rst/gotchas.rst index ff09f54..709bd53 100644 --- a/rst/gotchas.rst +++ b/rst/gotchas.rst @@ -2,7 +2,7 @@ Common Gotchas ================ -.. currentmodule:: llfuse +.. currentmodule:: pyfuse3 This chapter lists some common gotchas that should be avoided. diff --git a/rst/index.rst b/rst/index.rst index 501cfb6..0827388 100644 --- a/rst/index.rst +++ b/rst/index.rst @@ -1,11 +1,11 @@ ============================= - Python-LLFUSE Documentation + pyfuse3 Documentation ============================= Table of Contents ----------------- -.. module:: llfuse +.. module:: pyfuse3 .. toctree:: :maxdepth: 1 diff --git a/rst/install.rst b/rst/install.rst index a1da692..dc9c141 100644 --- a/rst/install.rst +++ b/rst/install.rst @@ -8,7 +8,7 @@ Dependencies ============ -In order to build and run Python-LLFUSE you need the following software: +In order to build and run pyfuse3 you need the following software: * Linux, FreeBSD, NetBSD or MacOS X system * Python_ 2.6 or newer (including Python 3.x), installed with @@ -45,13 +45,13 @@ For OS-X, you need: Stable releases =============== -To install a stable Python-LLFUSE release: +To install a stable pyfuse3 release: -1. Download and unpack the release tarball from https://pypi.python.org/pypi/llfuse/ +1. Download and unpack the release tarball from https://pypi.python.org/pypi/pyfuse3/ 2. Run ``python setup.py build_ext --inplace`` to build the C extension 3. Run ``python -m pytest test/`` to run a self-test. If this fails, ask for help on the `FUSE mailing list`_ or report a bug in the - `issue tracker `_. + `issue tracker `_. 4. To install system-wide for all users, run ``sudo python setup.py install``. To install into :file:`~/.local`, run ``python setup.py install --user``. @@ -60,10 +60,9 @@ To install a stable Python-LLFUSE release: Development Version =================== -If you have checked out the unstable development version from the -repository ( Mercurial_ or Git_ ), a bit more effort is required. You need to also -have Cython_ (0.24 or newer) and Sphinx_ (1.1 or newer) installed, and -the necessary commands are:: +If you have checked out the unstable development version, a bit more +effort is required. You need to also have Cython_ (0.24 or newer) and +Sphinx_ (1.1 or newer) installed, and the necessary commands are:: python setup.py build_cython python setup.py build_ext --inplace @@ -84,5 +83,3 @@ the necessary commands are:: .. _OSXFUSE: http://osxfuse.github.io/ .. _setuptools: https://pypi.python.org/pypi/setuptools .. _contextlib2: https://pypi.python.org/pypi/contextlib2/ -.. _Mercurial: https://bitbucket.org/nikratio/python-llfuse -.. _Git: https://github.com/python-llfuse/python-llfuse diff --git a/rst/lock.rst b/rst/lock.rst index e4c3de1..e30f82d 100644 --- a/rst/lock.rst +++ b/rst/lock.rst @@ -2,9 +2,9 @@ The global lock ================= -.. currentmodule:: llfuse +.. currentmodule:: pyfuse3 -Python-LLFUSE uses a global lock to synchronize concurrent requests. Since +pyfuse3 uses a global lock to synchronize concurrent requests. Since the GIL already enforces that Python threads do not run concurrently, this does not result in any additional performance penalties. However, the use of an explicit lock allows direct control over which Python @@ -28,7 +28,7 @@ indirectly releases the lock is explicitly marked as such. The global lock is controlled with the `lock` and `lock_released` -attributes of the `llfuse` module: +attributes of the `pyfuse3` module: .. py:attribute:: lock_released @@ -43,16 +43,15 @@ attributes of the `llfuse` module: with the global lock acquired. Note that this object resembles a ``threading.Lock`` instance but - is an instance of the `llfuse.Lock` class which is quite different from + is an instance of the `pyfuse3.Lock` class which is quite different from ``threading.Lock``. The `lock` object has the following methods: -.. class:: llfuse.Lock +.. class:: pyfuse3.Lock .. automethod:: Lock.acquire() .. automethod:: Lock.release .. automethod:: Lock.yield_ - diff --git a/rst/operations.rst b/rst/operations.rst index 290049a..befb23a 100644 --- a/rst/operations.rst +++ b/rst/operations.rst @@ -4,8 +4,7 @@ (You can use the :ref:`genindex` to directly jump to a specific handler). -.. currentmodule:: llfuse +.. currentmodule:: pyfuse3 .. autoclass:: Operations :members: - diff --git a/rst/util.rst b/rst/util.rst index 66f1f9e..23f5665 100644 --- a/rst/util.rst +++ b/rst/util.rst @@ -6,7 +6,7 @@ The following functions do not necessarily translate to calls to the FUSE library. They are provided because they're potentially useful when implementing file systems in Python. -.. currentmodule:: llfuse +.. currentmodule:: pyfuse3 .. autofunction:: setxattr .. autofunction:: getxattr diff --git a/setup.py b/setup.py index f8a1f6e..dfab60b 100755 --- a/setup.py +++ b/setup.py @@ -3,11 +3,11 @@ ''' setup.py -Installation script for Python-LLFUSE. +Installation script for pyfuse3. Copyright (c) 2010 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' @@ -46,7 +46,7 @@ basedir = os.path.abspath(os.path.dirname(sys.argv[0])) sys.path.insert(0, os.path.join(basedir, 'util')) -# When running from HG repo, enable all warnings +# When running from Git repo, enable all warnings DEVELOPER_MODE = os.path.exists(os.path.join(basedir, 'MANIFEST.in')) if DEVELOPER_MODE: print('found MANIFEST.in, running in developer mode') @@ -59,7 +59,7 @@ # to work properly sys.path.insert(0, os.path.join(basedir, 'src')) -LLFUSE_VERSION = '1.3.5' +PYFUSE3_VERSION = '0.1' def main(): @@ -75,7 +75,7 @@ def main(): compile_args = pkg_config('fuse', cflags=True, ldflags=False, min_ver='2.8.0') compile_args += ['-DFUSE_USE_VERSION=29', '-Wall', '-Wextra', '-Wconversion', - '-Wsign-compare', '-DLLFUSE_VERSION="%s"' % LLFUSE_VERSION] + '-Wsign-compare', '-DPYFUSE3_VERSION="%s"' % PYFUSE3_VERSION] # We may have unused functions if we compile for older FUSE versions compile_args.append('-Wno-unused-function') @@ -85,9 +85,10 @@ def main(): compile_args.append('-Wno-implicit-fallthrough') # Due to platform specific conditions, these are unavoidable + compile_args.append('-Wno-unused-function') compile_args.append('-Wno-unused-parameter') - # Enable all fatal warnings only when compiling from Mercurial tip. + # Enable all fatal warnings only in developer mode. # (otherwise we break forward compatibility because compilation with newer # compiler may fail if additional warnings are added) if DEVELOPER_MODE: @@ -116,7 +117,7 @@ def main(): link_args = pkg_config('fuse', cflags=False, ldflags=True, min_ver='2.8.0') link_args.append('-lpthread') - c_sources = ['src/llfuse.c', 'src/lock.c'] + c_sources = ['src/pyfuse3.c', 'src/lock.c'] if os.uname()[0] in ('Linux', 'GNU/kFreeBSD'): link_args.append('-lrt') @@ -128,15 +129,14 @@ def main(): install_requires.append('contextlib2') setuptools.setup( - name='llfuse', + name='pyfuse3', zip_safe=True, - version=LLFUSE_VERSION, - description='Python bindings for the low-level FUSE API', + version=PYFUSE3_VERSION, + description='Python 3 bindings for libfuse 3', long_description=long_desc, author='Nikolaus Rath', author_email='Nikolaus@rath.org', - url='https://bitbucket.org/nikratio/python-llfuse/', - download_url='https://bitbucket.org/nikratio/python-llfuse/downloads', + url='https://github.com/libfuse/pyfuse3', license='LGPL', classifiers=['Development Status :: 4 - Beta', 'Intended Audience :: Developers', @@ -151,16 +151,16 @@ def main(): keywords=['FUSE', 'python' ], package_dir={'': 'src'}, packages=setuptools.find_packages('src'), - provides=['llfuse'], - ext_modules=[Extension('llfuse', c_sources, + provides=['pyfuse3'], + ext_modules=[Extension('pyfuse3', c_sources, extra_compile_args=compile_args, extra_link_args=link_args)], cmdclass={'upload_docs': upload_docs, 'build_cython': build_cython }, command_options={ 'build_sphinx': { - 'version': ('setup.py', LLFUSE_VERSION), - 'release': ('setup.py', LLFUSE_VERSION), + 'version': ('setup.py', PYFUSE3_VERSION), + 'release': ('setup.py', PYFUSE3_VERSION), }}, install_requires=install_requires, ) @@ -210,7 +210,7 @@ def finalize_options(self): def run(self): subprocess.check_call(['rsync', '-aHv', '--del', os.path.join(basedir, 'doc', 'html') + '/', - 'ebox.rath.org:/srv/www.rath.org/llfuse-docs/']) + 'ebox.rath.org:/srv/www.rath.org/pyfuse3-docs/']) class build_cython(setuptools.Command): user_options = [] diff --git a/src/fuse_api.pxi b/src/fuse_api.pxi index 48bda30..e101c82 100644 --- a/src/fuse_api.pxi +++ b/src/fuse_api.pxi @@ -2,11 +2,11 @@ fuse_api.pxi This file defines the Python bindings to common FUSE API functions. -It is included by llfuse.pyx. +It is included by pyfuse3.pyx. Copyright © 2013 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' @@ -74,7 +74,7 @@ def setxattr(path, name, bytes value, namespace='user'): parameter is ignored. In contrast to the `os.setxattr` function from the standard library, the - method provided by Python-LLFUSE is also available for non-Linux systems. + method provided by pyfuse3 is also available for non-Linux systems. ''' if not isinstance(path, str_t): @@ -130,7 +130,7 @@ def getxattr(path, name, size_t size_guess=128, namespace='user'): parameter is ignored. In contrast to the `os.getxattr` function from the standard library, the - method provided by Python-LLFUSE is also available for non-Linux systems. + method provided by pyfuse3 is also available for non-Linux systems. ''' if not isinstance(path, str_t): @@ -209,10 +209,10 @@ def init(ops, mountpoint, options=default_options): reasonable defaults. It is recommended to use these options as a basis and add or remove options as necessary. For example:: - my_opts = set(llfuse.default_options) + my_opts = set(pyfuse3.default_options) my_opts.add('allow_other') my_opts.discard('default_permissions') - llfuse.init(ops, mountpoint, my_opts) + pyfuse3.init(ops, mountpoint, my_opts) Valid options are listed under ``struct fuse_opt fuse_mount_opts[]`` @@ -221,7 +221,7 @@ def init(ops, mountpoint, options=default_options): (`fuse_lowlevel_c:2626 `_). ''' - log.debug('Initializing llfuse') + log.debug('Initializing pyfuse3') cdef fuse_args f_args if not isinstance(mountpoint, str_t): @@ -258,7 +258,7 @@ def main(workers=None, handle_signals=True): '''Run FUSE main loop *workers* specifies the number of threads that will process requests - concurrently. If *workers* is `None`, llfuse will pick a reasonable + concurrently. If *workers* is `None`, pyfuse3 will pick a reasonable number bigger than one. If *workers* is ``1`` all requests will be processed by the thread calling `main`. diff --git a/src/gettime.h b/src/gettime.h index 3e6f569..f22d8c6 100644 --- a/src/gettime.h +++ b/src/gettime.h @@ -5,7 +5,7 @@ * * Copyright © 2015 Nikolaus Rath * - * This file is part of Python-LLFUSE. This work may be distributed under the + * This file is part of pyfuse3. This work may be distributed under the * terms of the GNU LGPL. */ diff --git a/src/handlers.pxi b/src/handlers.pxi index 24604d7..c136970 100644 --- a/src/handlers.pxi +++ b/src/handlers.pxi @@ -2,11 +2,11 @@ handlers.pxi This file defines the FUSE request handlers. It is included -by llfuse.pyx. +by pyfuse3.pyx. Copyright © 2013 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' diff --git a/src/lock.c b/src/lock.c index 0abe341..1e5f17f 100644 --- a/src/lock.c +++ b/src/lock.c @@ -5,7 +5,7 @@ This file provides the plain C components for the global lock. Copyright © 2013 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. */ diff --git a/src/lock.h b/src/lock.h index f57c623..2b47a37 100644 --- a/src/lock.h +++ b/src/lock.h @@ -3,13 +3,13 @@ lock.h - Header file for lock.c Copyright © 2015 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. */ -#ifndef _LLFUSE_LOCK_H_ -#define _LLFUSE_LOCK_H_ +#ifndef _PYFUSE3_LOCK_H_ +#define _PYFUSE3_LOCK_H_ #include @@ -19,4 +19,4 @@ int c_yield(int count); void init_lock(void); -#endif /* _LLFUSE_LOCK_H_ */ +#endif /* _PYFUSE3_LOCK_H_ */ diff --git a/src/macros.c b/src/macros.c index ce18ae0..594ed79 100644 --- a/src/macros.c +++ b/src/macros.c @@ -3,7 +3,7 @@ macros.c - Pre-processor macros Copyright © 2013 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. */ diff --git a/src/misc.pxi b/src/misc.pxi index bd25cda..810cec7 100644 --- a/src/misc.pxi +++ b/src/misc.pxi @@ -2,11 +2,11 @@ misc.pxi This file defines various functions that are used internally by -LLFUSE. It is included by llfuse.pyx. +PYFUSE3. It is included by pyfuse3.pyx. Copyright © 2013 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' @@ -26,7 +26,7 @@ cdef int handle_exc(fuse_req_t req): exc_info[0], exc_info[1]) fuse_session_exit(session) else: - log.exception('Only one exception can be re-raised in `llfuse.main`, ' + log.exception('Only one exception can be re-raised in `pyfuse3.main`, ' 'the following exception will be lost') pthread_mutex_unlock(&exc_info_mutex) @@ -101,7 +101,7 @@ cdef make_fuse_args(args, fuse_args* f_args): cdef ssize_t size_s cdef size_t size - args_new = [ b'Python-LLFUSE' ] + args_new = [ b'pyfuse3' ] for el in args: args_new.append(b'-o') args_new.append(el.encode('us-ascii')) diff --git a/src/operations.pxi b/src/operations.pxi index 59ed2ad..49c8a06 100644 --- a/src/operations.pxi +++ b/src/operations.pxi @@ -4,14 +4,14 @@ operations.pxi Copyright © 2013 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' class Operations(object): ''' This class defines the general and request handler methods that an - Python-LLFUSE file system may implement. If a particular request handler has + pyfuse3 file system may implement. If a particular request handler has not been implemented, it must raise `FUSEError` with an errorcode of `errno.ENOSYS`. Further requests of this type will then be handled directly by the FUSE kernel module without calling the handler again. @@ -38,7 +38,7 @@ class Operations(object): def destroy(self): '''Clean up operations. - This method will be called when `llfuse.close` has been called and the + This method will be called when `pyfuse3.close` has been called and the file system is about to be unmounted. This method must not raise any exceptions (not even `FUSEError`), since diff --git a/src/llfuse.h b/src/pyfuse3.h similarity index 91% rename from src/llfuse.h rename to src/pyfuse3.h index 6e0b5e0..2e094e3 100644 --- a/src/llfuse.h +++ b/src/pyfuse3.h @@ -1,9 +1,9 @@ /* -llfuse.h +pyfuse3.h Copyright © 2013 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. */ diff --git a/src/llfuse.pyx b/src/pyfuse3.pyx similarity index 95% rename from src/llfuse.pyx rename to src/pyfuse3.pyx index bd9bc68..0e7b890 100644 --- a/src/llfuse.pyx +++ b/src/pyfuse3.pyx @@ -1,13 +1,13 @@ ''' -llfuse.pxy +pyfuse3.pxy Copyright © 2013 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' -cdef extern from "llfuse.h": +cdef extern from "pyfuse3.h": int PLATFORM enum: PLATFORM_LINUX @@ -100,7 +100,7 @@ cdef extern from "Python.h" nogil: # Actually passed as -D to cc (and defined in setup.py) cdef extern from *: - char* LLFUSE_VERSION + char* PYFUSE3_VERSION ################ # PYTHON IMPORTS @@ -126,7 +126,7 @@ else: # GLOBAL VARIABLES ################## -log = logging.getLogger("llfuse") +log = logging.getLogger("pyfuse3") fse = sys.getfilesystemencoding() cdef object operations @@ -149,7 +149,7 @@ _notify_queue = Queue(maxsize=1000) # (in the Cython source, we want ENOATTR to refer # to the C constant, not a Python object) ROOT_INODE = FUSE_ROOT_ID -__version__ = LLFUSE_VERSION.decode('utf-8') +__version__ = PYFUSE3_VERSION.decode('utf-8') globals()['ENOATTR'] = ENOATTR ####################### diff --git a/src/xattr.h b/src/xattr.h index c137723..ab99d41 100644 --- a/src/xattr.h +++ b/src/xattr.h @@ -5,7 +5,7 @@ * * Copyright © 2015 Nikolaus Rath * - * This file is part of Python-LLFUSE. This work may be distributed under the + * This file is part of pyfuse3. This work may be distributed under the * terms of the GNU LGPL. */ diff --git a/test/conftest.py b/test/conftest.py index fa19c6a..e33e119 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -50,17 +50,17 @@ def pytest_configure(config): # modules from here basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) if not config.getoption('installed'): - llfuse_path = os.path.join(basedir, 'src') + pyfuse3_path = os.path.join(basedir, 'src') if (os.path.exists(os.path.join(basedir, 'setup.py')) and - os.path.exists(os.path.join(basedir, 'src', 'llfuse.pyx'))): - sys.path.insert(0, llfuse_path) + os.path.exists(os.path.join(basedir, 'src', 'pyfuse3.pyx'))): + sys.path.insert(0, pyfuse3_path) # Make sure that called processes use the same path pp = os.environ.get('PYTHONPATH', None) if pp: - pp = '%s:%s' % (llfuse_path, pp) + pp = '%s:%s' % (pyfuse3_path, pp) else: - pp = llfuse_path + pp = pyfuse3_path os.environ['PYTHONPATH'] = pp try: diff --git a/test/test_api.py b/test/test_api.py index 92fab37..2a5b960 100755 --- a/test/test_api.py +++ b/test/test_api.py @@ -1,11 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' -test_api.py - Unit tests for Python-LLFUSE. +test_api.py - Unit tests for pyfuse3. Copyright © 2015 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' @@ -16,7 +16,7 @@ import sys sys.exit(pytest.main([__file__] + sys.argv[1:])) -import llfuse +import pyfuse3 import tempfile import os import errno @@ -25,24 +25,24 @@ from pickle import PicklingError def test_inquire_bits(): - assert 0 < llfuse.get_ino_t_bits() < 256 - assert 0 < llfuse.get_off_t_bits() < 256 + assert 0 < pyfuse3.get_ino_t_bits() < 256 + assert 0 < pyfuse3.get_off_t_bits() < 256 def test_listdir(): # There is a race-condition here if /usr/bin is modified while the test # runs - but hopefully this is sufficiently rare. list1 = set(os.listdir('/usr/bin')) - list2 = set(llfuse.listdir('/usr/bin')) + list2 = set(pyfuse3.listdir('/usr/bin')) assert list1 == list2 def test_sup_groups(): - gids = llfuse.get_sup_groups(os.getpid()) + gids = pyfuse3.get_sup_groups(os.getpid()) gids2 = set(os.getgroups()) assert gids == gids2 def _getxattr_helper(path, name): try: - value = llfuse.getxattr(path, name) + value = pyfuse3.getxattr(path, name) except OSError as exc: errno = exc.errno value = None @@ -61,7 +61,7 @@ def _getxattr_helper(path, name): return value def test_entry_res(): - a = llfuse.EntryAttributes() + a = pyfuse3.EntryAttributes() val = 1000.2735 a.st_atime_ns = val*1e9 assert a.st_atime_ns / 1e9 == val @@ -73,7 +73,7 @@ def test_xattr(): value = b'a nice little bytestring' try: - llfuse.setxattr(fh.name, key, value) + pyfuse3.setxattr(fh.name, key, value) except OSError as exc: if exc.errno == errno.ENOTSUP: pytest.skip('ACLs not supported for %s' % fh.name) @@ -91,17 +91,17 @@ def test_xattr(): def test_copy(): - for obj in (llfuse.SetattrFields(), - llfuse.RequestContext(), - llfuse.lock, - llfuse.lock_released): + for obj in (pyfuse3.SetattrFields(), + pyfuse3.RequestContext(), + pyfuse3.lock, + pyfuse3.lock_released): pytest.raises(PicklingError, copy, obj) - for (inst, attr) in ((llfuse.EntryAttributes(), 'st_mode'), - (llfuse.StatvfsData(), 'f_files')): + for (inst, attr) in ((pyfuse3.EntryAttributes(), 'st_mode'), + (pyfuse3.StatvfsData(), 'f_files')): setattr(inst, attr, 42) inst_copy = copy(inst) assert getattr(inst, attr) == getattr(inst_copy, attr) - inst = llfuse.FUSEError(10) + inst = pyfuse3.FUSEError(10) assert inst.errno == copy(inst).errno diff --git a/test/test_examples.py b/test/test_examples.py index d4c75ed..3f55f9b 100755 --- a/test/test_examples.py +++ b/test/test_examples.py @@ -1,11 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' -test_examples.py - Unit tests for Python-LLFUSE. +test_examples.py - Unit tests for pyfuse3. Copyright © 2015 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' diff --git a/test/test_fs.py b/test/test_fs.py index 7bbd419..f54fa26 100755 --- a/test/test_fs.py +++ b/test/test_fs.py @@ -1,11 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' -test_fs.py - Unit tests for Python-LLFUSE. +test_fs.py - Unit tests for pyfuse3. Copyright © 2015 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' @@ -16,8 +16,8 @@ if __name__ == '__main__': sys.exit(pytest.main([__file__] + sys.argv[1:])) -import llfuse -from llfuse import FUSEError +import pyfuse3 +from pyfuse3 import FUSEError import multiprocessing import os import errno @@ -72,7 +72,7 @@ def test_invalidate_entry(testfs): # kernel has processed the forget() request, so we # wait longer and longer until it works. def check(_wait_time=[0.01]): - llfuse.setxattr(mnt_dir, 'command', b'forget_entry') + pyfuse3.setxattr(mnt_dir, 'command', b'forget_entry') time.sleep(_wait_time[0]) fs_state.lookup_called = False os.stat(path) @@ -94,7 +94,7 @@ def test_invalidate_inode(testfs): # kernel has processed the forget() request, so we # wait longer and longer until it works. def check(_wait_time=[0.01]): - llfuse.setxattr(mnt_dir, 'command', b'forget_inode') + pyfuse3.setxattr(mnt_dir, 'command', b'forget_inode') time.sleep(_wait_time[0]) fs_state.read_called = False fh.seek(0) @@ -106,7 +106,7 @@ def check(_wait_time=[0.01]): def test_notify_store(testfs): (mnt_dir, fs_state) = testfs with open(os.path.join(mnt_dir, 'message'), 'r') as fh: - llfuse.setxattr(mnt_dir, 'command', b'store') + pyfuse3.setxattr(mnt_dir, 'command', b'store') fs_state.read_called = False assert fh.read() == 'hello world\n' assert not fs_state.read_called @@ -142,11 +142,11 @@ def test_attr_timeout(testfs): os.fstat(fh.fileno()) assert fs_state.getattr_called -class Fs(llfuse.Operations): +class Fs(pyfuse3.Operations): def __init__(self, cross_process): super(Fs, self).__init__() self.hello_name = b"message" - self.hello_inode = llfuse.ROOT_INODE+1 + self.hello_inode = pyfuse3.ROOT_INODE+1 self.hello_data = b"hello world\n" self.status = cross_process self.lookup_cnt = 0 @@ -157,15 +157,15 @@ def __init__(self, cross_process): self.status.attr_timeout = 2 def getattr(self, inode, ctx=None): - entry = llfuse.EntryAttributes() - if inode == llfuse.ROOT_INODE: + entry = pyfuse3.EntryAttributes() + if inode == pyfuse3.ROOT_INODE: entry.st_mode = (stat.S_IFDIR | 0o755) entry.st_size = 0 elif inode == self.hello_inode: entry.st_mode = (stat.S_IFREG | 0o644) entry.st_size = len(self.hello_data) else: - raise llfuse.FUSEError(errno.ENOENT) + raise pyfuse3.FUSEError(errno.ENOENT) stamp = int(1438467123.985654*1e9) entry.st_atime_ns = stamp @@ -186,30 +186,30 @@ def forget(self, inode_list): self.lookup_cnt -= 1 assert self.lookup_cnt >= 0 else: - assert inode == llfuse.ROOT_INODE + assert inode == pyfuse3.ROOT_INODE def lookup(self, parent_inode, name, ctx=None): - if parent_inode != llfuse.ROOT_INODE or name != self.hello_name: - raise llfuse.FUSEError(errno.ENOENT) + if parent_inode != pyfuse3.ROOT_INODE or name != self.hello_name: + raise pyfuse3.FUSEError(errno.ENOENT) self.lookup_cnt += 1 self.status.lookup_called = True return self.getattr(self.hello_inode) def opendir(self, inode, ctx): - if inode != llfuse.ROOT_INODE: - raise llfuse.FUSEError(errno.ENOENT) + if inode != pyfuse3.ROOT_INODE: + raise pyfuse3.FUSEError(errno.ENOENT) return inode def readdir(self, fh, off): - assert fh == llfuse.ROOT_INODE + assert fh == pyfuse3.ROOT_INODE if off == 0: yield (self.hello_name, self.getattr(self.hello_inode), 1) def open(self, inode, flags, ctx): if inode != self.hello_inode: - raise llfuse.FUSEError(errno.ENOENT) + raise pyfuse3.FUSEError(errno.ENOENT) if flags & os.O_RDWR or flags & os.O_WRONLY: - raise llfuse.FUSEError(errno.EPERM) + raise pyfuse3.FUSEError(errno.EPERM) return inode def read(self, fh, off, size): @@ -218,15 +218,15 @@ def read(self, fh, off, size): return self.hello_data[off:off+size] def setxattr(self, inode, name, value, ctx): - if inode != llfuse.ROOT_INODE or name != b'command': + if inode != pyfuse3.ROOT_INODE or name != b'command': raise FUSEError(errno.ENOTSUP) if value == b'forget_entry': - llfuse.invalidate_entry(llfuse.ROOT_INODE, self.hello_name) + pyfuse3.invalidate_entry(pyfuse3.ROOT_INODE, self.hello_name) elif value == b'forget_inode': - llfuse.invalidate_inode(self.hello_inode) + pyfuse3.invalidate_inode(self.hello_inode) elif value == b'store': - llfuse.notify_store(self.hello_inode, offset=0, + pyfuse3.notify_store(self.hello_inode, offset=0, data=self.hello_data) else: raise FUSEError(errno.EINVAL) @@ -245,10 +245,10 @@ def run_fs(mountpoint, cross_process): root_logger.setLevel(logging.DEBUG) testfs = Fs(cross_process) - fuse_options = set(llfuse.default_options) - fuse_options.add('fsname=llfuse_testfs') - llfuse.init(testfs, mountpoint, fuse_options) + fuse_options = set(pyfuse3.default_options) + fuse_options.add('fsname=pyfuse3_testfs') + pyfuse3.init(testfs, mountpoint, fuse_options) try: - llfuse.main(workers=1) + pyfuse3.main(workers=1) finally: - llfuse.close() + pyfuse3.close() diff --git a/test/util.py b/test/util.py index 0afff42..41de7e0 100644 --- a/test/util.py +++ b/test/util.py @@ -1,11 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' -util.py - Utility functions for Python-LLFUSE unit tests. +util.py - Utility functions for pyfuse3 unit tests. Copyright © 2015 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. ''' diff --git a/util/sphinx_cython.py b/util/sphinx_cython.py index 5ce9f17..277f612 100644 --- a/util/sphinx_cython.py +++ b/util/sphinx_cython.py @@ -7,7 +7,7 @@ Copyright © 2010 Nikolaus Rath -This file is part of Python-LLFUSE. This work may be distributed under +This file is part of pyfuse3. This work may be distributed under the terms of the GNU LGPL. '''