Skip to content

Commit e627a5e

Browse files
committed
feat: Add data source for listing GitHub App installations in an organization
1 parent 935246a commit e627a5e

5 files changed

Lines changed: 337 additions & 21 deletions
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
package github
2+
3+
import (
4+
"context"
5+
6+
"github.com/google/go-github/v82/github"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func dataSourceGithubOrganizationAppInstallations() *schema.Resource {
12+
return &schema.Resource{
13+
ReadContext: dataSourceGithubOrganizationAppInstallationsRead,
14+
Description: "Use this data source to retrieve all GitHub App installations of the organization.",
15+
16+
Schema: map[string]*schema.Schema{
17+
"installations": {
18+
Type: schema.TypeList,
19+
Computed: true,
20+
Description: "List of GitHub App installations in the organization.",
21+
Elem: &schema.Resource{
22+
Schema: map[string]*schema.Schema{
23+
"id": {
24+
Type: schema.TypeInt,
25+
Computed: true,
26+
Description: "The ID of the GitHub App installation.",
27+
},
28+
"slug": {
29+
Type: schema.TypeString,
30+
Computed: true,
31+
Description: "The URL-friendly name of the GitHub App.",
32+
},
33+
"app_id": {
34+
Type: schema.TypeInt,
35+
Computed: true,
36+
Description: "The ID of the GitHub App.",
37+
},
38+
"repository_selection": {
39+
Type: schema.TypeString,
40+
Computed: true,
41+
Description: "Whether the installation has access to all repositories or only selected ones. Possible values are 'all' or 'selected'.",
42+
},
43+
"permissions": {
44+
Type: schema.TypeMap,
45+
Computed: true,
46+
Elem: &schema.Schema{Type: schema.TypeString},
47+
Description: "The permissions granted to the GitHub App installation.",
48+
},
49+
"events": {
50+
Type: schema.TypeList,
51+
Computed: true,
52+
Elem: &schema.Schema{Type: schema.TypeString},
53+
Description: "The list of events the GitHub App installation subscribes to.",
54+
},
55+
"html_url": {
56+
Type: schema.TypeString,
57+
Computed: true,
58+
Description: "The URL to the GitHub App installation's settings page.",
59+
},
60+
"client_id": {
61+
Type: schema.TypeString,
62+
Computed: true,
63+
Description: "The OAuth client ID of the GitHub App.",
64+
},
65+
"target_id": {
66+
Type: schema.TypeInt,
67+
Computed: true,
68+
Description: "The ID of the account the GitHub App is installed on.",
69+
},
70+
"target_type": {
71+
Type: schema.TypeString,
72+
Computed: true,
73+
Description: "The type of account the GitHub App is installed on. Possible values are 'Organization' or 'User'.",
74+
},
75+
"suspended": {
76+
Type: schema.TypeBool,
77+
Computed: true,
78+
Description: "Whether the GitHub App installation is currently suspended.",
79+
},
80+
},
81+
},
82+
},
83+
},
84+
}
85+
}
86+
87+
func dataSourceGithubOrganizationAppInstallationsRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
88+
owner := meta.(*Owner).name
89+
90+
client := meta.(*Owner).v3client
91+
92+
options := &github.ListOptions{
93+
PerPage: maxPerPage,
94+
}
95+
96+
results := make([]map[string]any, 0)
97+
for {
98+
appInstallations, resp, err := client.Organizations.ListInstallations(ctx, owner, options)
99+
if err != nil {
100+
return diag.FromErr(err)
101+
}
102+
103+
results = append(results, flattenGitHubAppInstallations(appInstallations.Installations)...)
104+
if resp.NextPage == 0 {
105+
break
106+
}
107+
108+
options.Page = resp.NextPage
109+
}
110+
111+
d.SetId(owner)
112+
err := d.Set("installations", results)
113+
if err != nil {
114+
return diag.FromErr(err)
115+
}
116+
117+
return nil
118+
}
119+
120+
func flattenGitHubAppInstallations(orgAppInstallations []*github.Installation) []map[string]any {
121+
results := make([]map[string]any, 0)
122+
123+
if orgAppInstallations == nil {
124+
return results
125+
}
126+
127+
for _, appInstallation := range orgAppInstallations {
128+
result := make(map[string]any)
129+
130+
result["id"] = appInstallation.GetID()
131+
result["slug"] = appInstallation.GetAppSlug()
132+
result["app_id"] = appInstallation.GetAppID()
133+
result["repository_selection"] = appInstallation.GetRepositorySelection()
134+
result["html_url"] = appInstallation.GetHTMLURL()
135+
result["client_id"] = appInstallation.GetClientID()
136+
result["target_id"] = appInstallation.GetTargetID()
137+
result["target_type"] = appInstallation.GetTargetType()
138+
result["suspended"] = !appInstallation.GetSuspendedAt().IsZero()
139+
if appInstallation.Events != nil {
140+
result["events"] = appInstallation.Events
141+
} else {
142+
result["events"] = []string{}
143+
}
144+
145+
result["permissions"] = flattenInstallationPermissions(appInstallation.Permissions)
146+
147+
results = append(results, result)
148+
}
149+
150+
return results
151+
}
152+
153+
func flattenInstallationPermissions(perms *github.InstallationPermissions) map[string]string {
154+
permissions := make(map[string]string)
155+
if perms == nil {
156+
return permissions
157+
}
158+
159+
if v := perms.GetActions(); v != "" {
160+
permissions["actions"] = v
161+
}
162+
if v := perms.GetAdministration(); v != "" {
163+
permissions["administration"] = v
164+
}
165+
if v := perms.GetChecks(); v != "" {
166+
permissions["checks"] = v
167+
}
168+
if v := perms.GetContents(); v != "" {
169+
permissions["contents"] = v
170+
}
171+
if v := perms.GetDeployments(); v != "" {
172+
permissions["deployments"] = v
173+
}
174+
if v := perms.GetEnvironments(); v != "" {
175+
permissions["environments"] = v
176+
}
177+
if v := perms.GetIssues(); v != "" {
178+
permissions["issues"] = v
179+
}
180+
if v := perms.GetMetadata(); v != "" {
181+
permissions["metadata"] = v
182+
}
183+
if v := perms.GetMembers(); v != "" {
184+
permissions["members"] = v
185+
}
186+
if v := perms.GetOrganizationAdministration(); v != "" {
187+
permissions["organization_administration"] = v
188+
}
189+
if v := perms.GetOrganizationHooks(); v != "" {
190+
permissions["organization_hooks"] = v
191+
}
192+
if v := perms.GetOrganizationPlan(); v != "" {
193+
permissions["organization_plan"] = v
194+
}
195+
if v := perms.GetOrganizationProjects(); v != "" {
196+
permissions["organization_projects"] = v
197+
}
198+
if v := perms.GetOrganizationSecrets(); v != "" {
199+
permissions["organization_secrets"] = v
200+
}
201+
if v := perms.GetOrganizationSelfHostedRunners(); v != "" {
202+
permissions["organization_self_hosted_runners"] = v
203+
}
204+
if v := perms.GetOrganizationUserBlocking(); v != "" {
205+
permissions["organization_user_blocking"] = v
206+
}
207+
if v := perms.GetPackages(); v != "" {
208+
permissions["packages"] = v
209+
}
210+
if v := perms.GetPages(); v != "" {
211+
permissions["pages"] = v
212+
}
213+
if v := perms.GetPullRequests(); v != "" {
214+
permissions["pull_requests"] = v
215+
}
216+
if v := perms.GetRepositoryHooks(); v != "" {
217+
permissions["repository_hooks"] = v
218+
}
219+
if v := perms.GetRepositoryProjects(); v != "" {
220+
permissions["repository_projects"] = v
221+
}
222+
if v := perms.GetRepositoryPreReceiveHooks(); v != "" {
223+
permissions["repository_pre_receive_hooks"] = v
224+
}
225+
if v := perms.GetSecrets(); v != "" {
226+
permissions["secrets"] = v
227+
}
228+
if v := perms.GetSecretScanningAlerts(); v != "" {
229+
permissions["secret_scanning_alerts"] = v
230+
}
231+
if v := perms.GetSecurityEvents(); v != "" {
232+
permissions["security_events"] = v
233+
}
234+
if v := perms.GetSingleFile(); v != "" {
235+
permissions["single_file"] = v
236+
}
237+
if v := perms.GetStatuses(); v != "" {
238+
permissions["statuses"] = v
239+
}
240+
if v := perms.GetTeamDiscussions(); v != "" {
241+
permissions["team_discussions"] = v
242+
}
243+
if v := perms.GetVulnerabilityAlerts(); v != "" {
244+
permissions["vulnerability_alerts"] = v
245+
}
246+
if v := perms.GetWorkflows(); v != "" {
247+
permissions["workflows"] = v
248+
}
249+
250+
return permissions
251+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package github
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccGithubOrganizationAppInstallations(t *testing.T) {
10+
config := `data "github_organization_app_installations" "test" {}`
11+
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() { skipUnlessHasOrgs(t) },
14+
ProviderFactories: providerFactories,
15+
Steps: []resource.TestStep{
16+
{
17+
Config: config,
18+
Check: resource.ComposeAggregateTestCheckFunc(
19+
resource.TestCheckResourceAttrSet("data.github_organization_app_installations.test", "installations.0.id"),
20+
resource.TestCheckResourceAttrSet("data.github_organization_app_installations.test", "installations.0.slug"),
21+
resource.TestCheckResourceAttrSet("data.github_organization_app_installations.test", "installations.0.app_id"),
22+
),
23+
},
24+
},
25+
})
26+
}

