modules/git: able to parse RFC1123Z date format #663

This commit is contained in:
Unknwon 2015-02-21 23:37:32 -05:00
parent 3fcc39c26b
commit 9dfa17faf2

View File

@ -17,24 +17,35 @@ type Signature struct {
When time.Time When time.Time
} }
// Helper to get a signature from the commit line, which looks like this: // Helper to get a signature from the commit line, which looks like these:
// author Patrick Gundlach <gundlach@speedata.de> 1378823654 +0200 // author Patrick Gundlach <gundlach@speedata.de> 1378823654 +0200
// author Patrick Gundlach <gundlach@speedata.de> Thu, 07 Apr 2005 22:13:13 +0200
// but without the "author " at the beginning (this method should) // but without the "author " at the beginning (this method should)
// be used for author and committer. // be used for author and committer.
// //
// FIXME: include timezone! // FIXME: include timezone for timestamp!
func newSignatureFromCommitline(line []byte) (*Signature, error) { func newSignatureFromCommitline(line []byte) (_ *Signature, err error) {
sig := new(Signature) sig := new(Signature)
emailstart := bytes.IndexByte(line, '<') emailstart := bytes.IndexByte(line, '<')
sig.Name = string(line[:emailstart-1]) sig.Name = string(line[:emailstart-1])
emailstop := bytes.IndexByte(line, '>') emailstop := bytes.IndexByte(line, '>')
sig.Email = string(line[emailstart+1 : emailstop]) sig.Email = string(line[emailstart+1 : emailstop])
timestop := bytes.IndexByte(line[emailstop+2:], ' ')
timestring := string(line[emailstop+2 : emailstop+2+timestop]) // Check date format.
seconds, err := strconv.ParseInt(timestring, 10, 64) firstChar := line[emailstop+2]
if err != nil { if firstChar >= 48 && firstChar <= 57 {
return nil, err timestop := bytes.IndexByte(line[emailstop+2:], ' ')
timestring := string(line[emailstop+2 : emailstop+2+timestop])
seconds, err := strconv.ParseInt(timestring, 10, 64)
if err != nil {
return nil, err
}
sig.When = time.Unix(seconds, 0)
} else {
sig.When, err = time.Parse(time.RFC1123Z, string(line[emailstop+2:]))
if err != nil {
return nil, err
}
} }
sig.When = time.Unix(seconds, 0)
return sig, nil return sig, nil
} }