Skip to content

Commit c7ba24b

Browse files
committed
Support local policies with remote plugins
1 parent 90a450c commit c7ba24b

File tree

8 files changed

+268
-88
lines changed

8 files changed

+268
-88
lines changed

private/buf/bufmigrate/migrator.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,9 @@ func (m *migrator) buildBufYAMLAndBufLockFiles(
401401
bufLock, err = bufconfig.NewBufLockFile(
402402
bufconfig.FileVersionV2,
403403
resolvedLockEntries,
404-
nil,
404+
nil, // Plugins are not supported in v1.
405+
nil, // Policies are not supported in v1.
406+
nil, // Policy PluginKeys are not supported in v1.
405407
)
406408
if err != nil {
407409
return nil, nil, err
@@ -448,6 +450,8 @@ func (m *migrator) buildBufYAMLAndBufLockFiles(
448450
bufconfig.FileVersionV2,
449451
resolvedDepModuleKeys,
450452
nil, // Plugins are not supported in v1.
453+
nil, // Policies are not supported in v1.
454+
nil, // Policy PluginKeys are not supported in v1.
451455
)
452456
if err != nil {
453457
return nil, nil, err

private/buf/bufworkspace/workspace_dep_manager.go

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/bufbuild/buf/private/bufpkg/bufmodule"
2525
"github.com/bufbuild/buf/private/bufpkg/bufparse"
2626
"github.com/bufbuild/buf/private/bufpkg/bufplugin"
27+
"github.com/bufbuild/buf/private/bufpkg/bufpolicy"
2728
"github.com/bufbuild/buf/private/pkg/slicesext"
2829
"github.com/bufbuild/buf/private/pkg/storage"
2930
"github.com/bufbuild/buf/private/pkg/syserror"
@@ -44,11 +45,21 @@ type WorkspaceDepManager interface {
4445
ExistingBufLockFileDepModuleKeys(ctx context.Context) ([]bufmodule.ModuleKey, error)
4546
// ExistingBufLockFileRemotePluginKeys returns the PluginKeys from the buf.lock file.
4647
ExistingBufLockFileRemotePluginKeys(ctx context.Context) ([]bufplugin.PluginKey, error)
48+
// ExistingBufLockFileRemotePolicyKeys returns the PolicyKeys from the buf.lock file.
49+
ExistingBufLockFileRemotePolicyKeys(ctx context.Context) ([]bufpolicy.PolicyKey, error)
50+
// ExistingBufLockFilePolicyNameToRemotePluginKeys returns the PluginKeys for each Policy name from the buf.lock file.
51+
ExistingBufLockFilePolicyNameToRemotePluginKeys(ctx context.Context) (map[string][]bufplugin.PluginKey, error)
4752
// UpdateBufLockFile updates the lock file that backs the Workspace to contain exactly
4853
// the given ModuleKeys and PluginKeys.
4954
//
5055
// If a buf.lock does not exist, one will be created.
51-
UpdateBufLockFile(ctx context.Context, depModuleKeys []bufmodule.ModuleKey, remotePluginKeys []bufplugin.PluginKey) error
56+
UpdateBufLockFile(
57+
ctx context.Context,
58+
depModuleKeys []bufmodule.ModuleKey,
59+
remotePluginKeys []bufplugin.PluginKey,
60+
remotePolicyKeys []bufpolicy.PolicyKey,
61+
policyNameToRemotePluginKeys map[string][]bufplugin.PluginKey,
62+
) error
5263
// ConfiguredDepModuleRefs returns the configured dependencies of the Workspace as ModuleRefs.
5364
//
5465
// These come from buf.yaml files.
@@ -206,11 +217,39 @@ func (w *workspaceDepManager) ExistingBufLockFileRemotePluginKeys(ctx context.Co
206217
return bufLockFile.RemotePluginKeys(), nil
207218
}
208219

209-
func (w *workspaceDepManager) UpdateBufLockFile(ctx context.Context, depModuleKeys []bufmodule.ModuleKey, remotePluginKeys []bufplugin.PluginKey) error {
220+
func (w *workspaceDepManager) ExistingBufLockFileRemotePolicyKeys(ctx context.Context) ([]bufpolicy.PolicyKey, error) {
221+
bufLockFile, err := bufconfig.GetBufLockFileForPrefix(ctx, w.bucket, w.targetSubDirPath)
222+
if err != nil {
223+
if errors.Is(err, fs.ErrNotExist) {
224+
return nil, nil
225+
}
226+
return nil, err
227+
}
228+
return bufLockFile.RemotePolicyKeys(), nil
229+
}
230+
231+
func (w *workspaceDepManager) ExistingBufLockFilePolicyNameToRemotePluginKeys(ctx context.Context) (map[string][]bufplugin.PluginKey, error) {
232+
bufLockFile, err := bufconfig.GetBufLockFileForPrefix(ctx, w.bucket, w.targetSubDirPath)
233+
if err != nil {
234+
if errors.Is(err, fs.ErrNotExist) {
235+
return nil, nil
236+
}
237+
return nil, err
238+
}
239+
return bufLockFile.PolicyNameToRemotePluginKeys(), nil
240+
}
241+
242+
func (w *workspaceDepManager) UpdateBufLockFile(ctx context.Context, depModuleKeys []bufmodule.ModuleKey, remotePluginKeys []bufplugin.PluginKey, remotePolicyKeys []bufpolicy.PolicyKey, policyNameToRemotePolicyKeys map[string][]bufplugin.PluginKey) error {
210243
var bufLockFile bufconfig.BufLockFile
211244
var err error
212245
if w.isV2 {
213-
bufLockFile, err = bufconfig.NewBufLockFile(bufconfig.FileVersionV2, depModuleKeys, remotePluginKeys)
246+
bufLockFile, err = bufconfig.NewBufLockFile(
247+
bufconfig.FileVersionV2,
248+
depModuleKeys,
249+
remotePluginKeys,
250+
remotePolicyKeys,
251+
policyNameToRemotePolicyKeys,
252+
)
214253
if err != nil {
215254
return err
216255
}
@@ -227,7 +266,7 @@ func (w *workspaceDepManager) UpdateBufLockFile(ctx context.Context, depModuleKe
227266
if len(remotePluginKeys) > 0 {
228267
return syserror.Newf("remote plugins are not supported for v1 buf.yaml files")
229268
}
230-
bufLockFile, err = bufconfig.NewBufLockFile(fileVersion, depModuleKeys, nil)
269+
bufLockFile, err = bufconfig.NewBufLockFile(fileVersion, depModuleKeys, nil, nil, nil)
231270
if err != nil {
232271
return err
233272
}

private/buf/cmd/buf/command/dep/depupdate/depupdate.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,14 @@ func run(
143143
if err != nil {
144144
return err
145145
}
146+
existingRemotePolicyKeys, err := workspaceDepManager.ExistingBufLockFileRemotePolicyKeys(ctx)
147+
if err != nil {
148+
return err
149+
}
150+
existingPolicyNameToRemotePluginKeys, err := workspaceDepManager.ExistingBufLockFilePolicyNameToRemotePluginKeys(ctx)
151+
if err != nil {
152+
return err
153+
}
146154

147155
// We're about to edit the buf.lock file on disk. If we have a subsequent error,
148156
// attempt to revert the buf.lock file.
@@ -152,11 +160,11 @@ func run(
152160
// overlay the new buf.lock file in a union bucket.
153161
defer func() {
154162
if retErr != nil {
155-
retErr = errors.Join(retErr, workspaceDepManager.UpdateBufLockFile(ctx, existingDepModuleKeys, existingRemotePluginKeys))
163+
retErr = errors.Join(retErr, workspaceDepManager.UpdateBufLockFile(ctx, existingDepModuleKeys, existingRemotePluginKeys, existingRemotePolicyKeys, existingPolicyNameToRemotePluginKeys))
156164
}
157165
}()
158166
// Edit the buf.lock file with the unpruned dependencies.
159-
if err := workspaceDepManager.UpdateBufLockFile(ctx, configuredDepModuleKeys, existingRemotePluginKeys); err != nil {
167+
if err := workspaceDepManager.UpdateBufLockFile(ctx, configuredDepModuleKeys, existingRemotePluginKeys, existingRemotePolicyKeys, existingPolicyNameToRemotePluginKeys); err != nil {
160168
return err
161169
}
162170
workspace, err := controller.GetWorkspace(ctx, dirPath, bufctl.WithIgnoreAndDisallowV1BufWorkYAMLs())

private/buf/cmd/buf/command/dep/internal/internal.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,15 @@ func Prune(
110110
if err != nil {
111111
return err
112112
}
113-
return workspaceDepManager.UpdateBufLockFile(ctx, depModuleKeys, existingRemotePluginKeys)
113+
existingRemotePolicyKeys, err := workspaceDepManager.ExistingBufLockFileRemotePolicyKeys(ctx)
114+
if err != nil {
115+
return err
116+
}
117+
existingPolicyNameToRemotePluginKeys, err := workspaceDepManager.ExistingBufLockFilePolicyNameToRemotePluginKeys(ctx)
118+
if err != nil {
119+
return err
120+
}
121+
return workspaceDepManager.UpdateBufLockFile(ctx, depModuleKeys, existingRemotePluginKeys, existingRemotePolicyKeys, existingPolicyNameToRemotePluginKeys)
114122
}
115123

116124
// LogUnusedConfiguredDepsForWorkspace takes a workspace and logs the unused configured

private/buf/cmd/buf/command/plugin/pluginprune/pluginprune.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,13 @@ func prune(
102102
if err != nil {
103103
return err
104104
}
105-
return workspaceDepManager.UpdateBufLockFile(ctx, existingDepModuleKeys, prunedBufLockPluginKeys)
105+
existingRemotePolicyKeys, err := workspaceDepManager.ExistingBufLockFileRemotePolicyKeys(ctx)
106+
if err != nil {
107+
return err
108+
}
109+
existingPolicyNameToRemotePluginKeys, err := workspaceDepManager.ExistingBufLockFilePolicyNameToRemotePluginKeys(ctx)
110+
if err != nil {
111+
return err
112+
}
113+
return workspaceDepManager.UpdateBufLockFile(ctx, existingDepModuleKeys, prunedBufLockPluginKeys, existingRemotePolicyKeys, existingPolicyNameToRemotePluginKeys)
106114
}

private/buf/cmd/buf/command/plugin/pluginupdate/pluginupdate.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,14 @@ func run(
131131
if err != nil {
132132
return err
133133
}
134+
existingRemotePolicyKeys, err := workspaceDepManager.ExistingBufLockFileRemotePolicyKeys(ctx)
135+
if err != nil {
136+
return err
137+
}
138+
existingPolicyNameToRemotePluginKeys, err := workspaceDepManager.ExistingBufLockFilePolicyNameToRemotePluginKeys(ctx)
139+
if err != nil {
140+
return err
141+
}
134142

135143
// We're about to edit the buf.lock file on disk. If we have a subsequent error,
136144
// attempt to revert the buf.lock file.
@@ -140,11 +148,13 @@ func run(
140148
// overlay the new buf.lock file in a union bucket.
141149
defer func() {
142150
if retErr != nil {
143-
retErr = errors.Join(retErr, workspaceDepManager.UpdateBufLockFile(ctx, existingDepModuleKeys, existingRemotePluginKeys))
151+
retErr = errors.Join(retErr, workspaceDepManager.UpdateBufLockFile(
152+
ctx, existingDepModuleKeys, existingRemotePluginKeys, existingRemotePolicyKeys, existingPolicyNameToRemotePluginKeys,
153+
))
144154
}
145155
}()
146156
// Edit the buf.lock file with the updated remote plugins.
147-
if err := workspaceDepManager.UpdateBufLockFile(ctx, existingDepModuleKeys, configuredRemotePluginKeys); err != nil {
157+
if err := workspaceDepManager.UpdateBufLockFile(ctx, existingDepModuleKeys, configuredRemotePluginKeys, existingRemotePolicyKeys, existingPolicyNameToRemotePluginKeys); err != nil {
148158
return err
149159
}
150160
return nil

0 commit comments

Comments
 (0)