github/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ func Provider() *schema.Provider {
265265
"github_organization_team_sync_groups": dataSourceGithubOrganizationTeamSyncGroups(),
266266
"github_organization_teams": dataSourceGithubOrganizationTeams(),
267267
"github_organization_webhooks": dataSourceGithubOrganizationWebhooks(),
268+
"github_organization_app_installations": dataSourceGithubOrganizationAppInstallations(),
268269
"github_ref": dataSourceGithubRef(),
269270
"github_release": dataSourceGithubRelease(),
270271
"github_release_asset": dataSourceGithubReleaseAsset(),

go.sum

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
4747
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
4848
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
4949
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
50+
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5051
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5152
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
52-
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
5353
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
5454
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
55-
github.com/google/go-github/v82 v82.0.0 h1:OH09ESON2QwKCUVMYmMcVu1IFKFoaZHwqYaUtr/MVfk=
56-
github.com/google/go-github/v82 v82.0.0/go.mod h1:hQ6Xo0VKfL8RZ7z1hSfB4fvISg0QqHOqe9BP0qo+WvM=
57-
github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0=
58-
github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU=
55+
github.com/google/go-github/v81 v81.0.0 h1:hTLugQRxSLD1Yei18fk4A5eYjOGLUBKAl/VCqOfFkZc=
56+
github.com/google/go-github/v81 v81.0.0/go.mod h1:upyjaybucIbBIuxgJS7YLOZGziyvvJ92WX6WEBNE3sM=
57+
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
58+
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
5959
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
6060
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
6161
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
@@ -92,8 +92,8 @@ github.com/hashicorp/terraform-json v0.27.1 h1:zWhEracxJW6lcjt/JvximOYyc12pS/gaK
9292
github.com/hashicorp/terraform-json v0.27.1/go.mod h1:GzPLJ1PLdUG5xL6xn1OXWIjteQRT2CNT9o/6A9mi9hE=
9393
github.com/hashicorp/terraform-plugin-go v0.29.0 h1:1nXKl/nSpaYIUBU1IG/EsDOX0vv+9JxAltQyDMpq5mU=
9494
github.com/hashicorp/terraform-plugin-go v0.29.0/go.mod h1:vYZbIyvxyy0FWSmDHChCqKvI40cFTDGSb3D8D70i9GM=
95-
github.com/hashicorp/terraform-plugin-log v0.10.0 h1:eu2kW6/QBVdN4P3Ju2WiB2W3ObjkAsyfBsL3Wh1fj3g=
96-
github.com/hashicorp/terraform-plugin-log v0.10.0/go.mod h1:/9RR5Cv2aAbrqcTSdNmY1NRHP4E3ekrXRGjqORpXyB0=
95+
github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0=
96+
github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow=
9797
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1 h1:mlAq/OrMlg04IuJT7NpefI1wwtdpWudnEmjuQs04t/4=
9898
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1/go.mod h1:GQhpKVvvuwzD79e8/NZ+xzj+ZpWovdPAe8nfV/skwNU=
9999
github.com/hashicorp/terraform-registry-address v0.4.0 h1:S1yCGomj30Sao4l5BMPjTGZmCNzuv7/GDTDX99E9gTk=
@@ -184,20 +184,20 @@ go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXe
184184
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
185185
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
186186
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
187-
golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
188-
golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
187+
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
188+
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
189189
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
190190
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
191-
golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI=
192-
golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg=
191+
golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
192+
golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
193193
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
194194
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
195195
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
196196
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
197197
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
198198
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
199-
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
200-
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
199+
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
200+
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
201201
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
202202
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
203203
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -220,30 +220,30 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
220220
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
221221
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
222222
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
223-
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
224-
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
223+
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
224+
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
225225
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
226226
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
227227
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
228228
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
229229
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
230-
golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY=
231-
golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww=
230+
golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q=
231+
golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
232232
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
233233
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
234234
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
235235
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
236236
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
237237
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
238238
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
239-
golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
240-
golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
239+
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
240+
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
241241
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
242242
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
243243
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
244244
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
245-
golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA=
246-
golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc=
245+
golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
246+
golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
247247
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
248248
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
249249
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=

0 commit comments

Comments
 (0)