Skip to content

Commit f274b7e

Browse files
authored
Switch to proto.CloneOf (#3757)
1 parent 6cf84db commit f274b7e

File tree

5 files changed

+18
-68
lines changed

5 files changed

+18
-68
lines changed

.golangci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ linters:
7070
- pattern: ^(proto|prototext|protojson|protoyaml).Unmarshal$
7171
- pattern: ^(proto|prototext|protojson|protoyaml).MarshalOptions$
7272
- pattern: ^(proto|prototext|protojson|protoyaml).UnmarshalOptions$
73+
- pattern: ^proto\.Clone$
74+
msg: please use proto.CloneOf
7375
govet:
7476
enable:
7577
- nilness
@@ -419,6 +421,8 @@ linters:
419421
# to set the source path for the location, this operation should be safe.
420422
path: private/bufpkg/bufcheck/bufcheckserver/internal/buflintvalidate/predefined_rules.go
421423
text: 'G115:'
424+
issues:
425+
max-same-issues: 0
422426
formatters:
423427
enable:
424428
- gci

make/go/dep_buf.mk

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ $(call _assert_var,CACHE_VERSIONS)
77
$(call _assert_var,CACHE_BIN)
88

99
# Settable
10-
# https://github.com/bufbuild/buf/releases 20250328 checked 20250328
11-
BUF_VERSION ?= v1.51.0
10+
# https://github.com/bufbuild/buf/releases 20250408 checked 20250408
11+
BUF_VERSION ?= v1.52.1
1212
# Settable
1313
#
1414
# If set, this path will be installed every time someone depends on $(BUF)

private/bufpkg/bufimage/bufimage.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -325,13 +325,7 @@ func CloneImage(image Image) (Image, error) {
325325

326326
// CloneImageFile returns a deep copy of the given image file.
327327
func CloneImageFile(imageFile ImageFile) (ImageFile, error) {
328-
clonedProto := proto.Clone(imageFile.FileDescriptorProto())
329-
clonedDescriptor, ok := clonedProto.(*descriptorpb.FileDescriptorProto)
330-
if !ok {
331-
// Shouldn't actually be possible...
332-
return nil, fmt.Errorf("failed to clone image file %q: input %T; clone is %T but expecting %T",
333-
imageFile.Path(), imageFile, clonedProto, (*descriptorpb.FileDescriptorProto)(nil))
334-
}
328+
clonedDescriptor := proto.CloneOf(imageFile.FileDescriptorProto())
335329
originalUnusedDeps := imageFile.UnusedDependencyIndexes()
336330
unusedDeps := make([]int32, len(originalUnusedDeps))
337331
copy(unusedDeps, originalUnusedDeps)

private/bufpkg/bufimage/bufimageutil/bufimageutil_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"github.com/bufbuild/buf/private/bufpkg/bufimage"
2727
"github.com/bufbuild/buf/private/bufpkg/bufmodule"
2828
"github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmoduletesting"
29-
imagev1 "github.com/bufbuild/buf/private/gen/proto/go/buf/alpha/image/v1"
3029
"github.com/bufbuild/buf/private/pkg/app/appext"
3130
"github.com/bufbuild/buf/private/pkg/protoencoding"
3231
"github.com/bufbuild/buf/private/pkg/slicesext"
@@ -545,7 +544,7 @@ func runFilterImage(t *testing.T, image bufimage.Image, opts ...ImageFilterOptio
545544
protoImage, err := bufimage.ImageToProtoImage(filteredImage)
546545
require.NoError(t, err)
547546
// Clone here as `bufimage.NewImageForProto` mutates protoImage.
548-
protoImage, _ = proto.Clone(protoImage).(*imagev1.Image) // Safe to assert.
547+
protoImage = proto.CloneOf(protoImage)
549548
filteredImage, err = bufimage.NewImageForProto(protoImage)
550549
require.NoError(t, err)
551550

@@ -751,8 +750,7 @@ func benchmarkFilterImage(b *testing.B, opts ...bufimage.BuildImageOption) {
751750
b.StopTimer()
752751
imageFiles := make([]bufimage.ImageFile, len(benchmarkCase.image.Files()))
753752
for j, imageFile := range benchmarkCase.image.Files() {
754-
clone, ok := proto.Clone(imageFile.FileDescriptorProto()).(*descriptorpb.FileDescriptorProto)
755-
require.True(b, ok)
753+
clone := proto.CloneOf(imageFile.FileDescriptorProto())
756754
var err error
757755
imageFiles[j], err = bufimage.NewImageFile(clone, nil, uuid.Nil, "", "", false, false, nil)
758756
require.NoError(b, err)

private/pkg/protoencoding/strip_legacy_options.go

Lines changed: 9 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
package protoencoding
1616

1717
import (
18-
"fmt"
19-
2018
"google.golang.org/protobuf/proto"
2119
"google.golang.org/protobuf/types/descriptorpb"
2220
)
@@ -62,11 +60,7 @@ func stripLegacyOptionsFromFile(file *descriptorpb.FileDescriptorProto) (*descri
6260
continue
6361
}
6462
if !cloned {
65-
newFile, err := clone(file)
66-
if err != nil {
67-
return nil, err
68-
}
69-
file = newFile
63+
file = proto.CloneOf(file)
7064
cloned = true
7165
}
7266
file.MessageType[i] = newDescriptor
@@ -77,11 +71,7 @@ func stripLegacyOptionsFromFile(file *descriptorpb.FileDescriptorProto) (*descri
7771
}
7872
if newExts != nil {
7973
if !cloned {
80-
newFile, err := clone(file)
81-
if err != nil {
82-
return nil, err
83-
}
84-
file = newFile
74+
file = proto.CloneOf(file)
8575
cloned = true
8676
}
8777
file.Extension = newExts
@@ -100,11 +90,7 @@ func stripLegacyOptionsFromMessage(message *descriptorpb.DescriptorProto) (*desc
10090
if message.GetOptions().GetMessageSetWireFormat() {
10191
// Strip this option since the Go runtime does not support
10292
// creating protoreflect.Descriptor instances with this set.
103-
newMessage, err := clone(message)
104-
if err != nil {
105-
return nil, err
106-
}
107-
message = newMessage
93+
message = proto.CloneOf(message)
10894
cloned = true
10995
message.Options.MessageSetWireFormat = nil
11096
}
@@ -117,11 +103,7 @@ func stripLegacyOptionsFromMessage(message *descriptorpb.DescriptorProto) (*desc
117103
continue
118104
}
119105
if !cloned {
120-
newMessage, err := clone(message)
121-
if err != nil {
122-
return nil, err
123-
}
124-
message = newMessage
106+
message = proto.CloneOf(message)
125107
cloned = true
126108
}
127109
message.Field[i] = newDescriptor
@@ -136,11 +118,7 @@ func stripLegacyOptionsFromMessage(message *descriptorpb.DescriptorProto) (*desc
136118
continue
137119
}
138120
if !cloned {
139-
newMessage, err := clone(message)
140-
if err != nil {
141-
return nil, err
142-
}
143-
message = newMessage
121+
message = proto.CloneOf(message)
144122
cloned = true
145123
}
146124
message.NestedType[i] = newDescriptor
@@ -151,11 +129,7 @@ func stripLegacyOptionsFromMessage(message *descriptorpb.DescriptorProto) (*desc
151129
}
152130
if newExtRanges != nil {
153131
if !cloned {
154-
newMessage, err := clone(message)
155-
if err != nil {
156-
return nil, err
157-
}
158-
message = newMessage
132+
message = proto.CloneOf(message)
159133
cloned = true
160134
}
161135
message.ExtensionRange = newExtRanges
@@ -166,11 +140,7 @@ func stripLegacyOptionsFromMessage(message *descriptorpb.DescriptorProto) (*desc
166140
}
167141
if newExts != nil {
168142
if !cloned {
169-
newMessage, err := clone(message)
170-
if err != nil {
171-
return nil, err
172-
}
173-
message = newMessage
143+
message = proto.CloneOf(message)
174144
cloned = true
175145
}
176146
message.Extension = newExts
@@ -192,10 +162,7 @@ func stripLegacyOptionsFromField(field *descriptorpb.FieldDescriptorProto) (*des
192162
// creating protoreflect.Descriptor instances with this set.
193163
// Buf CLI doesn't actually support weak dependencies, so
194164
// there should be no practical consequences of removing this.
195-
newField, err := clone(field)
196-
if err != nil {
197-
return nil, err
198-
}
165+
newField := proto.CloneOf(field)
199166
newField.Options.Weak = nil
200167
return newField, nil
201168
}
@@ -267,10 +234,7 @@ func stripLegacyOptionsFromExtensionRanges(extRanges []*descriptorpb.DescriptorP
267234
continue
268235
}
269236
if extRange.GetEnd() > maxTagNumber+1 /* extension range end is exclusive */ {
270-
newExtRange, err := clone(extRange)
271-
if err != nil {
272-
return nil, err
273-
}
237+
newExtRange := proto.CloneOf(extRange)
274238
newExtRange.End = proto.Int32(maxTagNumber + 1)
275239
if newExtRanges == nil {
276240
// initialize to everything so far except current item (that we're replacing)
@@ -286,13 +250,3 @@ func stripLegacyOptionsFromExtensionRanges(extRanges []*descriptorpb.DescriptorP
286250
}
287251
return newExtRanges, nil
288252
}
289-
290-
func clone[M proto.Message](message M) (M, error) {
291-
clone := proto.Clone(message)
292-
newMessage, isFileProto := clone.(M)
293-
if !isFileProto {
294-
var zero M
295-
return zero, fmt.Errorf("proto.Clone returned unexpected value: %T instead of %T", clone, message)
296-
}
297-
return newMessage, nil
298-
}

0 commit comments

Comments
 (0)