Skip to content

Commit eba243a

Browse files
authored
chore: generate based on discovery-artifact-manager (#2682)
Most other languages do not pull discovery documents directly from the discovery service, instead they share a cache. This change makes Go use that same cache while also maintaining the cached files in this repo. Other changes: - Added a dryrun flag to discogen for local testing - downgraded discogen deps to work with Go 1.20 - return no doc error if the file in the index is not cached locally. This operates the same as when we pulled from the disco service, where if we got a non-2XX we would silently skip generating an api Internal bug: 352084622
1 parent 4a713f7 commit eba243a

File tree

5 files changed

+263
-63
lines changed

5 files changed

+263
-63
lines changed

‎go.work.sum

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,10 @@ github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5
166166
github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
167167
github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=
168168
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
169-
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
170-
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
171169
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
172170
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
173171
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
174172
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
175-
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
176173
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE=
177174
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ=
178175
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo=
@@ -186,63 +183,47 @@ go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6
186183
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
187184
go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo=
188185
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
189-
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
190-
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
191186
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
192187
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
193-
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
194-
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
195188
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
189+
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
196190
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
197-
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
198191
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
199192
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
200-
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
201193
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
202-
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
203194
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
204195
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
205196
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
206197
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
207198
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
199+
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
208200
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
209201
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
210202
golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
211203
golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=
212204
golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
213205
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
214206
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
215-
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
216207
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
217208
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
218209
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
219210
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
220-
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
221-
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
222-
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
223211
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
224-
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
225-
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
226-
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
227212
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
228213
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
229214
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
230215
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
231216
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
232-
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
233-
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
217+
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
218+
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
234219
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
235220
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
236-
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
237-
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
221+
golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
222+
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
238223
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
239224
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
240-
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
241-
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
242-
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
243-
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
244225
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
245-
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
226+
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
246227
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
247228
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
248229
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
@@ -286,6 +267,4 @@ google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJai
286267
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
287268
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
288269
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
289-
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
290-
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
291270
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

‎google-api-go-generator/gen.go

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,13 @@ const (
4040
)
4141

4242
var (
43-
apiToGenerate = flag.String("api", "*", "The API ID to generate, like 'tasks:v1'. A value of '*' means all.")
44-
useCache = flag.Bool("cache", true, "Use cache of discovered Google API discovery documents.")
45-
genDir = flag.String("gendir", defaultGenDir(), "Directory to use to write out generated Go files")
46-
build = flag.Bool("build", false, "Compile generated packages.")
47-
install = flag.Bool("install", false, "Install generated packages.")
48-
apisURL = flag.String("discoveryurl", googleDiscoveryURL, "URL to root discovery document")
43+
apiToGenerate = flag.String("api", "*", "The API ID to generate, like 'tasks:v1'. A value of '*' means all.")
44+
useCache = flag.Bool("cache", true, "Use cache of discovered Google API discovery documents.")
45+
genDir = flag.String("gendir", defaultGenDir(), "Directory to use to write out generated Go files")
46+
build = flag.Bool("build", false, "Compile generated packages.")
47+
install = flag.Bool("install", false, "Install generated packages.")
48+
apisURL = flag.String("discoveryurl", googleDiscoveryURL, "URL to root discovery document")
49+
remoteCacheDir = flag.String("remote_cache_dir", os.Getenv("REMOTE_CACHE_DIR"), "Directory of remote cache index and schemas.")
4950

5051
publicOnly = flag.Bool("publiconly", true, "Only build public, released APIs. Only applicable for Google employees.")
5152

@@ -159,7 +160,7 @@ func main() {
159160
var (
160161
apiIds = []string{}
161162
matches = []*API{}
162-
errors = []error{}
163+
errs = []error{}
163164
)
164165
for _, api := range getAPIs() {
165166
apiIds = append(apiIds, api.ID)
@@ -172,8 +173,8 @@ func main() {
172173
if err == errOldRevision {
173174
log.Printf("Old revision found for %s, skipping generation", api.ID)
174175
continue
175-
} else if err != nil && err != errNoDoc {
176-
errors = append(errors, &generateError{api, err})
176+
} else if err != nil && !errors.Is(err, errNoDoc) {
177+
errs = append(errs, &generateError{api, err})
177178
continue
178179
}
179180
if *build && err == nil {
@@ -186,7 +187,7 @@ func main() {
186187
args = append(args, api.Target())
187188
out, err := exec.Command("go", args...).CombinedOutput()
188189
if err != nil {
189-
errors = append(errors, &compileError{api, string(out)})
190+
errs = append(errs, &compileError{api, string(out)})
190191
}
191192
}
192193
}
@@ -195,9 +196,9 @@ func main() {
195196
log.Fatalf("No APIs matched %q; options are %v", *apiToGenerate, apiIds)
196197
}
197198

198-
if len(errors) > 0 {
199-
log.Printf("%d API(s) failed to generate or compile:", len(errors))
200-
for _, ce := range errors {
199+
if len(errs) > 0 {
200+
log.Printf("%d API(s) failed to generate or compile:", len(errs))
201+
for _, ce := range errs {
201202
log.Println(ce.Error())
202203
}
203204
os.Exit(1)
@@ -241,6 +242,14 @@ func getAPIs() []*API {
241242
log.Fatal(err)
242243
}
243244
source = apiListFile
245+
} else if *remoteCacheDir != "" {
246+
var err error
247+
name := filepath.Join(*remoteCacheDir, "index.json")
248+
bytes, err = os.ReadFile(name)
249+
if err != nil {
250+
log.Fatal(err)
251+
}
252+
source = name
244253
} else {
245254
bytes = slurpURL(*apisURL)
246255
if *publicOnly {
@@ -590,34 +599,52 @@ func (a *API) needsDataWrapper() bool {
590599
return false
591600
}
592601

593-
func (a *API) jsonBytes() []byte {
602+
func (a *API) jsonBytes() ([]byte, error) {
594603
if a.forceJSON == nil {
595604
var slurp []byte
596605
var err error
597606
if *useCache {
598607
slurp, err = os.ReadFile(a.JSONFile())
599608
if err != nil {
600-
log.Fatal(err)
609+
return nil, err
610+
}
611+
} else if *remoteCacheDir != "" {
612+
filename := fmt.Sprintf("%s.%s.json", a.Name, a.Version)
613+
b, err := os.ReadFile(filepath.Join(*remoteCacheDir, filename))
614+
if err != nil {
615+
return nil, fmt.Errorf("%s: %w", err, errNoDoc)
616+
}
617+
618+
// Make sure that keys are sorted by re-marshalling.
619+
d := make(map[string]any)
620+
json.Unmarshal(b, &d)
621+
if err != nil {
622+
return nil, err
623+
}
624+
625+
slurp, err = json.MarshalIndent(d, "", " ")
626+
if err != nil {
627+
return nil, err
601628
}
602629
} else {
603630
slurp = slurpURL(a.DiscoveryURL())
604631
if slurp != nil {
605632
// Make sure that keys are sorted by re-marshalling.
606-
d := make(map[string]interface{})
633+
d := make(map[string]any)
607634
json.Unmarshal(slurp, &d)
608635
if err != nil {
609-
log.Fatal(err)
636+
return nil, err
610637
}
611638
var err error
612639
slurp, err = json.MarshalIndent(d, "", " ")
613640
if err != nil {
614-
log.Fatal(err)
641+
return nil, err
615642
}
616643
}
617644
}
618645
a.forceJSON = slurp
619646
}
620-
return a.forceJSON
647+
return a.forceJSON, nil
621648
}
622649

623650
func (a *API) JSONFile() string {
@@ -629,7 +656,10 @@ func (a *API) JSONFile() string {
629656
// if the API spec file being pulled in is older than the local cache.
630657
func (a *API) WriteGeneratedCode() error {
631658
genfilename := *output
632-
jsonBytes := a.jsonBytes()
659+
jsonBytes, err := a.jsonBytes()
660+
if err != nil {
661+
return err
662+
}
633663
// Skip generation if we don't have the discovery doc.
634664
if jsonBytes == nil {
635665
// No message here, because slurpURL printed one.
@@ -729,8 +759,10 @@ var docsLink string
729759
func (a *API) GenerateCode() ([]byte, error) {
730760
pkg := a.Package()
731761

732-
jsonBytes := a.jsonBytes()
733-
var err error
762+
jsonBytes, err := a.jsonBytes()
763+
if err != nil {
764+
return nil, err
765+
}
734766
if a.doc == nil {
735767
a.doc, err = disco.NewDocument(jsonBytes)
736768
if err != nil {

‎internal/kokoro/discogen/go.mod

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,32 @@ module google.golang.org/api/internal/kokoro/discogen
33
go 1.20
44

55
require (
6-
github.com/google/go-github/v61 v61.0.0
6+
github.com/go-git/go-git/v5 v5.12.0
7+
github.com/google/go-github/v59 v59.0.0
78
golang.org/x/oauth2 v0.21.0
89
)
910

10-
require github.com/google/go-querystring v1.1.0 // indirect
11+
require (
12+
dario.cat/mergo v1.0.0 // indirect
13+
github.com/Microsoft/go-winio v0.6.1 // indirect
14+
github.com/ProtonMail/go-crypto v1.0.0 // indirect
15+
github.com/cloudflare/circl v1.3.7 // indirect
16+
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
17+
github.com/emirpasic/gods v1.18.1 // indirect
18+
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
19+
github.com/go-git/go-billy/v5 v5.5.0 // indirect
20+
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
21+
github.com/google/go-querystring v1.1.0 // indirect
22+
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
23+
github.com/kevinburke/ssh_config v1.2.0 // indirect
24+
github.com/pjbgf/sha1cd v0.3.0 // indirect
25+
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
26+
github.com/skeema/knownhosts v1.2.2 // indirect
27+
github.com/xanzy/ssh-agent v0.3.3 // indirect
28+
golang.org/x/crypto v0.21.0 // indirect
29+
golang.org/x/mod v0.12.0 // indirect
30+
golang.org/x/net v0.22.0 // indirect
31+
golang.org/x/sys v0.18.0 // indirect
32+
golang.org/x/tools v0.13.0 // indirect
33+
gopkg.in/warnings.v0 v0.1.2 // indirect
34+
)

0 commit comments

Comments
 (0)