Skip to content

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

@2bndy5

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

elif option_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
if path is None:
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)
return None

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

static int config_level_to_sysdir(int *out, int config_level)
{
	switch (config_level) {
	case GIT_CONFIG_LEVEL_SYSTEM:
		*out = GIT_SYSDIR_SYSTEM;
		return 0;
	case GIT_CONFIG_LEVEL_XDG:
		*out = GIT_SYSDIR_XDG;
		return 0;
	case GIT_CONFIG_LEVEL_GLOBAL:
		*out = GIT_SYSDIR_GLOBAL;
		return 0;
	case GIT_CONFIG_LEVEL_PROGRAMDATA:
		*out = GIT_SYSDIR_PROGRAMDATA;
		return 0;
	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