mirror of
https://github.com/go-gitea/gitea.git
synced 2024-12-04 14:46:57 -05:00
Parse commit trailers using mail.ParseAddress()
This commit is contained in:
parent
17205fa1d3
commit
22d8652f64
@ -6,7 +6,6 @@ package util
|
||||
import (
|
||||
"errors"
|
||||
"net/mail"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var ErrInvalidCommitTrailerValueSyntax = errors.New("syntax error occurred while parsing a commit trailer value")
|
||||
@ -17,26 +16,17 @@ var ErrInvalidCommitTrailerValueSyntax = errors.New("syntax error occurred while
|
||||
//
|
||||
// Foo Bar <foobar@example.com>
|
||||
func ParseCommitTrailerValueWithAuthor(value string) (name, email string, err error) {
|
||||
value = strings.TrimSpace(value)
|
||||
if !strings.HasSuffix(value, ">") {
|
||||
return "", "", ErrInvalidCommitTrailerValueSyntax
|
||||
addr, err := mail.ParseAddress(value)
|
||||
if err != nil {
|
||||
return name, email, err
|
||||
}
|
||||
|
||||
closedBracketIdx := len(value) - 1
|
||||
openBracketIdx := strings.LastIndex(value, "<")
|
||||
if openBracketIdx == -1 {
|
||||
return "", "", ErrInvalidCommitTrailerValueSyntax
|
||||
if addr.Name == "" {
|
||||
return name, email, errors.New("commit trailer missing name")
|
||||
}
|
||||
|
||||
email = value[openBracketIdx+1 : closedBracketIdx]
|
||||
if _, err := mail.ParseAddress(email); err != nil {
|
||||
return "", "", ErrInvalidCommitTrailerValueSyntax
|
||||
}
|
||||
|
||||
name = strings.TrimSpace(value[:openBracketIdx])
|
||||
if len(name) == 0 {
|
||||
return "", "", ErrInvalidCommitTrailerValueSyntax
|
||||
}
|
||||
name = addr.Name
|
||||
email = addr.Address
|
||||
|
||||
return name, email, nil
|
||||
}
|
||||
|
@ -24,8 +24,6 @@ func TestParseCommitTrailerValueWithAuthor(t *testing.T) {
|
||||
{" <foobar@example.com>", true, "", ""},
|
||||
{"Foo Bar <foobar@example.com>", false, "Foo Bar", "foobar@example.com"},
|
||||
{" Foo Bar <foobar@example.com>", false, "Foo Bar", "foobar@example.com"},
|
||||
// Account for edge case where name contains an open bracket.
|
||||
{" Foo < Bar <foobar@example.com>", false, "Foo < Bar", "foobar@example.com"},
|
||||
}
|
||||
|
||||
for n, c := range cases {
|
||||
@ -33,6 +31,9 @@ func TestParseCommitTrailerValueWithAuthor(t *testing.T) {
|
||||
if c.shouldBeError {
|
||||
assert.Error(t, err, "case %d should be a syntax error", n)
|
||||
} else {
|
||||
if err != nil {
|
||||
assert.Fail(t, "did not expect an error: %v", err)
|
||||
}
|
||||
assert.Equal(t, c.expectedName, name, "case %d should have correct name", n)
|
||||
assert.Equal(t, c.expectedEmail, email, "case %d should have correct email", n)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user