libgit2 / libgit2/pygit2

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

Ouverte
#1,442 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Python
Étoiles
1.7k
Forks
408
Merge moyen
2 j 57 min
PR mergées (30 j)
7

Description

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()

https://github.com/libgit2/pygit2/blob/890730c1394c4b36b2c07f8679cd4c39e612fc75/pygit2/options.py#L359-L374

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 https://github.com/libgit2/libgit2sharp/issues/1951 which was fixed by padding the va_args passed to git_libgit2_opts() (https://github.com/libgit2/libgit2sharp/pull/1955).

Originally posted by @2bndy5 in https://github.com/libgit2/pygit2/issues/1441#issuecomment-3610152291

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par pygit2/options.py, lignes 359-374, et la configuration qui échoue dans test/conftest.py ; reproduisez test/test_treebuilder.py::test_rebuild_treebuilder sur PyPy/macOS arm64. Comparez l’argument passé à git_libgit2_opts() avec settings.c config_level_to_sysdir de libgit2 et avec la correction analogue de libgit2sharp. C’est terminé lorsque les affectations du chemin de recherche de configuration de la fixture passent dans cet environnement.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
c, python
Domaine
devtools
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
48/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.