1
2
3
4
5
6
7 package main
8
9 import (
10 "flag"
11 "fmt"
12 "io/ioutil"
13 "os"
14 "os/exec"
15 "path"
16 "path/filepath"
17 "strings"
18
19 "github.com/golang/protobuf/proto"
20 gengo "google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo"
21 "google.golang.org/protobuf/compiler/protogen"
22 "google.golang.org/protobuf/reflect/protodesc"
23 "google.golang.org/protobuf/reflect/protoreflect"
24
25 "google.golang.org/protobuf/types/descriptorpb"
26 "google.golang.org/protobuf/types/known/anypb"
27 "google.golang.org/protobuf/types/known/durationpb"
28 "google.golang.org/protobuf/types/known/emptypb"
29 "google.golang.org/protobuf/types/known/structpb"
30 "google.golang.org/protobuf/types/known/timestamppb"
31 "google.golang.org/protobuf/types/known/wrapperspb"
32 "google.golang.org/protobuf/types/pluginpb"
33 )
34
35 func main() {
36 run := flag.Bool("execute", false, "Write generated files to destination.")
37 flag.Parse()
38
39
40 files := []struct {
41 oldGoPkg string
42 newGoPkg string
43 pbDesc protoreflect.FileDescriptor
44 }{{
45 oldGoPkg: "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor",
46 newGoPkg: "google.golang.org/protobuf/types/descriptorpb",
47 pbDesc: descriptorpb.File_google_protobuf_descriptor_proto,
48 }, {
49 oldGoPkg: "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go",
50 newGoPkg: "google.golang.org/protobuf/types/pluginpb",
51 pbDesc: pluginpb.File_google_protobuf_compiler_plugin_proto,
52 }, {
53 oldGoPkg: "github.com/golang/protobuf/ptypes/any;any",
54 newGoPkg: "google.golang.org/protobuf/types/known/anypb",
55 pbDesc: anypb.File_google_protobuf_any_proto,
56 }, {
57 oldGoPkg: "github.com/golang/protobuf/ptypes/duration;duration",
58 newGoPkg: "google.golang.org/protobuf/types/known/durationpb",
59 pbDesc: durationpb.File_google_protobuf_duration_proto,
60 }, {
61 oldGoPkg: "github.com/golang/protobuf/ptypes/timestamp;timestamp",
62 newGoPkg: "google.golang.org/protobuf/types/known/timestamppb",
63 pbDesc: timestamppb.File_google_protobuf_timestamp_proto,
64 }, {
65 oldGoPkg: "github.com/golang/protobuf/ptypes/wrappers;wrappers",
66 newGoPkg: "google.golang.org/protobuf/types/known/wrapperspb",
67 pbDesc: wrapperspb.File_google_protobuf_wrappers_proto,
68 }, {
69 oldGoPkg: "github.com/golang/protobuf/ptypes/struct;structpb",
70 newGoPkg: "google.golang.org/protobuf/types/known/structpb",
71 pbDesc: structpb.File_google_protobuf_struct_proto,
72 }, {
73 oldGoPkg: "github.com/golang/protobuf/ptypes/empty;empty",
74 newGoPkg: "google.golang.org/protobuf/types/known/emptypb",
75 pbDesc: emptypb.File_google_protobuf_empty_proto,
76 }}
77
78
79 var req pluginpb.CodeGeneratorRequest
80 var flags []string
81 for _, file := range files {
82 pkgPath := file.oldGoPkg[:strings.IndexByte(file.oldGoPkg, ';')]
83 fd := &descriptorpb.FileDescriptorProto{
84 Name: proto.String(pkgPath + "/" + path.Base(pkgPath) + ".proto"),
85 Syntax: proto.String(file.pbDesc.Syntax().String()),
86 Dependency: []string{file.pbDesc.Path()},
87 PublicDependency: []int32{0},
88 Options: &descriptorpb.FileOptions{GoPackage: proto.String(file.oldGoPkg)},
89 }
90 req.ProtoFile = append(req.ProtoFile, protodesc.ToFileDescriptorProto(file.pbDesc), fd)
91 req.FileToGenerate = append(req.FileToGenerate, fd.GetName())
92 flags = append(flags, "M"+file.pbDesc.Path()+"="+file.newGoPkg)
93 }
94 req.Parameter = proto.String(strings.Join(flags, ","))
95
96
97 gen, err := protogen.Options{}.New(&req)
98 check(err)
99 for _, file := range gen.Files {
100 if file.Generate {
101 gengo.GenerateVersionMarkers = false
102 gengo.GenerateFile(gen, file)
103 }
104 }
105
106
107 resp := gen.Response()
108 if resp.Error != nil {
109 panic("gengo error: " + resp.GetError())
110 }
111 for _, file := range resp.File {
112 relPath, err := filepath.Rel(filepath.FromSlash("github.com/golang/protobuf"), file.GetName())
113 check(err)
114
115 check(ioutil.WriteFile(relPath+".bak", []byte(file.GetContent()), 0664))
116 if *run {
117 fmt.Println("#", relPath)
118 check(os.Rename(relPath+".bak", relPath))
119 } else {
120 cmd := exec.Command("diff", relPath, relPath+".bak", "-N", "-u")
121 cmd.Stdout = os.Stdout
122 cmd.Run()
123 os.Remove(relPath + ".bak")
124 }
125 }
126 }
127
128 func check(err error) {
129 if err != nil {
130 panic(err)
131 }
132 }
133
View as plain text