Enrich 'early EOF' error message

Signed-off-by: Paulo Gomes <paulo.gomes@weave.works>
This commit is contained in:
Paulo Gomes 2022-07-26 11:17:12 +01:00
parent d293828495
commit f51050e8c0
No known key found for this signature in database
GPG Key ID: 9995233870E99BEE
5 changed files with 92 additions and 31 deletions

View File

@ -14,6 +14,7 @@ import (
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"github.com/fluxcd/pkg/gittestserver" "github.com/fluxcd/pkg/gittestserver"
"github.com/fluxcd/source-controller/pkg/git"
) )
func populateRepoFromFixture(repo *libgit2.Repository, fixture string) error { func populateRepoFromFixture(repo *libgit2.Repository, fixture string) error {
@ -141,13 +142,13 @@ func TestPushRejected(t *testing.T) {
repoURL := gitServer.HTTPAddressWithCredentials() + "/appconfig.git" repoURL := gitServer.HTTPAddressWithCredentials() + "/appconfig.git"
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10) cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel() defer cancel()
repo, err := clone(cloneCtx, repoURL, "test") repo, err := clone(cloneCtx, repoURL, "test", nil)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
defer repo.Free() defer repo.Free()
cleanup, err := configureTransportOptsForRepo(repo) cleanup, err := configureTransportOptsForRepo(repo, nil)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -172,6 +173,54 @@ func TestPushRejected(t *testing.T) {
} }
} }
func TestEarlyEOF(t *testing.T) {
g := NewWithT(t)
gitServer, err := gittestserver.NewTempGitServer()
g.Expect(err).ToNot(HaveOccurred())
defer os.RemoveAll(gitServer.Root())
username := "norris"
password := "chuck"
gitServer.
AutoCreate().
KeyDir(filepath.Join(t.TempDir(), "keys")).
Auth(username, password).
ReadOnly(true)
err = gitServer.StartHTTP()
g.Expect(err).ToNot(HaveOccurred())
err = initGitRepo(gitServer, "testdata/appconfig", "test", "/appconfig.git")
g.Expect(err).ToNot(HaveOccurred())
repoURL := gitServer.HTTPAddressWithCredentials() + "/appconfig.git"
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
access := repoAccess{
auth: &git.AuthOptions{
Username: username,
Password: password,
},
}
repo, err := clone(cloneCtx, repoURL, "test", access.auth)
g.Expect(err).ToNot(HaveOccurred())
defer repo.Free()
cleanup, err := configureTransportOptsForRepo(repo, access.auth)
g.Expect(err).ToNot(HaveOccurred())
defer cleanup()
err = push(context.TODO(), repo.Workdir(), "test", access)
g.Expect(err).To(HaveOccurred())
g.Expect(err.Error()).To(ContainSubstring("early EOF (the SSH key may not have write access to the repository)"))
}
func Test_switchToBranch(t *testing.T) { func Test_switchToBranch(t *testing.T) {
g := NewWithT(t) g := NewWithT(t)
gitServer, err := gittestserver.NewTempGitServer() gitServer, err := gittestserver.NewTempGitServer()
@ -190,7 +239,7 @@ func Test_switchToBranch(t *testing.T) {
repoURL := gitServer.HTTPAddressWithCredentials() + "/appconfig.git" repoURL := gitServer.HTTPAddressWithCredentials() + "/appconfig.git"
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10) cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel() defer cancel()
repo, err := clone(cloneCtx, repoURL, branch) repo, err := clone(cloneCtx, repoURL, branch, nil)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
defer repo.Free() defer repo.Free()
@ -200,7 +249,7 @@ func Test_switchToBranch(t *testing.T) {
target := head.Target() target := head.Target()
// register transport options and update remote to transport url // register transport options and update remote to transport url
cleanup, err := configureTransportOptsForRepo(repo) cleanup, err := configureTransportOptsForRepo(repo, nil)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -887,6 +887,9 @@ func push(ctx context.Context, path, branch string, access repoAccess) error {
ProxyOptions: libgit2.ProxyOptions{Type: libgit2.ProxyTypeAuto}, ProxyOptions: libgit2.ProxyOptions{Type: libgit2.ProxyTypeAuto},
}) })
if err != nil { if err != nil {
if strings.Contains(err.Error(), "early EOF") {
return fmt.Errorf("%w (the SSH key may not have write access to the repository)", err)
}
return libgit2PushError(err) return libgit2PushError(err)
} }
return callbackErr return callbackErr

