Skip to content

Commit 0ba8844

Browse files
authored
🐫 Upgrade to use latest golang-utils (#137)
<!-- Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved. SPDX-License-Identifier: Proprietary --> ### Description - moved some of the logic to golang-utils ### Test Coverage <!-- Please put an `x` in the correct box e.g. `[x]` to indicate the testing coverage of this change. --> - [x] This change is covered by existing or additional automated tests. - [ ] Manual testing has been performed (and evidence provided) as automated testing was not feasible. - [ ] Additional tests are not required for this change (e.g. documentation update). --------- Co-authored-by: acabarbaye <[email protected]>
1 parent 001e1b7 commit 0ba8844

File tree

6 files changed

+29
-245
lines changed

6 files changed

+29
-245
lines changed

changes/20251201172918.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:camel: Upgrade dependencies

utils/api/api.go

Lines changed: 9 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -8,146 +8,37 @@ package api
88

99
import (
1010
"context"
11-
"fmt"
1211
"net/http"
13-
"reflect"
14-
"strings"
15-
16-
"github.com/perimeterx/marshmallow"
1712

1813
"github.com/ARM-software/embedded-development-services-client-utils/utils/errors"
19-
"github.com/ARM-software/golang-utils/utils/commonerrors"
20-
"github.com/ARM-software/golang-utils/utils/parallelisation"
21-
"github.com/ARM-software/golang-utils/utils/reflection"
22-
"github.com/ARM-software/golang-utils/utils/safeio"
14+
"github.com/ARM-software/golang-utils/utils/http/api"
2315
)
2416

25-
const requiredFieldError = "no value given for required property"
26-
17+
// Deprecated: Use github.com/ARM-software/golang-utils/utils/http/api instead
2718
// IsCallSuccessful determines whether an API response is successful or not
2819
func IsCallSuccessful(r *http.Response) bool {
29-
if r == nil {
30-
return false
31-
}
32-
return r.StatusCode >= http.StatusOK && r.StatusCode < http.StatusMultipleChoices
20+
return api.IsCallSuccessful(r)
3321
}
3422

3523
// CheckAPICallSuccess verifies whether an API response is successful or not and if not, populates an error with all the information needed.
3624
// errorContext corresponds to the description of what led to the error if error there is e.g. `Failed adding a user`.
3725
// resp corresponds to the HTTP response from a certain endpoint. The body of such response is not closed by this function.
3826
// apiErr corresponds to the error which may be returned by the HTTP client when calling the endpoint.
39-
func CheckAPICallSuccess(ctx context.Context, errorContext string, resp *http.Response, apiErr error) (err error) {
40-
err = parallelisation.DetermineContextError(ctx)
41-
if err != nil {
42-
return
43-
}
44-
if !IsCallSuccessful(resp) {
45-
statusCode := 0
46-
errorMessage := strings.Builder{}
47-
respErr := commonerrors.ErrUnexpected
48-
if resp != nil {
49-
statusCode = resp.StatusCode
50-
respErr = errors.MapErrorToHTTPResponseCode(statusCode)
51-
if respErr == nil {
52-
respErr = commonerrors.ErrUnexpected
53-
}
54-
errorDetails, subErr := errors.FetchAPIErrorDescriptionWithContext(ctx, resp)
55-
if commonerrors.Ignore(subErr, commonerrors.ErrMarshalling) != nil {
56-
err = commonerrors.Join(commonerrors.New(respErr, errorContext), subErr)
57-
return
58-
}
59-
if !reflection.IsEmpty(errorDetails) {
60-
errorMessage.WriteString(errorDetails)
61-
}
62-
_ = resp.Body.Close()
63-
}
64-
extra := ""
65-
if apiErr != nil {
66-
extra = fmt.Sprintf("; %v", apiErr.Error())
67-
}
68-
err = commonerrors.Newf(respErr, "%v (%d): %v%v", errorContext, statusCode, errorMessage.String(), extra)
69-
}
70-
return
27+
func CheckAPICallSuccess(ctx context.Context, errorContext string, resp *http.Response, apiErr error) error {
28+
return api.CheckAPICallSuccess(ctx, errorContext, errors.FetchAPIErrorDescriptionWithContext, resp, apiErr)
7129
}
7230

7331
// CallAndCheckSuccess is a wrapper for making an API call and then checking success with `CheckAPICallSuccess`
7432
// errorContext corresponds to the description of what led to the error if error there is e.g. `Failed adding a user`.
7533
// apiCallFunc corresponds to a generic function that will be called to make the API call
76-
func CallAndCheckSuccess[T any](ctx context.Context, errorContext string, apiCallFunc func(ctx context.Context) (*T, *http.Response, error)) (result *T, err error) {
77-
if err = parallelisation.DetermineContextError(ctx); err != nil {
78-
return
79-
}
80-
81-
result, resp, apiErr := apiCallFunc(ctx)
82-
if resp != nil && resp.Body != nil {
83-
defer func() {
84-
if resp != nil && resp.Body != nil {
85-
_ = resp.Body.Close()
86-
}
87-
}()
88-
}
89-
90-
err = checkResponse(ctx, apiErr, resp, result, errorContext)
91-
return
92-
}
93-
94-
func checkResponse(ctx context.Context, apiErr error, resp *http.Response, result any, errorContext string) (err error) {
95-
err = CheckAPICallSuccess(ctx, errorContext, resp, apiErr)
96-
if err != nil {
97-
return
98-
}
99-
100-
if apiErr != nil {
101-
err = commonerrors.WrapError(commonerrors.ErrMarshalling, apiErr, "API call was successful but an error occurred during response marshalling")
102-
if commonerrors.CorrespondTo(apiErr, requiredFieldError) {
103-
return
104-
}
105-
if resp == nil || resp.Body == nil {
106-
return
107-
}
108-
// At this point, the marshalling problem may be due to the present of unknown fields in the response due to an API extension.
109-
// See https://github.com/OpenAPITools/openapi-generator/issues/21446
110-
var respB []byte
111-
respB, err = safeio.ReadAll(ctx, resp.Body)
112-
if err != nil {
113-
return
114-
}
115-
_, err = marshmallow.Unmarshal(respB, result, marshmallow.WithSkipPopulateStruct(false), marshmallow.WithExcludeKnownFieldsFromMap(true))
116-
if err != nil {
117-
err = commonerrors.WrapError(commonerrors.ErrMarshalling, err, "API call was successful but an error occurred during response marshalling")
118-
return
119-
}
120-
}
121-
if reflection.IsEmpty(result) {
122-
err = commonerrors.New(commonerrors.ErrMarshalling, "unmarshalled response is empty")
123-
return
124-
}
125-
return
34+
func CallAndCheckSuccess[T any](ctx context.Context, errorContext string, apiCallFunc func(ctx context.Context) (*T, *http.Response, error)) (*T, error) {
35+
return api.CallAndCheckSuccess[T](ctx, errorContext, errors.FetchAPIErrorDescriptionWithContext, apiCallFunc)
12636
}
12737

12838
// GenericCallAndCheckSuccess is similar to CallAndCheckSuccess but for function returning interfaces rather than concrete types.
12939
// T must be an interface.
13040
// errorContext corresponds to the description of what led to the error if error there is e.g. `Failed adding a user`.
13141
// apiCallFunc corresponds to a generic function that will be called to make the API call
132-
func GenericCallAndCheckSuccess[T any](ctx context.Context, errorContext string, apiCallFunc func(ctx context.Context) (T, *http.Response, error)) (result T, err error) {
133-
if err = parallelisation.DetermineContextError(ctx); err != nil {
134-
return
135-
}
136-
137-
result, resp, apiErr := apiCallFunc(ctx)
138-
if resp != nil && resp.Body != nil {
139-
_ = resp.Body.Close()
140-
}
141-
142-
err = checkResponse(ctx, apiErr, resp, result, errorContext)
143-
if err != nil {
144-
return
145-
}
146-
147-
if reflect.ValueOf(result).Kind() != reflect.Ptr {
148-
err = commonerrors.Newf(commonerrors.ErrConflict, "result of the call is of type [%T] and so, not a pointer as expected", result)
149-
return
150-
}
151-
152-
return
42+
func GenericCallAndCheckSuccess[T any](ctx context.Context, errorContext string, apiCallFunc func(ctx context.Context) (T, *http.Response, error)) (T, error) {
43+
return api.GenericCallAndCheckSuccess[T](ctx, errorContext, errors.FetchAPIErrorDescriptionWithContext, apiCallFunc)
15344
}

utils/api/api_test.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,6 @@ import (
2424
"github.com/ARM-software/golang-utils/utils/field"
2525
)
2626

27-
func TestIsAPICallSuccessful(t *testing.T) {
28-
t.Run("api call successful", func(t *testing.T) {
29-
resp := _http.Response{StatusCode: 200}
30-
isSuccessful := IsCallSuccessful(&resp)
31-
assert.True(t, isSuccessful)
32-
})
33-
34-
t.Run("api call unsuccessful", func(t *testing.T) {
35-
resp := _http.Response{StatusCode: 400}
36-
isSuccessful := IsCallSuccessful(&resp)
37-
assert.False(t, isSuccessful)
38-
})
39-
40-
t.Run("api call returns nothing", func(t *testing.T) {
41-
resp := _http.Response{}
42-
isSuccessful := IsCallSuccessful(&resp)
43-
assert.False(t, isSuccessful)
44-
})
45-
}
46-
4727
func TestCheckAPICallSuccess(t *testing.T) {
4828
t.Run("context cancelled", func(t *testing.T) {
4929
errMessage := "context cancelled"

utils/errors/mapping.go

Lines changed: 4 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -5,99 +5,11 @@
55
package errors
66

77
import (
8-
"net/http"
9-
10-
"github.com/ARM-software/golang-utils/utils/commonerrors"
8+
"github.com/ARM-software/golang-utils/utils/http/errors"
119
)
1210

13-
// MapErrorToHTTPResponseCode maps a response status code to a common error.
11+
// Deprecated: MapErrorToHTTPResponseCode maps a response status code to a common error.
12+
// Use github.com/ARM-software/golang-utils/utils/http/errors instead
1413
func MapErrorToHTTPResponseCode(statusCode int) error {
15-
if statusCode < http.StatusBadRequest {
16-
return nil
17-
}
18-
switch statusCode {
19-
case http.StatusBadRequest:
20-
return commonerrors.ErrInvalid
21-
case http.StatusUnauthorized:
22-
return commonerrors.ErrUnauthorised
23-
case http.StatusPaymentRequired:
24-
return commonerrors.ErrUnknown
25-
case http.StatusForbidden:
26-
return commonerrors.ErrForbidden
27-
case http.StatusNotFound:
28-
return commonerrors.ErrNotFound
29-
case http.StatusMethodNotAllowed:
30-
return commonerrors.ErrNotFound
31-
case http.StatusNotAcceptable:
32-
return commonerrors.ErrUnsupported
33-
case http.StatusProxyAuthRequired:
34-
return commonerrors.ErrUnauthorised
35-
case http.StatusRequestTimeout:
36-
return commonerrors.ErrTimeout
37-
case http.StatusConflict:
38-
return commonerrors.ErrConflict
39-
case http.StatusGone:
40-
return commonerrors.ErrNotFound
41-
case http.StatusLengthRequired:
42-
return commonerrors.ErrInvalid
43-
case http.StatusPreconditionFailed:
44-
return commonerrors.ErrCondition
45-
case http.StatusRequestEntityTooLarge:
46-
return commonerrors.ErrTooLarge
47-
case http.StatusRequestURITooLong:
48-
return commonerrors.ErrTooLarge
49-
case http.StatusUnsupportedMediaType:
50-
return commonerrors.ErrUnsupported
51-
case http.StatusRequestedRangeNotSatisfiable:
52-
return commonerrors.ErrOutOfRange
53-
case http.StatusExpectationFailed:
54-
return commonerrors.ErrUnsupported
55-
case http.StatusTeapot:
56-
return commonerrors.ErrUnknown
57-
case http.StatusMisdirectedRequest:
58-
return commonerrors.ErrUnsupported
59-
case http.StatusUnprocessableEntity:
60-
return commonerrors.ErrMarshalling
61-
case http.StatusLocked:
62-
return commonerrors.ErrLocked
63-
case http.StatusFailedDependency:
64-
return commonerrors.ErrFailed
65-
case http.StatusTooEarly:
66-
return commonerrors.ErrUnexpected
67-
case http.StatusUpgradeRequired:
68-
return commonerrors.ErrUnsupported
69-
case http.StatusPreconditionRequired:
70-
return commonerrors.ErrCondition
71-
case http.StatusTooManyRequests:
72-
return commonerrors.ErrUnavailable
73-
case http.StatusRequestHeaderFieldsTooLarge:
74-
return commonerrors.ErrTooLarge
75-
case http.StatusUnavailableForLegalReasons:
76-
return commonerrors.ErrUnavailable
77-
78-
case http.StatusInternalServerError:
79-
return commonerrors.ErrUnexpected
80-
case http.StatusNotImplemented:
81-
return commonerrors.ErrNotImplemented
82-
case http.StatusBadGateway:
83-
return commonerrors.ErrUnavailable
84-
case http.StatusServiceUnavailable:
85-
return commonerrors.ErrUnavailable
86-
case http.StatusGatewayTimeout:
87-
return commonerrors.ErrTimeout
88-
case http.StatusHTTPVersionNotSupported:
89-
return commonerrors.ErrUnsupported
90-
case http.StatusVariantAlsoNegotiates:
91-
return commonerrors.ErrUnexpected
92-
case http.StatusInsufficientStorage:
93-
return commonerrors.ErrUnexpected
94-
case http.StatusLoopDetected:
95-
return commonerrors.ErrUnexpected
96-
case http.StatusNotExtended:
97-
return commonerrors.ErrUnexpected
98-
case http.StatusNetworkAuthenticationRequired:
99-
return commonerrors.ErrUnauthorised
100-
default:
101-
return commonerrors.ErrUnexpected
102-
}
14+
return errors.MapErrorToHTTPResponseCode(statusCode)
10315
}

utils/go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@ module github.com/ARM-software/embedded-development-services-client-utils/utils
33
go 1.25
44

55
require (
6-
github.com/ARM-software/embedded-development-services-client/client v1.82.0
7-
github.com/ARM-software/golang-utils/utils v1.130.0
6+
github.com/ARM-software/embedded-development-services-client/client v1.99.0
7+
github.com/ARM-software/golang-utils/utils v1.136.0
88
github.com/go-faker/faker/v4 v4.7.0
99
github.com/go-logr/logr v1.4.3
10-
github.com/perimeterx/marshmallow v1.1.5
1110
github.com/stretchr/testify v1.11.1
1211
go.uber.org/atomic v1.11.0
1312
go.uber.org/goleak v1.3.0
1413
go.uber.org/mock v0.6.0
15-
golang.org/x/sync v0.17.0
14+
golang.org/x/sync v0.18.0
1615
)
1716

1817
require (
@@ -57,6 +56,7 @@ require (
5756
github.com/mattn/go-isatty v0.0.20 // indirect
5857
github.com/mitchellh/go-homedir v1.1.0 // indirect
5958
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
59+
github.com/perimeterx/marshmallow v1.1.5 // indirect
6060
github.com/petermattis/goid v0.0.0-20250813065127-a731cc31b4fe // indirect
6161
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
6262
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
@@ -79,7 +79,7 @@ require (
7979
github.com/yusufpapurcu/wmi v1.2.4 // indirect
8080
github.com/zalando/go-keyring v0.2.6 // indirect
8181
go.uber.org/multierr v1.10.0 // indirect
82-
go.uber.org/zap v1.27.0 // indirect
82+
go.uber.org/zap v1.27.1 // indirect
8383
go.yaml.in/yaml/v3 v3.0.4 // indirect
8484
golang.org/x/crypto v0.41.0 // indirect
8585
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect

utils/go.sum

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho=
22
al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
33
bitbucket.org/creachadair/stringset v0.0.9/go.mod h1:t+4WcQ4+PXTa8aQdNKe40ZP6iwesoMFWAxPGd3UGjyY=
4-
github.com/ARM-software/embedded-development-services-client/client v1.82.0 h1:in5rwsgAlk7LYQROvU7BmSpoXCn4GA3V85W9/ODE0UM=
5-
github.com/ARM-software/embedded-development-services-client/client v1.82.0/go.mod h1:jGywz6vB+i3RkF6J7LXSs0l4g6xHuGfbhW+iWMEODkY=
6-
github.com/ARM-software/golang-utils/utils v1.130.0 h1:1LBLweH1qgJOxynOrcjbPeeoaiaPll8fYCa3ugLyyy4=
7-
github.com/ARM-software/golang-utils/utils v1.130.0/go.mod h1:l1W+4uRhZCVEoDzozfomDG6erB6kZz63Q+DCn6xNGM8=
4+
github.com/ARM-software/embedded-development-services-client/client v1.99.0 h1:to7sVrB6mkXmu+hIs3sa06FEB6bqhkv8zlKNL31fzNU=
5+
github.com/ARM-software/embedded-development-services-client/client v1.99.0/go.mod h1:TPvvUCQkSffqCuP/eCN5ANpsyRKphbSwxaDqP7c5RBk=
6+
github.com/ARM-software/golang-utils/utils v1.136.0 h1:/zYpzcXCG8Q/ycLVRwNMauzr0PFHqT/AK9K+DQOCFv0=
7+
github.com/ARM-software/golang-utils/utils v1.136.0/go.mod h1:253UeNJdOTDnvpEDfJwki4MfgqAR8CaB1FzXFDzjseo=
88
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
99
github.com/DeRuina/timberjack v1.3.9 h1:6UXZ1I7ExPGTX/1UNYawR58LlOJUHKBPiYC7WQ91eBo=
1010
github.com/DeRuina/timberjack v1.3.9/go.mod h1:RLoeQrwrCGIEF8gO5nV5b/gMD0QIy7bzQhBUgpp1EqE=
@@ -74,8 +74,8 @@ github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZ
7474
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
7575
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
7676
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
77-
github.com/gofrs/uuid/v5 v5.3.2 h1:2jfO8j3XgSwlz/wHqemAEugfnTlikAYHhnqQ8Xh4fE0=
78-
github.com/gofrs/uuid/v5 v5.3.2/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
77+
github.com/gofrs/uuid/v5 v5.4.0 h1:EfbpCTjqMuGyq5ZJwxqzn3Cbr2d0rUZU7v5ycAk/e/0=
78+
github.com/gofrs/uuid/v5 v5.4.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
7979
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f h1:3BSP1Tbs2djlpprl7wCLuiqMaUh5SJkkzI2gDs+FgLs=
8080
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14=
8181
github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -224,8 +224,8 @@ go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
224224
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
225225
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
226226
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
227-
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
228-
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
227+
go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
228+
go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
229229
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
230230
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
231231
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -244,8 +244,8 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx
244244
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
245245
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
246246
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
247-
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
248-
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
247+
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
248+
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
249249
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
250250
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
251251
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

0 commit comments

Comments
 (0)