libgit2 / libgit2/pygit2

Pytest tests cannot load global config that definitely exists even though real use of the library can

Abierto
#1,467 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Python
Estrellas
1.7k
Forks
408
Merge medio
2 d 57 min
PR fusionados (30 d)
7

Descripción

While working on and writing tests for #1466, I discovered that Config.get_global_config raised an IOError in my test. Confused as to why that didn't break other tests, I searched for use of this in the tests and found this:

def test_global_config() -> None:
    try:
        assert Config.get_global_config() is not None
    except IOError:
        # There is no user config
        pass


def test_system_config() -> None:
    try:
        assert Config.get_system_config() is not None
    except IOError:
        # There is no system config
        pass

I changed these tests to this so that these situations result in an official "skip" with information about why it was skipped, instead of just silently fake-passing:

def test_global_config() -> None:
    try:
        assert Config.get_global_config() is not None
    except IOError as e:
        settings = Settings()
        pytest.skip(f'Unavailable for testing with home dir = {settings.homedir}: {e}')


def test_system_config() -> None:
    try:
        assert Config.get_system_config() is not None
    except IOError as e:
        pytest.skip(f'Unavailable for testing: {e}')

But the resulting pytest output puzzled me:

test/test_config.py::test_global_config SKIPPED (Unavailable for testing with home dir = /Users/nicholas: the global file '.gitconfig' doesn't exist:)
test/test_config.py::test_system_config SKIPPED (Unavailable for testing: the system file 'gitconfig' doesn't exist:)

The first reason it puzzled me is that /Users/nicholas/.gitconfig definitely exists:

$ ls -al /Users/nicholas/.gitconfig
-rw-r--r--  1 nicholas  staff  366 Apr  9 17:39 /Users/nicholas/.gitconfig

The second reason it puzzled me is that I don't encounter this error if I simply use the library in a Python shell prompt:

>>> c = pygit2.Config.get_global_config()
>>> c["push.gpgSign"]
'if-asked'

Now, it's correct that my system config file does not exist:

>>> pygit2.Config.get_system_config()
Traceback (most recent call last):
  File "<python-input-8>", line 1, in <module>
    pygit2.Config.get_system_config()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/Users/nicholas/Development/OSS/libgit2/pygit2/.venv/lib/python3.14/site-packages/pygit2/config.py", line 309, in get_system_config
    check_error(err)
           ~~~~^^^^^
  File "/Users/nicholas/Development/OSS/libgit2/pygit2/.venv/lib/python3.14/site-packages/pygit2/config.py", line 300, in _from_found_config
  File "/Users/nicholas/Development/OSS/libgit2/pygit2/.venv/lib/python3.14/site-packages/pygit2/errors.py", line 56, in check_error
    raise IOError(message)
OSError: the system file 'gitconfig' doesn't exist: No such file or directory

But note that that error message is slightly different from the skip message of the test: "No such file or directory" is missing in the skip message. Weird?

If I now manually create /etc/gitconfig:

>>> c = pygit2.Config.get_system_config()
>>> c["bogus.foo"]
'bar'

But, low and behold, that test, also, still skips with the same partial message about not finding the system config file.

So, these two functions do work ... just not in tests. I've been unable to figure out why. My best guess is that mypy is somehow sandboxed so that it can't read these files? But that's just a wild guess. I can't confirm it.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con test/test_config.py y las rutas Config.get_global_config y Config.get_system_config mostradas en pygit2/config.py. Reproduce las pruebas omitidas con pytest y compara la visibilidad de sus archivos de configuración y los mensajes de error con los ejemplos interactivos de Python. Se considera terminado cuando las pruebas ya no informen silenciosamente de forma incorrecta sobre archivos de configuración existentes, o documenten y notifiquen claramente la limitación del entorno.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
git, python
Área
testing-qa
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
48/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.