Skip to content

Commit f042ec4

Browse files
Merge branch 'main' into linode_ca_panic
2 parents d60b2f0 + 5fc5868 commit f042ec4

File tree

101 files changed

+7205
-6394
lines changed

Some content is hidden

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

101 files changed

+7205
-6394
lines changed

.github/workflows/codeql.yml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: "CodeQL Advanced"
2+
3+
on:
4+
push:
5+
branches: [ "dev", "main", "proj/*" ]
6+
pull_request:
7+
branches: [ "dev", "main", "proj/*" ]
8+
schedule:
9+
- cron: '39 0 * * 6'
10+
11+
jobs:
12+
analyze:
13+
name: Analyze (${{ matrix.language }})
14+
runs-on: ubuntu-latest
15+
permissions:
16+
# required for all workflows
17+
security-events: write
18+
19+
# required to fetch internal or private CodeQL packs
20+
packages: read
21+
22+
# only required for workflows in private repositories
23+
actions: read
24+
contents: read
25+
26+
strategy:
27+
fail-fast: false
28+
matrix:
29+
include:
30+
- language: go
31+
build-mode: autobuild
32+
steps:
33+
- name: Checkout repository
34+
uses: actions/checkout@v4
35+
36+
- name: Initialize CodeQL
37+
uses: github/codeql-action/init@v3
38+
with:
39+
languages: ${{ matrix.language }}
40+
build-mode: ${{ matrix.build-mode }}
41+
queries: security-and-quality
42+
43+
- name: Perform CodeQL Analysis
44+
uses: github/codeql-action/analyze@v3
45+
with:
46+
category: "/language:${{matrix.language}}"
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
1-
name: Gosec Scan
1+
name: Security Checks for Pull Requests
22
on:
33
pull_request: null
44

55
jobs:
6+
dependency-review:
7+
permissions:
8+
contents: read
9+
pull-requests: write
10+
runs-on: ubuntu-latest
11+
steps:
12+
- name: 'Checkout repository'
13+
uses: actions/checkout@v4
14+
- name: 'Dependency Review'
15+
uses: actions/dependency-review-action@v4
16+
with:
17+
comment-summary-in-pr: on-failure
18+
619
gosec_scan:
720
runs-on: ubuntu-latest
821
env:

account_oauth_client.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,14 @@ func (c *Client) DeleteOAuthClient(ctx context.Context, clientID string) error {
129129
err := doDELETERequest(ctx, c, e)
130130
return err
131131
}
132+
133+
// ResetOAuthClientSecret resets the OAuth Client secret for a client with a specified id
134+
func (c *Client) ResetOAuthClientSecret(ctx context.Context, clientID string) (*OAuthClient, error) {
135+
e := formatAPIPath("account/oauth-clients/%s/reset-secret", clientID)
136+
response, err := doPOSTRequest[OAuthClient, any](ctx, c, e)
137+
if err != nil {
138+
return nil, err
139+
}
140+
141+
return response, nil
142+
}

