diff --git a/internal/pipe/git/git.go b/internal/pipe/git/git.go index e670e53bd..bf6d1cb3c 100644 --- a/internal/pipe/git/git.go +++ b/internal/pipe/git/git.go @@ -55,7 +55,7 @@ func getInfo(ctx *context.Context) (context.GitInfo, error) { if !git.IsRepo() { return context.GitInfo{}, ErrNotRepository } - info, err := getGitInfo(ctx) + info, err := getGitInfo() if err != nil && ctx.Snapshot { log.WithError(err).Warn("ignoring errors because this is a snapshot") if info.Commit == "" { @@ -66,7 +66,7 @@ func getInfo(ctx *context.Context) (context.GitInfo, error) { return info, err } -func getGitInfo(ctx *context.Context) (context.GitInfo, error) { +func getGitInfo() (context.GitInfo, error) { branch, err := getBranch() if err != nil { return context.GitInfo{}, fmt.Errorf("couldn't get current branch: %w", err) @@ -88,18 +88,6 @@ func getGitInfo(ctx *context.Context) (context.GitInfo, error) { return context.GitInfo{}, fmt.Errorf("couldn't get remote URL: %w", err) } - var tagErr error - tag, err := getTag() - if err != nil { - tagErr = err - tag = "v0.0.0" - } - - releaseURL, err := getReleaseURL(ctx.TokenType, gitURL, tag) - if err != nil { - return context.GitInfo{}, fmt.Errorf("couldn't get release URL: %w", err) - } - if strings.HasPrefix(gitURL, "https://") { u, err := url.Parse(gitURL) if err != nil { @@ -109,7 +97,8 @@ func getGitInfo(ctx *context.Context) (context.GitInfo, error) { gitURL = u.String() } - if tagErr != nil { + tag, err := getTag() + if err != nil { return context.GitInfo{ Branch: branch, Commit: full, @@ -117,8 +106,7 @@ func getGitInfo(ctx *context.Context) (context.GitInfo, error) { ShortCommit: short, CommitDate: date, URL: gitURL, - ReleaseURL: releaseURL, - CurrentTag: tag, + CurrentTag: "v0.0.0", }, ErrNoTag } return context.GitInfo{ @@ -129,7 +117,6 @@ func getGitInfo(ctx *context.Context) (context.GitInfo, error) { ShortCommit: short, CommitDate: date, URL: gitURL, - ReleaseURL: releaseURL, }, nil } @@ -219,16 +206,3 @@ func getTag() (string, error) { func getURL() (string, error) { return git.Clean(git.Run("ls-remote", "--get-url")) } - -func getReleaseURL(tokenType context.TokenType, url, tag string) (string, error) { - switch tokenType { - case context.TokenTypeGitHub: - return fmt.Sprintf("%s/releases/tag/%s", url, tag), nil - case context.TokenTypeGitLab: - return fmt.Sprintf("%s/-/releases/%s", url, tag), nil - case context.TokenTypeGitea: - return fmt.Sprintf("%s/releases/tag/%s", url, tag), nil - default: - return "", fmt.Errorf("invalid client token type: %q", tokenType) - } -} diff --git a/internal/pipe/mattermost/mattermost_test.go b/internal/pipe/mattermost/mattermost_test.go index 53e5d4e04..2ff4acc9d 100644 --- a/internal/pipe/mattermost/mattermost_test.go +++ b/internal/pipe/mattermost/mattermost_test.go @@ -89,7 +89,7 @@ func TestPostWebhook(t *testing.T) { }) ctx.Git.CurrentTag = "v1.0.0" - ctx.Git.ReleaseURL = "https://github.com/honk/honk/releases/tag/v1.0.0" + ctx.ReleaseURL = "https://github.com/honk/honk/releases/tag/v1.0.0" ctx.Git.URL = "https://github.com/honk/honk" os.Setenv("MATTERMOST_WEBHOOK", ts.URL) diff --git a/internal/pipe/release/release.go b/internal/pipe/release/release.go index 661cbec7d..780406a0a 100644 --- a/internal/pipe/release/release.go +++ b/internal/pipe/release/release.go @@ -54,6 +54,13 @@ func (Pipe) Default(ctx *context.Context) error { } ctx.Config.Release.GitLab = repo } + ctx.ReleaseURL = fmt.Sprintf( + "%s/%s/%s/-/releases/%s", + ctx.Config.GitLabURLs.Download, + ctx.Config.Release.GitLab.Owner, + ctx.Config.Release.GitLab.Name, + ctx.Git.CurrentTag, + ) case context.TokenTypeGitea: if ctx.Config.Release.Gitea.Name == "" { repo, err := git.ExtractRepoFromConfig() @@ -62,6 +69,13 @@ func (Pipe) Default(ctx *context.Context) error { } ctx.Config.Release.Gitea = repo } + ctx.ReleaseURL = fmt.Sprintf( + "%s/%s/%s/releases/tag/%s", + ctx.Config.GiteaURLs.Download, + ctx.Config.Release.Gitea.Owner, + ctx.Config.Release.Gitea.Name, + ctx.Git.CurrentTag, + ) default: // We keep github as default for now if ctx.Config.Release.GitHub.Name == "" { @@ -71,6 +85,13 @@ func (Pipe) Default(ctx *context.Context) error { } ctx.Config.Release.GitHub = repo } + ctx.ReleaseURL = fmt.Sprintf( + "%s/%s/%s/releases/tag/%s", + ctx.Config.GitHubURLs.Download, + ctx.Config.Release.GitHub.Owner, + ctx.Config.Release.GitHub.Name, + ctx.Git.CurrentTag, + ) } // Check if we have to check the git tag for an indicator to mark as pre release diff --git a/internal/pipe/release/release_test.go b/internal/pipe/release/release_test.go index cf83eb153..382e8cd31 100644 --- a/internal/pipe/release/release_test.go +++ b/internal/pipe/release/release_test.go @@ -317,9 +317,12 @@ func TestDefault(t *testing.T) { ctx := context.New(config.Project{}) ctx.TokenType = context.TokenTypeGitHub + ctx.Config.GitHubURLs.Download = "https://github.com" + ctx.Git.CurrentTag = "v1.0.0" require.NoError(t, Pipe{}.Default(ctx)) require.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Name) require.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Owner) + require.Equal(t, "https://github.com/goreleaser/goreleaser/releases/tag/v1.0.0", ctx.ReleaseURL) } func TestDefaultWithGitlab(t *testing.T) { @@ -329,9 +332,12 @@ func TestDefaultWithGitlab(t *testing.T) { ctx := context.New(config.Project{}) ctx.TokenType = context.TokenTypeGitLab + ctx.Config.GitLabURLs.Download = "https://gitlab.com" + ctx.Git.CurrentTag = "v1.0.0" require.NoError(t, Pipe{}.Default(ctx)) require.Equal(t, "gitlabrepo", ctx.Config.Release.GitLab.Name) require.Equal(t, "gitlabowner", ctx.Config.Release.GitLab.Owner) + require.Equal(t, "https://gitlab.com/gitlabowner/gitlabrepo/-/releases/v1.0.0", ctx.ReleaseURL) } func TestDefaultWithGitea(t *testing.T) { diff --git a/internal/tmpl/tmpl.go b/internal/tmpl/tmpl.go index 56c1773c9..1926c2730 100644 --- a/internal/tmpl/tmpl.go +++ b/internal/tmpl/tmpl.go @@ -85,7 +85,7 @@ func New(ctx *context.Context) *Template { commitDate: ctx.Git.CommitDate.UTC().Format(time.RFC3339), commitTimestamp: ctx.Git.CommitDate.UTC().Unix(), gitURL: ctx.Git.URL, - releaseURL: ctx.Git.ReleaseURL, + releaseURL: ctx.ReleaseURL, env: ctx.Env, date: ctx.Date.UTC().Format(time.RFC3339), timestamp: ctx.Date.UTC().Unix(), diff --git a/internal/tmpl/tmpl_test.go b/internal/tmpl/tmpl_test.go index 8f27c1bcb..13f763541 100644 --- a/internal/tmpl/tmpl_test.go +++ b/internal/tmpl/tmpl_test.go @@ -156,6 +156,7 @@ func TestFuncMap(t *testing.T) { require.NoError(t, err) ctx.Git.URL = "https://github.com/foo/bar.git" + ctx.ReleaseURL = "https://github.com/foo/bar/releases/tag/v1.0.0" ctx.Git.CurrentTag = "v1.2.4" for _, tc := range []struct { Template string @@ -204,6 +205,11 @@ func TestFuncMap(t *testing.T) { Name: "trimsuffix", Expected: "https://github.com/foo/bar", }, + { + Template: `{{ .ReleaseURL }}`, + Name: "trimsuffix", + Expected: "https://github.com/foo/bar/releases/tag/v1.0.0", + }, { Template: `{{ toupper "test" }}`, Name: "toupper", diff --git a/pkg/context/context.go b/pkg/context/context.go index 6c69a9406..dded4e4b9 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -25,7 +25,6 @@ type GitInfo struct { FullCommit string CommitDate time.Time URL string - ReleaseURL string } // Env is the environment variables. @@ -73,6 +72,7 @@ type Context struct { Git GitInfo Date time.Time Artifacts artifact.Artifacts + ReleaseURL string ReleaseNotes string ReleaseNotesFile string ReleaseNotesTmpl string diff --git a/www/docs/customization/announce/index.md b/www/docs/customization/announce/index.md index 9a36429dc..478d604ae 100644 --- a/www/docs/customization/announce/index.md +++ b/www/docs/customization/announce/index.md @@ -4,8 +4,6 @@ GoReleaser can also announce new releases on social networks, chat rooms and via It runs at the very end of the pipeline and can be skipped with the `--skip-announce` flag of the [`release`](/cmd/goreleaser_release/) command, or via the skip property: -By default, ".git" suffix is removing from `{{ .GitURL }}` variable like this `{{ trimsuffix .GitURL ".git" }}`. - ```yaml # .goreleaser.yml announce: diff --git a/www/docs/customization/templates.md b/www/docs/customization/templates.md index b7a10dbc8..38dcaf837 100644 --- a/www/docs/customization/templates.md +++ b/www/docs/customization/templates.md @@ -36,25 +36,27 @@ On fields that support templating, these fields are always available: | `incpatch "v1.2.4"` | increments the patch of the given version[^3] | | `incminor "v1.2.4"` | increments the minor of the given version[^3] | | `incmajor "v1.2.4"` | increments the major of the given version[^3] | +| `.ReleaseURL` | the current release download url[^4] | [^1]: The `v` prefix is stripped and it might be changed in `snapshot` and `nightly` builds. [^2]: Assuming `Tag` is a valid a SemVer, otherwise empty/zeroed. [^3]: Will panic if not a semantic version. +[^4]: Composed from the current SCM's download URL and current tag. For instance, on GitHub, it'll be `https://github.com/{owner}/{repo}/releases/tag/{tag}`. On fields that are related to a single artifact (e.g., the binary name), you may have some extra fields: | Key | Description | |-----------------|---------------------------------------| -| `.Os` | `GOOS`[^4] | -| `.Arch` | `GOARCH`[^4] | -| `.Arm` | `GOARM`[^4] | -| `.Mips` | `GOMIPS`[^4] | +| `.Os` | `GOOS`[^5] | +| `.Arch` | `GOARCH`[^5] | +| `.Arm` | `GOARM`[^5] | +| `.Mips` | `GOMIPS`[^5] | | `.Binary` | binary name | | `.ArtifactName` | archive name | | `.ArtifactPath` | absolute path to artifact | -[^4]: Might have been replaced by `archives.replacements`. +[^5]: Might have been replaced by `archives.replacements`. On the NFPM name template field, you can use those extra fields as well: