summaryrefslogtreecommitdiffstats
path: root/modules/git/signature.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/git/signature.go')
-rw-r--r--modules/git/signature.go29
1 files changed, 20 insertions, 9 deletions
diff --git a/modules/git/signature.go b/modules/git/signature.go
index 20f647d266..ad9c1b39b7 100644
--- a/modules/git/signature.go
+++ b/modules/git/signature.go
@@ -17,24 +17,35 @@ type Signature struct {
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> Thu, 07 Apr 2005 22:13:13 +0200
// but without the "author " at the beginning (this method should)
// be used for author and committer.
//
-// FIXME: include timezone!
-func newSignatureFromCommitline(line []byte) (*Signature, error) {
+// FIXME: include timezone for timestamp!
+func newSignatureFromCommitline(line []byte) (_ *Signature, err error) {
sig := new(Signature)
emailstart := bytes.IndexByte(line, '<')
sig.Name = string(line[:emailstart-1])
emailstop := bytes.IndexByte(line, '>')
sig.Email = string(line[emailstart+1 : emailstop])
- 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
+
+ // Check date format.
+ firstChar := line[emailstop+2]
+ if firstChar >= 48 && firstChar <= 57 {
+ 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
}