account_service_transfer.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package linodego
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"time"
7+
8+
"github.com/linode/linodego/internal/parseabletime"
9+
)
10+
11+
// AccountServiceTransferStatus constants start with AccountServiceTransfer and
12+
// include Linode API Account Service Transfer Status values.
13+
type AccountServiceTransferStatus string
14+
15+
// AccountServiceTransferStatus constants reflect the current status of an AccountServiceTransfer
16+
const (
17+
AccountServiceTransferAccepted AccountServiceTransferStatus = "accepted"
18+
AccountServiceTransferCanceled AccountServiceTransferStatus = "canceled"
19+
AccountServiceTransferCompleted AccountServiceTransferStatus = "completed"
20+
AccountServiceTransferFailed AccountServiceTransferStatus = "failed"
21+
AccountServiceTransferPending AccountServiceTransferStatus = "pending"
22+
AccountServiceTransferStale AccountServiceTransferStatus = "stale"
23+
)
24+
25+
// AccountServiceTransfer represents a request to transfer a service on an Account
26+
type AccountServiceTransfer struct {
27+
Created *time.Time `json:"-"`
28+
Entities AccountServiceTransferEntity `json:"entities"`
29+
Expiry *time.Time `json:"-"`
30+
IsSender bool `json:"is_sender"`
31+
Status AccountServiceTransferStatus `json:"status"`
32+
Token string `json:"token"`
33+
Updated *time.Time `json:"-"`
34+
}
35+
36+
// AccountServiceTransferEntity represents a collection of the services to include
37+
// in a transfer request, separated by type.
38+
// Note: At this time, only Linodes can be transferred.
39+
type AccountServiceTransferEntity struct {
40+
Linodes []int `json:"linodes"`
41+
}
42+
43+
type AccountServiceTransferRequestOptions struct {
44+
Entities AccountServiceTransferEntity `json:"entities"`
45+
}
46+
47+
// UnmarshalJSON implements the json.Unmarshaler interface
48+
func (ast *AccountServiceTransfer) UnmarshalJSON(b []byte) error {
49+
type Mask AccountServiceTransfer
50+
51+
p := struct {
52+
*Mask
53+
Created *parseabletime.ParseableTime `json:"created"`
54+
Expiry *parseabletime.ParseableTime `json:"expiry"`
55+
Updated *parseabletime.ParseableTime `json:"updated"`
56+
}{
57+
Mask: (*Mask)(ast),
58+
}
59+
60+
if err := json.Unmarshal(b, &p); err != nil {
61+
return err
62+
}
63+
64+
ast.Created = (*time.Time)(p.Created)
65+
ast.Expiry = (*time.Time)(p.Expiry)
66+
ast.Updated = (*time.Time)(p.Updated)
67+
68+
return nil
69+
}
70+
71+
// ListAccountServiceTransfer gets a paginated list of AccountServiceTransfer for the Account.
72+
func (c *Client) ListAccountServiceTransfer(ctx context.Context, opts *ListOptions) ([]AccountServiceTransfer, error) {
73+
e := "account/service-transfers"
74+
return getPaginatedResults[AccountServiceTransfer](ctx, c, e, opts)
75+
}
76+
77+
// GetAccountServiceTransfer gets the details of the AccountServiceTransfer for the provided token.
78+
func (c *Client) GetAccountServiceTransfer(ctx context.Context, token string) (*AccountServiceTransfer, error) {
79+
e := formatAPIPath("account/service-transfers/%s", token)
80+
return doGETRequest[AccountServiceTransfer](ctx, c, e)
81+
}
82+
83+
// RequestAccountServiceTransfer creates a transfer request for the specified services.
84+
func (c *Client) RequestAccountServiceTransfer(ctx context.Context, opts AccountServiceTransferRequestOptions) (*AccountServiceTransfer, error) {
85+
e := "account/service-transfers"
86+
return doPOSTRequest[AccountServiceTransfer](ctx, c, e, opts)
87+
}
88+
89+
// AcceptAccountServiceTransfer accepts an AccountServiceTransfer for the provided token to
90+
// receive the services included in the transfer to the Account.
91+
func (c *Client) AcceptAccountServiceTransfer(ctx context.Context, token string) error {
92+
e := formatAPIPath("account/service-transfers/%s/accept", token)
93+
_, err := doPOSTRequest[AccountServiceTransfer, any](ctx, c, e)
94+
return err
95+
}
96+
97+
// CancelAccountServiceTransfer cancels the AccountServiceTransfer for the provided token.
98+
func (c *Client) CancelAccountServiceTransfer(ctx context.Context, token string) error {
99+
e := formatAPIPath("account/service-transfers/%s", token)
100+
return doDELETERequest(ctx, c, e)
101+
}

account_user_grants.go

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ type GlobalUserGrants struct {
2020
AddLinodes bool `json:"add_linodes"`
2121
AddLongview bool `json:"add_longview"`
2222
AddNodeBalancers bool `json:"add_nodebalancers"`
23+
AddPlacementGroups bool `json:"add_placement_groups"`
2324
AddStackScripts bool `json:"add_stackscripts"`
2425
AddVolumes bool `json:"add_volumes"`
26+
AddVPCs bool `json:"add_vpcs"`
2527
CancelAccount bool `json:"cancel_account"`
28+
ChildAccountAccess bool `json:"child_account_access"`
2629
LongviewSubscription bool `json:"longview_subscription"`
2730
}
2831

@@ -38,29 +41,33 @@ type GrantedEntity struct {
3841
}
3942

4043
type UserGrants struct {
41-
Database []GrantedEntity `json:"database"`
42-
Domain []GrantedEntity `json:"domain"`
43-
Firewall []GrantedEntity `json:"firewall"`
44-
Image []GrantedEntity `json:"image"`
45-
Linode []GrantedEntity `json:"linode"`
46-
Longview []GrantedEntity `json:"longview"`
47-
NodeBalancer []GrantedEntity `json:"nodebalancer"`
48-
StackScript []GrantedEntity `json:"stackscript"`
49-
Volume []GrantedEntity `json:"volume"`
44+
Database []GrantedEntity `json:"database"`
45+
Domain []GrantedEntity `json:"domain"`
46+
Firewall []GrantedEntity `json:"firewall"`
47+
Image []GrantedEntity `json:"image"`
48+
Linode []GrantedEntity `json:"linode"`
49+
Longview []GrantedEntity `json:"longview"`
50+
NodeBalancer []GrantedEntity `json:"nodebalancer"`
51+
PlacementGroup []GrantedEntity `json:"placement_group"`
52+
StackScript []GrantedEntity `json:"stackscript"`
53+
Volume []GrantedEntity `json:"volume"`
54+
VPC []GrantedEntity `json:"vpc"`
5055

5156
Global GlobalUserGrants `json:"global"`
5257
}
5358

