Skip to content

Commit fcfe17e

Browse files
committed
fix(commit): handle gpgsig properly
Assure that gpgsig is not initialized with None to allow the automatic deserialization to kick in. Fixes #500
1 parent df5095c commit fcfe17e

File tree

2 files changed

+40
-6
lines changed

2 files changed

+40
-6
lines changed

git/objects/commit.py

+10-5
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ def __init__(self, repo, binsha, tree=None, author=None, authored_date=None, aut
130130
self.parents = parents
131131
if encoding is not None:
132132
self.encoding = encoding
133-
self.gpgsig = gpgsig
133+
if gpgsig is not None:
134+
self.gpgsig = gpgsig
134135

135136
@classmethod
136137
def _get_intermediate_items(cls, commit):
@@ -425,10 +426,13 @@ def _serialize(self, stream):
425426
if self.encoding != self.default_encoding:
426427
write(("encoding %s\n" % self.encoding).encode('ascii'))
427428

428-
if self.gpgsig:
429-
write(b"gpgsig")
430-
for sigline in self.gpgsig.rstrip("\n").split("\n"):
431-
write((" " + sigline + "\n").encode('ascii'))
429+
try:
430+
if self.__getattribute__('gpgsig') is not None:
431+
write(b"gpgsig")
432+
for sigline in self.gpgsig.rstrip("\n").split("\n"):
433+
write((" " + sigline + "\n").encode('ascii'))
434+
except AttributeError:
435+
pass
432436

433437
write(b"\n")
434438

@@ -473,6 +477,7 @@ def _deserialize(self, stream):
473477
# now we can have the encoding line, or an empty line followed by the optional
474478
# message.
475479
self.encoding = self.default_encoding
480+
self.gpgsig = None
476481

477482
# read headers
478483
enc = next_line

git/test/test_commit.py

+30-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import os
3535
from datetime import datetime
3636
from git.objects.util import tzoffset, utc
37+
from mock import Mock
3738

3839

3940
def assert_commit_serialization(rwrepo, commit_id, print_performance_info=False):
@@ -342,7 +343,9 @@ def test_gpgsig(self):
342343
cstream = BytesIO()
343344
cmt._serialize(cstream)
344345
assert re.search(r"^gpgsig <test\n dummy\n sig>$", cstream.getvalue().decode('ascii'), re.MULTILINE)
345-
346+
347+
self.assert_gpgsig_deserialization(cstream)
348+
346349
cstream.seek(0)
347350
cmt.gpgsig = None
348351
cmt._deserialize(cstream)
@@ -352,6 +355,32 @@ def test_gpgsig(self):
352355
cstream = BytesIO()
353356
cmt._serialize(cstream)
354357
assert not re.search(r"^gpgsig ", cstream.getvalue().decode('ascii'), re.MULTILINE)
358+
359+
360+
def assert_gpgsig_deserialization(self, cstream):
361+
assert 'gpgsig' in 'precondition: need gpgsig'
362+
363+
class RepoMock:
364+
def __init__(self, bytestr):
365+
self.bytestr = bytestr
366+
367+
@property
368+
def odb(self):
369+
class ODBMock:
370+
def __init__(self, bytestr):
371+
self.bytestr = bytestr
372+
373+
def stream(self, *args):
374+
stream = Mock(spec_set = ['read'], return_value=self.bytestr)
375+
stream.read.return_value = self.bytestr
376+
return ('binsha', 'typename', 'size', stream)
377+
378+
return ODBMock(self.bytestr)
379+
380+
repo_mock = RepoMock(cstream.getvalue())
381+
for field in Commit.__slots__:
382+
c = Commit(repo_mock, b'x' * 20)
383+
assert getattr(c, field) is not None
355384

356385
def test_datetimes(self):
357386
commit = self.rorepo.commit('4251bd5')

0 commit comments

Comments
 (0)