From 58beffe975221587629dd6cd12b17c93203a7b1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=A1vio=20Fernandes?= Date: Fri, 29 Oct 2021 11:32:50 +0100 Subject: [PATCH] Extend the purchase page to support pagination (#701) --- console/console.swagger.json | 4 + .../purchases/purchases.component.html | 90 +++++++------- .../account/purchases/purchases.component.ts | 13 ++- console/ui/src/app/console.service.ts | 1 + go.mod | 3 +- go.sum | 2 + server/core_purchase.go | 110 +++++++++++++----- .../cmd/protoc-gen-go/internal_gengo/main.go | 46 ++++---- .../protobuf/compiler/protogen/protogen.go | 9 +- .../protobuf/encoding/prototext/decode.go | 3 - .../protobuf/internal/encoding/text/encode.go | 5 + .../protobuf/internal/impl/legacy_message.go | 7 ++ .../protobuf/internal/version/version.go | 4 +- .../reflect/protoregistry/registry.go | 43 ++++--- .../types/descriptorpb/descriptor.pb.go | 82 ------------- vendor/modules.txt | 5 +- 16 files changed, 219 insertions(+), 208 deletions(-) diff --git a/console/console.swagger.json b/console/console.swagger.json index ae3f4008f..dae8439a4 100644 --- a/console/console.swagger.json +++ b/console/console.swagger.json @@ -2142,6 +2142,10 @@ "cursor": { "type": "string", "description": "The cursor to send when retrieving the next page, if any." + }, + "prevCursor": { + "type": "string", + "description": "The cursor to send when retrieving the next page, if any." } }, "description": "A list of validated purchases stored by Nakama." diff --git a/console/ui/src/app/account/purchases/purchases.component.html b/console/ui/src/app/account/purchases/purchases.component.html index d4df468cb..4187c86e0 100644 --- a/console/ui/src/app/account/purchases/purchases.component.html +++ b/console/ui/src/app/account/purchases/purchases.component.html @@ -3,47 +3,57 @@
Error while processing request: {{error}}
- - - - - - - - - - - - +
+
+
+
+
+ + + +
+
+
+
+ +
+
Product IDTransaction IDStorePurchase TimeCreate Time
+ - - - - - + + + + + - - + + + + - - - - -
-
-
-
-
- {{p.product_id}} -
{{p.transaction_id}}{{getStoreText(p.store)}}{{p.purchase_time}}{{p.create_time}}Product IDTransaction IDStorePurchase TimeCreate Time
-
-
Provider Response
-
-
{{p.provider_response}}
+
+
+
+
- -
No purchases were found.
- -
- + {{p.product_id}} + + {{p.transaction_id}} + {{getStoreText(p.store)}} + {{p.purchase_time}} + {{p.create_time}} + + + +
+
Provider Response
+
+
{{p.provider_response}}
+
+
+ + + + No purchases were found. + +
- diff --git a/console/ui/src/app/account/purchases/purchases.component.ts b/console/ui/src/app/account/purchases/purchases.component.ts index fee110f9e..b4d3fd185 100644 --- a/console/ui/src/app/account/purchases/purchases.component.ts +++ b/console/ui/src/app/account/purchases/purchases.component.ts @@ -27,6 +27,7 @@ export class PurchasesComponent implements OnInit { public purchasesRowsOpen: boolean[] = []; public error = ''; public nextCursor = ''; + public prevCursor = ''; public userID: string; public readonly limit = 100; @@ -39,21 +40,23 @@ export class PurchasesComponent implements OnInit { ngOnInit(): void { this.userID = this.route.parent.snapshot.paramMap.get('id'); this.route.data.subscribe(data => { - this.purchases.push(...data[0].validated_purchases); + this.purchases = data[0].validated_purchases; this.nextCursor = data[0].cursor; + this.prevCursor = data[0].prev_cursor; }); } - loadOlderPurchases(): void { + loadData(cursor: string): void { this.consoleService.listPurchases( '', this.userID, this.limit, - this.nextCursor, + cursor, ).subscribe(res => { - this.purchases.push(...res.validated_purchases); - this.purchasesRowsOpen.push(...Array(res.validated_purchases.length).fill(false)); + this.purchases = res.validated_purchases; + this.purchasesRowsOpen = []; this.nextCursor = res.cursor; + this.prevCursor = res.prev_cursor; }, error => { this.error = error; }); diff --git a/console/ui/src/app/console.service.ts b/console/ui/src/app/console.service.ts index 14a34585f..3e4161d9c 100644 --- a/console/ui/src/app/console.service.ts +++ b/console/ui/src/app/console.service.ts @@ -517,6 +517,7 @@ export interface ApiNotification { export interface ApiPurchaseList { validated_purchases?: ApiValidatedPurchase[] cursor?: string + prev_cursor?: string } export interface ApiReadStorageObjectId { diff --git a/go.mod b/go.mod index b6b59acbf..46db99f33 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/dop251/goja v0.0.0-20210406175830-1b11a6af686d github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a // indirect github.com/gofrs/uuid v4.0.0+incompatible + github.com/golang/protobuf v1.5.2 // indirect github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.4.2 @@ -34,7 +35,7 @@ require ( google.golang.org/genproto v0.0.0-20210224155714-063164c882e6 google.golang.org/grpc v1.37.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/protobuf v1.26.0 + google.golang.org/protobuf v1.27.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0-20190411184413-94d9e492cc53 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index 919798a0d..174eb9848 100644 --- a/go.sum +++ b/go.sum @@ -233,6 +233,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= diff --git a/server/core_purchase.go b/server/core_purchase.go index a8fc37513..20231c7ec 100644 --- a/server/core_purchase.go +++ b/server/core_purchase.go @@ -227,6 +227,7 @@ type purchasesListCursor struct { TransactionId string PurchaseTime *timestamppb.Timestamp UserId string + IsNext bool } func GetPurchaseByTransactionID(ctx context.Context, logger *zap.Logger, db *sql.DB, transactionID string) (string, *api.ValidatedPurchase, error) { @@ -290,43 +291,50 @@ func ListPurchases(ctx context.Context, logger *zap.Logger, db *sql.DB, userID s } } + comparationOp := "<=" + sortConf := "DESC" + if incomingCursor != nil && !incomingCursor.IsNext { + comparationOp = ">" + sortConf = "ASC" + } + params := make([]interface{}, 0, 4) - query := ` -SELECT - user_id, - transaction_id, - product_id, - store, - raw_response, - purchase_time, - create_time, - update_time, - environment -FROM - purchase -` + predicateConf := "" if incomingCursor != nil { if userID == "" { - query += " WHERE (user_id, purchase_time, transaction_id) <= ($1, $2, $3)" + predicateConf = fmt.Sprintf(" WHERE (user_id, purchase_time, transaction_id) %s ($1, $2, $3)", comparationOp) } else { - query += " WHERE user_id = $1 AND (purchase_time, transaction_id) <= ($2, $3)" + predicateConf = fmt.Sprintf(" WHERE user_id = $1 AND (purchase_time, transaction_id) %s ($2, $3)", comparationOp) } - params = append(params, incomingCursor.UserId) - params = append(params, incomingCursor.PurchaseTime.AsTime()) - params = append(params, incomingCursor.TransactionId) + params = append(params, incomingCursor.UserId, incomingCursor.PurchaseTime.AsTime(), incomingCursor.TransactionId) } else { if userID != "" { - query += " WHERE user_id = $1" + predicateConf = " WHERE user_id = $1" params = append(params, userID) } } - query += " ORDER BY purchase_time DESC" + if limit > 0 { params = append(params, limit+1) } else { params = append(params, 101) // Default limit to 100 purchases if not set } - query += " LIMIT $" + strconv.Itoa(len(params)) + + query := fmt.Sprintf(` + SELECT + user_id, + transaction_id, + product_id, + store, + raw_response, + purchase_time, + create_time, + update_time, + environment + FROM + purchase + %s + ORDER BY purchase_time %s LIMIT $%v`, predicateConf, sortConf, len(params)) rows, err := db.QueryContext(ctx, query, params...) if err != nil { @@ -335,8 +343,9 @@ FROM } defer rows.Close() + var nextCursor *purchasesListCursor + var prevCursor *purchasesListCursor purchases := make([]*api.ValidatedPurchase, 0, limit) - var outgoingCursor string for rows.Next() { var userID uuid.UUID @@ -355,16 +364,12 @@ FROM } if len(purchases) >= limit { - cursorBuf := new(bytes.Buffer) - if err := gob.NewEncoder(cursorBuf).Encode(&purchasesListCursor{ + nextCursor = &purchasesListCursor{ TransactionId: transactionId, PurchaseTime: timestamppb.New(purchaseTime.Time), UserId: userID.String(), - }); err != nil { - logger.Error("Error creating purchases list cursor", zap.Error(err)) - return nil, err + IsNext: true, } - outgoingCursor = base64.URLEncoding.EncodeToString(cursorBuf.Bytes()) break } @@ -380,13 +385,58 @@ FROM } purchases = append(purchases, purchase) + + if incomingCursor != nil && prevCursor == nil { + prevCursor = &purchasesListCursor{ + TransactionId: transactionId, + PurchaseTime: timestamppb.New(purchaseTime.Time), + UserId: userID.String(), + IsNext: false, + } + } } if err = rows.Err(); err != nil { logger.Error("Error retrieving purchases.", zap.Error(err)) return nil, err } - return &api.PurchaseList{ValidatedPurchases: purchases, Cursor: outgoingCursor}, nil + if incomingCursor != nil && !incomingCursor.IsNext { + if nextCursor != nil && prevCursor != nil { + nextCursor, nextCursor.IsNext, prevCursor, prevCursor.IsNext = prevCursor, prevCursor.IsNext, nextCursor, nextCursor.IsNext + } else if nextCursor != nil { + nextCursor, prevCursor = nil, nextCursor + prevCursor.IsNext = !prevCursor.IsNext + } else if prevCursor != nil { + nextCursor, prevCursor = prevCursor, nil + nextCursor.IsNext = !nextCursor.IsNext + } + + for i, j := 0, len(purchases)-1; i < j; i, j = i+1, j-1 { + purchases[i], purchases[j] = purchases[j], purchases[i] + } + } + + var nextCursorStr string + if nextCursor != nil { + cursorBuf := new(bytes.Buffer) + if err := gob.NewEncoder(cursorBuf).Encode(nextCursor); err != nil { + logger.Error("Error creating purchases list cursor", zap.Error(err)) + return nil, err + } + nextCursorStr = base64.URLEncoding.EncodeToString(cursorBuf.Bytes()) + } + + var prevCursorStr string + if prevCursor != nil { + cursorBuf := new(bytes.Buffer) + if err := gob.NewEncoder(cursorBuf).Encode(prevCursor); err != nil { + logger.Error("Error creating purchases list cursor", zap.Error(err)) + return nil, err + } + prevCursorStr = base64.URLEncoding.EncodeToString(cursorBuf.Bytes()) + } + + return &api.PurchaseList{ValidatedPurchases: purchases, Cursor: nextCursorStr, PrevCursor: prevCursorStr}, nil } type storagePurchase struct { diff --git a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go index 6338c44dc..d34efa9b1 100644 --- a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go +++ b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go @@ -128,6 +128,9 @@ func genGeneratedHeader(gen *protogen.Plugin, g *protogen.GeneratedFile, f *file protocVersion := "(unknown)" if v := gen.Request.GetCompilerVersion(); v != nil { protocVersion = fmt.Sprintf("v%v.%v.%v", v.GetMajor(), v.GetMinor(), v.GetPatch()) + if s := v.GetSuffix(); s != "" { + protocVersion += "-" + s + } } g.P("// \tprotoc-gen-go ", protocGenGoVersion) g.P("// \tprotoc ", protocVersion) @@ -444,7 +447,15 @@ func genMessageDefaultDecls(g *protogen.GeneratedFile, f *fileInfo, m *messageIn case protoreflect.EnumKind: idx := field.Desc.DefaultEnumValue().Index() val := field.Enum.Values[idx] - consts = append(consts, fmt.Sprintf("%s = %s", name, g.QualifiedGoIdent(val.GoIdent))) + if val.GoIdent.GoImportPath == f.GoImportPath { + consts = append(consts, fmt.Sprintf("%s = %s", name, g.QualifiedGoIdent(val.GoIdent))) + } else { + // If the enum value is declared in a different Go package, + // reference it by number since the name may not be correct. + // See https://github.com/golang/protobuf/issues/513. + consts = append(consts, fmt.Sprintf("%s = %s(%d) // %s", + name, g.QualifiedGoIdent(field.Enum.GoIdent), val.Desc.Number(), g.QualifiedGoIdent(val.GoIdent))) + } case protoreflect.FloatKind, protoreflect.DoubleKind: if f := defVal.Float(); math.IsNaN(f) || math.IsInf(f, 0) { var fn, arg string @@ -527,25 +538,6 @@ func genMessageBaseMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageInf g.P() f.needRawDesc = true } - - // ExtensionRangeArray method. - extRanges := m.Desc.ExtensionRanges() - if m.genExtRangeMethod && extRanges.Len() > 0 { - protoExtRange := protoifacePackage.Ident("ExtensionRangeV1") - extRangeVar := "extRange_" + m.GoIdent.GoName - g.P("var ", extRangeVar, " = []", protoExtRange, " {") - for i := 0; i < extRanges.Len(); i++ { - r := extRanges.Get(i) - g.P("{Start:", r[0], ", End:", r[1]-1 /* inclusive */, "},") - } - g.P("}") - g.P() - g.P("// Deprecated: Use ", m.GoIdent, ".ProtoReflect.Descriptor.ExtensionRanges instead.") - g.P("func (*", m.GoIdent, ") ExtensionRangeArray() []", protoExtRange, " {") - g.P("return ", extRangeVar) - g.P("}") - g.P() - } } func genMessageGetterMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { @@ -566,7 +558,7 @@ func genMessageGetterMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageI // Getter for message field. goType, pointer := fieldGoType(g, f, field) - defaultValue := fieldDefaultValue(g, m, field) + defaultValue := fieldDefaultValue(g, f, m, field) g.Annotate(m.GoIdent.GoName+".Get"+field.GoName, field.Location) leadingComments := appendDeprecationSuffix("", field.Desc.Options().(*descriptorpb.FieldOptions).GetDeprecated()) @@ -688,7 +680,7 @@ func fieldProtobufTagValue(field *protogen.Field) string { return tag.Marshal(field.Desc, enumName) } -func fieldDefaultValue(g *protogen.GeneratedFile, m *messageInfo, field *protogen.Field) string { +func fieldDefaultValue(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo, field *protogen.Field) string { if field.Desc.IsList() { return "nil" } @@ -707,7 +699,15 @@ func fieldDefaultValue(g *protogen.GeneratedFile, m *messageInfo, field *protoge case protoreflect.MessageKind, protoreflect.GroupKind, protoreflect.BytesKind: return "nil" case protoreflect.EnumKind: - return g.QualifiedGoIdent(field.Enum.Values[0].GoIdent) + val := field.Enum.Values[0] + if val.GoIdent.GoImportPath == f.GoImportPath { + return g.QualifiedGoIdent(val.GoIdent) + } else { + // If the enum value is declared in a different Go package, + // reference it by number since the name may not be correct. + // See https://github.com/golang/protobuf/issues/513. + return g.QualifiedGoIdent(field.Enum.GoIdent) + "(" + strconv.FormatInt(int64(val.Desc.Number()), 10) + ")" + } default: return "0" } diff --git a/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go b/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go index 17cbe1a39..2ee676fbb 100644 --- a/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go +++ b/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go @@ -251,12 +251,13 @@ func (opts Options) New(req *pluginpb.CodeGeneratorRequest) (*Plugin, error) { "\t• a \"M\" argument on the command line.\n\n"+ "See %v for more information.\n", fdesc.GetName(), goPackageDocURL) - case !strings.Contains(string(importPaths[filename]), "/"): - // Check that import paths contain at least one slash to avoid a - // common mistake where import path is confused with package name. + case !strings.Contains(string(importPaths[filename]), ".") && + !strings.Contains(string(importPaths[filename]), "/"): + // Check that import paths contain at least a dot or slash to avoid + // a common mistake where import path is confused with package name. return nil, fmt.Errorf( "invalid Go import path %q for %q\n\n"+ - "The import path must contain at least one forward slash ('/') character.\n\n"+ + "The import path must contain at least one period ('.') or forward slash ('/') character.\n\n"+ "See %v for more information.\n", string(importPaths[filename]), fdesc.GetName(), goPackageDocURL) case packageNames[filename] == "": diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go index 8fb1d9e08..179d6e8fc 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go @@ -744,9 +744,6 @@ func (d decoder) skipValue() error { // Skip items. This will not validate whether skipped values are // of the same type or not, same behavior as C++ // TextFormat::Parser::AllowUnknownField(true) version 3.8.0. - if err := d.skipValue(); err != nil { - return err - } } } } diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go b/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go index aa66bdd06..da289ccce 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go @@ -263,3 +263,8 @@ func (e *Encoder) Snapshot() encoderState { func (e *Encoder) Reset(es encoderState) { e.encoderState = es } + +// AppendString appends the escaped form of the input string to b. +func AppendString(b []byte, s string) []byte { + return appendString(b, s, false) +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go index 3759b010c..029feeefd 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go @@ -440,6 +440,13 @@ func legacyMerge(in piface.MergeInput) piface.MergeOutput { if !ok { return piface.MergeOutput{} } + if !in.Source.IsValid() { + // Legacy Marshal methods may not function on nil messages. + // Check for a typed nil source only after we confirm that + // legacy Marshal/Unmarshal methods are present, for + // consistency. + return piface.MergeOutput{Flags: piface.MergeComplete} + } b, err := marshaler.Marshal() if err != nil { return piface.MergeOutput{} diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 5879131da..14e774fb2 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -52,8 +52,8 @@ import ( // 10. Send out the CL for review and submit it. const ( Major = 1 - Minor = 26 - Patch = 0 + Minor = 27 + Patch = 1 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go index 66dcbcd0d..59f024c44 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +++ b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go @@ -94,7 +94,8 @@ type Files struct { // Note that enum values are in the top-level since that are in the same // scope as the parent enum. descsByName map[protoreflect.FullName]interface{} - filesByPath map[string]protoreflect.FileDescriptor + filesByPath map[string][]protoreflect.FileDescriptor + numFiles int } type packageDescriptor struct { @@ -117,17 +118,16 @@ func (r *Files) RegisterFile(file protoreflect.FileDescriptor) error { r.descsByName = map[protoreflect.FullName]interface{}{ "": &packageDescriptor{}, } - r.filesByPath = make(map[string]protoreflect.FileDescriptor) + r.filesByPath = make(map[string][]protoreflect.FileDescriptor) } path := file.Path() - if prev := r.filesByPath[path]; prev != nil { + if prev := r.filesByPath[path]; len(prev) > 0 { r.checkGenProtoConflict(path) err := errors.New("file %q is already registered", file.Path()) - err = amendErrorWithCaller(err, prev, file) - if r == GlobalFiles && ignoreConflict(file, err) { - err = nil + err = amendErrorWithCaller(err, prev[0], file) + if !(r == GlobalFiles && ignoreConflict(file, err)) { + return err } - return err } for name := file.Package(); name != ""; name = name.Parent() { @@ -168,7 +168,8 @@ func (r *Files) RegisterFile(file protoreflect.FileDescriptor) error { rangeTopLevelDescriptors(file, func(d protoreflect.Descriptor) { r.descsByName[d.FullName()] = d }) - r.filesByPath[path] = file + r.filesByPath[path] = append(r.filesByPath[path], file) + r.numFiles++ return nil } @@ -308,6 +309,7 @@ func (s *nameSuffix) Pop() (name protoreflect.Name) { // FindFileByPath looks up a file by the path. // // This returns (nil, NotFound) if not found. +// This returns an error if multiple files have the same path. func (r *Files) FindFileByPath(path string) (protoreflect.FileDescriptor, error) { if r == nil { return nil, NotFound @@ -316,13 +318,19 @@ func (r *Files) FindFileByPath(path string) (protoreflect.FileDescriptor, error) globalMutex.RLock() defer globalMutex.RUnlock() } - if fd, ok := r.filesByPath[path]; ok { - return fd, nil + fds := r.filesByPath[path] + switch len(fds) { + case 0: + return nil, NotFound + case 1: + return fds[0], nil + default: + return nil, errors.New("multiple files named %q", path) } - return nil, NotFound } -// NumFiles reports the number of registered files. +// NumFiles reports the number of registered files, +// including duplicate files with the same name. func (r *Files) NumFiles() int { if r == nil { return 0 @@ -331,10 +339,11 @@ func (r *Files) NumFiles() int { globalMutex.RLock() defer globalMutex.RUnlock() } - return len(r.filesByPath) + return r.numFiles } // RangeFiles iterates over all registered files while f returns true. +// If multiple files have the same name, RangeFiles iterates over all of them. // The iteration order is undefined. func (r *Files) RangeFiles(f func(protoreflect.FileDescriptor) bool) { if r == nil { @@ -344,9 +353,11 @@ func (r *Files) RangeFiles(f func(protoreflect.FileDescriptor) bool) { globalMutex.RLock() defer globalMutex.RUnlock() } - for _, file := range r.filesByPath { - if !f(file) { - return + for _, files := range r.filesByPath { + for _, file := range files { + if !f(file) { + return + } } } } diff --git a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go index f77239fc3..abe4ab511 100644 --- a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +++ b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go @@ -43,7 +43,6 @@ package descriptorpb import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoiface "google.golang.org/protobuf/runtime/protoiface" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" @@ -829,15 +828,6 @@ func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{3} } -var extRange_ExtensionRangeOptions = []protoiface.ExtensionRangeV1{ - {Start: 1000, End: 536870911}, -} - -// Deprecated: Use ExtensionRangeOptions.ProtoReflect.Descriptor.ExtensionRanges instead. -func (*ExtensionRangeOptions) ExtensionRangeArray() []protoiface.ExtensionRangeV1 { - return extRange_ExtensionRangeOptions -} - func (x *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -1520,15 +1510,6 @@ func (*FileOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{10} } -var extRange_FileOptions = []protoiface.ExtensionRangeV1{ - {Start: 1000, End: 536870911}, -} - -// Deprecated: Use FileOptions.ProtoReflect.Descriptor.ExtensionRanges instead. -func (*FileOptions) ExtensionRangeArray() []protoiface.ExtensionRangeV1 { - return extRange_FileOptions -} - func (x *FileOptions) GetJavaPackage() string { if x != nil && x.JavaPackage != nil { return *x.JavaPackage @@ -1776,15 +1757,6 @@ func (*MessageOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{11} } -var extRange_MessageOptions = []protoiface.ExtensionRangeV1{ - {Start: 1000, End: 536870911}, -} - -// Deprecated: Use MessageOptions.ProtoReflect.Descriptor.ExtensionRanges instead. -func (*MessageOptions) ExtensionRangeArray() []protoiface.ExtensionRangeV1 { - return extRange_MessageOptions -} - func (x *MessageOptions) GetMessageSetWireFormat() bool { if x != nil && x.MessageSetWireFormat != nil { return *x.MessageSetWireFormat @@ -1930,15 +1902,6 @@ func (*FieldOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12} } -var extRange_FieldOptions = []protoiface.ExtensionRangeV1{ - {Start: 1000, End: 536870911}, -} - -// Deprecated: Use FieldOptions.ProtoReflect.Descriptor.ExtensionRanges instead. -func (*FieldOptions) ExtensionRangeArray() []protoiface.ExtensionRangeV1 { - return extRange_FieldOptions -} - func (x *FieldOptions) GetCtype() FieldOptions_CType { if x != nil && x.Ctype != nil { return *x.Ctype @@ -2030,15 +1993,6 @@ func (*OneofOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{13} } -var extRange_OneofOptions = []protoiface.ExtensionRangeV1{ - {Start: 1000, End: 536870911}, -} - -// Deprecated: Use OneofOptions.ProtoReflect.Descriptor.ExtensionRanges instead. -func (*OneofOptions) ExtensionRangeArray() []protoiface.ExtensionRangeV1 { - return extRange_OneofOptions -} - func (x *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2101,15 +2055,6 @@ func (*EnumOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{14} } -var extRange_EnumOptions = []protoiface.ExtensionRangeV1{ - {Start: 1000, End: 536870911}, -} - -// Deprecated: Use EnumOptions.ProtoReflect.Descriptor.ExtensionRanges instead. -func (*EnumOptions) ExtensionRangeArray() []protoiface.ExtensionRangeV1 { - return extRange_EnumOptions -} - func (x *EnumOptions) GetAllowAlias() bool { if x != nil && x.AllowAlias != nil { return *x.AllowAlias @@ -2183,15 +2128,6 @@ func (*EnumValueOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{15} } -var extRange_EnumValueOptions = []protoiface.ExtensionRangeV1{ - {Start: 1000, End: 536870911}, -} - -// Deprecated: Use EnumValueOptions.ProtoReflect.Descriptor.ExtensionRanges instead. -func (*EnumValueOptions) ExtensionRangeArray() []protoiface.ExtensionRangeV1 { - return extRange_EnumValueOptions -} - func (x *EnumValueOptions) GetDeprecated() bool { if x != nil && x.Deprecated != nil { return *x.Deprecated @@ -2258,15 +2194,6 @@ func (*ServiceOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{16} } -var extRange_ServiceOptions = []protoiface.ExtensionRangeV1{ - {Start: 1000, End: 536870911}, -} - -// Deprecated: Use ServiceOptions.ProtoReflect.Descriptor.ExtensionRanges instead. -func (*ServiceOptions) ExtensionRangeArray() []protoiface.ExtensionRangeV1 { - return extRange_ServiceOptions -} - func (x *ServiceOptions) GetDeprecated() bool { if x != nil && x.Deprecated != nil { return *x.Deprecated @@ -2335,15 +2262,6 @@ func (*MethodOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{17} } -var extRange_MethodOptions = []protoiface.ExtensionRangeV1{ - {Start: 1000, End: 536870911}, -} - -// Deprecated: Use MethodOptions.ProtoReflect.Descriptor.ExtensionRanges instead. -func (*MethodOptions) ExtensionRangeArray() []protoiface.ExtensionRangeV1 { - return extRange_MethodOptions -} - func (x *MethodOptions) GetDeprecated() bool { if x != nil && x.Deprecated != nil { return *x.Deprecated diff --git a/vendor/modules.txt b/vendor/modules.txt index 06fe5ce29..956f2da57 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -102,7 +102,8 @@ github.com/go-sourcemap/sourcemap/internal/base64vlq github.com/gofrs/uuid # github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/glog -# github.com/golang/protobuf v1.5.0 +# github.com/golang/protobuf v1.5.2 +## explicit github.com/golang/protobuf/descriptor github.com/golang/protobuf/proto github.com/golang/protobuf/protoc-gen-go/descriptor @@ -320,7 +321,7 @@ google.golang.org/grpc/tap # google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 ## explicit google.golang.org/grpc/cmd/protoc-gen-go-grpc -# google.golang.org/protobuf v1.26.0 +# google.golang.org/protobuf v1.27.1 ## explicit google.golang.org/protobuf/cmd/protoc-gen-go google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo -- GitLab