github.com/ethereum/go-ethereum@v1.16.1/internal/version/vcs.go (about) 1 // Copyright 2022 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package version 18 19 import ( 20 "runtime/debug" 21 "time" 22 ) 23 24 // In go 1.18 and beyond, the go tool embeds VCS information into the build. 25 26 const ( 27 govcsTimeLayout = "2006-01-02T15:04:05Z" 28 ourTimeLayout = "20060102" 29 ) 30 31 // These variables are set at build-time by the linker when the build is 32 // done by build/ci.go. 33 var gitCommit, gitDate string 34 35 // VCSInfo represents the git repository state. 36 type VCSInfo struct { 37 Commit string // head commit hash 38 Date string // commit time in YYYYMMDD format 39 Dirty bool 40 } 41 42 // VCS returns version control information of the current executable. 43 func VCS() (VCSInfo, bool) { 44 if gitCommit != "" { 45 // Use information set by the build script if present. 46 return VCSInfo{Commit: gitCommit, Date: gitDate}, true 47 } 48 if buildInfo, ok := debug.ReadBuildInfo(); ok { 49 if buildInfo.Main.Path == ourPath { 50 return buildInfoVCS(buildInfo) 51 } 52 } 53 return VCSInfo{}, false 54 } 55 56 // buildInfoVCS returns VCS information of the build. 57 func buildInfoVCS(info *debug.BuildInfo) (s VCSInfo, ok bool) { 58 for _, v := range info.Settings { 59 switch v.Key { 60 case "vcs.revision": 61 s.Commit = v.Value 62 case "vcs.modified": 63 if v.Value == "true" { 64 s.Dirty = true 65 } 66 case "vcs.time": 67 t, err := time.Parse(govcsTimeLayout, v.Value) 68 if err == nil { 69 s.Date = t.Format(ourTimeLayout) 70 } 71 } 72 } 73 if s.Commit != "" && s.Date != "" { 74 ok = true 75 } 76 return 77 }