diff options
| -rw-r--r-- | git/objects/commit.py | 53 | ||||
| -rw-r--r-- | git/test/fixtures/commit_with_gpgsig | 30 | ||||
| -rw-r--r-- | git/test/test_commit.py | 42 | 
3 files changed, 107 insertions, 18 deletions
diff --git a/git/objects/commit.py b/git/objects/commit.py index cbfd5097..4380f472 100644 --- a/git/objects/commit.py +++ b/git/objects/commit.py @@ -57,15 +57,15 @@ class Commit(base.Object, Iterable, Diffable, Traversable, Serializable):      __slots__ = ("tree",                   "author", "authored_date", "author_tz_offset",                   "committer", "committed_date", "committer_tz_offset", -                 "message", "parents", "encoding") +                 "message", "parents", "encoding", "gpgsig")      _id_attribute_ = "binsha"      def __init__(self, repo, binsha, tree=None, author=None, authored_date=None, author_tz_offset=None, -                 committer=None, committed_date=None, committer_tz_offset=None,  -                 message=None,  parents=None, encoding=None): -        """Instantiate a new Commit. All keyword arguments taking None as default will  -        be implicitly set on first query.  -         +                 committer=None, committed_date=None, committer_tz_offset=None, +                 message=None,  parents=None, encoding=None, gpgsig=None): +        """Instantiate a new Commit. All keyword arguments taking None as default will +        be implicitly set on first query. +          :param binsha: 20 byte sha1          :param parents: tuple( Commit, ... )               is a tuple of commit ids or actual Commits @@ -120,7 +120,8 @@ class Commit(base.Object, Iterable, Diffable, Traversable, Serializable):              self.parents = parents          if encoding is not None:              self.encoding = encoding -         +        self.gpgsig = gpgsig +      @classmethod      def _get_intermediate_items(cls, commit):          return commit.parents @@ -393,7 +394,12 @@ class Commit(base.Object, Iterable, Diffable, Traversable, Serializable):          if self.encoding != self.default_encoding:              write("encoding %s\n" % self.encoding) -         + +        if self.gpgsig: +            write("gpgsig") +            for sigline in self.gpgsig.rstrip("\n").split("\n"): +                write(" "+sigline+"\n") +          write("\n")          # write plain bytes, be sure its encoded according to our encoding @@ -429,15 +435,28 @@ class Commit(base.Object, Iterable, Diffable, Traversable, Serializable):          # now we can have the encoding line, or an empty line followed by the optional          # message.          self.encoding = self.default_encoding -        # read encoding or empty line to separate message -        enc = readline() -        enc = enc.strip() -        if enc: -            self.encoding = enc[enc.find(' ')+1:] -            # now comes the message separator  -            readline() -        # END handle encoding -         + +        # read headers +        buf = readline().strip() +        while buf != "": +            if buf[0:10] == "encoding ": +                self.encoding = buf[buf.find(' ')+1:] +            elif buf[0:7] == "gpgsig ": +                sig = buf[buf.find(' ')+1:] + "\n" +                is_next_header = False +                while True: +                    sigbuf = readline() +                    if sigbuf == "": break +                    if sigbuf[0:1] != " ": +                        buf = sigbuf.strip() +                        is_next_header = True +                        break +                    sig += sigbuf[1:] +                self.gpgsig = sig.rstrip("\n") +                if is_next_header: +                    continue +            buf = readline().strip() +          # decode the authors name          try:              self.author.name = self.author.name.decode(self.encoding)  diff --git a/git/test/fixtures/commit_with_gpgsig b/git/test/fixtures/commit_with_gpgsig new file mode 100644 index 00000000..f38cdabd --- /dev/null +++ b/git/test/fixtures/commit_with_gpgsig @@ -0,0 +1,30 @@ +tree cefbccb4843d821183ae195e70a17c9938318945 +parent 904435cf76a9bdd5eb41b1c4e049d5a64f3a8400 +author Jon Mason <jon.mason@intel.com> 1367013117 -0700 +committer Jon Mason <jon.mason@intel.com> 1368640702 -0700 +gpgsig -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.11 (GNU/Linux) +  + iQIcBAABAgAGBQJRk8zMAAoJEG5mS6x6i9IjsTEP/0v2Wx/i7dqyKban6XMIhVdj + uI0DycfXqnCCZmejidzeao+P+cuK/ZAA/b9fU4MtwkDm2USvnIOrB00W0isxsrED + sdv6uJNa2ybGjxBolLrfQcWutxGXLZ1FGRhEvkPTLMHHvVriKoNFXcS7ewxP9MBf + NH97K2wauqA+J4BDLDHQJgADCOmLrGTAU+G1eAXHIschDqa6PZMH5nInetYZONDh + 3SkOOv8VKFIF7gu8X7HC+7+Y8k8U0TW0cjlQ2icinwCc+KFoG6GwXS7u/VqIo1Yp + Tack6sxIdK7NXJhV5gAeAOMJBGhO0fHl8UUr96vGEKwtxyZhWf8cuIPOWLk06jA0 + g9DpLqmy/pvyRfiPci+24YdYRBua/vta+yo/Lp85N7Hu/cpIh+q5WSLvUlv09Dmo + TTTG8Hf6s3lEej7W8z2xcNZoB6GwXd8buSDU8cu0I6mEO9sNtAuUOHp2dBvTA6cX + PuQW8jg3zofnx7CyNcd3KF3nh2z8mBcDLgh0Q84srZJCPRuxRcp9ylggvAG7iaNd + XMNvSK8IZtWLkx7k3A3QYt1cN4y1zdSHLR2S+BVCEJea1mvUE+jK5wiB9S4XNtKm + BX/otlTa8pNE3fWYBxURvfHnMY4i3HQT7Bc1QjImAhMnyo2vJk4ORBJIZ1FTNIhJ + JzJMZDRLQLFvnzqZuCjE + =przd + -----END PGP SIGNATURE----- + +NTB: Multiple NTB client fix + +Fix issue with adding multiple ntb client devices to the ntb virtual +bus.  Previously, multiple devices would be added with the same name, +resulting in crashes.  To get around this issue, add a unique number to +the device when it is added. + +Signed-off-by: Jon Mason <jon.mason@intel.com> diff --git a/git/test/test_commit.py b/git/test/test_commit.py index 58e51151..f536470f 100644 --- a/git/test/test_commit.py +++ b/git/test/test_commit.py @@ -13,6 +13,7 @@ from gitdb.util import hex_to_bin  from cStringIO import StringIO  import time  import sys +import re  def assert_commit_serialization(rwrepo, commit_id, print_performance_info=False): @@ -272,4 +273,43 @@ class TestCommit(TestBase):          # actually, it can't be printed in a shell as repr wants to have ascii only          # it appears          cmt.author.__repr__() -         + +    def test_gpgsig(self): +        cmt = self.rorepo.commit() +        cmt._deserialize(open(fixture_path('commit_with_gpgsig'))) + +        fixture_sig = """-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.11 (GNU/Linux) + +iQIcBAABAgAGBQJRk8zMAAoJEG5mS6x6i9IjsTEP/0v2Wx/i7dqyKban6XMIhVdj +uI0DycfXqnCCZmejidzeao+P+cuK/ZAA/b9fU4MtwkDm2USvnIOrB00W0isxsrED +sdv6uJNa2ybGjxBolLrfQcWutxGXLZ1FGRhEvkPTLMHHvVriKoNFXcS7ewxP9MBf +NH97K2wauqA+J4BDLDHQJgADCOmLrGTAU+G1eAXHIschDqa6PZMH5nInetYZONDh +3SkOOv8VKFIF7gu8X7HC+7+Y8k8U0TW0cjlQ2icinwCc+KFoG6GwXS7u/VqIo1Yp +Tack6sxIdK7NXJhV5gAeAOMJBGhO0fHl8UUr96vGEKwtxyZhWf8cuIPOWLk06jA0 +g9DpLqmy/pvyRfiPci+24YdYRBua/vta+yo/Lp85N7Hu/cpIh+q5WSLvUlv09Dmo +TTTG8Hf6s3lEej7W8z2xcNZoB6GwXd8buSDU8cu0I6mEO9sNtAuUOHp2dBvTA6cX +PuQW8jg3zofnx7CyNcd3KF3nh2z8mBcDLgh0Q84srZJCPRuxRcp9ylggvAG7iaNd +XMNvSK8IZtWLkx7k3A3QYt1cN4y1zdSHLR2S+BVCEJea1mvUE+jK5wiB9S4XNtKm +BX/otlTa8pNE3fWYBxURvfHnMY4i3HQT7Bc1QjImAhMnyo2vJk4ORBJIZ1FTNIhJ +JzJMZDRLQLFvnzqZuCjE +=przd +-----END PGP SIGNATURE-----""" +        assert cmt.gpgsig == fixture_sig + +        cmt.gpgsig = "<test\ndummy\nsig>" +        assert cmt.gpgsig != fixture_sig + +        cstream = StringIO() +        cmt._serialize(cstream) +        assert re.search(r"^gpgsig <test\n dummy\n sig>$", cstream.getvalue(), re.MULTILINE) + +        cstream.seek(0) +        cmt.gpgsig = None +        cmt._deserialize(cstream) +        assert cmt.gpgsig == "<test\ndummy\nsig>" + +        cmt.gpgsig = None +        cstream = StringIO() +        cmt._serialize(cstream) +        assert not re.search(r"^gpgsig ", cstream.getvalue(), re.MULTILINE)  | 
