Skip to content

BrokenPipeError on KeyboardInterrupt #427

@mallamanis

Description

@mallamanis

I am using the latest GitPython on pip and I have bumped into a weird behavior, that seems to be buggy. I have replicated the behavior both with Python 2.7 and 3.4 and has emerged after updating to newer versions of GitPython. Consider the following snippet (assumes a git repository on the current directory):

import time
from git import Repo, TagReference

repository = Repo('.')
current_commit = repository.head.commit
tag_object = TagReference.create(repository, 'test', message='msg')

try:
    for i in range(10):
        time.sleep(1)

except KeyboardInterrupt:
    print("Interrupted. Exiting gracefully...")

data = tag_object.tag.message

If you interrupt (Ctrl+C) the loop, then the last statement fails with a broken pipe exception (full stack trace below). If the code is not interrupted everything succeeds. Also removing the current_commit = repository.head.commit line, makes the problem go away, even if you interrupt a loop.

I presume that it has to do with the handling of the SIGTERM emitted with a Ctrl+C, but I am not sure if this is true.

The stack trace:

Traceback (most recent call last):
  File "./bugreplicate.py", line 15, in <module>
    data = tag_object.tag.message
  File "/usr/local/lib/python2.7/dist-packages/git/refs/tag.py", line 40, in tag
    obj = self.object
  File "/usr/local/lib/python2.7/dist-packages/git/refs/symbolic.py", line 176, in _get_object
    return Object.new_from_sha(self.repo, hex_to_bin(self.dereference_recursive(self.repo, self.path)))
  File "/usr/local/lib/python2.7/dist-packages/git/objects/base.py", line 65, in new_from_sha
    oinfo = repo.odb.info(sha1)
  File "/usr/local/lib/python2.7/dist-packages/git/db.py", line 40, in info
    hexsha, typename, size = self._git.get_object_header(bin_to_hex(sha))
  File "/usr/local/lib/python2.7/dist-packages/git/cmd.py", line 984, in get_object_header
    return self.__get_object_header(cmd, ref)
  File "/usr/local/lib/python2.7/dist-packages/git/cmd.py", line 972, in __get_object_header
    cmd.stdin.flush()
IOError: [Errno 32] Broken pipe

Some more context: I am using GitPython for experimenter link and need a way to handle KeyboardInterruptions. When a Ctrl+C is pressed, I want to be able to safely store data into the git repository.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions