diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2bf34a8..d95487b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,13 +11,13 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14-dev"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] cython-version: ["0.29", "3"] os: [ubuntu-24.04] exclude: - python-version: "3.13" cython-version: "0.29" - - python-version: "3.14-dev" + - python-version: "3.14" cython-version: "0.29" steps: diff --git a/Changes.rst b/Changes.rst index 9af791f..b49f05f 100644 --- a/Changes.rst +++ b/Changes.rst @@ -6,6 +6,21 @@ **WARNING**: Python-LLFUSE is no longer actively developed. +Release 1.5.2 (2025-12-22) +========================== + +- Support and test on Python 3.14 also. +- CI: test on Ubuntu 24.04 +- Cythonized using Cython 3.2.3. +- setup.py: + + - use SPDX license metadata (the old style was deprecated), + also require setuptools >= 78.1.1, #104 + - remove tests_require (not supported anymore) +- get rid of sphinx build warnings, #56 +- README: link to mfusepy project + + Release 1.5.1 (2024-08-31) ========================== diff --git a/README.rst b/README.rst index 3dbcfb4..46ec1cc 100644 --- a/README.rst +++ b/README.rst @@ -14,6 +14,8 @@ The Python-LLFUSE Module Python-LLFUSE is no longer actively developed and just receiving community-contributed maintenance to keep it alive for some time. +A good alternative for some use cases might be `mfusepy `_. + 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, diff --git a/pyproject.toml b/pyproject.toml index fed528d..ef5db1b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,3 @@ [build-system] -requires = ["setuptools"] +requires = ["setuptools >= 78.1.1"] build-backend = "setuptools.build_meta" diff --git a/rst/conf.py b/rst/conf.py index 13f7835..7b2bf5d 100644 --- a/rst/conf.py +++ b/rst/conf.py @@ -52,14 +52,14 @@ # General information about the project. project = 'Python-LLFUSE' -copyright = '2010-2024, Nikolaus Rath' +copyright = '2010-2025, Nikolaus Rath' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = '1.5.1' +version = '1.5.2' # The full version, including alpha/beta/rc tags. release = version + '' diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index e69de29..0000000 diff --git a/setup.py b/setup.py index 9654af7..6e09f10 100755 --- a/setup.py +++ b/setup.py @@ -47,7 +47,7 @@ warnings.simplefilter('default') -LLFUSE_VERSION = '1.5.1' +LLFUSE_VERSION = '1.5.2' def main(): @@ -105,7 +105,8 @@ def main(): author='Nikolaus Rath', author_email='Nikolaus@rath.org', url='https://github.com/python-llfuse/python-llfuse/', - license='LGPL', + license='LGPL-2.0-or-later', + license_files=['LICENSE'], classifiers=['Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'Programming Language :: Python', @@ -119,7 +120,6 @@ def main(): 'Programming Language :: Python :: 3.14', 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: System :: Filesystems', - 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', 'Operating System :: POSIX :: Linux', 'Operating System :: MacOS :: MacOS X', 'Operating System :: POSIX :: BSD :: FreeBSD'], @@ -128,7 +128,6 @@ def main(): package_dir={'': 'src'}, packages=setuptools.find_packages('src'), python_requires='>=3.8', - tests_require=['pytest >= 3.4.0'], provides=['llfuse'], ext_modules=[Extension('llfuse', c_sources, extra_compile_args=compile_args, diff --git a/src/darwin_compat.c b/src/darwin_compat.c index c9cbafe..4daf634 100644 --- a/src/darwin_compat.c +++ b/src/darwin_compat.c @@ -10,6 +10,11 @@ #include #include +static void _unlock_mutex(void *mutex) +{ + pthread_mutex_unlock((pthread_mutex_t *)mutex); +} + /* * Semaphore implementation based on: * @@ -152,7 +157,7 @@ darwin_sem_timedwait(darwin_sem_t *sem, const struct timespec *abs_timeout) return -1; } - pthread_cleanup_push((void(*)(void*))&pthread_mutex_unlock, + pthread_cleanup_push(&_unlock_mutex, &sem->__data.local.count_lock); pthread_mutex_lock(&sem->__data.local.count_lock); @@ -213,7 +218,7 @@ darwin_sem_wait(darwin_sem_t *sem) /* Must be volatile or will be clobbered by longjmp */ volatile int res = 0; - pthread_cleanup_push((void(*)(void*))&pthread_mutex_unlock, + pthread_cleanup_push(&_unlock_mutex, &sem->__data.local.count_lock); pthread_mutex_lock(&sem->__data.local.count_lock); diff --git a/src/fuse_api.pxi b/src/fuse_api.pxi index a156f21..fa731a6 100644 --- a/src/fuse_api.pxi +++ b/src/fuse_api.pxi @@ -272,7 +272,7 @@ def main(workers=None, handle_signals=True): and the function to return. *SIGINT* (Ctrl-C) will thus *not* result in a `KeyboardInterrupt` exception while this function is runnning. Note setting *handle_signals* to `False` means you must handle the signals - by yourself and call `stop` to make the `main` returns. + by yourself and call ``stop`` to make the `main` returns. When the function returns because the file system has received an unmount request it will return `None`. If it returns because it has received a diff --git a/src/misc.pxi b/src/misc.pxi index d93667c..79a02ff 100644 --- a/src/misc.pxi +++ b/src/misc.pxi @@ -199,7 +199,7 @@ cdef class Lock: def yield_(self, count=1): '''Yield global lock to a different thread - A call to `~Lock.yield_` is roughly similar to:: + A call to ``~Lock.yield_`` is roughly similar to:: for i in range(count): if no_threads_waiting_for(lock): @@ -207,8 +207,8 @@ cdef class Lock: lock.release() lock.acquire() - However, when using `~Lock.yield_` it is guaranteed that the lock will - actually be passed to a different thread (the above pseude-code may + However, when using ``~Lock.yield_`` it is guaranteed that the lock will + actually be passed to a different thread (the above pseudocode may result in the same thread re-acquiring the lock *count* times). ''' diff --git a/util/upload-pypi b/util/upload-pypi index 300b53a..f3d3ff1 100755 --- a/util/upload-pypi +++ b/util/upload-pypi @@ -8,9 +8,9 @@ if [ "$R" = "" ]; then fi if [ "$2" = "test" ]; then - export TWINE_REPOSITORY_URL=https://test.pypi.org/legacy/ + export TWINE_REPOSITORY=testllfuse else - export TWINE_REPOSITORY_URL= + export TWINE_REPOSITORY=llfuse fi D=dist/llfuse-$R.tar.gz