diff --git a/internal/client/client_test.go b/internal/client/client_test.go index 42f9ad3ead4..1aa7356e938 100644 --- a/internal/client/client_test.go +++ b/internal/client/client_test.go @@ -19,7 +19,9 @@ func TestClientNewGitea(t *testing.T) { ctx := &context.Context{ Config: config.Project{ GiteaURLs: config.GiteaURLs{ - API: "https://git.dtluna.net/api/v1", + // TODO: use a mocked http server to cover version api + API: "https://gitea.com/api/v1", + Download: "https://gitea.com", }, }, TokenType: context.TokenTypeGitea, @@ -35,7 +37,7 @@ func TestClientNewGiteaInvalidURL(t *testing.T) { ctx := &context.Context{ Config: config.Project{ GiteaURLs: config.GiteaURLs{ - API: "://git.dtluna.net/api/v1", + API: "://gitea.com/api/v1", }, }, TokenType: context.TokenTypeGitea, diff --git a/internal/client/gitea.go b/internal/client/gitea.go index 65c51e7dd47..3c20bc1fb7e 100644 --- a/internal/client/gitea.go +++ b/internal/client/gitea.go @@ -2,6 +2,7 @@ package client import ( "crypto/tls" + "encoding/base64" "fmt" "net/http" "net/url" @@ -85,8 +86,42 @@ func (c *giteaClient) CreateFile( path, message string, ) error { - //TODO: implement for brew and scoop support for Gitea-hosted repos - return nil + // use default branch + branchName := "" + + fileOptions := gitea.FileOptions{ + Message: message, + BranchName: branchName, + Author: gitea.Identity{ + Name: commitAuthor.Name, + Email: commitAuthor.Email, + }, + Committer: gitea.Identity{ + Name: commitAuthor.Name, + Email: commitAuthor.Email, + }, + } + + currentFile, resp, err := c.client.GetContents(repo.Owner, repo.Name, branchName, path) + // file not exist, create it + if err != nil { + if resp == nil || resp.StatusCode != http.StatusNotFound { + return err + } + _, _, err = c.client.CreateFile(repo.Owner, repo.Name, path, gitea.CreateFileOptions{ + FileOptions: fileOptions, + Content: base64.StdEncoding.EncodeToString(content), + }) + return err + } + + // update file + _, _, err = c.client.UpdateFile(repo.Owner, repo.Name, path, gitea.UpdateFileOptions{ + FileOptions: fileOptions, + SHA: currentFile.SHA, + Content: base64.StdEncoding.EncodeToString(content), + }) + return err } func (c *giteaClient) createRelease(ctx *context.Context, title, body string) (*gitea.Release, error) { @@ -193,7 +228,12 @@ func (c *giteaClient) CreateRelease(ctx *context.Context, body string) (string, } func (c *giteaClient) ReleaseURLTemplate(ctx *context.Context) (string, error) { - return "", NotImplementedError{TokenType: context.TokenTypeGitea} + return fmt.Sprintf( + "%s/%s/%s/releases/download/{{ .Tag }}/{{ .ArtifactName }}", + ctx.Config.GiteaURLs.Download, + ctx.Config.Release.Gitea.Owner, + ctx.Config.Release.Gitea.Name, + ), nil } // Upload uploads a file into a release repository. diff --git a/internal/client/gitea_test.go b/internal/client/gitea_test.go index 9e2d773fb9f..7038c311974 100644 --- a/internal/client/gitea_test.go +++ b/internal/client/gitea_test.go @@ -22,7 +22,7 @@ type GetInstanceURLSuite struct { func (s *GetInstanceURLSuite) TestWithScheme() { t := s.T() - rootURL := "https://git.dtluna.net" + rootURL := "https://gitea.com" result, err := getInstanceURL(rootURL + "/api/v1") require.NoError(t, err) require.Equal(t, rootURL, result) @@ -30,7 +30,7 @@ func (s *GetInstanceURLSuite) TestWithScheme() { func (s *GetInstanceURLSuite) TestParseError() { t := s.T() - host := "://.dtluna.net" + host := "://wrong.gitea.com" result, err := getInstanceURL(host) require.Error(t, err) require.Empty(t, result) @@ -38,7 +38,7 @@ func (s *GetInstanceURLSuite) TestParseError() { func (s *GetInstanceURLSuite) TestNoScheme() { t := s.T() - host := "git.dtluna.net" + host := "gitea.com" result, err := getInstanceURL(host) require.Error(t, err) require.Empty(t, result) @@ -113,7 +113,7 @@ func (s *GiteaReleasesTestSuite) SetupTest() { CurrentTag: s.tag, Commit: s.commit, ShortCommit: s.commit[0:2], - URL: "https://git.dtluna.net/goreleaser/goreleaser.git", + URL: "https://gitea.com/goreleaser/goreleaser.git", }, PreRelease: s.isPrerelease, } @@ -240,20 +240,25 @@ func (s *GiteaupdateReleaseSuite) TestError() { require.Nil(t, release) } -func TestGiteaupdateReleaseSuite(t *testing.T) { - suite.Run(t, new(GiteaupdateReleaseSuite)) +func (s *GiteaupdateReleaseSuite) TestGiteaCreateFile() { + t := s.T() + fileEndpoint := fmt.Sprintf("%s/api/v1/repos/%s/%s/contents/%s", s.url, s.owner, s.repoName, "file.txt") + + httpmock.RegisterResponder("GET", fmt.Sprintf("%s/api/v1/version", s.url), httpmock.NewStringResponder(200, "{\"version\":\"1.12.0\"}")) + httpmock.RegisterResponder("GET", fileEndpoint, httpmock.NewStringResponder(404, "")) + httpmock.RegisterResponder("POST", fileEndpoint, httpmock.NewStringResponder(201, "{\n \"content\": {\n \"name\": \"test.file\",\n \"path\": \"test.file\",\n \"sha\": \"3b18e512dba79e4c8300dd08aeb37f8e728b8dad\",\n \"type\": \"file\",\n \"size\": 12,\n \"encoding\": \"base64\",\n \"content\": \"aGVsbG8gd29ybGQK\"\n }\n}")) + + author := config.CommitAuthor{Name: s.owner} + repo := Repo{Owner: s.owner, Name: s.repoName} + content := []byte("hello world") + path := "file.txt" + message := "add hello world" + err := s.client.CreateFile(s.ctx, author, repo, content, path, message) + require.Nil(t, err) } -func TestGiteaCreateFile(t *testing.T) { - client := giteaClient{} - ctx := context.Context{} - author := config.CommitAuthor{} - repo := Repo{} - content := []byte{} - path := "" - message := "" - file := client.CreateFile(&ctx, author, repo, content, path, message) - require.Nil(t, file) +func TestGiteaupdateReleaseSuite(t *testing.T) { + suite.Run(t, new(GiteaupdateReleaseSuite)) } type GiteaCreateReleaseSuite struct { @@ -401,3 +406,26 @@ func (s *GiteaUploadSuite) TestSuccess() { func TestGiteaUploadSuite(t *testing.T) { suite.Run(t, new(GiteaUploadSuite)) } + +func TestGiteaReleaseURLTemplate(t *testing.T) { + var ctx = context.New(config.Project{ + GiteaURLs: config.GiteaURLs{ + API: "https://gitea.com/api/v1", + Download: "https://gitea.com", + }, + Release: config.Release{ + Gitea: config.Repo{ + Owner: "owner", + Name: "name", + }, + }, + }) + client, err := NewGitea(ctx, ctx.Token) + require.NoError(t, err) + + urlTpl, err := client.ReleaseURLTemplate(ctx) + require.NoError(t, err) + + expectedUrl := "https://gitea.com/owner/name/releases/download/{{ .Tag }}/{{ .ArtifactName }}" + require.Equal(t, expectedUrl, urlTpl) +} diff --git a/internal/pipe/defaults/defaults.go b/internal/pipe/defaults/defaults.go index 5a0ea5812cc..538700e22fd 100644 --- a/internal/pipe/defaults/defaults.go +++ b/internal/pipe/defaults/defaults.go @@ -3,6 +3,8 @@ package defaults import ( + "strings" + "github.com/goreleaser/goreleaser/internal/client" "github.com/goreleaser/goreleaser/internal/middleware" "github.com/goreleaser/goreleaser/pkg/context" @@ -27,6 +29,9 @@ func (Pipe) Run(ctx *context.Context) error { if ctx.Config.GitLabURLs.Download == "" { ctx.Config.GitLabURLs.Download = client.DefaultGitLabDownloadURL } + if ctx.Config.GiteaURLs.Download == "" { + ctx.Config.GiteaURLs.Download = strings.ReplaceAll(ctx.Config.GiteaURLs.API, "/api/v1", "") + } for _, defaulter := range defaults.Defaulters { if err := middleware.Logging( defaulter.String(), diff --git a/internal/pipe/defaults/defaults_test.go b/internal/pipe/defaults/defaults_test.go index f7f93c7a0ef..5bb61be497d 100644 --- a/internal/pipe/defaults/defaults_test.go +++ b/internal/pipe/defaults/defaults_test.go @@ -104,4 +104,16 @@ func TestFillPartial(t *testing.T) { require.Empty(t, ctx.Config.Dockers[0].Goarm) require.Equal(t, "disttt", ctx.Config.Dist) require.NotEqual(t, "https://github.com", ctx.Config.GitHubURLs.Download) + + ctx = &context.Context{ + TokenType: context.TokenTypeGitea, + + Config: config.Project{ + GiteaURLs: config.GiteaURLs{ + API: "https://gitea.com/api/v1", + }, + }, + } + require.NoError(t, Pipe{}.Run(ctx)) + require.Equal(t, "https://gitea.com", ctx.Config.GiteaURLs.Download) } diff --git a/pkg/config/config.go b/pkg/config/config.go index bd0ee74603a..c34110be61f 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -30,6 +30,7 @@ type GitLabURLs struct { // GiteaURLs holds the URLs to be used when using gitea. type GiteaURLs struct { API string `yaml:"api,omitempty"` + Download string `yaml:"download,omitempty"` SkipTLSVerify bool `yaml:"skip_tls_verify,omitempty"` } diff --git a/www/docs/environment.md b/www/docs/environment.md index 8352fbc6dd8..aba9f09e3b3 100644 --- a/www/docs/environment.md +++ b/www/docs/environment.md @@ -74,6 +74,7 @@ the `.goreleaser.yml` configuration file: # .goreleaser.yml gitea_urls: api: https://gitea.myinstance.com/api/v1/ + download: https://gitea.myinstance.com # set to true if you use a self-signed certificate skip_tls_verify: false ```