mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	Backport #29054. Fix #28840 This backport is for 1.21 only and it is different from the change in 1.22: this backport still accept the legacy date format to avoid breaking.
		
			
				
	
	
		
			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
 | |
| }
 |