View File

@ -54,6 +54,7 @@ import (
"github.com/fluxcd/pkg/gittestserver" "github.com/fluxcd/pkg/gittestserver"
"github.com/fluxcd/pkg/ssh" "github.com/fluxcd/pkg/ssh"
sourcev1 "github.com/fluxcd/source-controller/api/v1beta2" sourcev1 "github.com/fluxcd/source-controller/api/v1beta2"
"github.com/fluxcd/source-controller/pkg/git"
"github.com/fluxcd/source-controller/pkg/git/libgit2/managed" "github.com/fluxcd/source-controller/pkg/git/libgit2/managed"
imagev1 "github.com/fluxcd/image-automation-controller/api/v1beta1" imagev1 "github.com/fluxcd/image-automation-controller/api/v1beta1"
@ -484,7 +485,7 @@ func TestImageAutomationReconciler_e2e(t *testing.T) {
// Clone the repo locally. // Clone the repo locally.
cloneCtx, cancel := context.WithTimeout(ctx, timeout) cloneCtx, cancel := context.WithTimeout(ctx, timeout)
defer cancel() defer cancel()
localRepo, err := clone(cloneCtx, cloneLocalRepoURL, branch) localRepo, err := clone(cloneCtx, cloneLocalRepoURL, branch, nil)
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo") g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
defer localRepo.Free() defer localRepo.Free()
@ -628,7 +629,7 @@ func TestImageAutomationReconciler_e2e(t *testing.T) {
// separate localRepo. // separate localRepo.
cloneCtx, cancel := context.WithTimeout(ctx, timeout) cloneCtx, cancel := context.WithTimeout(ctx, timeout)
defer cancel() defer cancel()
localRepo, err := clone(cloneCtx, cloneLocalRepoURL, branch) localRepo, err := clone(cloneCtx, cloneLocalRepoURL, branch, nil)
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo") g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
defer localRepo.Free() defer localRepo.Free()
@ -880,7 +881,7 @@ func compareRepoWithExpected(g *WithT, repoURL, branch, fixture string, changeFi
changeFixture(expected) changeFixture(expected)
cloneCtx, cancel := context.WithTimeout(ctx, timeout) cloneCtx, cancel := context.WithTimeout(ctx, timeout)
defer cancel() defer cancel()
repo, err := clone(cloneCtx, repoURL, branch) repo, err := clone(cloneCtx, repoURL, branch, nil)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
defer repo.Free() defer repo.Free()
// NOTE: The workdir contains a trailing /. Clean it to not confuse the // NOTE: The workdir contains a trailing /. Clean it to not confuse the
@ -897,7 +898,7 @@ func compareRepoWithExpected(g *WithT, repoURL, branch, fixture string, changeFi
// it tries to figure it out by looking at the remote url of origin. It returns a function // it tries to figure it out by looking at the remote url of origin. It returns a function
// which removes the transport options for this repo and sets the remote url of the origin // which removes the transport options for this repo and sets the remote url of the origin
// back to the actual url. Callers are expected to call this function in a deferred manner. // back to the actual url. Callers are expected to call this function in a deferred manner.
func configureTransportOptsForRepo(repo *libgit2.Repository) (func(), error) { func configureTransportOptsForRepo(repo *libgit2.Repository, authOpts *git.AuthOptions) (func(), error) {
origin, err := repo.Remotes.Lookup(originRemote) origin, err := repo.Remotes.Lookup(originRemote)
if err != nil { if err != nil {
return nil, err return nil, err
@ -911,6 +912,7 @@ func configureTransportOptsForRepo(repo *libgit2.Repository) (func(), error) {
transportOptsURL := u.Scheme + "://" + randStringRunes(5) transportOptsURL := u.Scheme + "://" + randStringRunes(5)
managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{ managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{
TargetURL: repoURL, TargetURL: repoURL,
AuthOpts: authOpts,
}) })
err = repo.Remotes.SetUrl(originRemote, transportOptsURL) err = repo.Remotes.SetUrl(originRemote, transportOptsURL)
@ -926,7 +928,7 @@ func configureTransportOptsForRepo(repo *libgit2.Repository) (func(), error) {
func commitInRepo(g *WithT, repoURL, branch, msg string, changeFiles func(path string)) *libgit2.Oid { func commitInRepo(g *WithT, repoURL, branch, msg string, changeFiles func(path string)) *libgit2.Oid {
cloneCtx, cancel := context.WithTimeout(ctx, timeout) cloneCtx, cancel := context.WithTimeout(ctx, timeout)
defer cancel() defer cancel()
repo, err := clone(cloneCtx, repoURL, branch) repo, err := clone(cloneCtx, repoURL, branch, nil)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
defer repo.Free() defer repo.Free()
@ -940,7 +942,7 @@ func commitInRepo(g *WithT, repoURL, branch, msg string, changeFiles func(path s
id, err := commitWorkDir(repo, branch, msg, sig) id, err := commitWorkDir(repo, branch, msg, sig)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
cleanup, err := configureTransportOptsForRepo(repo) cleanup, err := configureTransportOptsForRepo(repo, nil)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
defer cleanup() defer cleanup()
origin, err := repo.Remotes.Lookup(originRemote) origin, err := repo.Remotes.Lookup(originRemote)
@ -1177,15 +1179,22 @@ func mockSignature(time time.Time) *git2go.Signature {
} }
} }
func clone(ctx context.Context, repoURL, branchName string) (*git2go.Repository, error) { func clone(ctx context.Context, repoURL, branchName string, authOpts *git.AuthOptions) (*git2go.Repository, error) {
dir, err := os.MkdirTemp("", "iac-clone-*") dir, err := os.MkdirTemp("", "iac-clone-*")
if err != nil { if err != nil {
return nil, err return nil, err
} }
transportOptsURL := "http://" + randStringRunes(5)
u, err := url.Parse(repoURL)
if err != nil {
return nil, err
}
transportOptsURL := u.Scheme + "://" + randStringRunes(5)
managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{ managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{
TargetURL: repoURL, TargetURL: repoURL,
Context: ctx, Context: ctx,
AuthOpts: authOpts,
}) })
defer managed.RemoveTransportOptions(transportOptsURL) defer managed.RemoveTransportOptions(transportOptsURL)
@ -1214,7 +1223,7 @@ func clone(ctx context.Context, repoURL, branchName string) (*git2go.Repository,
func waitForNewHead(g *WithT, repo *git2go.Repository, branch, preChangeHash string) { func waitForNewHead(g *WithT, repo *git2go.Repository, branch, preChangeHash string) {
var commitToResetTo *git2go.Commit var commitToResetTo *git2go.Commit
cleanup, err := configureTransportOptsForRepo(repo) cleanup, err := configureTransportOptsForRepo(repo, nil)
g.Expect(err).ToNot(HaveOccurred()) g.Expect(err).ToNot(HaveOccurred())
defer cleanup() defer cleanup()
@ -1272,7 +1281,7 @@ func commitIdFromBranch(repo *git2go.Repository, branchName string) string {
} }
func getRemoteHead(repo *git2go.Repository, branchName string) (*git2go.Oid, error) { func getRemoteHead(repo *git2go.Repository, branchName string) (*git2go.Oid, error) {
cleanup, err := configureTransportOptsForRepo(repo) cleanup, err := configureTransportOptsForRepo(repo, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1460,7 +1469,7 @@ func testWithCustomRepoAndImagePolicy(
repoURL := gitServer.HTTPAddressWithCredentials() + repositoryPath repoURL := gitServer.HTTPAddressWithCredentials() + repositoryPath
cloneCtx, cancel := context.WithTimeout(ctx, timeout) cloneCtx, cancel := context.WithTimeout(ctx, timeout)
defer cancel() defer cancel()
localRepo, err := clone(cloneCtx, repoURL, args.branch) localRepo, err := clone(cloneCtx, repoURL, args.branch, nil)
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo") g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
defer localRepo.Free() defer localRepo.Free()

12
go.mod
View File

@ -12,7 +12,7 @@ require (
github.com/fluxcd/image-reflector-controller/api v0.19.3 github.com/fluxcd/image-reflector-controller/api v0.19.3
github.com/fluxcd/pkg/apis/acl v0.0.3 github.com/fluxcd/pkg/apis/acl v0.0.3
github.com/fluxcd/pkg/apis/meta v0.14.2 github.com/fluxcd/pkg/apis/meta v0.14.2
github.com/fluxcd/pkg/gittestserver v0.5.4 github.com/fluxcd/pkg/gittestserver v0.6.0
github.com/fluxcd/pkg/runtime v0.16.2 github.com/fluxcd/pkg/runtime v0.16.2
github.com/fluxcd/pkg/ssh v0.5.0 github.com/fluxcd/pkg/ssh v0.5.0
github.com/fluxcd/source-controller v0.25.10 github.com/fluxcd/source-controller v0.25.10
@ -23,6 +23,7 @@ require (
github.com/onsi/gomega v1.19.0 github.com/onsi/gomega v1.19.0
github.com/otiai10/copy v1.7.0 github.com/otiai10/copy v1.7.0
github.com/spf13/pflag v1.0.5 github.com/spf13/pflag v1.0.5
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d
k8s.io/api v0.24.2 k8s.io/api v0.24.2
k8s.io/apimachinery v0.24.2 k8s.io/apimachinery v0.24.2
k8s.io/client-go v0.24.2 k8s.io/client-go v0.24.2
@ -55,7 +56,7 @@ require (
github.com/emicklei/go-restful/v3 v3.8.0 // indirect github.com/emicklei/go-restful/v3 v3.8.0 // indirect
github.com/emirpasic/gods v1.18.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect
github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect
github.com/fluxcd/gitkit v0.5.1 // indirect github.com/fluxcd/gitkit v0.6.0 // indirect
github.com/fluxcd/pkg/gitutil v0.1.0 // indirect github.com/fluxcd/pkg/gitutil v0.1.0 // indirect
github.com/fluxcd/pkg/version v0.1.0 // indirect github.com/fluxcd/pkg/version v0.1.0 // indirect
github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect
@ -110,10 +111,9 @@ require (
go.uber.org/atomic v1.7.0 // indirect go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect go.uber.org/multierr v1.6.0 // indirect
go.uber.org/zap v1.21.0 // indirect go.uber.org/zap v1.21.0 // indirect
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect
golang.org/x/net v0.0.0-20220706163947-c90051bbdb60 // indirect golang.org/x/oauth2 v0.0.0-20220718184931-c8730f7fcb92 // indirect
golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 // indirect golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
golang.org/x/sys v0.0.0-20220624220833-87e55d714810 // indirect
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
golang.org/x/text v0.3.7 // indirect golang.org/x/text v0.3.7 // indirect
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect

20
go.sum
View File

@ -186,16 +186,16 @@ github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/fluxcd/gitkit v0.5.1 h1:kmpXs0g+eNuoq9CUzGppGadVF+c7j4n2kPYE/bvkMD0= github.com/fluxcd/gitkit v0.6.0 h1:iNg5LTx6ePo+Pl0ZwqHTAkhbUHxGVSY3YCxCdw7VIFg=
github.com/fluxcd/gitkit v0.5.1/go.mod h1:svOHuKi0fO9HoawdK4HfHAJJseZDHHjk7I3ihnCIqNo= github.com/fluxcd/gitkit v0.6.0/go.mod h1:svOHuKi0fO9HoawdK4HfHAJJseZDHHjk7I3ihnCIqNo=
github.com/fluxcd/image-reflector-controller/api v0.19.3 h1:mgKNHZL8AAvqzBdiuVNQtOVlEijgFyGvTr4A6vuNVgc= github.com/fluxcd/image-reflector-controller/api v0.19.3 h1:mgKNHZL8AAvqzBdiuVNQtOVlEijgFyGvTr4A6vuNVgc=
github.com/fluxcd/image-reflector-controller/api v0.19.3/go.mod h1:QFRYeJTfUQY9l3r+PqGGAlr7KzJRCKN7Lsvg9nXaWHk= github.com/fluxcd/image-reflector-controller/api v0.19.3/go.mod h1:QFRYeJTfUQY9l3r+PqGGAlr7KzJRCKN7Lsvg9nXaWHk=
github.com/fluxcd/pkg/apis/acl v0.0.3 h1:Lw0ZHdpnO4G7Zy9KjrzwwBmDZQuy4qEjaU/RvA6k1lc= github.com/fluxcd/pkg/apis/acl v0.0.3 h1:Lw0ZHdpnO4G7Zy9KjrzwwBmDZQuy4qEjaU/RvA6k1lc=
github.com/fluxcd/pkg/apis/acl v0.0.3/go.mod h1:XPts6lRJ9C9fIF9xVWofmQwftvhY25n1ps7W9xw0XLU= github.com/fluxcd/pkg/apis/acl v0.0.3/go.mod h1:XPts6lRJ9C9fIF9xVWofmQwftvhY25n1ps7W9xw0XLU=
github.com/fluxcd/pkg/apis/meta v0.14.2 h1:/Hf7I/Vz01vv3m7Qx7DtQvrzAL1oVt0MJcLb/I1Y1HE= github.com/fluxcd/pkg/apis/meta v0.14.2 h1:/Hf7I/Vz01vv3m7Qx7DtQvrzAL1oVt0MJcLb/I1Y1HE=
github.com/fluxcd/pkg/apis/meta v0.14.2/go.mod h1:ijZ61VG/8T3U17gj0aFL3fdtZL+mulD6V8VrLLUCAgM= github.com/fluxcd/pkg/apis/meta v0.14.2/go.mod h1:ijZ61VG/8T3U17gj0aFL3fdtZL+mulD6V8VrLLUCAgM=
github.com/fluxcd/pkg/gittestserver v0.5.4 h1:qRPtyjtJ98lDL5w5gnOjTjjBLWWq7+gknrVqC77mwuU= github.com/fluxcd/pkg/gittestserver v0.6.0 h1:HYuvs+MUzNwgdVnrBn5ge48wfoKpkOH0Ug5f3S9pk1k=
github.com/fluxcd/pkg/gittestserver v0.5.4/go.mod h1:h84tnNBKIlOaZWS2HeQNkCH5WKHD6sUsjwIRhZunX0Q= github.com/fluxcd/pkg/gittestserver v0.6.0/go.mod h1:nHVrVybYg9j13Evy99aTGCF9Wj1llmaJD+UQBEvgkc8=
github.com/fluxcd/pkg/gitutil v0.1.0 h1:VO3kJY/CKOCO4ysDNqfdpTg04icAKBOSb3lbR5uE/IE= github.com/fluxcd/pkg/gitutil v0.1.0 h1:VO3kJY/CKOCO4ysDNqfdpTg04icAKBOSb3lbR5uE/IE=
github.com/fluxcd/pkg/gitutil v0.1.0/go.mod h1:Ybz50Ck5gkcnvF0TagaMwtlRy3X3wXuiri1HVsK5id4= github.com/fluxcd/pkg/gitutil v0.1.0/go.mod h1:Ybz50Ck5gkcnvF0TagaMwtlRy3X3wXuiri1HVsK5id4=
github.com/fluxcd/pkg/runtime v0.16.2 h1:CexfMmJK+r12sHTvKWyAax0pcPomjd6VnaHXcxjUrRY= github.com/fluxcd/pkg/runtime v0.16.2 h1:CexfMmJK+r12sHTvKWyAax0pcPomjd6VnaHXcxjUrRY=
@ -798,8 +798,8 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su
golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220706163947-c90051bbdb60 h1:8NSylCMxLW4JvserAndSgFL7aPli6A68yf0bYFTcWCM= golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0=
golang.org/x/net v0.0.0-20220706163947-c90051bbdb60/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -821,8 +821,8 @@ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 h1:+jnHzr9VPj32ykQVai5DNahi9+NSp7yYuCsl5eAQtL0= golang.org/x/oauth2 v0.0.0-20220718184931-c8730f7fcb92 h1:oVlhw3Oe+1reYsE2Nqu19PDJfLzwdU3QUUrG86rLK68=
golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220718184931-c8730f7fcb92/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -922,8 +922,8 @@ golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220624220833-87e55d714810 h1:rHZQSjJdAI4Xf5Qzeh2bBc5YJIkPFVM6oDtMFYmgws0= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=