Fixes regression accessing GitLab public repositories

Some git servers are more accommodating than others. Gitlab will try to
validate credentials when they are provided, even if they are empty and
the target repository is public, leading to a failed authentication error.

Signed-off-by: Paulo Gomes <paulo.gomes@weave.works>
This commit is contained in:
Paulo Gomes 2022-03-29 23:11:02 +01:00 committed by Hidde Beydals
parent 9b1140cc81
commit c84179088c
2 changed files with 27 additions and 4 deletions

View File

@ -36,10 +36,15 @@ func transportAuth(opts *git.AuthOptions) (transport.AuthMethod, error) {
}
switch opts.Transport {
case git.HTTPS, git.HTTP:
return &http.BasicAuth{
Username: opts.Username,
Password: opts.Password,
}, nil
// Some providers (i.e. GitLab) will reject empty credentials for
// public repositories.
if opts.Username != "" || opts.Password != "" {
return &http.BasicAuth{
Username: opts.Username,
Password: opts.Password,
}, nil
}
return nil, nil
case git.SSH:
if len(opts.Identity) > 0 {
pk, err := ssh.NewPublicKeys(opts.Username, opts.Identity, opts.Password)

View File

@ -74,6 +74,24 @@ func Test_transportAuth(t *testing.T) {
wantFunc func(g *WithT, t transport.AuthMethod, opts *git.AuthOptions)
wantErr error
}{
{
name: "Public HTTP Repositories",
opts: &git.AuthOptions{
Transport: git.HTTP,
},
wantFunc: func(g *WithT, t transport.AuthMethod, opts *git.AuthOptions) {
g.Expect(t).To(BeNil())
},
},
{
name: "Public HTTPS Repositories",
opts: &git.AuthOptions{
Transport: git.HTTP,
},
wantFunc: func(g *WithT, t transport.AuthMethod, opts *git.AuthOptions) {
g.Expect(t).To(BeNil())
},
},
{
name: "HTTP basic auth",
opts: &git.AuthOptions{