-
-
Notifications
You must be signed in to change notification settings - Fork 137
Comparing changes
Open a pull request
base repository: tox-dev/filelock
base: 3.29.4
head repository: tox-dev/filelock
compare: 3.29.5
- 14 commits
- 17 files changed
- 6 contributors
Commits on Jun 15, 2026
-
serialise read/write release rollback against a concurrent acquire (#563
) ReadWriteLock.release() rolls back the transaction on the shared sqlite3 connection outside _transaction_lock, even though acquire() runs its own BEGIN under that lock. Once release has put lock_level back to 0 inside the internal lock but has not yet rolled back, another thread acquiring on the same instance sees the level at 0, takes _transaction_lock and issues BEGIN against the connection whose transaction is still open, which raises "cannot start a transaction within a transaction" (re-raised, since it is not a "database is locked" timeout); in the reverse ordering the rollback instead ends the new holder's freshly started transaction and quietly drops the database lock while it still thinks it holds it. The added test parks the rollback with the level already at 0 and shows the racing acquirer now waits rather than erroring. Wrapping the rollback in _transaction_lock keeps it serialised against acquire the same way the rest of the transaction work already is. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Configuration menu - View commit details
-
Copy full SHA for 897930f - Browse repository at this point
Copy the full SHA 897930fView commit details -
[pre-commit.ci] pre-commit autoupdate (#564)
<!--pre-commit.ci start--> updates: - [github.com/python-jsonschema/check-jsonschema: 0.37.2 → 0.37.3](python-jsonschema/check-jsonschema@0.37.2...0.37.3) - [github.com/tox-dev/pyproject-fmt: v2.23.0 → v2.24.1](tox-dev/pyproject-fmt@v2.23.0...v2.24.1) - [github.com/astral-sh/ruff-pre-commit: v0.15.16 → v0.15.17](astral-sh/ruff-pre-commit@v0.15.16...v0.15.17) - [github.com/rbubley/mirrors-prettier: v3.8.3 → v3.8.4](rbubley/mirrors-prettier@v3.8.3...v3.8.4) <!--pre-commit.ci end--> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Bernát Gábor <gaborjbernat@gmail.com>
Configuration menu - View commit details
-
Copy full SHA for 65c3b65 - Browse repository at this point
Copy the full SHA 65c3b65View commit details
Commits on Jun 16, 2026
-
Configuration menu - View commit details
-
Copy full SHA for 2e20c75 - Browse repository at this point
Copy the full SHA 2e20c75View commit details
Commits on Jun 19, 2026
-
Configuration menu - View commit details
-
Copy full SHA for 64f0c29 - Browse repository at this point
Copy the full SHA 64f0c29View commit details
Commits on Jun 21, 2026
-
don't follow symlinks in raise_on_not_writable_file (#567)
raise_on_not_writable_file is the pre-acquire writability/exists gate used by SoftFileLock and WindowsFileLock, and it still uses os.stat which follows symlinks. If a hostile process plants a symlink at the lock path, the check inspects the link target rather than the lock path itself, so a symlink to a directory raises IsADirectoryError and a symlink to a read-only file raises PermissionError, turning a normal contended acquire into a misleading hard failure and leaking whether arbitrary target paths are writable to the caller. The actual open already uses O_NOFOLLOW and refuses a symlinked lock file, and every other lock-path op here (the O_NOFOLLOW reads, the lstat in break_lock_file and the lifetime check) already declines to follow symlinks, so this precheck was the odd one out. Switching it to os.lstat reads the link itself; behaviour is unchanged for ordinary lock files, and a real read-only file or directory is still rejected.
Configuration menu - View commit details
-
Copy full SHA for 022394c - Browse repository at this point
Copy the full SHA 022394cView commit details
Commits on Jun 24, 2026
-
[pre-commit.ci] pre-commit autoupdate (#568)
<!--pre-commit.ci start--> updates: - [github.com/tox-dev/pyproject-fmt: v2.24.1 → v2.25.0](tox-dev/pyproject-fmt@v2.24.1...v2.25.0) - [github.com/astral-sh/ruff-pre-commit: v0.15.17 → v0.15.18](astral-sh/ruff-pre-commit@v0.15.17...v0.15.18) - [github.com/zizmorcore/zizmor-pre-commit: v1.25.2 → v1.26.1](zizmorcore/zizmor-pre-commit@v1.25.2...v1.26.1) <!--pre-commit.ci end--> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Bernát Gábor <gaborjbernat@gmail.com>
Configuration menu - View commit details
-
Copy full SHA for dbcc83a - Browse repository at this point
Copy the full SHA dbcc83aView commit details -
build(deps): bump actions/checkout from 6.0.3 to 7.0.0 (#570)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/releases">actions/checkout's releases</a>.</em></p> <blockquote> <h2>v7.0.0</h2> <h2>What's Changed</h2> <ul> <li>block checking out fork pr for pull_request_target and workflow_run by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> <li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2458">actions/checkout#2458</a></li> <li>Bump flatted from 3.3.1 to 3.4.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2460">actions/checkout#2460</a></li> <li>Bump js-yaml from 4.1.0 to 4.2.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2461">actions/checkout#2461</a></li> <li>Bump <code>@actions/core</code> and <code>@actions/tool-cache</code> and Remove uuid by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2459">actions/checkout#2459</a></li> <li>upgrade module to esm and update dependencies by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2463">actions/checkout#2463</a></li> <li>Bump the minor-npm-dependencies group across 1 directory with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2462">actions/checkout#2462</a></li> <li>getting ready for checkout v7 release by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2464">actions/checkout#2464</a></li> <li>update error wording by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2467">actions/checkout#2467</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> made their first contribution in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6.0.3...v7.0.0">https://github.com/actions/checkout/compare/v6.0.3...v7.0.0</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/blob/main/CHANGELOG.md">actions/checkout's changelog</a>.</em></p> <blockquote> <h1>Changelog</h1> <h2>v7.0.0</h2> <ul> <li>Block checking out fork PR for pull_request_target and workflow_run by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> <li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2458">actions/checkout#2458</a></li> <li>Bump flatted from 3.3.1 to 3.4.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2460">actions/checkout#2460</a></li> <li>Bump js-yaml from 4.1.0 to 4.2.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2461">actions/checkout#2461</a></li> <li>Bump <code>@actions/core</code> and <code>@actions/tool-cache</code> and Remove uuid by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2459">actions/checkout#2459</a></li> <li>upgrade module to esm and update dependencies by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2463">actions/checkout#2463</a></li> <li>Bump the minor-npm-dependencies group across 1 directory with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2462">actions/checkout#2462</a></li> </ul> <h2>v6.0.3</h2> <ul> <li>Fix checkout init for SHA-256 repositories by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2439">actions/checkout#2439</a></li> <li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> </ul> <h2>v6.0.2</h2> <ul> <li>Fix tag handling: preserve annotations and explicit fetch-tags by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2356">actions/checkout#2356</a></li> </ul> <h2>v6.0.1</h2> <ul> <li>Add worktree support for persist-credentials includeIf by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2327">actions/checkout#2327</a></li> </ul> <h2>v6.0.0</h2> <ul> <li>Persist creds to a separate file by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2286">actions/checkout#2286</a></li> <li>Update README to include Node.js 24 support details and requirements by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2248">actions/checkout#2248</a></li> </ul> <h2>v5.0.1</h2> <ul> <li>Port v6 cleanup to v5 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2301">actions/checkout#2301</a></li> </ul> <h2>v5.0.0</h2> <ul> <li>Update actions checkout to use node 24 by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li> </ul> <h2>v4.3.1</h2> <ul> <li>Port v6 cleanup to v4 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2305">actions/checkout#2305</a></li> </ul> <h2>v4.3.0</h2> <ul> <li>docs: update README.md by <a href="https://github.com/motss"><code>@motss</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li> <li>Add internal repos for checking out multiple repositories by <a href="https://github.com/mouismail"><code>@mouismail</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li> <li>Documentation update - add recommended permissions to Readme by <a href="https://github.com/benwells"><code>@benwells</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li> <li>Adjust positioning of user email note and permissions heading by <a href="https://github.com/joshmgross"><code>@joshmgross</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li> <li>Update README.md by <a href="https://github.com/nebuk89"><code>@nebuk89</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li> <li>Update CODEOWNERS for actions by <a href="https://github.com/TingluoHuang"><code>@TingluoHuang</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li> <li>Update package dependencies by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li> </ul> <h2>v4.2.2</h2> <ul> <li><code>url-helper.ts</code> now leverages well-known environment variables by <a href="https://github.com/jww3"><code>@jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1941">actions/checkout#1941</a></li> <li>Expand unit test coverage for <code>isGhes</code> by <a href="https://github.com/jww3"><code>@jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1946">actions/checkout#1946</a></li> </ul> <h2>v4.2.1</h2> <ul> <li>Check out other refs/* by commit if provided, fall back to ref by <a href="https://github.com/orhantoy"><code>@orhantoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1924">actions/checkout#1924</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/checkout/commit/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0"><code>9c091bb</code></a> update error wording (<a href="https://redirect.github.com/actions/checkout/issues/2467">#2467</a>)</li> <li><a href="https://github.com/actions/checkout/commit/1044a6dea927916f2c38ba5aeffbc0a847b1221a"><code>1044a6d</code></a> getting ready for checkout v7 release (<a href="https://redirect.github.com/actions/checkout/issues/2464">#2464</a>)</li> <li><a href="https://github.com/actions/checkout/commit/f0282184c7ce73ab54c7e4ab5a617122602e575f"><code>f028218</code></a> Bump the minor-npm-dependencies group across 1 directory with 3 updates (<a href="https://redirect.github.com/actions/checkout/issues/2462">#2462</a>)</li> <li><a href="https://github.com/actions/checkout/commit/d914b262ffc244530a203ab40decab34c3abf34d"><code>d914b26</code></a> upgrade module to esm and update dependencies (<a href="https://redirect.github.com/actions/checkout/issues/2463">#2463</a>)</li> <li><a href="https://github.com/actions/checkout/commit/537c7ef99cef6e5ddb5e7ff5d16d14510503801d"><code>537c7ef</code></a> Bump <code>@actions/core</code> and <code>@actions/tool-cache</code> and Remove uuid (<a href="https://redirect.github.com/actions/checkout/issues/2459">#2459</a>)</li> <li><a href="https://github.com/actions/checkout/commit/130a169078a413d3a5246a393625e8e742f387f6"><code>130a169</code></a> Bump js-yaml from 4.1.0 to 4.2.0 (<a href="https://redirect.github.com/actions/checkout/issues/2461">#2461</a>)</li> <li><a href="https://github.com/actions/checkout/commit/7d09575332117a40b46e5e020664df234cd416f3"><code>7d09575</code></a> Bump flatted from 3.3.1 to 3.4.2 (<a href="https://redirect.github.com/actions/checkout/issues/2460">#2460</a>)</li> <li><a href="https://github.com/actions/checkout/commit/0f9f3aa320cb53abeb534aeb54048075d9697a0e"><code>0f9f3aa</code></a> Bump actions/publish-immutable-action (<a href="https://redirect.github.com/actions/checkout/issues/2458">#2458</a>)</li> <li><a href="https://github.com/actions/checkout/commit/f9e715a95fcd1f9253f77dd28f11e88d2d6460c7"><code>f9e715a</code></a> block checking out fork pr for pull_request_target and workflow_run (<a href="https://redirect.github.com/actions/checkout/issues/2454">#2454</a>)</li> <li>See full diff in <a href="https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Configuration menu - View commit details
-
Copy full SHA for 70ecdb2 - Browse repository at this point
Copy the full SHA 70ecdb2View commit details
Commits on Jun 29, 2026
-
don't complete a writer acquire on a peer's reclaimed marker (#571)
the writer acquire is two-phase, and in phase 2 (waiting for readers to drain) it refreshes the .write marker on every scan. if the writer is paused longer than stale_threshold a peer can evict that now-stale marker and reclaim the slot with its own token, but phase 2 carried on touching whatever sat at the path and reported success once the readers had gone, so the original writer would finish its acquire on top of the peer's live marker and two writers could end up believing they hold the exclusive lock at the same time. this re-checks that the marker still carries our token before refreshing it, the same identity check the heartbeat refresh and the release path already rely on, and re-claims the slot (waiting behind the peer when it currently holds .write) instead of trusting a foreign marker. the regression test drives the eviction mid phase-2 and asserts the acquire no longer completes on a stranger's marker.
Configuration menu - View commit details
-
Copy full SHA for 22ecd6a - Browse repository at this point
Copy the full SHA 22ecd6aView commit details -
[pre-commit.ci] pre-commit autoupdate (#572)
<!--pre-commit.ci start--> updates: - [github.com/tox-dev/pyproject-fmt: v2.25.0 → v2.25.1](tox-dev/pyproject-fmt@v2.25.0...v2.25.1) - [github.com/astral-sh/ruff-pre-commit: v0.15.18 → v0.15.20](astral-sh/ruff-pre-commit@v0.15.18...v0.15.20) - [github.com/rbubley/mirrors-prettier: v3.8.4 → v3.9.1](rbubley/mirrors-prettier@v3.8.4...v3.9.1) <!--pre-commit.ci end--> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Configuration menu - View commit details
-
Copy full SHA for 0b707fe - Browse repository at this point
Copy the full SHA 0b707feView commit details
Commits on Jul 2, 2026
-
use a private break name in break_lock_file (#576)
break_lock_file renames a stale lock aside before re-checking and unlinking it, but the aside name is a fixed `<lock>.break.<pid>`. Two breakers in the same process share that name (a thread pool where each worker holds its own lock instance with a lifetime, all contending on one expired lock), so a second break can rename a freshly recreated live lock onto that path in the small window between the re-verify lstat and the unlink, and the first breaker then deletes a live lock the inode check just approved, letting a second holder in. The soft read/write marker break already appends a random token to its aside name for exactly this reason; this makes break_lock_file do the same so no peer can target our break path.
Configuration menu - View commit details
-
Copy full SHA for 7595a7b - Browse repository at this point
Copy the full SHA 7595a7bView commit details -
Keep Unix lock files after release (#577)
## Problem Since `03b0ab7` (`feat(unix): delete lock file on release`), `UnixFileLock._release()` unlinks the path before unlocking and closing the fd. That lets a process that already opened the old inode keep waiting on that deleted file while another process recreates the filename and locks a new inode, so both can believe they hold the same lock. Fixes #574. ## Solution - stop unlinking the Unix lock file on release - keep the Unix-specific expectations aligned with the persistent-path behavior - add a regression that proves a waiter fd cannot acquire a different inode after another lock instance reacquires the same path ## Testing - `.venv-ci/bin/python -m pytest tests/test_filelock.py tests/test_unix_fallback.py tests/test_self_deadlock.py -q` - `.venv-ci/bin/python -m ruff check src/filelock/_unix.py tests/test_filelock.py tests/test_unix_fallback.py tests/test_self_deadlock.py` - `.venv-ci/bin/python -m ruff format --check src/filelock/_unix.py tests/test_filelock.py tests/test_unix_fallback.py tests/test_self_deadlock.py`
Configuration menu - View commit details
-
Copy full SHA for ea594a5 - Browse repository at this point
Copy the full SHA ea594a5View commit details
Commits on Jul 3, 2026
-
Configuration menu - View commit details
-
Copy full SHA for c76dee6 - Browse repository at this point
Copy the full SHA c76dee6View commit details -
roll back a read acquire's open transaction when its SELECT fails (#575)
Co-authored-by: Bernát Gábor <gaborjbernat@gmail.com>
Configuration menu - View commit details
-
Copy full SHA for 1f6cde4 - Browse repository at this point
Copy the full SHA 1f6cde4View commit details -
Configuration menu - View commit details
-
Copy full SHA for be56227 - Browse repository at this point
Copy the full SHA be56227View commit details
This comparison is taking too long to generate.
Unfortunately it looks like we can’t render this comparison for you right now. It might be too big, or there might be something weird with your repository.
You can try running this command locally to see the comparison on your machine:
git diff 3.29.4...3.29.5