Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
15 changes: 15 additions & 0 deletions Changes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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)
==========================

Expand Down
2 changes: 2 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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 <https://github.com/mxmlnkn/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,
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[build-system]
requires = ["setuptools"]
requires = ["setuptools >= 78.1.1"]
build-backend = "setuptools.build_meta"
4 changes: 2 additions & 2 deletions rst/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 + ''

Expand Down
Empty file removed setup.cfg
Empty file.
7 changes: 3 additions & 4 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
warnings.simplefilter('default')


LLFUSE_VERSION = '1.5.1'
LLFUSE_VERSION = '1.5.2'

def main():

Expand Down Expand Up @@ -105,7 +105,8 @@ def main():
author='Nikolaus Rath',
author_email='[email protected]',
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',
Expand All @@ -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'],
Expand All @@ -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,
Expand Down
9 changes: 7 additions & 2 deletions src/darwin_compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
#include <errno.h>
#include <sys/types.h>

static void _unlock_mutex(void *mutex)
{
pthread_mutex_unlock((pthread_mutex_t *)mutex);
}

/*
* Semaphore implementation based on:
*
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/fuse_api.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions src/misc.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -199,16 +199,16 @@ 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):
break
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).
'''

Expand Down
4 changes: 2 additions & 2 deletions util/upload-pypi
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down