| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "fmt" |
| "strings" |
| |
| "github.com/maruel/subcommands" |
| |
| "go.chromium.org/luci/auth" |
| "go.chromium.org/luci/auth/client/authcli" |
| buildbucketpb "go.chromium.org/luci/buildbucket/proto" |
| ) |
| |
| type commonFlags struct { |
| subcommands.CommandRunBase |
| buildbucketHost string |
| gitilesRef string |
| searchRange int |
| authFlags authcli.Flags |
| |
| parsedAuthOpts auth.Options |
| } |
| |
| func (c *commonFlags) Init(authOpts auth.Options) { |
| c.authFlags = authcli.Flags{} |
| c.authFlags.Register(&c.Flags, authOpts) |
| c.Flags.StringVar(&c.buildbucketHost, "host", "cr-buildbucket.appspot.com", "Buildbucket hostname") |
| c.Flags.StringVar(&c.gitilesRef, "gitiles-ref", "", "Optionally filter for matching gitiles ref e.g. refs/heads/main") |
| c.Flags.IntVar(&c.searchRange, "search-range", 25, "Number of builds to search") |
| } |
| |
| func (c *commonFlags) checkFlags() error { |
| var err error |
| c.parsedAuthOpts, err = c.authFlags.Options() |
| if err != nil { |
| return err |
| } |
| if c.buildbucketHost == "" { |
| return fmt.Errorf("-host is required") |
| } |
| return nil |
| } |
| |
| // newBuilderID returns a *buildbucketpb.BuilderID for a project/bucket/builder string. |
| func newBuilderID(builder string) (*buildbucketpb.BuilderID, error) { |
| components := strings.Split(builder, "/") |
| if len(components) != 3 { |
| return nil, fmt.Errorf("failed to parse builder %s", builder) |
| } |
| return &buildbucketpb.BuilderID{ |
| Project: components[0], |
| Bucket: components[1], |
| Builder: components[2], |
| }, nil |
| } |
| |
| // builders is a flag.Getter implementation representing a []*buildbucketpb.BuilderID. |
| type builders []*buildbucketpb.BuilderID |
| |
| // String returns a comma-separated string representation of the builder IDs. |
| func (b builders) String() string { |
| strs := make([]string, len(b)) |
| for i, bid := range b { |
| strs[i] = bid.String() |
| } |
| return strings.Join(strs, ", ") |
| } |
| |
| // Set records seeing a flag value. |
| func (b *builders) Set(val string) error { |
| bid, err := newBuilderID(val) |
| if err != nil { |
| return err |
| } |
| *b = append(*b, bid) |
| return nil |
| } |
| |
| // Get retrieves the flag value. |
| func (b builders) Get() any { |
| return []*buildbucketpb.BuilderID(b) |
| } |