...

Source file src/github.com/golang/protobuf/internal/cmd/generate-alias/main.go

Documentation: github.com/golang/protobuf/internal/cmd/generate-alias

     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  
     5  //go:generate go run . -execute
     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  	// Set of generated proto packages to forward to v2.
    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  	// For each package, construct a proto file that public imports the package.
    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  	// Use the internal logic of protoc-gen-go to generate the files.
    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  	// Write the generated files.
   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") // best-effort delete
   124  		}
   125  	}
   126  }
   127  
   128  func check(err error) {
   129  	if err != nil {
   130  		panic(err)
   131  	}
   132  }
   133  

View as plain text