Skip to content

BrokenPipeError on KeyboardInterrupt #427

Open
@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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions