Skip to content

RecursionError: maximum recursion depth exceeded while calling a Python object when running simple UnitTest due to GitPython unittests also being included #1049

@jmartens

Description

@jmartens

While writing a unittest for a framework I ran into RecursionErrors:

I was able to reproduce it with this minimal test case:

from unittest import TestCase
from git import Repo
from tempfile import NamedTemporaryFile, TemporaryDirectory


class TestRunner(TestCase):

    def test_check_repo(self):

        # Normal repository...
        with TemporaryDirectory() as repo_dir:
            repo = Repo.init(repo_dir, bare=False)

            # ... with untracked files
            with NamedTemporaryFile(dir=repo_dir, mode="r+", delete=False) as file:
                file.file.writelines(["This is a test file..."])

            # Add initial commit, so we can tag
            repo.index.add([file.name])
            repo.index.commit('Test commit for unittest')

If I run above example like:

Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\runpy.py", line 193, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Program Files\Python38\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\Program Files\Python38\lib\unittest\__main__.py", line 18, in <module>
    main(module=None)
  File "C:\Program Files\Python38\lib\unittest\main.py", line 101, in __init__
    self.runTests()
  File "C:\Program Files\Python38\lib\unittest\main.py", line 271, in runTests
    self.result = testRunner.run(self.test)
  File "C:\Program Files\Python38\lib\unittest\runner.py", line 176, in run
    test(result)
  File "C:\Program Files\Python38\lib\unittest\suite.py", line 84, in __call__
    return self.run(*args, **kwds)
  File "C:\Program Files\Python38\lib\unittest\suite.py", line 122, in run
    test(result)
  File "C:\Program Files\Python38\lib\unittest\suite.py", line 84, in __call__
    return self.run(*args, **kwds)
  File "C:\Program Files\Python38\lib\unittest\suite.py", line 122, in run
    test(result)
  File "C:\Program Files\Python38\lib\unittest\case.py", line 736, in __call__
    return self.run(*args, **kwds)
  File "C:\Program Files\Python38\lib\unittest\case.py", line 684, in run
    self._feedErrorsToResult(result, outcome.errors)
  File "C:\Program Files\Python38\lib\unittest\case.py", line 602, in _feedErrorsToResult
    result.addError(test, exc_info)
  File "C:\Program Files\Python38\lib\unittest\runner.py", line 67, in addError
    super(TextTestResult, self).addError(test, err)
  File "C:\Program Files\Python38\lib\unittest\result.py", line 17, in inner
    return method(self, *args, **kw)
  File "C:\Program Files\Python38\lib\unittest\result.py", line 115, in addError
    self.errors.append((test, self._exc_info_to_string(err, test)))
  File "C:\Program Files\Python38\lib\unittest\result.py", line 185, in _exc_info_to_string
    tb_e = traceback.TracebackException(
  File "C:\Program Files\Python38\lib\traceback.py", line 493, in __init__
    context = TracebackException(
  File "C:\Program Files\Python38\lib\traceback.py", line 493, in __init__
    context = TracebackException(
  File "C:\Program Files\Python38\lib\traceback.py", line 493, in __init__
    context = TracebackException(
  [Previous line repeated 485 more times]
  File "C:\Program Files\Python38\lib\traceback.py", line 476, in __init__
    _seen.add(id(exc_value))
RecursionError: maximum recursion depth exceeded while calling a Python object

As soon as I remove the line that actually commits the recursion errors disappear so I am I guessing some uncaught exception is thrown somewhere when doing a commit.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions