2016-11-04 01:16:01 +03:00
// Copyright 2015 The Gogs Authors. All rights reserved.
2019-04-19 15:17:27 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2016-11-04 01:16:01 +03:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package git
import (
"bytes"
"strconv"
"time"
2019-04-19 15:17:27 +03:00
2020-03-17 19:19:58 +03:00
"github.com/go-git/go-git/v5/plumbing/object"
2016-11-04 01:16:01 +03:00
)
// Signature represents the Author or Committer information.
2019-04-19 15:17:27 +03:00
type Signature = object . Signature
2016-11-04 01:16:01 +03:00
2017-12-11 05:23:34 +03:00
const (
// GitTimeLayout is the (default) time layout used by git.
GitTimeLayout = "Mon Jan _2 15:04:05 2006 -0700"
)
2016-11-04 01:16:01 +03:00
// 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 for timestamp!
func newSignatureFromCommitline ( line [ ] byte ) ( _ * Signature , err error ) {
sig := new ( Signature )
emailStart := bytes . IndexByte ( line , '<' )
sig . Name = string ( line [ : emailStart - 1 ] )
emailEnd := bytes . IndexByte ( line , '>' )
sig . Email = string ( line [ emailStart + 1 : emailEnd ] )
// Check date format.
2017-10-23 16:36:14 +03:00
if len ( line ) > emailEnd + 2 {
firstChar := line [ emailEnd + 2 ]
if firstChar >= 48 && firstChar <= 57 {
timestop := bytes . IndexByte ( line [ emailEnd + 2 : ] , ' ' )
timestring := string ( line [ emailEnd + 2 : emailEnd + 2 + timestop ] )
seconds , _ := strconv . ParseInt ( timestring , 10 , 64 )
sig . When = time . Unix ( seconds , 0 )
} else {
2017-12-11 05:23:34 +03:00
sig . When , err = time . Parse ( GitTimeLayout , string ( line [ emailEnd + 2 : ] ) )
2017-10-23 16:36:14 +03:00
if err != nil {
return nil , err
}
2016-11-04 01:16:01 +03:00
}
2017-10-23 16:36:14 +03:00
} else {
// Fall back to unix 0 time
sig . When = time . Unix ( 0 , 0 )
2016-11-04 01:16:01 +03:00
}
return sig , nil
}