1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-07-15 01:34:21 +02:00

refactor: align Homebrew repo handling with Scoop (#1649)

This commit is contained in:
Radek Simko
2020-07-06 14:48:17 +01:00
committed by GitHub
parent 345b91703a
commit 998e377627
28 changed files with 311 additions and 264 deletions

View File

@ -81,7 +81,7 @@ archives:
- goos: windows - goos: windows
format: zip format: zip
brews: brews:
- github: - tap:
owner: goreleaser owner: goreleaser
name: homebrew-tap name: homebrew-tap
folder: Formula folder: Formula

View File

@ -2,6 +2,7 @@
package client package client
import ( import (
"fmt"
"os" "os"
"github.com/apex/log" "github.com/apex/log"
@ -20,6 +21,7 @@ type Info struct {
// Client interface. // Client interface.
type Client interface { type Client interface {
CreateRelease(ctx *context.Context, body string) (releaseID string, err error) CreateRelease(ctx *context.Context, body string) (releaseID string, err error)
ReleaseURLTemplate(ctx *context.Context) (string, error)
CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content []byte, path, message string) (err error) CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content []byte, path, message string) (err error)
Upload(ctx *context.Context, releaseID string, artifact *artifact.Artifact, file *os.File) (err error) Upload(ctx *context.Context, releaseID string, artifact *artifact.Artifact, file *os.File) (err error)
} }
@ -47,3 +49,16 @@ type RetriableError struct {
func (e RetriableError) Error() string { func (e RetriableError) Error() string {
return e.Err.Error() return e.Err.Error()
} }
type NotImplementedError struct {
TokenType context.TokenType
}
func (e NotImplementedError) Error() string {
return fmt.Sprintf("not implemented for %s", e.TokenType)
}
func IsNotImplementedErr(err error) bool {
_, ok := err.(NotImplementedError)
return ok
}

View File

@ -168,6 +168,10 @@ func (c *giteaClient) CreateRelease(ctx *context.Context, body string) (string,
return strconv.FormatInt(release.ID, 10), nil return strconv.FormatInt(release.ID, 10), nil
} }
func (c *giteaClient) ReleaseURLTemplate(ctx *context.Context) (string, error) {
return "", NotImplementedError{TokenType: context.TokenTypeGitea}
}
// Upload uploads a file into a release repository. // Upload uploads a file into a release repository.
func (c *giteaClient) Upload( func (c *giteaClient) Upload(
ctx *context.Context, ctx *context.Context,

View File

@ -2,6 +2,7 @@ package client
import ( import (
"crypto/tls" "crypto/tls"
"fmt"
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
@ -17,6 +18,8 @@ import (
"golang.org/x/oauth2" "golang.org/x/oauth2"
) )
const DefaultGitHubDownloadURL = "https://github.com"
type githubClient struct { type githubClient struct {
client *github.Client client *github.Client
} }
@ -147,6 +150,15 @@ func (c *githubClient) CreateRelease(ctx *context.Context, body string) (string,
return githubReleaseID, err return githubReleaseID, err
} }
func (c *githubClient) ReleaseURLTemplate(ctx *context.Context) (string, error) {
return fmt.Sprintf(
"%s/%s/%s/releases/download/{{ .Tag }}/{{ .ArtifactName }}",
ctx.Config.GitHubURLs.Download,
ctx.Config.Release.GitHub.Owner,
ctx.Config.Release.GitHub.Name,
), nil
}
func (c *githubClient) Upload( func (c *githubClient) Upload(
ctx *context.Context, ctx *context.Context,
releaseID string, releaseID string,

View File

@ -56,6 +56,29 @@ func TestGitHubUploadReleaseIDNotInt(t *testing.T) {
) )
} }
func TestGitHubReleaseURLTemplate(t *testing.T) {
var ctx = context.New(config.Project{
GitHubURLs: config.GitHubURLs{
// default URL would otherwise be set via pipe/defaults
Download: DefaultGitHubDownloadURL,
},
Release: config.Release{
GitHub: config.Repo{
Owner: "owner",
Name: "name",
},
},
})
client, err := NewGitHub(ctx)
require.NoError(t, err)
urlTpl, err := client.ReleaseURLTemplate(ctx)
require.NoError(t, err)
expectedUrl := "https://github.com/owner/name/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
require.Equal(t, expectedUrl, urlTpl)
}
func TestGitHubCreateReleaseWrongNameTemplate(t *testing.T) { func TestGitHubCreateReleaseWrongNameTemplate(t *testing.T) {
var ctx = context.New(config.Project{ var ctx = context.New(config.Project{
Release: config.Release{ Release: config.Release{

View File

@ -3,6 +3,7 @@ package client
import ( import (
"crypto/tls" "crypto/tls"
"errors" "errors"
"fmt"
"net/http" "net/http"
"os" "os"
"strings" "strings"
@ -15,6 +16,8 @@ import (
"github.com/xanzy/go-gitlab" "github.com/xanzy/go-gitlab"
) )
const DefaultGitLabDownloadURL = "https://gitlab.com"
// ErrExtractHashFromFileUploadURL indicates the file upload hash could not ne extracted from the url. // ErrExtractHashFromFileUploadURL indicates the file upload hash could not ne extracted from the url.
var ErrExtractHashFromFileUploadURL = errors.New("could not extract hash from gitlab file upload url") var ErrExtractHashFromFileUploadURL = errors.New("could not extract hash from gitlab file upload url")
@ -229,6 +232,15 @@ func (c *gitlabClient) CreateRelease(ctx *context.Context, body string) (release
return tagName, err // gitlab references a tag in a repo by its name return tagName, err // gitlab references a tag in a repo by its name
} }
func (c *gitlabClient) ReleaseURLTemplate(ctx *context.Context) (string, error) {
return fmt.Sprintf(
"%s/%s/%s/uploads/{{ .ArtifactUploadHash }}/{{ .ArtifactName }}",
ctx.Config.GitLabURLs.Download,
ctx.Config.Release.GitLab.Owner,
ctx.Config.Release.GitLab.Name,
), nil
}
// Upload uploads a file into a release repository. // Upload uploads a file into a release repository.
func (c *gitlabClient) Upload( func (c *gitlabClient) Upload(
ctx *context.Context, ctx *context.Context,

View File

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"testing" "testing"
"github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -31,3 +33,26 @@ func TestFailToExtractHashFromProjectFileURL(t *testing.T) {
t.Errorf("expected an error but got none for path-too-small in url") t.Errorf("expected an error but got none for path-too-small in url")
} }
} }
func TestGitLabReleaseURLTemplate(t *testing.T) {
var ctx = context.New(config.Project{
GitLabURLs: config.GitLabURLs{
// default URL would otherwise be set via pipe/defaults
Download: DefaultGitLabDownloadURL,
},
Release: config.Release{
GitLab: config.Repo{
Owner: "owner",
Name: "name",
},
},
})
client, err := NewGitLab(ctx)
assert.NoError(t, err)
urlTpl, err := client.ReleaseURLTemplate(ctx)
assert.NoError(t, err)
expectedUrl := "https://gitlab.com/owner/name/uploads/{{ .ArtifactUploadHash }}/{{ .ArtifactName }}"
assert.Equal(t, expectedUrl, urlTpl)
}

View File

@ -22,8 +22,8 @@ func Notice(ctx *context.Context, property string) {
}() }()
// replaces . and _ with - // replaces . and _ with -
url := baseURL + strings.NewReplacer( url := baseURL + strings.NewReplacer(
".", "-", ".", "",
"_", "-", "_", "",
).Replace(property) ).Replace(property)
log.Warn(color.New(color.Bold, color.FgHiYellow).Sprintf( log.Warn(color.New(color.Bold, color.FgHiYellow).Sprintf(
"DEPRECATED: `%s` should not be used anymore, check %s for more info.", "DEPRECATED: `%s` should not be used anymore, check %s for more info.",

View File

@ -1,3 +1,3 @@
• first • first
• DEPRECATED: `foo.bar.whatever` should not be used anymore, check https://goreleaser.com/deprecations#foo-bar-whatever for more info. • DEPRECATED: `foo.bar.whatever` should not be used anymore, check https://goreleaser.com/deprecations#foobarwhatever for more info.
• last • last

View File

@ -12,6 +12,7 @@ import (
"github.com/apex/log" "github.com/apex/log"
"github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/client" "github.com/goreleaser/goreleaser/internal/client"
"github.com/goreleaser/goreleaser/internal/deprecate"
"github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
@ -26,9 +27,6 @@ var ErrNoArchivesFound = errors.New("no linux/macos archives found")
// for linux or windows. // for linux or windows.
var ErrMultipleArchivesSameOS = errors.New("one tap can handle only archive of an OS/Arch combination. Consider using ids in the brew section") var ErrMultipleArchivesSameOS = errors.New("one tap can handle only archive of an OS/Arch combination. Consider using ids in the brew section")
// ErrEmptyTokenType indicates unknown token type.
var ErrEmptyTokenType = errors.New("no token type found")
// ErrTokenTypeNotImplementedForBrew indicates that a new token type was not implemented for this pipe. // ErrTokenTypeNotImplementedForBrew indicates that a new token type was not implemented for this pipe.
type ErrTokenTypeNotImplementedForBrew struct { type ErrTokenTypeNotImplementedForBrew struct {
TokenType context.TokenType TokenType context.TokenType
@ -50,6 +48,11 @@ func (Pipe) String() string {
// Publish brew formula. // Publish brew formula.
func (Pipe) Publish(ctx *context.Context) error { func (Pipe) Publish(ctx *context.Context) error {
// we keep GitHub as default for now, in line with releases
if string(ctx.TokenType) == "" {
ctx.TokenType = context.TokenTypeGitHub
}
client, err := client.New(ctx) client, err := client.New(ctx)
if err != nil { if err != nil {
return err return err
@ -66,6 +69,7 @@ func (Pipe) Publish(ctx *context.Context) error {
func (Pipe) Default(ctx *context.Context) error { func (Pipe) Default(ctx *context.Context) error {
for i := range ctx.Config.Brews { for i := range ctx.Config.Brews {
var brew = &ctx.Config.Brews[i] var brew = &ctx.Config.Brews[i]
if brew.Install == "" { if brew.Install == "" {
// TODO: maybe replace this with a simplear also optimistic // TODO: maybe replace this with a simplear also optimistic
// approach of just doing `bin.install "project_name"`? // approach of just doing `bin.install "project_name"`?
@ -82,6 +86,14 @@ func (Pipe) Default(ctx *context.Context) error {
brew.Install = strings.Join(installs, "\n") brew.Install = strings.Join(installs, "\n")
log.Warnf("optimistically guessing `brew[%d].installs`, double check", i) log.Warnf("optimistically guessing `brew[%d].installs`, double check", i)
} }
if brew.GitHub.String() != "" {
deprecate.Notice(ctx, "brews.github")
brew.Tap = brew.GitHub
}
if brew.GitLab.String() != "" {
deprecate.Notice(ctx, "brews.gitlab")
brew.Tap = brew.GitLab
}
if brew.CommitAuthor.Name == "" { if brew.CommitAuthor.Name == "" {
brew.CommitAuthor.Name = "goreleaserbot" brew.CommitAuthor.Name = "goreleaserbot"
} }
@ -118,7 +130,7 @@ func contains(ss []string, s string) bool {
} }
func doRun(ctx *context.Context, brew config.Homebrew, client client.Client) error { func doRun(ctx *context.Context, brew config.Homebrew, client client.Client) error {
if brew.GitHub.Name == "" && brew.GitLab.Name == "" { if brew.Tap.Name == "" {
return pipe.Skip("brew section is not configured") return pipe.Skip("brew section is not configured")
} }
@ -148,7 +160,7 @@ func doRun(ctx *context.Context, brew config.Homebrew, client client.Client) err
return ErrNoArchivesFound return ErrNoArchivesFound
} }
content, err := buildFormula(ctx, brew, ctx.TokenType, archives) content, err := buildFormula(ctx, brew, client, archives)
if err != nil { if err != nil {
return err return err
} }
@ -170,18 +182,7 @@ func doRun(ctx *context.Context, brew config.Homebrew, client client.Client) err
return pipe.Skip("prerelease detected with 'auto' upload, skipping homebrew publish") return pipe.Skip("prerelease detected with 'auto' upload, skipping homebrew publish")
} }
var repo config.Repo repo := brew.Tap
switch ctx.TokenType {
case context.TokenTypeGitHub:
repo = brew.GitHub
case context.TokenTypeGitLab:
repo = brew.GitLab
default:
if string(ctx.TokenType) == "" {
return ErrEmptyTokenType
}
return ErrTokenTypeNotImplementedForBrew{ctx.TokenType}
}
var gpath = buildFormulaPath(brew.Folder, filename) var gpath = buildFormulaPath(brew.Folder, filename)
log.WithField("formula", gpath). log.WithField("formula", gpath).
@ -196,8 +197,8 @@ func buildFormulaPath(folder, filename string) string {
return path.Join(folder, filename) return path.Join(folder, filename)
} }
func buildFormula(ctx *context.Context, brew config.Homebrew, tokenType context.TokenType, artifacts []*artifact.Artifact) (string, error) { func buildFormula(ctx *context.Context, brew config.Homebrew, client client.Client, artifacts []*artifact.Artifact) (string, error) {
data, err := dataFor(ctx, brew, tokenType, artifacts) data, err := dataFor(ctx, brew, client, artifacts)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -216,7 +217,7 @@ func doBuildFormula(ctx *context.Context, data templateData) (string, error) {
return tmpl.New(ctx).Apply(out.String()) return tmpl.New(ctx).Apply(out.String())
} }
func dataFor(ctx *context.Context, cfg config.Homebrew, tokenType context.TokenType, artifacts []*artifact.Artifact) (templateData, error) { func dataFor(ctx *context.Context, cfg config.Homebrew, cl client.Client, artifacts []*artifact.Artifact) (templateData, error) {
var result = templateData{ var result = templateData{
Name: formulaNameFor(cfg.Name), Name: formulaNameFor(cfg.Name),
Desc: cfg.Description, Desc: cfg.Description,
@ -240,25 +241,14 @@ func dataFor(ctx *context.Context, cfg config.Homebrew, tokenType context.TokenT
} }
if cfg.URLTemplate == "" { if cfg.URLTemplate == "" {
switch tokenType { url, err := cl.ReleaseURLTemplate(ctx)
// we keep GitHub as default for now, in line with releases if err != nil {
case context.TokenTypeGitHub, "": if client.IsNotImplementedErr(err) {
cfg.URLTemplate = fmt.Sprintf( return result, ErrTokenTypeNotImplementedForBrew{ctx.TokenType}
"%s/%s/%s/releases/download/{{ .Tag }}/{{ .ArtifactName }}", }
ctx.Config.GitHubURLs.Download, return result, err
ctx.Config.Release.GitHub.Owner,
ctx.Config.Release.GitHub.Name,
)
case context.TokenTypeGitLab:
cfg.URLTemplate = fmt.Sprintf(
"%s/%s/%s/uploads/{{ .ArtifactUploadHash }}/{{ .ArtifactName }}",
ctx.Config.GitLabURLs.Download,
ctx.Config.Release.GitLab.Owner,
ctx.Config.Release.GitLab.Name,
)
default:
return result, ErrTokenTypeNotImplementedForBrew{tokenType}
} }
cfg.URLTemplate = url
} }
url, err := tmpl.New(ctx).WithArtifact(artifact, map[string]string{}).Apply(cfg.URLTemplate) url, err := tmpl.New(ctx).WithArtifact(artifact, map[string]string{}).Apply(cfg.URLTemplate)
if err != nil { if err != nil {

View File

@ -9,6 +9,7 @@ import (
"testing" "testing"
"github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/client"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
@ -115,42 +116,22 @@ func TestRunPipe(t *testing.T) {
for name, fn := range map[string]func(ctx *context.Context){ for name, fn := range map[string]func(ctx *context.Context){
"default": func(ctx *context.Context) { "default": func(ctx *context.Context) {
ctx.TokenType = context.TokenTypeGitHub ctx.TokenType = context.TokenTypeGitHub
ctx.Config.GitHubURLs.Download = "https://github.com" ctx.Config.Brews[0].Tap.Owner = "test"
ctx.Config.Release.GitHub.Owner = "test" ctx.Config.Brews[0].Tap.Name = "test"
ctx.Config.Release.GitHub.Name = "test"
ctx.Config.Brews[0].GitHub.Owner = "test"
ctx.Config.Brews[0].GitHub.Name = "test"
ctx.Config.Brews[0].Homepage = "https://github.com/goreleaser" ctx.Config.Brews[0].Homepage = "https://github.com/goreleaser"
}, },
"github_enterprise_url": func(ctx *context.Context) {
ctx.TokenType = context.TokenTypeGitHub
ctx.Config.GitHubURLs.Download = "https://github.com"
ctx.Config.Release.GitHub.Owner = "test"
ctx.Config.Release.GitHub.Name = "test"
ctx.Config.Brews[0].GitHub.Owner = "test"
ctx.Config.Brews[0].GitHub.Name = "test"
ctx.Config.Brews[0].Homepage = "https://github.com/goreleaser"
ctx.Config.GitHubURLs.Download = "http://github.example.org"
},
"custom_download_strategy": func(ctx *context.Context) { "custom_download_strategy": func(ctx *context.Context) {
ctx.TokenType = context.TokenTypeGitHub ctx.TokenType = context.TokenTypeGitHub
ctx.Config.GitHubURLs.Download = "https://github.com" ctx.Config.Brews[0].Tap.Owner = "test"
ctx.Config.Release.GitHub.Owner = "test" ctx.Config.Brews[0].Tap.Name = "test"
ctx.Config.Release.GitHub.Name = "test"
ctx.Config.Brews[0].GitHub.Owner = "test"
ctx.Config.Brews[0].GitHub.Name = "test"
ctx.Config.Brews[0].Homepage = "https://github.com/goreleaser" ctx.Config.Brews[0].Homepage = "https://github.com/goreleaser"
ctx.Config.Brews[0].DownloadStrategy = "GitHubPrivateRepositoryReleaseDownloadStrategy" ctx.Config.Brews[0].DownloadStrategy = "GitHubPrivateRepositoryReleaseDownloadStrategy"
}, },
"custom_require": func(ctx *context.Context) { "custom_require": func(ctx *context.Context) {
ctx.TokenType = context.TokenTypeGitHub ctx.TokenType = context.TokenTypeGitHub
ctx.Config.GitHubURLs.Download = "https://github.com" ctx.Config.Brews[0].Tap.Owner = "test"
ctx.Config.Release.GitHub.Owner = "test" ctx.Config.Brews[0].Tap.Name = "test"
ctx.Config.Release.GitHub.Name = "test"
ctx.Config.Brews[0].GitHub.Owner = "test"
ctx.Config.Brews[0].GitHub.Name = "test"
ctx.Config.Brews[0].Homepage = "https://github.com/goreleaser" ctx.Config.Brews[0].Homepage = "https://github.com/goreleaser"
ctx.Config.Brews[0].DownloadStrategy = "CustomDownloadStrategy" ctx.Config.Brews[0].DownloadStrategy = "CustomDownloadStrategy"
@ -158,35 +139,18 @@ func TestRunPipe(t *testing.T) {
}, },
"custom_block": func(ctx *context.Context) { "custom_block": func(ctx *context.Context) {
ctx.TokenType = context.TokenTypeGitHub ctx.TokenType = context.TokenTypeGitHub
ctx.Config.GitHubURLs.Download = "https://github.com" ctx.Config.Brews[0].Tap.Owner = "test"
ctx.Config.Release.GitHub.Owner = "test" ctx.Config.Brews[0].Tap.Name = "test"
ctx.Config.Release.GitHub.Name = "test"
ctx.Config.Brews[0].GitHub.Owner = "test"
ctx.Config.Brews[0].GitHub.Name = "test"
ctx.Config.Brews[0].Homepage = "https://github.com/goreleaser" ctx.Config.Brews[0].Homepage = "https://github.com/goreleaser"
ctx.Config.Brews[0].CustomBlock = `head "https://github.com/caarlos0/test.git"` ctx.Config.Brews[0].CustomBlock = `head "https://github.com/caarlos0/test.git"`
}, },
"default_gitlab": func(ctx *context.Context) { "default_gitlab": func(ctx *context.Context) {
ctx.TokenType = context.TokenTypeGitLab ctx.TokenType = context.TokenTypeGitLab
ctx.Config.GitLabURLs.Download = "https://gitlab.com" ctx.Config.Brews[0].Tap.Owner = "test"
ctx.Config.Release.GitLab.Owner = "test" ctx.Config.Brews[0].Tap.Name = "test"
ctx.Config.Release.GitLab.Name = "test"
ctx.Config.Brews[0].GitLab.Owner = "test"
ctx.Config.Brews[0].GitLab.Name = "test"
ctx.Config.Brews[0].Homepage = "https://gitlab.com/goreleaser" ctx.Config.Brews[0].Homepage = "https://gitlab.com/goreleaser"
}, },
"gitlab_enterprise_url": func(ctx *context.Context) {
ctx.TokenType = context.TokenTypeGitLab
ctx.Config.GitLabURLs.Download = "https://gitlab.com"
ctx.Config.Release.GitLab.Owner = "test"
ctx.Config.Release.GitLab.Name = "test"
ctx.Config.Brews[0].GitLab.Owner = "test"
ctx.Config.Brews[0].GitLab.Name = "test"
ctx.Config.Brews[0].Homepage = "https://gitlab.com/goreleaser"
ctx.Config.GitLabURLs.Download = "https://gitlab.my-company.org"
},
} { } {
t.Run(name, func(t *testing.T) { t.Run(name, func(t *testing.T) {
folder, err := ioutil.TempDir("", "goreleasertest") folder, err := ioutil.TempDir("", "goreleasertest")
@ -305,7 +269,7 @@ func TestRunPipeForMultipleArmVersions(t *testing.T) {
Dependencies: []config.HomebrewDependency{{Name: "zsh"}, {Name: "bash", Type: "recommended"}}, Dependencies: []config.HomebrewDependency{{Name: "zsh"}, {Name: "bash", Type: "recommended"}},
Conflicts: []string{"gtk+", "qt"}, Conflicts: []string{"gtk+", "qt"},
Install: `bin.install "{{ .ProjectName }}"`, Install: `bin.install "{{ .ProjectName }}"`,
GitHub: config.Repo{ Tap: config.Repo{
Owner: "test", Owner: "test",
Name: "test", Name: "test",
}, },
@ -401,7 +365,7 @@ func TestRunPipeNoDarwin64Build(t *testing.T) {
Config: config.Project{ Config: config.Project{
Brews: []config.Homebrew{ Brews: []config.Homebrew{
{ {
GitHub: config.Repo{ Tap: config.Repo{
Owner: "test", Owner: "test",
Name: "test", Name: "test",
}, },
@ -419,7 +383,7 @@ func TestRunPipeMultipleArchivesSameOsBuild(t *testing.T) {
config.Project{ config.Project{
Brews: []config.Homebrew{ Brews: []config.Homebrew{
{ {
GitHub: config.Repo{ Tap: config.Repo{
Owner: "test", Owner: "test",
Name: "test", Name: "test",
}, },
@ -539,18 +503,16 @@ func TestRunPipeMultipleArchivesSameOsBuild(t *testing.T) {
for _, test := range tests { for _, test := range tests {
for idx, ttt := range test.osarchs { for idx, ttt := range test.osarchs {
t.Run(ttt.goarch, func(tt *testing.T) { ctx.Artifacts.Add(&artifact.Artifact{
ctx.Artifacts.Add(&artifact.Artifact{ Name: fmt.Sprintf("bin%d", idx),
Name: fmt.Sprintf("bin%d", idx), Path: f.Name(),
Path: f.Name(), Goos: ttt.goos,
Goos: ttt.goos, Goarch: ttt.goarch,
Goarch: ttt.goarch, Type: artifact.UploadableArchive,
Type: artifact.UploadableArchive, Extra: map[string]interface{}{
Extra: map[string]interface{}{ "ID": fmt.Sprintf("foo%d", idx),
"ID": fmt.Sprintf("foo%d", idx), "Format": "tar.gz",
"Format": "tar.gz", },
},
})
}) })
} }
client := &DummyClient{} client := &DummyClient{}
@ -575,7 +537,7 @@ func TestRunPipeBinaryRelease(t *testing.T) {
config.Project{ config.Project{
Brews: []config.Homebrew{ Brews: []config.Homebrew{
{ {
GitHub: config.Repo{ Tap: config.Repo{
Owner: "test", Owner: "test",
Name: "test", Name: "test",
}, },
@ -604,7 +566,7 @@ func TestRunPipeNoUpload(t *testing.T) {
Release: config.Release{}, Release: config.Release{},
Brews: []config.Homebrew{ Brews: []config.Homebrew{
{ {
GitHub: config.Repo{ Tap: config.Repo{
Owner: "test", Owner: "test",
Name: "test", Name: "test",
}, },
@ -656,7 +618,7 @@ func TestRunEmptyTokenType(t *testing.T) {
Release: config.Release{}, Release: config.Release{},
Brews: []config.Homebrew{ Brews: []config.Homebrew{
{ {
GitHub: config.Repo{ Tap: config.Repo{
Owner: "test", Owner: "test",
Name: "test", Name: "test",
}, },
@ -679,7 +641,7 @@ func TestRunEmptyTokenType(t *testing.T) {
}, },
}) })
client := &DummyClient{} client := &DummyClient{}
assert.Equal(t, ErrEmptyTokenType, doRun(ctx, ctx.Config.Brews[0], client)) assert.NoError(t, doRun(ctx, ctx.Config.Brews[0], client))
} }
func TestRunTokenTypeNotImplementedForBrew(t *testing.T) { func TestRunTokenTypeNotImplementedForBrew(t *testing.T) {
@ -691,7 +653,7 @@ func TestRunTokenTypeNotImplementedForBrew(t *testing.T) {
Release: config.Release{}, Release: config.Release{},
Brews: []config.Homebrew{ Brews: []config.Homebrew{
{ {
GitHub: config.Repo{ Tap: config.Repo{
Owner: "test", Owner: "test",
Name: "test", Name: "test",
}, },
@ -714,7 +676,7 @@ func TestRunTokenTypeNotImplementedForBrew(t *testing.T) {
"Format": "tar.gz", "Format": "tar.gz",
}, },
}) })
client := &DummyClient{} client := &DummyClient{NotImplemented: true}
assert.Equal(t, ErrTokenTypeNotImplementedForBrew{TokenType: "gitea"}, doRun(ctx, ctx.Config.Brews[0], client)) assert.Equal(t, ErrTokenTypeNotImplementedForBrew{TokenType: "gitea"}, doRun(ctx, ctx.Config.Brews[0], client))
} }
@ -764,20 +726,29 @@ func TestGHFolder(t *testing.T) {
} }
type DummyClient struct { type DummyClient struct {
CreatedFile bool CreatedFile bool
Content string Content string
NotImplemented bool
} }
func (client *DummyClient) CreateRelease(ctx *context.Context, body string) (releaseID string, err error) { func (dc *DummyClient) CreateRelease(ctx *context.Context, body string) (releaseID string, err error) {
return return
} }
func (client *DummyClient) CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content []byte, path, msg string) (err error) { func (dc *DummyClient) ReleaseURLTemplate(ctx *context.Context) (string, error) {
client.CreatedFile = true if dc.NotImplemented {
client.Content = string(content) return "", client.NotImplementedError{}
}
return "https://dummyhost/download/{{ .Tag }}/{{ .ArtifactName }}", nil
}
func (dc *DummyClient) CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content []byte, path, msg string) (err error) {
dc.CreatedFile = true
dc.Content = string(content)
return return
} }
func (client *DummyClient) Upload(ctx *context.Context, releaseID string, artifact *artifact.Artifact, file *os.File) (err error) { func (dc *DummyClient) Upload(ctx *context.Context, releaseID string, artifact *artifact.Artifact, file *os.File) (err error) {
return return
} }

View File

@ -6,7 +6,7 @@ class CustomBlock < Formula
bottle :unneeded bottle :unneeded
if OS.mac? if OS.mac?
url "https://github.com/test/test/releases/download/v1.0.1/bin.tar.gz" url "https://dummyhost/download/v1.0.1/bin.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux? elsif OS.linux?
end end

View File

@ -6,7 +6,7 @@ class CustomDownloadStrategy < Formula
bottle :unneeded bottle :unneeded
if OS.mac? if OS.mac?
url "https://github.com/test/test/releases/download/v1.0.1/bin.tar.gz", :using => GitHubPrivateRepositoryReleaseDownloadStrategy url "https://dummyhost/download/v1.0.1/bin.tar.gz", :using => GitHubPrivateRepositoryReleaseDownloadStrategy
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux? elsif OS.linux?
end end

View File

@ -7,7 +7,7 @@ class CustomRequire < Formula
bottle :unneeded bottle :unneeded
if OS.mac? if OS.mac?
url "https://github.com/test/test/releases/download/v1.0.1/bin.tar.gz", :using => CustomDownloadStrategy url "https://dummyhost/download/v1.0.1/bin.tar.gz", :using => CustomDownloadStrategy
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux? elsif OS.linux?
end end

View File

@ -6,7 +6,7 @@ class Default < Formula
bottle :unneeded bottle :unneeded
if OS.mac? if OS.mac?
url "https://github.com/test/test/releases/download/v1.0.1/bin.tar.gz" url "https://dummyhost/download/v1.0.1/bin.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux? elsif OS.linux?
end end

View File

@ -6,7 +6,7 @@ class DefaultGitlab < Formula
bottle :unneeded bottle :unneeded
if OS.mac? if OS.mac?
url "https://gitlab.com/test/test/uploads/820ead5d9d2266c728dce6d4d55b6460/bin.tar.gz" url "https://dummyhost/download/v1.0.1/bin.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux? elsif OS.linux?
end end

View File

@ -1,40 +0,0 @@
# This file was generated by GoReleaser. DO NOT EDIT.
class GithubEnterpriseUrl < Formula
desc "A run pipe test formula and FOO=foo_is_bar"
homepage "https://github.com/goreleaser"
version "1.0.1"
bottle :unneeded
if OS.mac?
url "http://github.example.org/test/test/releases/download/v1.0.1/bin.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux?
end
depends_on "zsh" => :optional
depends_on "bash"
conflicts_with "gtk+"
conflicts_with "qt"
def install
bin.install "github_enterprise_url"
end
def caveats; <<~EOS
don't do this github_enterprise_url
EOS
end
plist_options :startup => false
def plist; <<~EOS
<xml>whatever</xml>
EOS
end
test do
system "true"
system "#{bin}/foo -h"
end
end

View File

@ -1,40 +0,0 @@
# This file was generated by GoReleaser. DO NOT EDIT.
class GitlabEnterpriseUrl < Formula
desc "A run pipe test formula and FOO=foo_is_bar"
homepage "https://gitlab.com/goreleaser"
version "1.0.1"
bottle :unneeded
if OS.mac?
url "https://gitlab.my-company.org/test/test/uploads/820ead5d9d2266c728dce6d4d55b6460/bin.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux?
end
depends_on "zsh" => :optional
depends_on "bash"
conflicts_with "gtk+"
conflicts_with "qt"
def install
bin.install "gitlab_enterprise_url"
end
def caveats; <<~EOS
don't do this gitlab_enterprise_url
EOS
end
plist_options :startup => false
def plist; <<~EOS
<xml>whatever</xml>
EOS
end
test do
system "true"
system "#{bin}/foo -h"
end
end

View File

@ -6,15 +6,15 @@ class MultipleArmv5 < Formula
bottle :unneeded bottle :unneeded
if OS.mac? if OS.mac?
url "https://github.com/test/test/releases/download/v1.0.1/bin.tar.gz" url "https://dummyhost/download/v1.0.1/bin.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux? elsif OS.linux?
if Hardware::CPU.arm? if Hardware::CPU.arm?
if Hardware::CPU.is_64_bit? if Hardware::CPU.is_64_bit?
url "https://github.com/test/test/releases/download/v1.0.1/arm64.tar.gz" url "https://dummyhost/download/v1.0.1/arm64.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
else else
url "https://github.com/test/test/releases/download/v1.0.1/armv5.tar.gz" url "https://dummyhost/download/v1.0.1/armv5.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
end end
end end

View File

@ -6,15 +6,15 @@ class MultipleArmv6 < Formula
bottle :unneeded bottle :unneeded
if OS.mac? if OS.mac?
url "https://github.com/test/test/releases/download/v1.0.1/bin.tar.gz" url "https://dummyhost/download/v1.0.1/bin.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux? elsif OS.linux?
if Hardware::CPU.arm? if Hardware::CPU.arm?
if Hardware::CPU.is_64_bit? if Hardware::CPU.is_64_bit?
url "https://github.com/test/test/releases/download/v1.0.1/arm64.tar.gz" url "https://dummyhost/download/v1.0.1/arm64.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
else else
url "https://github.com/test/test/releases/download/v1.0.1/armv6.tar.gz" url "https://dummyhost/download/v1.0.1/armv6.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
end end
end end

View File

@ -6,15 +6,15 @@ class MultipleArmv7 < Formula
bottle :unneeded bottle :unneeded
if OS.mac? if OS.mac?
url "https://github.com/test/test/releases/download/v1.0.1/bin.tar.gz" url "https://dummyhost/download/v1.0.1/bin.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
elsif OS.linux? elsif OS.linux?
if Hardware::CPU.arm? if Hardware::CPU.arm?
if Hardware::CPU.is_64_bit? if Hardware::CPU.is_64_bit?
url "https://github.com/test/test/releases/download/v1.0.1/arm64.tar.gz" url "https://dummyhost/download/v1.0.1/arm64.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
else else
url "https://github.com/test/test/releases/download/v1.0.1/armv7.tar.gz" url "https://dummyhost/download/v1.0.1/armv7.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
end end
end end

View File

@ -3,6 +3,7 @@
package defaults package defaults
import ( import (
"github.com/goreleaser/goreleaser/internal/client"
"github.com/goreleaser/goreleaser/internal/middleware" "github.com/goreleaser/goreleaser/internal/middleware"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
"github.com/goreleaser/goreleaser/pkg/defaults" "github.com/goreleaser/goreleaser/pkg/defaults"
@ -21,10 +22,10 @@ func (Pipe) Run(ctx *context.Context) error {
ctx.Config.Dist = "dist" ctx.Config.Dist = "dist"
} }
if ctx.Config.GitHubURLs.Download == "" { if ctx.Config.GitHubURLs.Download == "" {
ctx.Config.GitHubURLs.Download = "https://github.com" ctx.Config.GitHubURLs.Download = client.DefaultGitHubDownloadURL
} }
if ctx.Config.GitLabURLs.Download == "" { if ctx.Config.GitLabURLs.Download == "" {
ctx.Config.GitLabURLs.Download = "https://gitlab.com" ctx.Config.GitLabURLs.Download = client.DefaultGitLabDownloadURL
} }
for _, defaulter := range defaults.Defaulters { for _, defaulter := range defaults.Defaulters {
if err := middleware.Logging( if err := middleware.Logging(

View File

@ -546,6 +546,10 @@ func (c *DummyClient) CreateRelease(ctx *context.Context, body string) (releaseI
return return
} }
func (c *DummyClient) ReleaseURLTemplate(ctx *context.Context) (string, error) {
return "", nil
}
func (c *DummyClient) CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content []byte, path, msg string) (err error) { func (c *DummyClient) CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content []byte, path, msg string) (err error) {
return return
} }

View File

@ -5,7 +5,6 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"path/filepath" "path/filepath"
"strings" "strings"
@ -88,7 +87,11 @@ func doRun(ctx *context.Context, client client.Client) error {
var path = ctx.Config.Scoop.Name + ".json" var path = ctx.Config.Scoop.Name + ".json"
content, err := buildManifest(ctx, archives) data, err := dataFor(ctx, client, archives)
if err != nil {
return err
}
content, err := doBuildManifest(data)
if err != nil { if err != nil {
return err return err
} }
@ -143,8 +146,17 @@ type Resource struct {
Hash string `json:"hash"` // the archive checksum Hash string `json:"hash"` // the archive checksum
} }
func buildManifest(ctx *context.Context, artifacts []*artifact.Artifact) (bytes.Buffer, error) { func doBuildManifest(manifest Manifest) (bytes.Buffer, error) {
var result bytes.Buffer var result bytes.Buffer
data, err := json.MarshalIndent(manifest, "", " ")
if err != nil {
return result, err
}
_, err = result.Write(data)
return result, err
}
func dataFor(ctx *context.Context, cl client.Client, artifacts []*artifact.Artifact) (Manifest, error) {
var manifest = Manifest{ var manifest = Manifest{
Version: ctx.Version, Version: ctx.Version,
Architecture: map[string]Resource{}, Architecture: map[string]Resource{},
@ -155,24 +167,14 @@ func buildManifest(ctx *context.Context, artifacts []*artifact.Artifact) (bytes.
} }
if ctx.Config.Scoop.URLTemplate == "" { if ctx.Config.Scoop.URLTemplate == "" {
switch ctx.TokenType { url, err := cl.ReleaseURLTemplate(ctx)
case context.TokenTypeGitHub: if err != nil {
ctx.Config.Scoop.URLTemplate = fmt.Sprintf( if client.IsNotImplementedErr(err) {
"%s/%s/%s/releases/download/{{ .Tag }}/{{ .ArtifactName }}", return manifest, ErrTokenTypeNotImplementedForScoop
ctx.Config.GitHubURLs.Download, }
ctx.Config.Release.GitHub.Owner, return manifest, err
ctx.Config.Release.GitHub.Name,
)
case context.TokenTypeGitLab:
ctx.Config.Scoop.URLTemplate = fmt.Sprintf(
"%s/%s/%s/uploads/{{ .ArtifactUploadHash }}/{{ .ArtifactName }}",
ctx.Config.GitLabURLs.Download,
ctx.Config.Release.GitLab.Owner,
ctx.Config.Release.GitLab.Name,
)
default:
return result, ErrTokenTypeNotImplementedForScoop
} }
ctx.Config.Scoop.URLTemplate = url
} }
for _, artifact := range artifacts { for _, artifact := range artifacts {
@ -185,12 +187,12 @@ func buildManifest(ctx *context.Context, artifacts []*artifact.Artifact) (bytes.
WithArtifact(artifact, map[string]string{}). WithArtifact(artifact, map[string]string{}).
Apply(ctx.Config.Scoop.URLTemplate) Apply(ctx.Config.Scoop.URLTemplate)
if err != nil { if err != nil {
return result, err return manifest, err
} }
sum, err := artifact.Checksum("sha256") sum, err := artifact.Checksum("sha256")
if err != nil { if err != nil {
return result, err return manifest, err
} }
log.WithFields(log.Fields{ log.WithFields(log.Fields{
@ -207,12 +209,7 @@ func buildManifest(ctx *context.Context, artifacts []*artifact.Artifact) (bytes.
} }
} }
data, err := json.MarshalIndent(manifest, "", " ") return manifest, nil
if err != nil {
return result, err
}
_, err = result.Write(data)
return result, err
} }
func binaries(a *artifact.Artifact) []string { func binaries(a *artifact.Artifact) []string {

View File

@ -1,6 +1,7 @@
package scoop package scoop
import ( import (
ctx "context"
"flag" "flag"
"io/ioutil" "io/ioutil"
"os" "os"
@ -385,7 +386,7 @@ func Test_doRun(t *testing.T) {
}, },
}, },
}, },
&DummyClient{}, &DummyClient{NotImplemented: true},
}, },
[]*artifact.Artifact{ []*artifact.Artifact{
{Name: "foo_1.0.1_windows_amd64.tar.gz", Goos: "windows", Goarch: "amd64", Path: file}, {Name: "foo_1.0.1_windows_amd64.tar.gz", Goos: "windows", Goarch: "amd64", Path: file},
@ -756,6 +757,7 @@ func Test_buildManifest(t *testing.T) {
{ {
"testdata/test_buildmanifest.json.golden", "testdata/test_buildmanifest.json.golden",
&context.Context{ &context.Context{
Context: ctx.Background(),
TokenType: context.TokenTypeGitHub, TokenType: context.TokenTypeGitHub,
Git: context.GitInfo{ Git: context.GitInfo{
CurrentTag: "v1.0.1", CurrentTag: "v1.0.1",
@ -792,6 +794,7 @@ func Test_buildManifest(t *testing.T) {
{ {
"testdata/test_buildmanifest_url_template.json.golden", "testdata/test_buildmanifest_url_template.json.golden",
&context.Context{ &context.Context{
Context: ctx.Background(),
TokenType: context.TokenTypeGitHub, TokenType: context.TokenTypeGitHub,
Git: context.GitInfo{ Git: context.GitInfo{
CurrentTag: "v1.0.1", CurrentTag: "v1.0.1",
@ -833,6 +836,7 @@ func Test_buildManifest(t *testing.T) {
{ {
"testdata/test_buildmanifest_gitlab_url_template.json.golden", "testdata/test_buildmanifest_gitlab_url_template.json.golden",
&context.Context{ &context.Context{
Context: ctx.Background(),
TokenType: context.TokenTypeGitLab, TokenType: context.TokenTypeGitLab,
Git: context.GitInfo{ Git: context.GitInfo{
CurrentTag: "v1.0.1", CurrentTag: "v1.0.1",
@ -878,7 +882,11 @@ func Test_buildManifest(t *testing.T) {
var ctx = tt.ctx var ctx = tt.ctx
err := Pipe{}.Default(ctx) err := Pipe{}.Default(ctx)
require.NoError(t, err) require.NoError(t, err)
out, err := buildManifest(ctx, []*artifact.Artifact{
cl, err := client.New(ctx)
require.NoError(t, err)
mf, err := dataFor(ctx, cl, []*artifact.Artifact{
{ {
Name: "foo_1.0.1_windows_amd64.tar.gz", Name: "foo_1.0.1_windows_amd64.tar.gz",
Goos: "windows", Goos: "windows",
@ -914,7 +922,9 @@ func Test_buildManifest(t *testing.T) {
}, },
}, },
}) })
require.NoError(t, err)
out, err := doBuildManifest(mf)
require.NoError(t, err) require.NoError(t, err)
if *update { if *update {
@ -971,7 +981,9 @@ func TestWrapInDirectory(t *testing.T) {
}, },
} }
require.NoError(t, Pipe{}.Default(ctx)) require.NoError(t, Pipe{}.Default(ctx))
out, err := buildManifest(ctx, []*artifact.Artifact{ cl, err := client.New(ctx)
require.NoError(t, err)
mf, err := dataFor(ctx, cl, []*artifact.Artifact{
{ {
Name: "foo_1.0.1_windows_amd64.tar.gz", Name: "foo_1.0.1_windows_amd64.tar.gz",
Goos: "windows", Goos: "windows",
@ -991,7 +1003,9 @@ func TestWrapInDirectory(t *testing.T) {
}, },
}, },
}) })
require.NoError(t, err)
out, err := doBuildManifest(mf)
require.NoError(t, err) require.NoError(t, err)
var golden = "testdata/test_buildmanifest_wrap.json.golden" var golden = "testdata/test_buildmanifest_wrap.json.golden"
@ -1004,20 +1018,28 @@ func TestWrapInDirectory(t *testing.T) {
} }
type DummyClient struct { type DummyClient struct {
CreatedFile bool CreatedFile bool
Content string Content string
NotImplemented bool
} }
func (client *DummyClient) CreateRelease(ctx *context.Context, body string) (releaseID string, err error) { func (dc *DummyClient) CreateRelease(ctx *context.Context, body string) (releaseID string, err error) {
return return
} }
func (client *DummyClient) CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content []byte, path, msg string) (err error) { func (dc *DummyClient) ReleaseURLTemplate(ctx *context.Context) (string, error) {
client.CreatedFile = true if dc.NotImplemented {
client.Content = string(content) return "", client.NotImplementedError{}
}
return "", nil
}
func (dc *DummyClient) CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content []byte, path, msg string) (err error) {
dc.CreatedFile = true
dc.Content = string(content)
return return
} }
func (client *DummyClient) Upload(ctx *context.Context, releaseID string, artifact *artifact.Artifact, file *os.File) (err error) { func (dc *DummyClient) Upload(ctx *context.Context, releaseID string, artifact *artifact.Artifact, file *os.File) (err error) {
return return
} }

View File

@ -78,8 +78,7 @@ func (r Repo) String() string {
// Homebrew contains the brew section. // Homebrew contains the brew section.
type Homebrew struct { type Homebrew struct {
Name string `yaml:",omitempty"` Name string `yaml:",omitempty"`
GitHub Repo `yaml:",omitempty"` Tap Repo `yaml:",omitempty"`
GitLab Repo `yaml:",omitempty"`
CommitAuthor CommitAuthor `yaml:"commit_author,omitempty"` CommitAuthor CommitAuthor `yaml:"commit_author,omitempty"`
Folder string `yaml:",omitempty"` Folder string `yaml:",omitempty"`
Caveats string `yaml:",omitempty"` Caveats string `yaml:",omitempty"`
@ -97,6 +96,10 @@ type Homebrew struct {
CustomBlock string `yaml:"custom_block,omitempty"` CustomBlock string `yaml:"custom_block,omitempty"`
IDs []string `yaml:"ids,omitempty"` IDs []string `yaml:"ids,omitempty"`
Goarm string `yaml:"goarm,omitempty"` Goarm string `yaml:"goarm,omitempty"`
// Deprecated in favour of Tap
GitHub Repo `yaml:",omitempty"`
GitLab Repo `yaml:",omitempty"`
} }
// Scoop contains the scoop.sh section. // Scoop contains the scoop.sh section.

View File

@ -39,17 +39,11 @@ brews:
# NOTE: make sure the url_template, the token and given repo (github or gitlab) owner and name are from the # NOTE: make sure the url_template, the token and given repo (github or gitlab) owner and name are from the
# same kind. We will probably unify this in the next major version like it is done with scoop. # same kind. We will probably unify this in the next major version like it is done with scoop.
# Github repository to push the tap to. # GitHub/GitLab repository to push the formula to
github:
owner: github-user
name: homebrew-tap
# OR Gitlab
# gitlab:
# owner: gitlab-user
# name: homebrew-tap
# Gitea is not supported yet, but the support coming # Gitea is not supported yet, but the support coming
tap:
owner: repo-owner
name: homebrew-tap
# Template for the url which is determined by the given Token (github or gitlab) # Template for the url which is determined by the given Token (github or gitlab)
# Default for github is "https://github.com/<repo_owner>/<repo_name>/releases/download/{{ .Tag }}/{{ .ArtifactName }}" # Default for github is "https://github.com/<repo_owner>/<repo_name>/releases/download/{{ .Tag }}/{{ .ArtifactName }}"

View File

@ -15,7 +15,61 @@ $ goreleaser check
## Active deprecation notices ## Active deprecation notices
None at this time. ### brews.github
> since 2020-07-06 (v0.139.0)
GitHub section was deprecated in favour of `tap` which
reflects Homebrew's naming convention. GitHub will be picked
automatically when GitHub token is passed.
Change this:
=== "Before"
```yaml
brews:
-
github:
owner: goreleaser
name: homebrew-tap
```
=== "After"
```yaml
brews:
-
tap:
owner: goreleaser
name: homebrew-tap
```
### brews.gitlab
> since 2020-07-06 (v0.139.0)
GitLab section was deprecated in favour of `tap` which
reflects Homebrew's naming convention. GitLab will be picked
automatically when GitLab token is passed.
Change this:
=== "Before"
```yaml
brews:
-
gitlab:
owner: goreleaser
name: homebrew-tap
```
=== "After"
```yaml
brews:
-
tap:
owner: goreleaser
name: homebrew-tap
```
<!-- <!--