Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for parsing git trailers (#614)
Adds a wrapper for git_message_trailers which returns a slice of trailer structs.
- Loading branch information
1 parent
31f877e
commit 5241c72
Showing
2 changed files
with
84 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package git | ||
|
||
/* | ||
#include <git2.h> | ||
*/ | ||
import "C" | ||
import ( | ||
"runtime" | ||
"unsafe" | ||
) | ||
|
||
// Trailer represents a single git message trailer. | ||
type Trailer struct { | ||
Key string | ||
Value string | ||
} | ||
|
||
// MessageTrailers parses trailers out of a message, returning a slice of | ||
// Trailer structs. Trailers are key/value pairs in the last paragraph of a | ||
// message, not including any patches or conflicts that may be present. | ||
func MessageTrailers(message string) ([]Trailer, error) { | ||
var trailersC C.git_message_trailer_array | ||
|
||
messageC := C.CString(message) | ||
defer C.free(unsafe.Pointer(messageC)) | ||
|
||
runtime.LockOSThread() | ||
defer runtime.UnlockOSThread() | ||
|
||
ecode := C.git_message_trailers(&trailersC, messageC) | ||
if ecode < 0 { | ||
return nil, MakeGitError(ecode) | ||
} | ||
defer C.git_message_trailer_array_free(&trailersC) | ||
trailers := make([]Trailer, trailersC.count) | ||
var trailer *C.git_message_trailer | ||
for i, p := 0, uintptr(unsafe.Pointer(trailersC.trailers)); i < int(trailersC.count); i, p = i+1, p+unsafe.Sizeof(C.git_message_trailer{}) { | ||
trailer = (*C.git_message_trailer)(unsafe.Pointer(p)) | ||
trailers[i] = Trailer{Key: C.GoString(trailer.key), Value: C.GoString(trailer.value)} | ||
} | ||
return trailers, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package git | ||
|
||
import ( | ||
"fmt" | ||
"reflect" | ||
"testing" | ||
) | ||
|
||
func TestTrailers(t *testing.T) { | ||
t.Parallel() | ||
tests := []struct { | ||
input string | ||
expected []Trailer | ||
}{ | ||
{ | ||
"commit with zero trailers\n", | ||
[]Trailer{}, | ||
}, | ||
{ | ||
"commit with one trailer\n\nCo-authored-by: Alice <alice@example.com>\n", | ||
[]Trailer{ | ||
Trailer{Key: "Co-authored-by", Value: "Alice <alice@example.com>"}, | ||
}, | ||
}, | ||
{ | ||
"commit with two trailers\n\nCo-authored-by: Alice <alice@example.com>\nSigned-off-by: Bob <bob@example.com>\n", | ||
[]Trailer{ | ||
Trailer{Key: "Co-authored-by", Value: "Alice <alice@example.com>"}, | ||
Trailer{Key: "Signed-off-by", Value: "Bob <bob@example.com>"}}, | ||
}, | ||
} | ||
for _, test := range tests { | ||
fmt.Printf("%s", test.input) | ||
actual, err := MessageTrailers(test.input) | ||
if err != nil { | ||
t.Errorf("Trailers returned an unexpected error: %v", err) | ||
} | ||
if !reflect.DeepEqual(test.expected, actual) { | ||
t.Errorf("expecting %#v\ngot %#v", test.expected, actual) | ||
} | ||
} | ||
} |