Skip to content

Commit

Permalink
Add exclude_options configuration for generation
Browse files Browse the repository at this point in the history
This adds a new plugin option `exclude_options` for use on generation.
The excluded options are stripped from the Image creating a shallow
clone of the FileDescriptors that make up the ImageFiles. Any imports
that are no longer required due to options being removed are also
removed. The option is applied for the plugin. Multiple filtered images
that reference the original image may be created when exclude options
are set.
  • Loading branch information
emcfarlane committed Feb 6, 2025
1 parent c955b56 commit 7aab46c
Show file tree
Hide file tree
Showing 22 changed files with 6,575 additions and 0 deletions.
14 changes: 14 additions & 0 deletions private/buf/bufgen/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/bufbuild/buf/private/bufpkg/bufconfig"
"github.com/bufbuild/buf/private/bufpkg/bufimage"
"github.com/bufbuild/buf/private/bufpkg/bufimage/bufimagemodify"
"github.com/bufbuild/buf/private/bufpkg/bufimage/bufimageutil"
"github.com/bufbuild/buf/private/bufpkg/bufprotoplugin"
"github.com/bufbuild/buf/private/bufpkg/bufprotoplugin/bufprotopluginos"
"github.com/bufbuild/buf/private/bufpkg/bufremoteplugin"
Expand Down Expand Up @@ -235,13 +236,15 @@ func (g *generator) execPlugins(
if includeWellKnownTypesOverride != nil {
includeWellKnownTypes = *includeWellKnownTypesOverride
}
excludeOptions := currentPluginConfig.ExcludeOptions()
response, err := g.execLocalPlugin(
ctx,
container,
imageProvider,
currentPluginConfig,
includeImports,
includeWellKnownTypes,
excludeOptions,
)
if err != nil {
return err
Expand Down Expand Up @@ -309,11 +312,21 @@ func (g *generator) execLocalPlugin(
pluginConfig bufconfig.GeneratePluginConfig,
includeImports bool,
includeWellKnownTypes bool,
excludeOptions []string,
) (*pluginpb.CodeGeneratorResponse, error) {
pluginImages, err := imageProvider.GetImages(Strategy(pluginConfig.Strategy()))
if err != nil {
return nil, err
}
if len(excludeOptions) > 0 {
for i, pluginImage := range pluginImages {
pluginImage, err := bufimageutil.ExcludeOptions(pluginImage, excludeOptions...)
if err != nil {
return nil, err
}
pluginImages[i] = pluginImage
}
}
requests, err := bufimage.ImagesToCodeGeneratorRequests(
pluginImages,
pluginConfig.Opt(),
Expand Down Expand Up @@ -356,6 +369,7 @@ func (g *generator) execRemotePluginsV2(
pluginConfigs []*remotePluginExecArgs,
includeImportsOverride *bool,
includeWellKnownTypesOverride *bool,
// TODO: add support for exclude_options.
) ([]*remotePluginExecutionResult, error) {
requests := make([]*registryv1alpha1.PluginGenerationRequest, len(pluginConfigs))
for i, pluginConfig := range pluginConfigs {
Expand Down
2 changes: 2 additions & 0 deletions private/bufpkg/bufconfig/buf_gen_yaml_file.go
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,8 @@ type externalGeneratePluginConfigV2 struct {
IncludeWKT bool `json:"include_wkt,omitempty" yaml:"include_wkt,omitempty"`
// Strategy is only valid with ProtoBuiltin and Local.
Strategy *string `json:"strategy,omitempty" yaml:"strategy,omitempty"`
// ExcludeOptions removes options from the image.
ExcludeOptions []string `json:"exclude_options,omitempty" yaml:"exclude_options,omitempty"`
}

// externalGenerateManagedConfigV2 represents the managed mode config in a v2 buf.gen.yaml file.
Expand Down
2 changes: 2 additions & 0 deletions private/bufpkg/bufconfig/buf_gen_yaml_file_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,8 @@ plugins:
strategy: all
include_imports: true
include_wkt: true
exclude_options:
- buf.validate.oneof
inputs:
- git_repo: github.com/acme/weather
branch: dev
Expand Down
36 changes: 36 additions & 0 deletions private/bufpkg/bufconfig/generate_plugin_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ type GeneratePluginConfig interface {
//
// This is not empty only when the plugin is remote.
Revision() int
// ExcludeOptions returns the options to exclude.
ExcludeOptions() []string

isGeneratePluginConfig()
}
Expand All @@ -123,6 +125,7 @@ func NewRemoteGeneratePluginConfig(
opt []string,
includeImports bool,
includeWKT bool,
excludeOptions []string,
revision int,
) (GeneratePluginConfig, error) {
return newRemoteGeneratePluginConfig(
Expand All @@ -131,6 +134,7 @@ func NewRemoteGeneratePluginConfig(
opt,
includeImports,
includeWKT,
excludeOptions,
revision,
)
}
Expand All @@ -142,6 +146,7 @@ func NewLocalOrProtocBuiltinGeneratePluginConfig(
opt []string,
includeImports bool,
includeWKT bool,
excludeOptions []string,
strategy *GenerateStrategy,
) (GeneratePluginConfig, error) {
return newLocalOrProtocBuiltinGeneratePluginConfig(
Expand All @@ -150,6 +155,7 @@ func NewLocalOrProtocBuiltinGeneratePluginConfig(
opt,
includeImports,
includeWKT,
excludeOptions,
strategy,
)
}
Expand All @@ -161,6 +167,7 @@ func NewLocalGeneratePluginConfig(
opt []string,
includeImports bool,
includeWKT bool,
excludeOptions []string,
strategy *GenerateStrategy,
path []string,
) (GeneratePluginConfig, error) {
Expand All @@ -170,6 +177,7 @@ func NewLocalGeneratePluginConfig(
opt,
includeImports,
includeWKT,
excludeOptions,
strategy,
path,
)
Expand All @@ -183,6 +191,7 @@ func NewProtocBuiltinGeneratePluginConfig(
opt []string,
includeImports bool,
includeWKT bool,
excludeOptions []string,
strategy *GenerateStrategy,
protocPath []string,
) (GeneratePluginConfig, error) {
Expand All @@ -192,6 +201,7 @@ func NewProtocBuiltinGeneratePluginConfig(
opt,
includeImports,
includeWKT,
excludeOptions,
strategy,
protocPath,
)
Expand All @@ -203,6 +213,7 @@ func NewGeneratePluginConfigWithIncludeImportsAndWKT(
config GeneratePluginConfig,
includeImports bool,
includeWKT bool,
excludeOptions []string,
) (GeneratePluginConfig, error) {
originalConfig, ok := config.(*generatePluginConfig)
if !ok {
Expand All @@ -215,6 +226,9 @@ func NewGeneratePluginConfigWithIncludeImportsAndWKT(
if includeWKT {
generatePluginConfig.includeWKT = true
}
if len(excludeOptions) > 0 {
generatePluginConfig.excludeOptions = excludeOptions
}
return &generatePluginConfig, nil
}

Expand All @@ -227,6 +241,7 @@ type generatePluginConfig struct {
opts []string
includeImports bool
includeWKT bool
excludeOptions []string
strategy *GenerateStrategy
path []string
protocPath []string
Expand Down Expand Up @@ -258,6 +273,7 @@ func newGeneratePluginConfigFromExternalV1Beta1(
opt,
false,
false,
nil, // TODO
strategy,
[]string{externalConfig.Path},
)
Expand All @@ -268,6 +284,7 @@ func newGeneratePluginConfigFromExternalV1Beta1(
opt,
false,
false,
nil, // TODO
strategy,
)
}
Expand Down Expand Up @@ -327,6 +344,7 @@ func newGeneratePluginConfigFromExternalV1(
opt,
false,
false,
nil, // TODO
externalConfig.Revision,
)
}
Expand All @@ -339,6 +357,7 @@ func newGeneratePluginConfigFromExternalV1(
opt,
false,
false,
nil, // TODO
strategy,
path,
)
Expand All @@ -350,6 +369,7 @@ func newGeneratePluginConfigFromExternalV1(
opt,
false,
false,
nil, // TODO
strategy,
protocPath,
)
Expand All @@ -362,6 +382,7 @@ func newGeneratePluginConfigFromExternalV1(
opt,
false,
false,
nil, // TODO
strategy,
)
}
Expand Down Expand Up @@ -418,6 +439,7 @@ func newGeneratePluginConfigFromExternalV2(
opt,
externalConfig.IncludeImports,
externalConfig.IncludeWKT,
externalConfig.ExcludeOptions,
revision,
)
case externalConfig.Local != nil:
Expand All @@ -438,6 +460,7 @@ func newGeneratePluginConfigFromExternalV2(
opt,
externalConfig.IncludeImports,
externalConfig.IncludeWKT,
externalConfig.ExcludeOptions,
parsedStrategy,
path,
)
Expand All @@ -455,6 +478,7 @@ func newGeneratePluginConfigFromExternalV2(
opt,
externalConfig.IncludeImports,
externalConfig.IncludeWKT,
externalConfig.ExcludeOptions,
parsedStrategy,
protocPath,
)
Expand All @@ -469,6 +493,7 @@ func newRemoteGeneratePluginConfig(
opt []string,
includeImports bool,
includeWKT bool,
excludeOptions []string,
revision int,
) (*generatePluginConfig, error) {
if includeWKT && !includeImports {
Expand All @@ -490,6 +515,7 @@ func newRemoteGeneratePluginConfig(
opts: opt,
includeImports: includeImports,
includeWKT: includeWKT,
excludeOptions: excludeOptions,
}, nil
}

Expand All @@ -499,6 +525,7 @@ func newLocalOrProtocBuiltinGeneratePluginConfig(
opt []string,
includeImports bool,
includeWKT bool,
excludeOptions []string,
strategy *GenerateStrategy,
) (*generatePluginConfig, error) {
if includeWKT && !includeImports {
Expand All @@ -512,6 +539,7 @@ func newLocalOrProtocBuiltinGeneratePluginConfig(
opts: opt,
includeImports: includeImports,
includeWKT: includeWKT,
excludeOptions: excludeOptions,
}, nil
}

Expand All @@ -521,6 +549,7 @@ func newLocalGeneratePluginConfig(
opt []string,
includeImports bool,
includeWKT bool,
excludeOptions []string,
strategy *GenerateStrategy,
path []string,
) (*generatePluginConfig, error) {
Expand All @@ -539,6 +568,7 @@ func newLocalGeneratePluginConfig(
opts: opt,
includeImports: includeImports,
includeWKT: includeWKT,
excludeOptions: excludeOptions,
}, nil
}

Expand All @@ -548,6 +578,7 @@ func newProtocBuiltinGeneratePluginConfig(
opt []string,
includeImports bool,
includeWKT bool,
excludeOptions []string,
strategy *GenerateStrategy,
protocPath []string,
) (*generatePluginConfig, error) {
Expand All @@ -563,6 +594,7 @@ func newProtocBuiltinGeneratePluginConfig(
strategy: strategy,
includeImports: includeImports,
includeWKT: includeWKT,
excludeOptions: excludeOptions,
}, nil
}

Expand Down Expand Up @@ -590,6 +622,10 @@ func (p *generatePluginConfig) IncludeWKT() bool {
return p.includeWKT
}

func (p *generatePluginConfig) ExcludeOptions() []string {
return p.excludeOptions
}

func (p *generatePluginConfig) Strategy() GenerateStrategy {
if p.strategy == nil {
return GenerateStrategyDirectory
Expand Down
Loading

0 comments on commit 7aab46c

Please sign in to comment.