wxiaoguang
a24e1da7e9
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.
50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
// Copyright 2015 The Gogs Authors. All rights reserved.
|
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package git
|
|
|
|
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
|
|
}
|