From 1395a17c1a5a05a465032519932794c486e43559 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Wed, 8 Mar 2017 20:50:12 +0100 Subject: [PATCH 1/2] Add GPG payload to commit information if present based on : https://github.com/git/git/blob/3bc53220cb2dcf709f7a027a3f526befd021d858/commit.c#L1128 --- commit.go | 21 +++++++++++++++++++++ repo_commit.go | 6 ++++++ 2 files changed, 27 insertions(+) diff --git a/commit.go b/commit.go index fa5e18561..e611f0893 100644 --- a/commit.go +++ b/commit.go @@ -6,6 +6,7 @@ package git import ( "bufio" + "bytes" "container/list" "fmt" "net/http" @@ -22,11 +23,31 @@ type Commit struct { Author *Signature Committer *Signature CommitMessage string + Signature *CommitGPGSignature parents []SHA1 // SHA1 strings submoduleCache *ObjectCache } +// CommitGPGSignature represents a git commit signature part. +type CommitGPGSignature struct { + Signature string + Payload string //TODO check if can be reconstruct from the rest of commit information to not have duplicate data +} + +// similar to https://github.com/git/git/blob/3bc53220cb2dcf709f7a027a3f526befd021d858/commit.c#L1128 +func newGPGSignatureFromCommitline(data []byte, signatureStart int) (*CommitGPGSignature, error) { + sig := new(CommitGPGSignature) + sig.Payload = string(data[:signatureStart-8]) + signatureEnd := bytes.LastIndex(data, []byte("-----END PGP SIGNATURE-----")) + if signatureEnd == -1 { + return nil, fmt.Errorf("end of commit signature not found") + } + sig.Signature = string(data[signatureStart : signatureEnd+27]) + + return sig, nil +} + // Message returns the commit message. Same as retrieving CommitMessage directly. func (c *Commit) Message() string { return c.CommitMessage diff --git a/repo_commit.go b/repo_commit.go index 97f44abda..37219734a 100644 --- a/repo_commit.go +++ b/repo_commit.go @@ -78,6 +78,12 @@ l: return nil, err } commit.Committer = sig + case "gpgsig": + sig, err := newGPGSignatureFromCommitline(data, nextline+spacepos+1) + if err != nil { + return nil, err + } + commit.Signature = sig } nextline += eol + 1 case eol == 0: From 335d1be33a8b2845aca44af909f55c880914e912 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sat, 11 Mar 2017 00:29:38 +0100 Subject: [PATCH 2/2] Fix missing data in payload + leading space in Signature --- commit.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/commit.go b/commit.go index e611f0893..28dd26483 100644 --- a/commit.go +++ b/commit.go @@ -38,13 +38,12 @@ type CommitGPGSignature struct { // similar to https://github.com/git/git/blob/3bc53220cb2dcf709f7a027a3f526befd021d858/commit.c#L1128 func newGPGSignatureFromCommitline(data []byte, signatureStart int) (*CommitGPGSignature, error) { sig := new(CommitGPGSignature) - sig.Payload = string(data[:signatureStart-8]) signatureEnd := bytes.LastIndex(data, []byte("-----END PGP SIGNATURE-----")) if signatureEnd == -1 { return nil, fmt.Errorf("end of commit signature not found") } - sig.Signature = string(data[signatureStart : signatureEnd+27]) - + sig.Signature = strings.Replace(string(data[signatureStart:signatureEnd+27]), "\n ", "\n", -1) + sig.Payload = string(data[:signatureStart-8]) + string(data[signatureEnd+27:]) return sig, nil }