Skip to content

"invalid config path selector" error when testing on pypy with MacOS arm64 #1442

Description

@2bndy5
pytest output

../venv-test-arm64/lib/pypy3.11/site-packages/pygit2/errors.py:67: GitError
__________________ ERROR at setup of test_rebuild_treebuilder __________________
@pytest.fixture(scope='session', autouse=True)
def global_git_config() -> None:
# Do not use global config for better test reproducibility.
# https://github.com/libgit2/pygit2/issues/989
levels = [
pygit2.enums.ConfigLevel.GLOBAL,
pygit2.enums.ConfigLevel.XDG,
pygit2.enums.ConfigLevel.SYSTEM,
]
for level in levels:
> pygit2.settings.search_path[level] = ''
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
test/conftest.py:22: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../venv-test-arm64/lib/pypy3.11/site-packages/pygit2/settings.py:45: in __setitem__
option(Option.SET_SEARCH_PATH, key, value)
../venv-test-arm64/lib/pypy3.11/site-packages/pygit2/options.py:373: in option
check_error(err)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ err = -1, io = False
def check_error(err: int, io: bool = False) -> None:
if err >= 0:
return
# These are special error codes, they should never reach here
test = err != C.GIT_EUSER and err != C.GIT_PASSTHROUGH
assert test, f'Unexpected error code {err}'
# Error message
giterr = C.git_error_last()
if giterr != ffi.NULL:
message = ffi.string(giterr.message).decode('utf8', errors='surrogateescape')
else:
message = f'err {err} (no message provided)'
# Translate to Python errors
if err in value_errors:
raise ValueError(message)
if err == C.GIT_ENOTFOUND:
if io:
raise IOError(message)
raise KeyError(message)
if err == C.GIT_EINVALIDSPEC:
raise ValueError(message)
if err == C.GIT_ITEROVER:
raise StopIteration()
# Generic Git error
> raise GitError(message)
E _pygit2.GitError: invalid config path selector 0
../venv-test-arm64/lib/pypy3.11/site-packages/pygit2/errors.py:67: GitError
ERROR test/test_treebuilder.py::test_rebuild_treebuilder - _pygit2.GitError: invalid config path selector 0


As far as I can tell, this "invalid config path selector" error seems to be specific to pygit2 on pypy11. It seems that the int(level) passed to git_libgit2_opts()

pygit2/pygit2/options.py

Lines 359 to 374 in 890730c

elifoption_type==C.GIT_OPT_SET_SEARCH_PATH:
check_args(option_type, arg1, arg2, 2)
level=int(arg1) # Convert enum to int
path=arg2
path_cdata: ArrayC[char] |NULL_TYPE
ifpathisNone:
path_cdata=ffi.NULL
else:
path_bytes=to_bytes(path)
path_cdata=ffi.new('char[]', path_bytes)
err=C.git_libgit2_opts(option_type, ffi.cast('int', level), path_cdata)
check_error(err)
returnNone

is not matching up with the libgit2 C constants of the same name:

staticintconfig_level_to_sysdir(int*out, intconfig_level)
{
switch (config_level) {
caseGIT_CONFIG_LEVEL_SYSTEM:
*out=GIT_SYSDIR_SYSTEM;
return0;
caseGIT_CONFIG_LEVEL_XDG:
*out=GIT_SYSDIR_XDG;
return0;
caseGIT_CONFIG_LEVEL_GLOBAL:
*out=GIT_SYSDIR_GLOBAL;
return0;
caseGIT_CONFIG_LEVEL_PROGRAMDATA:
*out=GIT_SYSDIR_PROGRAMDATA;
return0;
default:
break;
}
git_error_set(
GIT_ERROR_INVALID, "invalid config path selector %d", config_level);
return-1;
}

See libgit2 source

There was a similar issue in libgit2/libgit2sharp#1951 which was fixed by padding the va_args passed to git_libgit2_opts() (libgit2/libgit2sharp#1955).

Originally posted by @2bndy5 in #1441 (comment)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions