Przeglądaj źródła

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

Unknwon 10 lat temu
rodzic
commit
9dfa17faf2
1 zmienionych plików z 20 dodań i 9 usunięć
  1. 20 9
      modules/git/signature.go

+ 20 - 9
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
 }