func (d *descriptorSet) marshalTo(w io.Writer) error {
	p, err := proto.Marshal(&d.merged)
	if err != nil {
		return err
	}
	args := []string{
		"protoc",
		"-I",
		d.includeDir,
		"--decode",
		"google.protobuf.FileDescriptorSet",
		d.descProto,
	}
	cmd := exec.Command(args[0], args[1:]...)
	cmd.Stdin = bytes.NewReader(p)
	cmd.Stdout = w
	cmd.Stderr = os.Stderr
	if !quiet {
		fmt.Println(strings.Join(args, " "))
	}
	return cmd.Run()
}
stabilize outputs the merged protobuf descriptor set into the provided writer.

This is equivalent to the following command:

cat merged.pb | protoc -I /path/to --decode google.protobuf.FileDescriptorSet /path/to/google/protobuf/descriptor.proto
package main
import (
	"bytes"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"os"
	"os/exec"
	"strings"
	"github.com/golang/protobuf/proto"
	"github.com/golang/protobuf/protoc-gen-go/descriptor"
)
type descriptorSet struct {
	merged      descriptor.FileDescriptorSet
	seen        map[string]struct{}
	ignoreFiles map[string]struct{}
	descProto   string
	includeDir  string
}
func newDescriptorSet(ignoreFiles []string, d string, i string) *descriptorSet {
	ifm := make(map[string]struct{}, len(ignoreFiles))
	for _, ignore := range ignoreFiles {
		ifm[ignore] = struct{}{}
	}
	return &descriptorSet{
		seen:        make(map[string]struct{}),
		ignoreFiles: ifm,
		descProto:   d,
		includeDir:  i,
	}
}
func (d *descriptorSet) add(descs ...*descriptor.FileDescriptorProto) {
	for _, file := range descs {
		name := file.GetName()
		if _, ok := d.seen[name]; ok {
			continue
		}
		if _, ok := d.ignoreFiles[name]; ok {
			continue
		}
		d.merged.File = append(d.merged.File, file)
		d.seen[name] = struct{}{}
	}
}