main.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright 2019 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. //go:generate go run . -execute
  5. package main
  6. import (
  7. "flag"
  8. "fmt"
  9. "io/ioutil"
  10. "os"
  11. "os/exec"
  12. "path"
  13. "path/filepath"
  14. "strings"
  15. "github.com/golang/protobuf/proto"
  16. gengo "github.com/golang/protobuf/v2/cmd/protoc-gen-go/internal_gengo"
  17. "github.com/golang/protobuf/v2/protogen"
  18. "github.com/golang/protobuf/v2/reflect/protodesc"
  19. "github.com/golang/protobuf/v2/reflect/protoreflect"
  20. descriptorpb "github.com/golang/protobuf/v2/types/descriptor"
  21. knownpb "github.com/golang/protobuf/v2/types/known"
  22. pluginpb "github.com/golang/protobuf/v2/types/plugin"
  23. )
  24. func main() {
  25. run := flag.Bool("execute", false, "Write generated files to destination.")
  26. flag.Parse()
  27. // Set of generated proto packages to forward to v2.
  28. files := []struct {
  29. goPkg string
  30. pbDesc protoreflect.FileDescriptor
  31. }{{
  32. goPkg: "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor",
  33. pbDesc: descriptorpb.File_google_protobuf_descriptor_proto,
  34. }, {
  35. goPkg: "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go",
  36. pbDesc: pluginpb.File_google_protobuf_compiler_plugin_proto,
  37. }, {
  38. goPkg: "github.com/golang/protobuf/ptypes/any;any",
  39. pbDesc: knownpb.File_google_protobuf_any_proto,
  40. }, {
  41. goPkg: "github.com/golang/protobuf/ptypes/duration;duration",
  42. pbDesc: knownpb.File_google_protobuf_duration_proto,
  43. }, {
  44. goPkg: "github.com/golang/protobuf/ptypes/timestamp;timestamp",
  45. pbDesc: knownpb.File_google_protobuf_timestamp_proto,
  46. }, {
  47. goPkg: "github.com/golang/protobuf/ptypes/wrappers;wrappers",
  48. pbDesc: knownpb.File_google_protobuf_wrappers_proto,
  49. }, {
  50. goPkg: "github.com/golang/protobuf/ptypes/struct;structpb",
  51. pbDesc: knownpb.File_google_protobuf_struct_proto,
  52. }, {
  53. goPkg: "github.com/golang/protobuf/ptypes/empty;empty",
  54. pbDesc: knownpb.File_google_protobuf_empty_proto,
  55. }}
  56. // For each package, construct a proto file that public imports the package.
  57. var req pluginpb.CodeGeneratorRequest
  58. for _, file := range files {
  59. pkgPath := file.goPkg[:strings.IndexByte(file.goPkg, ';')]
  60. fd := &descriptorpb.FileDescriptorProto{
  61. Name: proto.String(pkgPath + "/" + path.Base(pkgPath) + ".proto"),
  62. Syntax: proto.String(file.pbDesc.Syntax().String()),
  63. Dependency: []string{file.pbDesc.Path()},
  64. PublicDependency: []int32{0},
  65. Options: &descriptorpb.FileOptions{GoPackage: proto.String(file.goPkg)},
  66. }
  67. req.ProtoFile = append(req.ProtoFile, protodesc.ToFileDescriptorProto(file.pbDesc), fd)
  68. req.FileToGenerate = append(req.FileToGenerate, fd.GetName())
  69. }
  70. // Use the internal logic of protoc-gen-go to generate the files.
  71. gen, err := protogen.New(&req, nil)
  72. check(err)
  73. for _, file := range gen.Files {
  74. if file.Generate {
  75. gengo.GenerateFile(gen, file)
  76. }
  77. }
  78. // Write the generated files.
  79. resp := gen.Response()
  80. if resp.Error != nil {
  81. panic("gengo error: " + resp.GetError())
  82. }
  83. for _, file := range resp.File {
  84. relPath, err := filepath.Rel(filepath.FromSlash("github.com/golang/protobuf"), file.GetName())
  85. check(err)
  86. check(ioutil.WriteFile(relPath+".bak", []byte(file.GetContent()), 0664))
  87. if *run {
  88. fmt.Println("#", relPath)
  89. check(os.Rename(relPath+".bak", relPath))
  90. } else {
  91. cmd := exec.Command("diff", relPath, relPath+".bak", "-N", "-u")
  92. cmd.Stdout = os.Stdout
  93. cmd.Run()
  94. os.Remove(relPath + ".bak") // best-effort delete
  95. }
  96. }
  97. }
  98. func check(err error) {
  99. if err != nil {
  100. panic(err)
  101. }
  102. }