5459
type UserGrantsUpdateOptions struct {
55-
Database []GrantedEntity `json:"database,omitempty"`
56-
Domain []EntityUserGrant `json:"domain,omitempty"`
57-
Firewall []EntityUserGrant `json:"firewall,omitempty"`
58-
Image []EntityUserGrant `json:"image,omitempty"`
59-
Linode []EntityUserGrant `json:"linode,omitempty"`
60-
Longview []EntityUserGrant `json:"longview,omitempty"`
61-
NodeBalancer []EntityUserGrant `json:"nodebalancer,omitempty"`
62-
StackScript []EntityUserGrant `json:"stackscript,omitempty"`
63-
Volume []EntityUserGrant `json:"volume,omitempty"`
60+
Database []GrantedEntity `json:"database,omitempty"`
61+
Domain []EntityUserGrant `json:"domain,omitempty"`
62+
Firewall []EntityUserGrant `json:"firewall,omitempty"`
63+
Image []EntityUserGrant `json:"image,omitempty"`
64+
Linode []EntityUserGrant `json:"linode,omitempty"`
65+
Longview []EntityUserGrant `json:"longview,omitempty"`
66+
NodeBalancer []EntityUserGrant `json:"nodebalancer,omitempty"`
67+
PlacementGroup []EntityUserGrant `json:"placement_group,omitempty"`
68+
StackScript []EntityUserGrant `json:"stackscript,omitempty"`
69+
Volume []EntityUserGrant `json:"volume,omitempty"`
70+
VPC []EntityUserGrant `json:"vpc,omitempty"`
6471

6572
Global GlobalUserGrants `json:"global"`
6673
}

account_users.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ type UserCreateOptions struct {
4747
type UserUpdateOptions struct {
4848
Username string `json:"username,omitempty"`
4949
Restricted *bool `json:"restricted,omitempty"`
50+
Email string `json:"email,omitempty"`
5051
}
5152

5253
// UnmarshalJSON implements the json.Unmarshaler interface
@@ -102,6 +103,7 @@ func (i User) GetCreateOptions() (o UserCreateOptions) {
102103
func (i User) GetUpdateOptions() (o UserUpdateOptions) {
103104
o.Username = i.Username
104105
o.Restricted = copyBool(&i.Restricted)
106+
o.Email = i.Email
105107

106108
return
107109
}

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ module github.com/linode/linodego
33
require (
44
github.com/go-resty/resty/v2 v2.16.2
55
github.com/google/go-cmp v0.6.0
6+
github.com/google/go-querystring v1.1.0
67
github.com/jarcoal/httpmock v1.3.1
7-
golang.org/x/net v0.31.0
8+
golang.org/x/net v0.32.0
89
golang.org/x/oauth2 v0.24.0
9-
golang.org/x/text v0.20.0
10+
golang.org/x/text v0.21.0
1011
gopkg.in/ini.v1 v1.66.6
1112
)
1213

go.sum

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
22
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
33
github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg=
44
github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU=
5+
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
56
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
67
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
8+
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
9+
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
710
github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww=
811
github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
912
github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g=
@@ -12,14 +15,15 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
1215
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1316
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
1417
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
15-
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
16-
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
18+
golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
19+
golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
1720
golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
1821
golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
19-
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
20-
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
22+
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
23+
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
2124
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
2225
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
26+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
2327
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
2428
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2529
gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI=

go.work.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt7
4343
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
4444
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
4545
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
46+
golang.org/x/crypto v0.30.0 h1:RwoQn3GkWiMkzlX562cLB7OxWvjH1L8xutO2WoJcRoY=
47+
golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
4648
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
4749
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
4850
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
@@ -52,14 +54,12 @@ golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
5254
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
5355
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
5456
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
57+
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
58+
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
5559
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
56-
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
57-
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
5860
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY=
5961
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
6062
golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
61-
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
62-
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
6363
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
6464
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
6565
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=

k8s/go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ require (
1818
github.com/gogo/protobuf v1.3.2 // indirect
1919
github.com/golang/protobuf v1.5.4 // indirect
2020
github.com/google/gnostic-models v0.6.8 // indirect
21+
github.com/google/go-querystring v1.1.0 // indirect
2122
github.com/google/gofuzz v1.2.0 // indirect
2223
github.com/google/uuid v1.3.0 // indirect
2324
github.com/imdario/mergo v0.3.6 // indirect
@@ -28,11 +29,11 @@ require (
2829
github.com/modern-go/reflect2 v1.0.2 // indirect
2930
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
3031
github.com/spf13/pflag v1.0.5 // indirect
31-
golang.org/x/net v0.31.0 // indirect
32+
golang.org/x/net v0.32.0 // indirect
3233
golang.org/x/oauth2 v0.24.0 // indirect
33-
golang.org/x/sys v0.27.0 // indirect
34-
golang.org/x/term v0.26.0 // indirect
35-
golang.org/x/text v0.20.0 // indirect
34+
golang.org/x/sys v0.28.0 // indirect
35+
golang.org/x/term v0.27.0 // indirect
36+
golang.org/x/text v0.21.0 // indirect
3637
golang.org/x/time v0.6.0 // indirect
3738
google.golang.org/protobuf v1.33.0 // indirect
3839
gopkg.in/inf.v0 v0.9.1 // indirect

0 commit comments

Comments
 (0)