Skip to content

Commit dd9da3b

Browse files
authored
Disable format on files with errors (#4169)
1 parent e68c306 commit dd9da3b

File tree

76 files changed

+145
-140
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+145
-140
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion

cmd/buf/testdata/format/invalid/invalid_field_number.proto

Lines changed: 0 additions & 8 deletions
This file was deleted.

private/buf/bufformat/bufformat.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ func FormatBucket(ctx context.Context, bucket storage.ReadBucket) (_ storage.Rea
8282

8383
// FormatFileNode formats the given file node and writ the result to dest.
8484
func FormatFileNode(dest io.Writer, fileNode *ast.FileNode) error {
85+
// Construct the file descriptor to ensure the AST is valid. This will
86+
// capture unknown syntax like edition "2024" which at the current time is
87+
// not supported.
88+
if _, err := parser.ResultFromAST(fileNode, true, reporter.NewHandler(nil)); err != nil {
89+
return err
90+
}
8591
formatter := newFormatter(dest, fileNode)
8692
return formatter.Run()
8793
}

private/buf/bufformat/formatter_test.go

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ func testFormatCustomOptions(t *testing.T) {
4242
}
4343

4444
func testFormatEditions(t *testing.T) {
45-
testFormatNoDiff(t, "testdata/editions")
45+
testFormatNoDiff(t, "testdata/editions/2023")
46+
testFormatError(t, "testdata/editions/2024", `edition "2024" not yet fully supported; latest supported edition "2023"`)
4647
}
4748

4849
func testFormatProto2(t *testing.T) {
@@ -78,40 +79,54 @@ func testFormatNoDiff(t *testing.T, path string) {
7879
ctx := context.Background()
7980
bucket, err := storageos.NewProvider().NewReadWriteBucket(path)
8081
require.NoError(t, err)
82+
8183
moduleSetBuilder := bufmodule.NewModuleSetBuilder(ctx, slogtestext.NewLogger(t), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider)
8284
moduleSetBuilder.AddLocalModule(bucket, path, true)
8385
moduleSet, err := moduleSetBuilder.Build()
8486
require.NoError(t, err)
85-
readBucket, err := FormatModuleSet(ctx, moduleSet)
87+
formatBucket, err := FormatModuleSet(ctx, moduleSet)
8688
require.NoError(t, err)
87-
require.NoError(
88-
t,
89-
storage.WalkReadObjects(
89+
assertGolden := func(formatBucket storage.ReadBucket) {
90+
err := storage.WalkReadObjects(
9091
ctx,
91-
readBucket,
92+
formatBucket,
9293
"",
9394
func(formattedFile storage.ReadObject) error {
94-
expectedPath := formattedFile.Path()
95-
t.Run(expectedPath, func(t *testing.T) {
96-
// The expected format result is the golden file. If
97-
// this file IS a golden file, it is expected to not
98-
// change.
99-
if !strings.HasSuffix(expectedPath, ".golden.proto") {
100-
expectedPath = strings.Replace(expectedPath, ".proto", ".golden.proto", 1)
101-
}
102-
formattedData, err := io.ReadAll(formattedFile)
103-
require.NoError(t, err)
104-
expectedFile, err := bucket.Get(ctx, expectedPath)
105-
require.NoError(t, err)
106-
expectedData, err := io.ReadAll(expectedFile)
107-
require.NoError(t, err)
108-
fileDiff, err := diff.Diff(ctx, expectedData, formattedData, expectedPath, formattedFile.Path()+" (formatted)")
109-
require.NoError(t, err)
110-
require.Empty(t, string(fileDiff))
111-
})
95+
formattedData, err := io.ReadAll(formattedFile)
96+
require.NoError(t, err)
97+
expectedPath := strings.Replace(formattedFile.Path(), ".proto", ".golden", 1)
98+
expectedData, err := storage.ReadPath(ctx, bucket, expectedPath)
99+
require.NoError(t, err)
100+
fileDiff, err := diff.Diff(ctx, expectedData, formattedData, expectedPath, formattedFile.Path()+" (formatted)")
101+
require.NoError(t, err)
102+
require.Empty(t, string(fileDiff))
112103
return nil
113104
},
114-
),
115-
)
105+
)
106+
require.NoError(t, err)
107+
}
108+
assertGolden(formatBucket)
109+
110+
moduleSetBuilder = bufmodule.NewModuleSetBuilder(ctx, slogtestext.NewLogger(t), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider)
111+
moduleSetBuilder.AddLocalModule(formatBucket, path, true)
112+
moduleSet, err = moduleSetBuilder.Build()
113+
require.NoError(t, err)
114+
reformattedBucket, err := FormatModuleSet(ctx, moduleSet)
115+
require.NoError(t, err)
116+
assertGolden(reformattedBucket)
117+
})
118+
}
119+
120+
func testFormatError(t *testing.T, path string, errContains string) {
121+
t.Run(path, func(t *testing.T) {
122+
ctx := context.Background()
123+
bucket, err := storageos.NewProvider().NewReadWriteBucket(path)
124+
require.NoError(t, err)
125+
moduleSetBuilder := bufmodule.NewModuleSetBuilder(ctx, slogtestext.NewLogger(t), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider)
126+
moduleSetBuilder.AddLocalModule(bucket, path, true)
127+
moduleSet, err := moduleSetBuilder.Build()
128+
require.NoError(t, err)
129+
_, err = FormatModuleSet(ctx, moduleSet)
130+
require.ErrorContains(t, err, errContains)
116131
})
117132
}

private/buf/bufformat/testdata/customoptions/options.golden.proto renamed to private/buf/bufformat/testdata/customoptions/options.golden

File renamed without changes.

private/buf/bufformat/testdata/editions/editions.golden.proto renamed to private/buf/bufformat/testdata/editions/2023/editions.golden

File renamed without changes.

private/buf/bufformat/testdata/editions/editions.proto renamed to private/buf/bufformat/testdata/editions/2023/editions.proto

File renamed without changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
edition = "2024";
2+
3+
package a.b.c;
4+
5+
import option "google/protobuf/descriptor.proto";

private/buf/bufformat/testdata/header/nopackage.golden.proto renamed to private/buf/bufformat/testdata/header/nopackage.golden

File renamed without changes.

private/buf/bufformat/testdata/header/nosyntax.golden.proto renamed to private/buf/bufformat/testdata/header/nosyntax.golden

File renamed without changes.

0 commit comments

Comments
 (0)