build: add check for stale generated files (#30037)

Co-authored-by: Felix Lange <fjl@twurst.com>
pull/30109/head
jwasinger 3 months ago committed by GitHub
parent a4e338f05e
commit 41abab9e39
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 26
      accounts/usbwallet/trezor/messages-common.pb.go
  2. 24
      accounts/usbwallet/trezor/messages-ethereum.pb.go
  3. 46
      accounts/usbwallet/trezor/messages-management.pb.go
  4. 4
      accounts/usbwallet/trezor/messages.pb.go
  5. 1
      appveyor.yml
  6. 25
      build/checksums.txt
  7. 174
      build/ci.go
  8. 2
      core/tracing/hooks.go
  9. 11
      internal/build/archive.go

@ -4,7 +4,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.33.0
// protoc-gen-go v1.34.2
// protoc v5.27.1
// source: messages-common.proto
@ -1010,7 +1010,7 @@ func file_messages_common_proto_rawDescGZIP() []byte {
var file_messages_common_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_messages_common_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
var file_messages_common_proto_goTypes = []interface{}{
var file_messages_common_proto_goTypes = []any{
(Failure_FailureType)(0), // 0: hw.trezor.messages.common.Failure.FailureType
(ButtonRequest_ButtonRequestType)(0), // 1: hw.trezor.messages.common.ButtonRequest.ButtonRequestType
(PinMatrixRequest_PinMatrixRequestType)(0), // 2: hw.trezor.messages.common.PinMatrixRequest.PinMatrixRequestType
@ -1043,7 +1043,7 @@ func file_messages_common_proto_init() {
return
}
if !protoimpl.UnsafeEnabled {
file_messages_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[0].Exporter = func(v any, i int) any {
switch v := v.(*Success); i {
case 0:
return &v.state
@ -1055,7 +1055,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[1].Exporter = func(v any, i int) any {
switch v := v.(*Failure); i {
case 0:
return &v.state
@ -1067,7 +1067,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[2].Exporter = func(v any, i int) any {
switch v := v.(*ButtonRequest); i {
case 0:
return &v.state
@ -1079,7 +1079,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[3].Exporter = func(v any, i int) any {
switch v := v.(*ButtonAck); i {
case 0:
return &v.state
@ -1091,7 +1091,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[4].Exporter = func(v any, i int) any {
switch v := v.(*PinMatrixRequest); i {
case 0:
return &v.state
@ -1103,7 +1103,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[5].Exporter = func(v any, i int) any {
switch v := v.(*PinMatrixAck); i {
case 0:
return &v.state
@ -1115,7 +1115,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[6].Exporter = func(v any, i int) any {
switch v := v.(*PassphraseRequest); i {
case 0:
return &v.state
@ -1127,7 +1127,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[7].Exporter = func(v any, i int) any {
switch v := v.(*PassphraseAck); i {
case 0:
return &v.state
@ -1139,7 +1139,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[8].Exporter = func(v any, i int) any {
switch v := v.(*PassphraseStateRequest); i {
case 0:
return &v.state
@ -1151,7 +1151,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[9].Exporter = func(v any, i int) any {
switch v := v.(*PassphraseStateAck); i {
case 0:
return &v.state
@ -1163,7 +1163,7 @@ func file_messages_common_proto_init() {
return nil
}
}
file_messages_common_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
file_messages_common_proto_msgTypes[10].Exporter = func(v any, i int) any {
switch v := v.(*HDNodeType); i {
case 0:
return &v.state

@ -4,7 +4,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.33.0
// protoc-gen-go v1.34.2
// protoc v5.27.1
// source: messages-ethereum.proto
@ -831,7 +831,7 @@ func file_messages_ethereum_proto_rawDescGZIP() []byte {
}
var file_messages_ethereum_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
var file_messages_ethereum_proto_goTypes = []interface{}{
var file_messages_ethereum_proto_goTypes = []any{
(*EthereumGetPublicKey)(nil), // 0: hw.trezor.messages.ethereum.EthereumGetPublicKey
(*EthereumPublicKey)(nil), // 1: hw.trezor.messages.ethereum.EthereumPublicKey
(*EthereumGetAddress)(nil), // 2: hw.trezor.messages.ethereum.EthereumGetAddress
@ -860,7 +860,7 @@ func file_messages_ethereum_proto_init() {
}
file_messages_common_proto_init()
if !protoimpl.UnsafeEnabled {
file_messages_ethereum_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[0].Exporter = func(v any, i int) any {
switch v := v.(*EthereumGetPublicKey); i {
case 0:
return &v.state
@ -872,7 +872,7 @@ func file_messages_ethereum_proto_init() {
return nil
}
}
file_messages_ethereum_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[1].Exporter = func(v any, i int) any {
switch v := v.(*EthereumPublicKey); i {
case 0:
return &v.state
@ -884,7 +884,7 @@ func file_messages_ethereum_proto_init() {
return nil
}
}
file_messages_ethereum_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[2].Exporter = func(v any, i int) any {
switch v := v.(*EthereumGetAddress); i {
case 0:
return &v.state
@ -896,7 +896,7 @@ func file_messages_ethereum_proto_init() {
return nil
}
}
file_messages_ethereum_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[3].Exporter = func(v any, i int) any {
switch v := v.(*EthereumAddress); i {
case 0:
return &v.state
@ -908,7 +908,7 @@ func file_messages_ethereum_proto_init() {
return nil
}
}
file_messages_ethereum_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[4].Exporter = func(v any, i int) any {
switch v := v.(*EthereumSignTx); i {
case 0:
return &v.state
@ -920,7 +920,7 @@ func file_messages_ethereum_proto_init() {
return nil
}
}
file_messages_ethereum_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[5].Exporter = func(v any, i int) any {
switch v := v.(*EthereumTxRequest); i {
case 0:
return &v.state
@ -932,7 +932,7 @@ func file_messages_ethereum_proto_init() {
return nil
}
}
file_messages_ethereum_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[6].Exporter = func(v any, i int) any {
switch v := v.(*EthereumTxAck); i {
case 0:
return &v.state
@ -944,7 +944,7 @@ func file_messages_ethereum_proto_init() {
return nil
}
}
file_messages_ethereum_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[7].Exporter = func(v any, i int) any {
switch v := v.(*EthereumSignMessage); i {
case 0:
return &v.state
@ -956,7 +956,7 @@ func file_messages_ethereum_proto_init() {
return nil
}
}
file_messages_ethereum_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[8].Exporter = func(v any, i int) any {
switch v := v.(*EthereumMessageSignature); i {
case 0:
return &v.state
@ -968,7 +968,7 @@ func file_messages_ethereum_proto_init() {
return nil
}
}
file_messages_ethereum_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
file_messages_ethereum_proto_msgTypes[9].Exporter = func(v any, i int) any {
switch v := v.(*EthereumVerifyMessage); i {
case 0:
return &v.state

@ -4,7 +4,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.33.0
// protoc-gen-go v1.34.2
// protoc v5.27.1
// source: messages-management.proto
@ -1955,7 +1955,7 @@ func file_messages_management_proto_rawDescGZIP() []byte {
var file_messages_management_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_messages_management_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
var file_messages_management_proto_goTypes = []interface{}{
var file_messages_management_proto_goTypes = []any{
(ApplySettings_PassphraseSourceType)(0), // 0: hw.trezor.messages.management.ApplySettings.PassphraseSourceType
(RecoveryDevice_RecoveryDeviceType)(0), // 1: hw.trezor.messages.management.RecoveryDevice.RecoveryDeviceType
(WordRequest_WordRequestType)(0), // 2: hw.trezor.messages.management.WordRequest.WordRequestType
@ -2001,7 +2001,7 @@ func file_messages_management_proto_init() {
}
file_messages_common_proto_init()
if !protoimpl.UnsafeEnabled {
file_messages_management_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[0].Exporter = func(v any, i int) any {
switch v := v.(*Initialize); i {
case 0:
return &v.state
@ -2013,7 +2013,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[1].Exporter = func(v any, i int) any {
switch v := v.(*GetFeatures); i {
case 0:
return &v.state
@ -2025,7 +2025,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[2].Exporter = func(v any, i int) any {
switch v := v.(*Features); i {
case 0:
return &v.state
@ -2037,7 +2037,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[3].Exporter = func(v any, i int) any {
switch v := v.(*ClearSession); i {
case 0:
return &v.state
@ -2049,7 +2049,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[4].Exporter = func(v any, i int) any {
switch v := v.(*ApplySettings); i {
case 0:
return &v.state
@ -2061,7 +2061,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[5].Exporter = func(v any, i int) any {
switch v := v.(*ApplyFlags); i {
case 0:
return &v.state
@ -2073,7 +2073,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[6].Exporter = func(v any, i int) any {
switch v := v.(*ChangePin); i {
case 0:
return &v.state
@ -2085,7 +2085,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[7].Exporter = func(v any, i int) any {
switch v := v.(*Ping); i {
case 0:
return &v.state
@ -2097,7 +2097,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[8].Exporter = func(v any, i int) any {
switch v := v.(*Cancel); i {
case 0:
return &v.state
@ -2109,7 +2109,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[9].Exporter = func(v any, i int) any {
switch v := v.(*GetEntropy); i {
case 0:
return &v.state
@ -2121,7 +2121,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[10].Exporter = func(v any, i int) any {
switch v := v.(*Entropy); i {
case 0:
return &v.state
@ -2133,7 +2133,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[11].Exporter = func(v any, i int) any {
switch v := v.(*WipeDevice); i {
case 0:
return &v.state
@ -2145,7 +2145,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[12].Exporter = func(v any, i int) any {
switch v := v.(*LoadDevice); i {
case 0:
return &v.state
@ -2157,7 +2157,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[13].Exporter = func(v any, i int) any {
switch v := v.(*ResetDevice); i {
case 0:
return &v.state
@ -2169,7 +2169,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[14].Exporter = func(v any, i int) any {
switch v := v.(*BackupDevice); i {
case 0:
return &v.state
@ -2181,7 +2181,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[15].Exporter = func(v any, i int) any {
switch v := v.(*EntropyRequest); i {
case 0:
return &v.state
@ -2193,7 +2193,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[16].Exporter = func(v any, i int) any {
switch v := v.(*EntropyAck); i {
case 0:
return &v.state
@ -2205,7 +2205,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[17].Exporter = func(v any, i int) any {
switch v := v.(*RecoveryDevice); i {
case 0:
return &v.state
@ -2217,7 +2217,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[18].Exporter = func(v any, i int) any {
switch v := v.(*WordRequest); i {
case 0:
return &v.state
@ -2229,7 +2229,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[19].Exporter = func(v any, i int) any {
switch v := v.(*WordAck); i {
case 0:
return &v.state
@ -2241,7 +2241,7 @@ func file_messages_management_proto_init() {
return nil
}
}
file_messages_management_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
file_messages_management_proto_msgTypes[20].Exporter = func(v any, i int) any {
switch v := v.(*SetU2FCounter); i {
case 0:
return &v.state

@ -4,7 +4,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.33.0
// protoc-gen-go v1.34.2
// protoc v5.27.1
// source: messages.proto
@ -1320,7 +1320,7 @@ func file_messages_proto_rawDescGZIP() []byte {
}
var file_messages_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_messages_proto_goTypes = []interface{}{
var file_messages_proto_goTypes = []any{
(MessageType)(0), // 0: hw.trezor.messages.MessageType
(*descriptorpb.EnumValueOptions)(nil), // 1: google.protobuf.EnumValueOptions
}

@ -24,6 +24,7 @@ for:
- image: Ubuntu
build_script:
- go run build/ci.go lint
- go run build/ci.go generate -verify
- go run build/ci.go install -dlgo
test_script:
- go run build/ci.go test -dlgo -short

@ -99,3 +99,28 @@ d7f0013f82e6d7f862cc6cb5c8cdb48eef5f2e239b35baa97e2f1a7466043767 go1.19.6.src.t
# version:ppa-builder-2 1.21.9
# https://go.dev/dl/
58f0c5ced45a0012bce2ff7a9df03e128abcc8818ebabe5027bb92bafe20e421 go1.21.9.src.tar.gz
# version:protoc 27.1
# https://github.com/protocolbuffers/protobuf/releases/
# https://github.com/protocolbuffers/protobuf/releases/download/v27.1/
8809c2ec85368c6b6e9af161b6771a153aa92670a24adbe46dd34fa02a04df2f protoc-27.1-linux-aarch_64.zip
5d21979a6d27475e810b76b88863d1e784fa01ffb15e511a3ec5bd1924d89426 protoc-27.1-linux-ppcle_64.zip
84d8852750ed186dc4a057a1a86bcac409be5362d6af04770f42367fee6b7bc1 protoc-27.1-linux-s390_64.zip
2f028796ff5741691650e0eea290e61ff2f1c0d87f8d31fe45ef47fd967cef0c protoc-27.1-linux-x86_32.zip
8970e3d8bbd67d53768fe8c2e3971bdd71e51cfe2001ca06dacad17258a7dae3 protoc-27.1-linux-x86_64.zip
03b7af1bf469e7285dc51976ee5fa99412704dbd1c017105114852a37b165c12 protoc-27.1-osx-aarch_64.zip
f14d3973cf13283d07c520ed6f4c12405ad41b9efd18089a1c74897037d742b5 protoc-27.1-osx-universal_binary.zip
8520d944f3a3890fa296a3b3b0d4bb18337337e2526bbbf1b507eeea3c2a1ec4 protoc-27.1-osx-x86_64.zip
6263718ff96547b8392a079f6fdf02a4156f2e8d13cd51649a0d03fb7afa2de8 protoc-27.1-win32.zip
da531c51ccd1290d8d34821f0ce4e219c7fbaa6f9825f5a3fb092a9d03fe6206 protoc-27.1-win64.zip
# version:protoc-gen-go 1.34.2
# https://github.com/protocolbuffers/protobuf-go/releases/
# https://github.com/protocolbuffers/protobuf-go/releases/download/v1.34.2/
9b48d8f90add02e8e94e14962fed74e7ce2b2d6bda4dd42f1f4fbccf0f766f1a protoc-gen-go.v1.34.2.darwin.amd64.tar.gz
17aca7f948dbb624049030cf841e35895cf34183ba006e721247fdeb95ff2780 protoc-gen-go.v1.34.2.darwin.arm64.tar.gz
a191849433fd489f1d44f37788d762658f3f5fb225f3a85d4ce6ba32666703ed protoc-gen-go.v1.34.2.linux.386.tar.gz
b87bc134dee55576a842141bf0ed27761c635d746780fce5dee038c6dd16554f protoc-gen-go.v1.34.2.linux.amd64.tar.gz
63d400167e75ab9f6690688f6fdc6a9455aa20bc1faa71e32149dbd322f7f198 protoc-gen-go.v1.34.2.linux.arm64.tar.gz
56e7675816db6e62be4f833a51544d5716b8420c462515579e05ca8444ab06ed protoc-gen-go.v1.34.2.windows.386.zip
abafd39612177dd4e9a65207cadd5374a9352d8611e8e040f8462fcfa3010daf protoc-gen-go.v1.34.2.windows.amd64.zip

@ -39,9 +39,11 @@ package main
import (
"bytes"
"crypto/sha256"
"encoding/base64"
"flag"
"fmt"
"io"
"log"
"os"
"os/exec"
@ -169,6 +171,8 @@ func main() {
doPurge(os.Args[2:])
case "sanitycheck":
doSanityCheck()
case "generate":
doGenerate()
default:
log.Fatal("unknown command ", os.Args[1])
}
@ -345,6 +349,86 @@ func downloadSpecTestFixtures(csdb *build.ChecksumDB, cachedir string) string {
return filepath.Join(cachedir, base)
}
// hashSourceFiles iterates all files under the top-level project directory
// computing the hash of each file (excluding files within the tests
// subrepo)
func hashSourceFiles() (map[string]common.Hash, error) {
res := make(map[string]common.Hash)
err := filepath.WalkDir(".", func(path string, d os.DirEntry, err error) error {
if strings.HasPrefix(path, filepath.FromSlash("tests/testdata")) {
return filepath.SkipDir
}
if !d.Type().IsRegular() {
return nil
}
// open the file and hash it
f, err := os.OpenFile(path, os.O_RDONLY, 0666)
if err != nil {
return err
}
hasher := sha256.New()
if _, err := io.Copy(hasher, f); err != nil {
return err
}
res[path] = common.Hash(hasher.Sum(nil))
return nil
})
if err != nil {
return nil, err
}
return res, nil
}
// doGenerate ensures that re-generating generated files does not cause
// any mutations in the source file tree: i.e. all generated files were
// updated and committed. Any stale generated files are updated.
func doGenerate() {
var (
tc = new(build.GoToolchain)
cachedir = flag.String("cachedir", "./build/cache", "directory for caching binaries.")
verify = flag.Bool("verify", false, "check whether any files are changed by go generate")
)
protocPath := downloadProtoc(*cachedir)
protocGenGoPath := downloadProtocGenGo(*cachedir)
var preHashes map[string]common.Hash
if *verify {
var err error
preHashes, err = hashSourceFiles()
if err != nil {
log.Fatal("failed to compute map of source hashes", "err", err)
}
}
c := tc.Go("generate", "./...")
pathList := []string{filepath.Join(protocPath, "bin"), protocGenGoPath, os.Getenv("PATH")}
c.Env = append(c.Env, "PATH="+strings.Join(pathList, string(os.PathListSeparator)))
build.MustRun(c)
if !*verify {
return
}
// Check if files were changed.
postHashes, err := hashSourceFiles()
if err != nil {
log.Fatal("error computing source tree file hashes", "err", err)
}
updates := []string{}
for path, postHash := range postHashes {
preHash, ok := preHashes[path]
if !ok || preHash != postHash {
updates = append(updates, path)
}
}
for _, updatedFile := range updates {
fmt.Fprintf(os.Stderr, "changed file %s\n", updatedFile)
}
if len(updates) != 0 {
log.Fatal("One or more generated files were updated by running 'go generate ./...'")
}
}
// doLint runs golangci-lint on requested packages.
func doLint(cmdline []string) {
var (
@ -390,6 +474,96 @@ func downloadLinter(cachedir string) string {
return filepath.Join(cachedir, base, "golangci-lint")
}
// protocArchiveBaseName returns the name of the protoc archive file for
// the current system, stripped of version and file suffix.
func protocArchiveBaseName() (string, error) {
switch runtime.GOOS + "-" + runtime.GOARCH {
case "windows-amd64":
return "win64", nil
case "windows-386":
return "win32", nil
case "linux-arm64":
return "linux-aarch_64", nil
case "linux-386":
return "linux-x86_32", nil
case "linux-amd64":
return "linux-x86_64", nil
case "darwin-arm64":
return "osx-aarch_64", nil
case "darwin-amd64":
return "osx-x86_64", nil
default:
return "", fmt.Errorf("no prebuilt release of protoc available for this system (os: %s, arch: %s)", runtime.GOOS, runtime.GOARCH)
}
}
// downloadProtocGenGo downloads protoc-gen-go, which is used by protoc
// in the generate command. It returns the full path of the directory
// containing the 'protoc-gen-go' executable.
func downloadProtocGenGo(cachedir string) string {
csdb := build.MustLoadChecksums("build/checksums.txt")
version, err := build.Version(csdb, "protoc-gen-go")
if err != nil {
log.Fatal(err)
}
baseName := fmt.Sprintf("protoc-gen-go.v%s.%s.%s", version, runtime.GOOS, runtime.GOARCH)
archiveName := baseName
if runtime.GOOS == "windows" {
archiveName += ".zip"
} else {
archiveName += ".tar.gz"
}
url := fmt.Sprintf("https://github.com/protocolbuffers/protobuf-go/releases/download/v%s/%s", version, archiveName)
archivePath := path.Join(cachedir, archiveName)
if err := csdb.DownloadFile(url, archivePath); err != nil {
log.Fatal(err)
}
extractDest := filepath.Join(cachedir, baseName)
if err := build.ExtractArchive(archivePath, extractDest); err != nil {
log.Fatal(err)
}
extractDest, err = filepath.Abs(extractDest)
if err != nil {
log.Fatal("error resolving absolute path for protoc", "err", err)
}
return extractDest
}
// downloadProtoc downloads the prebuilt protoc binary used to lint generated
// files as a CI step. It returns the full path to the directory containing
// the protoc executable.
func downloadProtoc(cachedir string) string {
csdb := build.MustLoadChecksums("build/checksums.txt")
version, err := build.Version(csdb, "protoc")
if err != nil {
log.Fatal(err)
}
baseName, err := protocArchiveBaseName()
if err != nil {
log.Fatal(err)
}
fileName := fmt.Sprintf("protoc-%s-%s", version, baseName)
archiveFileName := fileName + ".zip"
url := fmt.Sprintf("https://github.com/protocolbuffers/protobuf/releases/download/v%s/%s", version, archiveFileName)
archivePath := filepath.Join(cachedir, archiveFileName)
if err := csdb.DownloadFile(url, archivePath); err != nil {
log.Fatal(err)
}
extractDest := filepath.Join(cachedir, fileName)
if err := build.ExtractArchive(archivePath, extractDest); err != nil {
log.Fatal(err)
}
extractDest, err = filepath.Abs(extractDest)
if err != nil {
log.Fatal("error resolving absolute path for protoc", "err", err)
}
return extractDest
}
// Release Packaging
func doArchive(cmdline []string) {
var (

@ -199,7 +199,7 @@ type Hooks struct {
// for tracing and reporting.
type BalanceChangeReason byte
//go:generate stringer -type=BalanceChangeReason -output gen_balance_change_reason_stringer.go
//go:generate go run golang.org/x/tools/cmd/stringer -type=BalanceChangeReason -output gen_balance_change_reason_stringer.go
const (
BalanceChangeUnspecified BalanceChangeReason = 0

@ -272,17 +272,22 @@ func extractFile(arpath string, armode os.FileMode, data io.Reader, dest string)
return fmt.Errorf("path %q escapes archive destination", target)
}
// Ensure the destination directory exists.
// Remove the preivously-extracted file if it exists
if err := os.RemoveAll(target); err != nil {
return err
}
// Recreate the destination directory
if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil {
return err
}
// Copy file data.
file, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, armode)
file, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY, armode)
if err != nil {
return err
}
if _, err := io.Copy(file, data); err != nil {
if _, err = io.Copy(file, data); err != nil {
file.Close()
os.Remove(target)
return err

Loading…
Cancel
Save