Refactor parseSignatureFromCommitLine (#29054)
Replace #28849. Thanks to @yp05327 for the looking into the problem. Fix #28840 The old behavior of newSignatureFromCommitline is not right. The new parseSignatureFromCommitLine: 1. never fails 2. only accept one format (if there is any other, it could be easily added) And add some tests.
This commit is contained in:
parent
da2f03750f
commit
a24e1da7e9
8 changed files with 104 additions and 149 deletions
|
@ -4,7 +4,46 @@
|
|||
|
||||
package git
|
||||
|
||||
const (
|
||||
// GitTimeLayout is the (default) time layout used by git.
|
||||
GitTimeLayout = "Mon Jan _2 15:04:05 2006 -0700"
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
)
|
||||
|
||||
// Helper to get a signature from the commit line, which looks like:
|
||||
//
|
||||
// full name <user@example.com> 1378823654 +0200
|
||||
//
|
||||
// Haven't found the official reference for the standard format yet.
|
||||
// This function never fails, if the "line" can't be parsed, it returns a default Signature with "zero" time.
|
||||
func parseSignatureFromCommitLine(line string) *Signature {
|
||||
sig := &Signature{}
|
||||
s1, sx, ok1 := strings.Cut(line, " <")
|
||||
s2, s3, ok2 := strings.Cut(sx, "> ")
|
||||
if !ok1 || !ok2 {
|
||||
sig.Name = line
|
||||
return sig
|
||||
}
|
||||
sig.Name, sig.Email = s1, s2
|
||||
|
||||
if strings.Count(s3, " ") == 1 {
|
||||
ts, tz, _ := strings.Cut(s3, " ")
|
||||
seconds, _ := strconv.ParseInt(ts, 10, 64)
|
||||
if tzTime, err := time.Parse("-0700", tz); err == nil {
|
||||
sig.When = time.Unix(seconds, 0).In(tzTime.Location())
|
||||
}
|
||||
} else {
|
||||
// the old gitea code tried to parse the date in a few different formats, but it's not clear why.
|
||||
// according to public document, only the standard format "timestamp timezone" could be found, so drop other formats.
|
||||
log.Error("suspicious commit line format: %q", line)
|
||||
for _, fmt := range []string{ /*"Mon Jan _2 15:04:05 2006 -0700"*/ } {
|
||||
if t, err := time.Parse(fmt, s3); err == nil {
|
||||
sig.When = t
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return sig
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue