diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 596134f3c4..fc38abf01c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,6 +66,12 @@ jobs: - os: ubuntu-24.04 python-version: '3.12' toxenv: py312-fuse3 + - os: ubuntu-24.04 + python-version: '3.13' + toxenv: py313-fuse3 + - os: ubuntu-24.04 + python-version: '3.14' + toxenv: py314-fuse3 - os: macos-15 python-version: '3.11' toxenv: py311-none # note: no fuse testing, due to #6099, see also #6196. diff --git a/setup.py b/setup.py index 106139eef1..32ccb6d73b 100644 --- a/setup.py +++ b/setup.py @@ -63,8 +63,10 @@ prefer_system_libxxhash = not bool(os.environ.get('BORG_USE_BUNDLED_XXHASH')) system_prefix_libxxhash = os.environ.get('BORG_LIBXXHASH_PREFIX') -# Number of threads to use for cythonize, not used on windows -cpu_threads = multiprocessing.cpu_count() if multiprocessing and multiprocessing.get_start_method() != 'spawn' else None +# Number of threads to use for cythonize, not used on windows. +# Only with the "fork" start method: "spawn" and "forkserver" (default on Linux since Python 3.14) +# re-import setup.py in the worker processes, which recursively runs setup() there. +cpu_threads = multiprocessing.cpu_count() if multiprocessing and multiprocessing.get_start_method() == 'fork' else None # Are we building on ReadTheDocs? on_rtd = os.environ.get('READTHEDOCS') @@ -75,7 +77,7 @@ # Please note: # using any other msgpack version is not supported by borg development and # any feedback related to issues caused by this will be ignored. - 'msgpack >=0.5.6, <=1.1.1, !=1.0.1', + 'msgpack >=0.5.6, <=1.2.4, !=1.0.1', 'packaging', ] @@ -297,6 +299,8 @@ def members_appended(*ds): 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', + 'Programming Language :: Python :: 3.14', 'Topic :: Security :: Cryptography', 'Topic :: System :: Archiving :: Backup', ], diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 971c3e7621..8374080e1d 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1908,7 +1908,7 @@ def do_with_lock(self, args, repository): # any other mechanism relying on existing segment data not changing). # see issue #1867. repository.commit(compact=False) - return ret + return ret @with_repository(manifest=False, exclusive=True) def do_compact(self, args, repository): diff --git a/src/borg/helpers/msgpack.py b/src/borg/helpers/msgpack.py index 63561c9f42..327af646f6 100644 --- a/src/borg/helpers/msgpack.py +++ b/src/borg/helpers/msgpack.py @@ -182,7 +182,7 @@ def is_slow_msgpack(): def is_supported_msgpack(): # DO NOT CHANGE OR REMOVE! See also requirements and comments in setup.py. import msgpack - return (0, 5, 6) <= msgpack.version[:3] <= (1, 1, 1) and \ + return (0, 5, 6) <= msgpack.version[:3] <= (1, 2, 4) and \ msgpack.version not in [(1, 0, 1), ] # < add bad releases here to deny list diff --git a/src/borg/testsuite/repository.py b/src/borg/testsuite/repository.py index ca0f9d9c07..70160ace62 100644 --- a/src/borg/testsuite/repository.py +++ b/src/borg/testsuite/repository.py @@ -977,7 +977,10 @@ def test_rpc_exception_transport(self): self.repository.call('inject_exception', {'kind': 'divide'}) except RemoteRepository.RPCError as e: assert e.unpacked - assert e.get_message() == 'ZeroDivisionError: integer division or modulo by zero\n' + assert e.get_message() in ( + 'ZeroDivisionError: integer division or modulo by zero\n', # Python < 3.14 + 'ZeroDivisionError: division by zero\n', # Python >= 3.14 + ) assert e.exception_class == 'ZeroDivisionError' assert len(e.exception_full) > 0 diff --git a/tox.ini b/tox.ini index 3ae0d53e6e..b7f4957fbb 100644 --- a/tox.ini +++ b/tox.ini @@ -2,7 +2,7 @@ # fakeroot -u tox --recreate [tox] -envlist = py{39,310,311,312}-{none,fuse2,fuse3} +envlist = py{39,310,311,312,313,314}-{none,fuse2,fuse3} minversion = 3.2 requires = pkgconfig