Repository navigation
fix: the config file's directory no longer decides the rootdir alone - #14837
Open
RonnyPfannschmidt wants to merge 1 commit into
Open
RonnyPfannschmidt wants to merge 1 commit into
RonnyPfannschmidt wants to merge 1 commit into
Conversation
Member
|
@RonnyPfannschmidt can you rebase the PR? In github it currently contains the 2 commits that are already in main, so a little harder to review. |
RonnyPfannschmidt
force-pushed
the
fix/rootdir-not-decided-by-config-file
branch
from
September 15, 2026 11:34
7cbfbd8 to
f0d3607
Compare
Member
Author
|
done |
RonnyPfannschmidt
force-pushed
the
fix/rootdir-not-decided-by-config-file
branch
from
September 23, 2026 07:00
f0d3607 to
7cc8e21
Compare
RonnyPfannschmidt
force-pushed
the
fix/rootdir-not-decided-by-config-file
branch
from
October 4, 2026 13:06
7cc8e21 to
fe6416e
Compare
Passing -c/--config-file set the rootdir to the config file's parent directory. A config kept in a subdirectory -- the common `-c config/pytest.ini` layout -- therefore moved the rootdir into that subdirectory, which broke conftest discovery and node ids: conftests collected an empty path prefix, so same-named fixtures from sibling directories shadowed each other and node ids came out as `config::test2` instead of `tests/tests2/test2.py::test2`. The config file's location is evidence about where the project lives, not a decision on its own. Take the common ancestor of the config file's directory and the collected test paths instead, falling back to the invocation directory in place of the test paths when none were given. If the two live in unrelated trees the ancestor degrades to the filesystem root, in which case the config file's directory is kept, as before. This covers cases neither of the two open proposals handled alone: scenario before pytest-dev#14454 pytest-dev#14579 now -c config/pytest.ini (no args) config/ ok config/ ok -c config/pytest.ini tests/ config/ ok ok ok sibling config, invoked from a subdirectory config/ sub/ ok ok unrelated working directory config/ unrel. ok ok pytest-dev#14454 (@EternalRights) found the root cause and drove the design discussion; its `invocation_dir` rule is right for the no-args case but follows the working directory even when that is unrelated to the project. pytest-dev#14579 (@hariharan077) contributed the common-ancestor form, which is most of the answer but leaves the no-args case unfixed. Neither is needed once the ancestor also considers the invocation directory, and no ambiguity warning is required because the ancestor is derived rather than guessed. This is a breaking change: it alters documented behaviour, so doc/en/reference/customize.rst is updated along with it, and the changelog entries are filed as breaking rather than as bugfixes. Closes pytest-dev#13246 Closes pytest-dev#9703 Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
RonnyPfannschmidt
force-pushed
the
fix/rootdir-not-decided-by-config-file
branch
from
October 11, 2026 07:26
fe6416e to
5df7f15
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Split out of #14807 after review — that PR keeps the refactor and the non-breaking
-cfixes, this one carries the single breaking change.Depends on #14807 (the branch is based on it); the diff against
mainwill shrink to one commit once that lands.Supersedes #14454 and #14579. Closes #13246, closes #9703.
The problem
-cset the rootdir to the config file's parent directory. With the common-c config/pytest.inilayout that moved the rootdir intoconfig/, so conftests collected an empty path prefix: same-named fixtures from sibling directories shadowed each other, and node ids came out asconfig::test2rather thantests/tests2/test2.py::test2.The change
The config file's location is evidence about where the project lives, not a decision on its own. Take the common ancestor of the config file's directory and the collected test paths, using the invocation directory in their place when no paths were given. If the two live in unrelated trees the ancestor degrades to the filesystem root, in which case the config file's directory is kept, as today.
-c config/pytest.ini(no args)config/config/-c config/pytest.ini tests/config/config/sub/config/invocation_dirrule is right for the no-args case but follows the working directory even when that is unrelated to the project. Its ambiguity warning is also written toParser.extra_info, which is only rendered byPytestArgumentParser.error()— so it never appears on a successful run, and its tests pass by asserting onconfig._parser.extra_infodirectly.if dirsand so leaves the no-args case unfixed.No ambiguity warning is needed once the ancestor also considers the invocation directory, because the rootdir is then derived rather than guessed.
This changes documented behaviour —
doc/en/reference/customize.rstsaid "If-cis passed in the command-line, use that as configuration file, and its directory asrootdir" — so the doc is updated here and the changelog entries are filed asbreaking, notbugfix.@bluetech asked on #14807 whether the next release is intended to be major. The
versionchangeddirective in the doc currently says10.0on that assumption — tell me the target and I will adjust it. If the next release is 9.2 instead, this PR should simply wait.Concretely, what breaks: a project that today runs
-c cfg/pytest.iniand relies on the rootdir beingcfg/— node ids,.pytest_cachelocation, and rootdir-relative ini paths all move. In practice such a setup already has broken conftest discovery, which is what #13246 and #9703 report.Verification
Full suite green (4349 passed, 47 skipped, 13 xfailed, 7 xpassed — the xpasses are pre-existing, #11603/#10042).
Verified against the original reproducers by swapping in
main'sfindpaths.pyand running the same commands: onmainthe #13246 repro givesFAILED config::test2 - assert 1 == 2androotdir: .../config; with this commit, 2 passed androotdir: .../— the project root.