Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package goreleaser for openSUSE:Factory checked in at 2026-04-01 19:51:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/goreleaser (Old) and /work/SRC/openSUSE:Factory/.goreleaser.new.21863 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "goreleaser" Wed Apr 1 19:51:31 2026 rev:24 rq:1343938 version:2.15.1 Changes: -------- --- /work/SRC/openSUSE:Factory/goreleaser/goreleaser.changes 2026-03-31 15:23:24.863132700 +0200 +++ /work/SRC/openSUSE:Factory/.goreleaser.new.21863/goreleaser.changes 2026-04-01 19:52:27.493689234 +0200 @@ -1,0 +2,16 @@ +Tue Mar 31 08:02:56 UTC 2026 - Felix Niederwanger <[email protected]> + +- Update to version 2.15.1: + * refactor: fix modernize lint issues (#6507) + * fix: exclude signatures and certificates from sign pipe "all" filter (#6509) + * fix: retry git clone/push on transient network errors, clean up partial clones (#6506) + * chore(deps): bump github.com/go-git/go-git/v5 from 5.16.5 to 5.17.1 (#6510) + * fix: retry snapcraft upload on 5xx error (#6504) + * ci: always trigger generate + * chore: auto-update generated files + * docs: update + * docs: announce v2.15 + * docs: v2.15 + * chore: auto-update generated files + +------------------------------------------------------------------- Old: ---- goreleaser-2.15.0.obscpio New: ---- goreleaser-2.15.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ goreleaser.spec ++++++ --- /var/tmp/diff_new_pack.dRHuMG/_old 2026-04-01 19:52:29.385768071 +0200 +++ /var/tmp/diff_new_pack.dRHuMG/_new 2026-04-01 19:52:29.385768071 +0200 @@ -17,7 +17,7 @@ Name: goreleaser -Version: 2.15.0 +Version: 2.15.1 Release: 0 Summary: CLI tool for release engineering in Go, Rust, Zig and TypeScript License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.dRHuMG/_old 2026-04-01 19:52:29.493772571 +0200 +++ /var/tmp/diff_new_pack.dRHuMG/_new 2026-04-01 19:52:29.501772905 +0200 @@ -2,7 +2,7 @@ <service name="obs_scm" mode="manual"> <param name="url">https://github.com/goreleaser/goreleaser.git</param> <param name="scm">git</param> - <param name="revision">v2.15.0</param> + <param name="revision">v2.15.1</param> <param name="match-tag">v*</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.dRHuMG/_old 2026-04-01 19:52:29.541774571 +0200 +++ /var/tmp/diff_new_pack.dRHuMG/_new 2026-04-01 19:52:29.553775071 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/goreleaser/goreleaser.git</param> - <param name="changesrevision">97c05b9cadd9fd996272aeec084181f4c43c0b62</param></service></servicedata> + <param name="changesrevision">5b156e9f54a8a514a8275d042b40af9b6518f729</param></service></servicedata> (No newline at EOF) ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2025-02-18 21:02:12.000000000 +0100 @@ -0,0 +1,3 @@ +/goreleaser +/_build* +/goreleaser-*.*.*.tar.gz ++++++ goreleaser-2.15.0.obscpio -> goreleaser-2.15.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/.github/workflows/release.yml new/goreleaser-2.15.1/.github/workflows/release.yml --- old/goreleaser-2.15.0/.github/workflows/release.yml 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/.github/workflows/release.yml 2026-03-30 19:47:26.000000000 +0200 @@ -14,6 +14,7 @@ trigger-generate: runs-on: ubuntu-latest needs: [goreleaser] + if: ${{ always() }} steps: - uses: benc-uk/workflow-dispatch@7a027648b88c2413826b6ddd6c76114894dc5ec4 # v1.3.1 if: startsWith(github.ref, 'refs/tags/v') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/.golangci.yaml new/goreleaser-2.15.1/.golangci.yaml --- old/goreleaser-2.15.0/.golangci.yaml 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/.golangci.yaml 2026-03-30 19:47:26.000000000 +0200 @@ -10,6 +10,7 @@ - gocritic - godoclint - misspell + - modernize - noctx - nolintlint - perfsprint @@ -39,6 +40,9 @@ gocritic: disabled-checks: - appendAssign + modernize: + disable: + - omitzero perfsprint: int-conversion: false err-error: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/README.md new/goreleaser-2.15.1/README.md --- old/goreleaser-2.15.0/README.md 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/README.md 2026-03-30 19:47:26.000000000 +0200 @@ -92,19 +92,19 @@ <h3>Diamond</h3> <a href="https://serpapi.com/?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://github.com/serpapi.png" alt="SerpApi" width="128" height="128"/></a> <h3>Platinum</h3> - <a href="https://opensource.sap.com?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/2531208?v=4&s=112" alt="SAP" width="112" height="112"/></a> + <a href="https://opensource.sap.com?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/2531208?s=112&v=4" alt="SAP" width="112" height="112"/></a> <h3>Gold</h3> - <a href="https://opensource.mercedes-benz.com/?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/34240465?v=4&s=96" alt="Mercedes-Benz Group" width="96" height="96"/></a> - <a href="https://nitric.io?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/72055470?v=4&s=96" alt="nitric" width="96" height="96"/></a> + <a href="https://opensource.mercedes-benz.com/?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/34240465?s=96&v=4" alt="Mercedes-Benz Group" width="96" height="96"/></a> + <a href="https://nitric.io?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/72055470?s=96&v=4" alt="nitric" width="96" height="96"/></a> <h3>Silver</h3> <a href="https://depot.dev?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=opencollective" target="_blank" rel="noopener sponsored" ><img src="https://images.opencollective.com/depot/39125a1/logo.png?height=80" alt="Depot" width="80" height="80"/></a> <a href="https://www.n-ix.com/?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=opencollective" target="_blank" rel="noopener sponsored" ><img src="https://images.opencollective.com/n-ix-ltd/575a7a5/logo.png?height=80" alt="N-iX Ltd" width="80" height="80"/></a> <h3>Bronze</h3> - <a href="https://www.conet.de?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/35725664?v=4&s=64" alt="conet cloud" width="64" height="64"/></a> - <a href="https://encore.dev?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/50438175?v=4&s=64" alt="Encore" width="64" height="64"/></a> - <a href="https://www.comet.com/site/?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/31487821?v=4&s=64" alt="Comet" width="64" height="64"/></a> + <a href="https://www.conet.de?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/35725664?s=64&v=4" alt="conet cloud" width="64" height="64"/></a> + <a href="https://encore.dev?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/50438175?s=64&v=4" alt="Encore" width="64" height="64"/></a> + <a href="https://www.comet.com/site/?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/31487821?s=64&v=4" alt="Comet" width="64" height="64"/></a> <a href="https://about.gitea.com/?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=opencollective" target="_blank" rel="noopener sponsored" ><img src="https://images.opencollective.com/gitea/bf35c2f/logo.png?height=64" alt="Gitea" width="64" height="64"/></a> - <a href="https://www.interviewpal.com?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/268665632?v=4&s=64" alt="InterviewPal.com" width="64" height="64"/></a> + <a href="https://www.interviewpal.com?utm_source=goreleaser&utm_medium=sponsor&utm_campaign=homepage&utm_content=github" target="_blank" rel="noopener sponsored" ><img src="https://avatars.githubusercontent.com/u/268665632?s=64&v=4" alt="InterviewPal.com" width="64" height="64"/></a> <h3>And many more!</h3> <p>See the full list <a href="https://goreleaser.com/sponsors" target="_blank" rel="noopener sponsored">here</a>.</p> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/go.mod new/goreleaser-2.15.1/go.mod --- old/goreleaser-2.15.0/go.mod 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/go.mod 2026-03-30 19:47:26.000000000 +0200 @@ -224,8 +224,8 @@ github.com/github/smimesign v0.2.0 // indirect github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.7.0 // indirect - github.com/go-git/go-git/v5 v5.16.5 // indirect + github.com/go-git/go-billy/v5 v5.8.0 // indirect + github.com/go-git/go-git/v5 v5.17.1 // indirect github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/go.sum new/goreleaser-2.15.1/go.sum --- old/goreleaser-2.15.0/go.sum 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/go.sum 2026-03-30 19:47:26.000000000 +0200 @@ -368,12 +368,12 @@ github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.7.0 h1:83lBUJhGWhYp0ngzCMSgllhUSuoHP1iEWYjsPl9nwqM= -github.com/go-git/go-billy/v5 v5.7.0/go.mod h1:/1IUejTKH8xipsAcdfcSAlUlo2J7lkYV8GTKxAT/L3E= +github.com/go-git/go-billy/v5 v5.8.0 h1:I8hjc3LbBlXTtVuFNJuwYuMiHvQJDq1AT6u4DwDzZG0= +github.com/go-git/go-billy/v5 v5.8.0/go.mod h1:RpvI/rw4Vr5QA+Z60c6d6LXH0rYJo0uD5SqfmrrheCY= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.16.5 h1:mdkuqblwr57kVfXri5TTH+nMFLNUxIj9Z7F5ykFbw5s= -github.com/go-git/go-git/v5 v5.16.5/go.mod h1:QOMLpNf1qxuSY4StA/ArOdfFR2TrKEjJiye2kel2m+M= +github.com/go-git/go-git/v5 v5.17.1 h1:WnljyxIzSj9BRRUlnmAU35ohDsjRK0EKmL0evDqi5Jk= +github.com/go-git/go-git/v5 v5.17.1/go.mod h1:pW/VmeqkanRFqR6AljLcs7EA7FbZaN5MQqO7oZADXpo= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/client/git.go new/goreleaser-2.15.1/internal/client/git.go --- old/goreleaser-2.15.0/internal/client/git.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/client/git.go 2026-03-30 19:47:26.000000000 +0200 @@ -150,8 +150,10 @@ if err := runGitCmds(ctx, cwd, env, [][]string{ {"add", "-A", "."}, {"commit", "-m", message}, - {"push", "origin", "HEAD"}, }); err != nil { + return fmt.Errorf("git: failed to commit %q (%q): %w", repo.Name, url, err) + } + if err := pushRepo(ctx, cwd, env); err != nil { return fmt.Errorf("git: failed to push %q (%q): %w", repo.Name, url, err) } @@ -219,18 +221,27 @@ return errors.As(err, &kerr) } +func isRetriableGitError(err error) bool { + return strings.Contains(err.Error(), "Connection reset") || + strings.Contains(err.Error(), "Network is unreachable") || + strings.Contains(err.Error(), "Connection closed") +} + func cloneRepo(ctx *context.Context, parent, url, name string, env []string) error { if err := retry.Do( func() error { + dir := filepath.Join(parent, name) + // Remove any leftover directory from a previous failed clone + // attempt so that `git clone` does not fail with "already exists". + if err := os.RemoveAll(dir); err != nil { + return fmt.Errorf("failed to remove partial clone directory %q: %w", dir, err) + } log.WithField("url", url). - WithField("dir", filepath.Join(parent, name)). + WithField("dir", dir). Info("cloning") return runGitCmds(ctx, parent, env, [][]string{{"clone", url, name}}) }, - retry.RetryIf(func(err error) bool { - return strings.Contains(err.Error(), "Connection reset") || - strings.Contains(err.Error(), "Network is unreachable") - }), + retry.RetryIf(isRetriableGitError), retry.Attempts(10), retry.Delay(time.Second), retry.LastErrorOnly(true), @@ -240,6 +251,18 @@ return nil } +func pushRepo(ctx *context.Context, cwd string, env []string) error { + return retry.Do( + func() error { + return runGitCmds(ctx, cwd, env, [][]string{{"push", "origin", "HEAD"}}) + }, + retry.RetryIf(isRetriableGitError), + retry.Attempts(10), + retry.Delay(time.Second), + retry.LastErrorOnly(true), + ) +} + func runGitCmds(ctx *context.Context, cwd string, env []string, cmds [][]string) error { for _, cmd := range cmds { args := append([]string{"-C", cwd}, cmd...) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/client/git_test.go new/goreleaser-2.15.1/internal/client/git_test.go --- old/goreleaser-2.15.0/internal/client/git_test.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/client/git_test.go 2026-03-30 19:47:26.000000000 +0200 @@ -1,6 +1,7 @@ package client import ( + "errors" "os" "strings" "testing" @@ -420,6 +421,26 @@ }) } +func TestIsRetriableGitError(t *testing.T) { + t.Parallel() + for _, tt := range []struct { + name string + err string + expected bool + }{ + {"connection reset", "Connection reset by peer", true}, + {"network unreachable", "Network is unreachable", true}, + {"connection closed", "Connection closed by 192.0.2.1 port 22", true}, + {"other error", "permission denied (publickey)", false}, + {"unrelated error", "repository not found", false}, + } { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + require.Equal(t, tt.expected, isRetriableGitError(errors.New(tt.err))) + }) + } +} + func TestRepoFromURL(t *testing.T) { t.Parallel() for k, v := range map[string]string{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/client/github.go new/goreleaser-2.15.1/internal/client/github.go --- old/goreleaser-2.15.0/internal/client/github.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/client/github.go 2026-03-30 19:47:26.000000000 +0200 @@ -121,7 +121,7 @@ c.checkRateLimit(ctx, time.Sleep) notes, _, err := c.client.Repositories.GenerateReleaseNotes(ctx, repo.Owner, repo.Name, &github.GenerateNotesOptions{ TagName: current, - PreviousTagName: github.Ptr(prev), + PreviousTagName: &prev, }) if err != nil { return "", err @@ -292,11 +292,11 @@ base.Owner, base.Name, &github.NewPullRequest{ - Title: github.Ptr(title), - Base: github.Ptr(base.Branch), - Head: github.Ptr(headString(base, head)), - Body: github.Ptr(strings.Join([]string{tpl, prFooter}, "\n")), - Draft: github.Ptr(draft), + Title: &title, + Base: &base.Branch, + Head: new(headString(base, head)), + Body: new(strings.Join([]string{tpl, prFooter}, "\n")), + Draft: &draft, }, ) if err != nil { @@ -324,7 +324,7 @@ head.Owner, head.Name, &github.RepoMergeUpstreamRequest{ - Branch: github.Ptr(branch), + Branch: &branch, }, ) if err != nil { @@ -357,15 +357,15 @@ options := &github.RepositoryContentFileOptions{ Content: content, - Message: github.Ptr(message), + Message: &message, } // When using a GitHub App token, omit the committer to get automatic signed commits // See: https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification#signature-verification-for-bots if !commitAuthor.UseGitHubAppToken { options.Committer = &github.CommitAuthor{ - Name: github.Ptr(commitAuthor.Name), - Email: github.Ptr(commitAuthor.Email), + Name: &commitAuthor.Name, + Email: &commitAuthor.Email, } } @@ -450,13 +450,13 @@ body = truncateReleaseBody(body) data := &github.RepositoryRelease{ - Name: github.Ptr(title), - TagName: github.Ptr(ctx.Git.CurrentTag), - Body: github.Ptr(body), + Name: &title, + TagName: &ctx.Git.CurrentTag, + Body: &body, // Always start with a draft release while uploading artifacts. // PublishRelease will undraft it. - Draft: github.Ptr(true), - Prerelease: github.Ptr(ctx.PreRelease), + Draft: new(true), + Prerelease: &ctx.PreRelease, } if target := ctx.Config.Release.TargetCommitish; target != "" { @@ -465,7 +465,7 @@ return "", err } if target != "" { - data.TargetCommitish = github.Ptr(target) + data.TargetCommitish = &target } } @@ -488,17 +488,17 @@ return fmt.Errorf("non-numeric release ID %q: %w", releaseID, err) } data := &github.RepositoryRelease{ - Draft: github.Ptr(draft), + Draft: &draft, } latest, err := tmpl.New(ctx).Apply(ctx.Config.Release.MakeLatest) if err != nil { return fmt.Errorf("templating GitHub make_latest: %w", err) } if latest != "" { - data.MakeLatest = github.Ptr(latest) + data.MakeLatest = &latest } if ctx.Config.Release.DiscussionCategoryName != "" { - data.DiscussionCategoryName = github.Ptr(ctx.Config.Release.DiscussionCategoryName) + data.DiscussionCategoryName = &ctx.Config.Release.DiscussionCategoryName } release, err := c.updateRelease(ctx, releaseIDInt, data) if err != nil { @@ -539,7 +539,7 @@ } data.Draft = release.Draft - data.Body = github.Ptr(getReleaseNotes(release.GetBody(), body, ctx.Config.Release.ReleaseNotesMode)) + data.Body = new(getReleaseNotes(release.GetBody(), body, ctx.Config.Release.ReleaseNotesMode)) return c.updateRelease(ctx, release.GetID(), data) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/client/github_test.go new/goreleaser-2.15.1/internal/client/github_test.go --- old/goreleaser-2.15.0/internal/client/github_test.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/client/github_test.go 2026-03-30 19:47:26.000000000 +0200 @@ -483,8 +483,8 @@ if r.URL.Path == "/api/v3/repos/someone/something/contents/.github/PULL_REQUEST_TEMPLATE.md" { content := github.RepositoryContent{ - Encoding: github.Ptr("base64"), - Content: github.Ptr(base64.StdEncoding.EncodeToString([]byte(testPRTemplate))), + Encoding: new("base64"), + Content: new(base64.StdEncoding.EncodeToString([]byte(testPRTemplate))), } bts, _ := json.Marshal(content) _, _ = w.Write(bts) @@ -545,8 +545,8 @@ if r.URL.Path == "/api/v3/repos/someone/something/contents/.github/PULL_REQUEST_TEMPLATE.md" { content := github.RepositoryContent{ - Encoding: github.Ptr("base64"), - Content: github.Ptr(base64.StdEncoding.EncodeToString([]byte(testPRTemplate))), + Encoding: new("base64"), + Content: new(base64.StdEncoding.EncodeToString([]byte(testPRTemplate))), } bts, _ := json.Marshal(content) _, _ = w.Write(bts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/client/gitlab.go new/goreleaser-2.15.1/internal/client/gitlab.go --- old/goreleaser-2.15.0/internal/client/gitlab.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/client/gitlab.go 2026-03-30 19:47:26.000000000 +0200 @@ -708,7 +708,7 @@ SourceBranch: &head.Branch, TargetBranch: &base.Branch, Title: &title, - Description: gitlab.Ptr(prFooter), + Description: new(prFooter), } if targetProjectID != 0 { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/pipe/git/git.go new/goreleaser-2.15.1/internal/pipe/git/git.go --- old/goreleaser-2.15.0/internal/pipe/git/git.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/pipe/git/git.go 2026-03-30 19:47:26.000000000 +0200 @@ -6,6 +6,7 @@ "net/url" "os" "os/exec" + "slices" "strconv" "strings" "time" @@ -369,14 +370,7 @@ return tags[0] } for _, tag := range tags { - excluded := false - for _, exl := range exclude { - if exl == tag { - excluded = true - break - } - } - if !excluded { + if !slices.Contains(exclude, tag) { return tag } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/pipe/sign/sign.go new/goreleaser-2.15.1/internal/pipe/sign/sign.go --- old/goreleaser-2.15.0/internal/pipe/sign/sign.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/pipe/sign/sign.go 2026-03-30 19:47:26.000000000 +0200 @@ -101,7 +101,12 @@ log.Warn("when artifacts is `source`, `ids` has no effect. ignoring") } case "all": - filters = append(filters, artifact.ByTypes(artifact.ReleaseUploadableTypes()...)) + filters = append(filters, + artifact.And( + artifact.ByTypes(artifact.ReleaseUploadableTypes()...), + artifact.Not(artifact.ByTypes(artifact.Signature, artifact.Certificate)), + ), + ) case "archive": filters = append(filters, artifact.ByType(artifact.UploadableArchive)) case "binary": diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/pipe/sign/sign_test.go new/goreleaser-2.15.1/internal/pipe/sign/sign_test.go --- old/goreleaser-2.15.0/internal/pipe/sign/sign_test.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/pipe/sign/sign_test.go 2026-03-30 19:47:26.000000000 +0200 @@ -846,6 +846,71 @@ require.Equal(t, []string{"cosign", "gpg2"}, Pipe{}.Dependencies(ctx)) } +func TestSignAllExcludesSignaturesAndCertificates(t *testing.T) { + tmpdir := t.TempDir() + + ctx := testctx.WrapWithCfg(t.Context(), config.Project{ + Dist: tmpdir, + Signs: []config.Sign{ + { + Cmd: "true", + Artifacts: "all", + Signature: "${artifact}.newsig", + }, + }, + }) + + require.NoError(t, os.WriteFile(filepath.Join(tmpdir, "archive.tar.gz"), []byte("foo"), 0o644)) + require.NoError(t, os.WriteFile(filepath.Join(tmpdir, "checksums.txt"), []byte("foo"), 0o644)) + require.NoError(t, os.WriteFile(filepath.Join(tmpdir, "checksums.txt.sig"), []byte("foo"), 0o644)) + require.NoError(t, os.WriteFile(filepath.Join(tmpdir, "checksums.txt.pem"), []byte("foo"), 0o644)) + + ctx.Artifacts.Add(&artifact.Artifact{ + Name: "archive.tar.gz", + Path: filepath.Join(tmpdir, "archive.tar.gz"), + Type: artifact.UploadableArchive, + Extra: map[string]any{artifact.ExtraID: "default"}, + }) + ctx.Artifacts.Add(&artifact.Artifact{ + Name: "checksums.txt", + Path: filepath.Join(tmpdir, "checksums.txt"), + Type: artifact.Checksum, + }) + ctx.Artifacts.Add(&artifact.Artifact{ + Name: "checksums.txt.sig", + Path: filepath.Join(tmpdir, "checksums.txt.sig"), + Type: artifact.Signature, + Extra: map[string]any{artifact.ExtraID: "default"}, + }) + ctx.Artifacts.Add(&artifact.Artifact{ + Name: "checksums.txt.pem", + Path: filepath.Join(tmpdir, "checksums.txt.pem"), + Type: artifact.Certificate, + Extra: map[string]any{artifact.ExtraID: "default"}, + }) + + require.NoError(t, Pipe{}.Default(ctx)) + require.NoError(t, Pipe{}.Run(ctx)) + + // Collect only newly-created signatures (identified by the ".newsig" + // suffix configured above). + var signed []string + for _, a := range ctx.Artifacts.Filter(artifact.ByType(artifact.Signature)).List() { + if strings.HasSuffix(a.Name, ".newsig") { + signed = append(signed, a.Name) + } + } + + // Only the archive and checksum should be signed. Pre-existing + // signatures and certificates must be excluded — this is the fix for + // #6508: signing .sig/.pem files causes checksums.txt to include its + // own signature, breaking verification. + require.ElementsMatch(t, []string{ + "archive.tar.gz.newsig", + "checksums.txt.newsig", + }, signed) +} + func setGpg(tb testing.TB, ctx *context.Context, p string) { tb.Helper() _, err := git.Run(ctx, "config", "--local", "--add", "gpg.program", p) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/pipe/snapcraft/snapcraft.go new/goreleaser-2.15.1/internal/pipe/snapcraft/snapcraft.go --- old/goreleaser-2.15.0/internal/pipe/snapcraft/snapcraft.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/pipe/snapcraft/snapcraft.go 2026-03-30 19:47:26.000000000 +0200 @@ -6,12 +6,15 @@ import ( "errors" "fmt" + "net/http" "os" "os/exec" "path/filepath" "slices" "strings" + "time" + "github.com/avast/retry-go/v4" "github.com/caarlos0/log" "github.com/goreleaser/goreleaser/v2/internal/artifact" "github.com/goreleaser/goreleaser/v2/internal/deprecate" @@ -448,20 +451,50 @@ needsReviewMsg = `(NEEDS REVIEW)` ) +func isRetriableSnapPush(err error) bool { + for _, code := range []int{ + http.StatusInternalServerError, + http.StatusBadGateway, + http.StatusServiceUnavailable, + http.StatusGatewayTimeout, + } { + if strings.Contains(err.Error(), fmt.Sprintf("[%d]", code)) { + return true + } + } + return false +} + func push(ctx *context.Context, snap *artifact.Artifact) error { log := log.WithField("snap", snap.Name) releases := artifact.MustExtra[[]string](*snap, releasesExtra) - /* #nosec */ - cmd := exec.CommandContext(ctx, "snapcraft", "upload", "--release="+strings.Join(releases, ","), snap.Path) - log.WithField("args", cmd.Args).Info("pushing snap") - if out, err := cmd.CombinedOutput(); err != nil { - if strings.Contains(string(out), reviewWaitMsg) || - strings.Contains(string(out), humanReviewMsg) || - strings.Contains(string(out), needsReviewMsg) { - log.Warn(reviewWaitMsg) - } else { - return fmt.Errorf("failed to push %s package: %w: %s", snap.Path, err, string(out)) - } + if err := retry.Do( + func() error { + /* #nosec */ + cmd := exec.CommandContext(ctx, "snapcraft", "upload", "--release="+strings.Join(releases, ","), snap.Path) + log.WithField("args", cmd.Args).Info("pushing snap") + out, err := cmd.CombinedOutput() + if err != nil { + if strings.Contains(string(out), reviewWaitMsg) || + strings.Contains(string(out), humanReviewMsg) || + strings.Contains(string(out), needsReviewMsg) { + log.Warn(reviewWaitMsg) + return nil + } + return fmt.Errorf("failed to push %s package: %w: %s", snap.Path, err, string(out)) + } + return nil + }, + retry.RetryIf(isRetriableSnapPush), + retry.Attempts(10), + retry.Delay(10*time.Second), + retry.DelayType(retry.BackOffDelay), + retry.LastErrorOnly(true), + retry.OnRetry(func(n uint, err error) { + log.WithField("attempt", n+1).WithError(err).Warn("failed to push snap, retrying") + }), + ); err != nil { + return err } snap.Type = artifact.Snapcraft ctx.Artifacts.Add(snap) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/internal/pipe/snapcraft/snapcraft_test.go new/goreleaser-2.15.1/internal/pipe/snapcraft/snapcraft_test.go --- old/goreleaser-2.15.0/internal/pipe/snapcraft/snapcraft_test.go 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/internal/pipe/snapcraft/snapcraft_test.go 2026-03-30 19:47:26.000000000 +0200 @@ -613,6 +613,15 @@ require.Equal(t, []string{"edge", "beta", "candidate", "stable"}, ctx.Config.Snapcrafts[1].ChannelTemplates) } +func TestIsRetriableSnapPush(t *testing.T) { + t.Parallel() + for _, code := range []int{500, 502, 503, 504} { + require.True(t, isRetriableSnapPush(fmt.Errorf("some error [%d] something", code))) + } + require.False(t, isRetriableSnapPush(fmt.Errorf("some other error"))) + require.False(t, isRetriableSnapPush(fmt.Errorf("[404] not found"))) +} + func Test_processChannelsTemplates(t *testing.T) { ctx := testctx.WrapWithCfg(t.Context(), config.Project{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/content/blog/goreleaser-v2.15.md new/goreleaser-2.15.1/www/content/blog/goreleaser-v2.15.md --- old/goreleaser-2.15.0/www/content/blog/goreleaser-v2.15.md 1970-01-01 01:00:00.000000000 +0100 +++ new/goreleaser-2.15.1/www/content/blog/goreleaser-v2.15.md 2026-03-30 19:47:26.000000000 +0200 @@ -0,0 +1,182 @@ +--- +title: Announcing GoReleaser v2.15 +date: 2026-03-29 +slug: goreleaser-v2.15 +tags: [announcements] +authors: [caarlos0] +--- + +This version a big one for Linux packaging - Flatpak bundles and Source RPMs land in +the same release, alongside a rebuilt documentation website and better Go build +defaults. + +<!--more--> + +## Flatpak + +GoReleaser can now build and publish [Flatpak](https://flatpak.org/) bundles! + +Flatpak lets you distribute Linux desktop applications as self-contained +bundles that run on any distro, inside a sandboxed environment with a +predictable runtime. A minimal example: + +```yaml {filename=".goreleaser.yaml"} +flatpak: + - app_id: com.example.MyApp + runtime: org.freedesktop.Platform + runtime_version: "24.08" + sdk: org.freedesktop.Sdk +``` + +The `app_id`, `runtime`, `runtime_version`, and `sdk` fields are required. +You can also set `finish_args` to configure sandbox permissions: + +```yaml {filename=".goreleaser.yaml"} +flatpak: + - app_id: com.example.MyApp + runtime: org.freedesktop.Platform + runtime_version: "24.08" + sdk: org.freedesktop.Sdk + finish_args: + - --share=network + - --socket=wayland + - --filesystem=home +``` + +Flatpak bundles are automatically included in checksums and signing. + +See the [documentation](https://goreleaser.com/customization/flatpak/) for more +details. + +## Go build `./...` and better defaults + +The Go builder now supports `./...` as a build target. +GoReleaser will find all packages with a `main` function, infer their binary +names just like `go build` does, and build them all at once: + +```yaml {filename=".goreleaser.yaml"} +builds: + - main: ./... +``` + +Less config, and faster builds — Go can schedule all packages together in a +single compiler invocation, which matters for repos with multiple binaries. + +`goreleaser init` also generates better defaults now, including `goarch` and +`main`, so there's even less to fill in by hand. + +## Generate completions in Homebrew Casks + +Homebrew Casks now support the `generate_completions_from_executable` stanza. +Users installing your tool via Homebrew will get shell completions +automatically, without any extra manual steps: + +```yaml {filename=".goreleaser.yaml"} +homebrew_casks: + - generate_completions_from_executable: true +``` + +See the [documentation](https://goreleaser.com/customization/homebrew_casks/) +for more details. + +> [!NOTE] +> This feature was just recently introduced in Homebrew. + +## Source RPMs + +GoReleaser can now generate Source RPM (`.src.rpm`) packages! + +This one has been a long time coming - the feature request dates back to 2022, +and it's finally here. +Huge thanks to [Tom Payne](https://github.com/twpayne) for working on it! + +Source RPMs are how RPM-based distributions (Fedora, RHEL, CentOS, etc.) +package software for redistribution and rebuilding. They bundle the source +archive together with a `.spec` file that describes how to produce binary RPMs. + +A minimal example: + +```yaml {filename=".goreleaser.yaml"} +srpm: + enabled: true + spec_file: myproject.spec.tmpl + summary: My project summary + license: MIT + url: https://myproject.example.com +``` + +See the [documentation](https://goreleaser.com/customization/package/srpm/) for +the full list of configuration fields and an example Fedora-style spec template. + +## New website + + + +We migrated the documentation website from Material for MkDocs to +Hugo with the Hextra theme. + +The new site is faster, and we took the opportunity to clean up and improve +the docs along the way. + +If you run into any broken links, please let us know — or open a PR adding a +redirect to the `_redirects` file. + +You can read the full announcement [here](https://goreleaser.com/blog/new-site/). + +## Before publish installer types and SBOM support + +{{< featpro >}} + +The `before_publish` hook now works with NSIS and `.pkg` installer types, so +you can run scripts before those artifacts are published. + +The SBOM pipe now covers installer types too — you can generate SBOMs for your +`.pkg` and NSIS installers alongside your binaries. + +We also fixed a handful of rough edges left over from v2.14: NSIS and `.pkg` +artifacts are now correctly uploaded to releases and blob storage, play nicely +with the custom publisher, and are included when signing installers. + +## Other updates + +- [**checksums**](https://goreleaser.com/customization/checksum/): added BLAKE3 checksumming support +- [**telegram**](https://goreleaser.com/customization/telegram/): added `message_thread_id` to post to a specific supergroup thread; fixed response body not being closed +- [**gomod**](https://goreleaser.com/customization/gomod/): retry Go mod proxy fetches on `404` with exponential backoff +- [**homebrew_casks**](https://goreleaser.com/customization/homebrew_casks/): fixed stanza order; use heredoc for caveats to handle shell metacharacters +- [**docker**](https://goreleaser.com/customization/docker/): check if `--provenance` and `--sbom` flags are available before using them +- [**rust**](https://goreleaser.com/customization/rust/): support `cargo-zigbuild` targets with custom glibc versions +- [**go**](https://goreleaser.com/customization/build/): removed `windows/arm` from valid build targets +- [**release**](https://goreleaser.com/customization/release/): fixed `ignore_tags` filtering when multiple tags are set +- [**pro/changelog**](https://goreleaser.com/customization/changelog/): fixed changelog generation on the first release + +## Other news + +- GoReleaser now has ~15.7k stars and 458 contributors! Thanks, everyone! +- We often discuss new features in our Discord server. + [Join the conversation][discord]! +- nFPM had new releases as well, + [check it out](https://github.com/goreleaser/nfpm/releases). + +## Download + +You can install or upgrade using your favorite package manager, or see the +full release notes and download the pre-compiled binaries from GitHub: + +{{< button href="https://goreleaser.com/install" label="Install" icon="download" primary="true" >}} +{{< button href="https://github.com/goreleaser/goreleaser/releases/tag/v2.15.0" label="v2.15.0 (OSS)" icon="github" primary="false" >}} +{{< button href="https://github.com/goreleaser/goreleaser-pro/releases/tag/v2.15.0" label="v2.15.0 (Pro)" icon="github" primary="false" >}} + +## Helping out + +You can help by reporting issues, contributing features, documentation +improvements, and bug fixes. +You can also sponsor the project, or get a GoReleaser Pro license. + +{{< button href="https://goreleaser.com/pro" label="Get the Pro license" icon="pro" primary="true" >}} +{{< button href="https://goreleaser.com/sponsors" label="Sponsor the project" icon="sponsor" primary="false" >}} + +[discord]: https://goreleaser.com/discord +[mkdocs]: https://squidfunk.github.io/mkdocs-material/ +[hugo]: https://gohugo.io +[hextra]: https://imfing.github.io/hextra/ +[redirs]: https://github.com/goreleaser/goreleaser/blob/main/www/static/_redirects diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/content/customization/announce/telegram.md new/goreleaser-2.15.1/www/content/customization/announce/telegram.md --- old/goreleaser-2.15.0/www/content/customization/announce/telegram.md 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/content/customization/announce/telegram.md 2026-03-30 19:47:26.000000000 +0200 @@ -32,7 +32,7 @@ # Specific thread ID to reply to. # - # {{< inline_version "v2.15-unreleased" >}} + # {{< inline_version "v2.15" >}} message_thread_id: 1234 # Message template to use while publishing. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/content/customization/builds/builders/go.md new/goreleaser-2.15.1/www/content/customization/builds/builders/go.md --- old/goreleaser-2.15.0/www/content/customization/builds/builders/go.md 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/content/customization/builds/builders/go.md 2026-03-30 19:47:26.000000000 +0200 @@ -25,7 +25,7 @@ # Path to main.go file or main package. # Notice: when used with `gomod.proxy`, this must be a package. # If you set it to a ellipsis path (e.g. './...'), GoReleaser will find all - # 'main' functions and build them all on a single command. {{< inline_version "v2.15-unreleased" >}} + # 'main' functions and build them all on a single command. {{< inline_version "v2.15" >}} # # Default: `.`. main: ./cmd/my-app @@ -538,7 +538,7 @@ ## Building ellipsis paths -{{< version "v2.15-unreleased" >}} +{{< version "v2.15" >}} You can also set the `main` to an ellipsis import path, e.g. `./...`. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/content/customization/general/templates.md new/goreleaser-2.15.1/www/content/customization/general/templates.md --- old/goreleaser-2.15.0/www/content/customization/general/templates.md 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/content/customization/general/templates.md 2026-03-30 19:47:26.000000000 +0200 @@ -157,50 +157,50 @@ On all fields, you have these available functions: -| Usage | Description | -| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| `replace "v1.2" "v" ""` | replaces all matches. See [ReplaceAll](https://pkg.go.dev/strings#ReplaceAll) | -| `split "1.2" "."` | split string at separator. See [Split](https://pkg.go.dev/strings#Split) | -| `time "01/02/2006"` | current UTC time in the specified format (this is not deterministic, a new time for every call) | -| `contains "foobar" "foo"` | checks whether the first string contains the second. See [Contains](https://pkg.go.dev/strings#Contains) | -| `tolower "V1.2"` | makes input string lowercase. See [ToLower](https://pkg.go.dev/strings#ToLower) | -| `toupper "v1.2"` | makes input string uppercase. See [ToUpper](https://pkg.go.dev/strings#ToUpper) | -| `trim " v1.2 "` | removes all leading and trailing white space. See [TrimSpace](https://pkg.go.dev/strings#TrimSpace) | -| `trimprefix "v1.2" "v"` | removes provided leading prefix string, if present. See [TrimPrefix](https://pkg.go.dev/strings#TrimPrefix) | -| `trimsuffix "1.2v" "v"` | removes provided trailing suffix string, if present. See [TrimSuffix](https://pkg.go.dev/strings#TrimSuffix) | -| `dir .Path` | returns all but the last element of path, typically the path's directory. See [Dir](https://pkg.go.dev/path/filepath#Dir) | -| `base .Path` | returns the last element of path. See [Base](https://pkg.go.dev/path/filepath#Base) | -| `abs .ArtifactPath` | returns an absolute representation of path. See [Abs](https://pkg.go.dev/path/filepath#Abs) | -| `filter "text" "regex"` | keeps only the lines matching the given regex, analogous to `grep -E` | -| `reverseFilter "text" "regex"` | keeps only the lines **not** matching the given regex, analogous to `grep -vE` | -| `title "foo"` | "titlenize" the string using english as language. See [Title](https://pkg.go.dev/golang.org/x/text/cases#Title) | -| `mdv2escape "foo"` | escape characters according to MarkdownV2, especially useful in the Telegram integration | -| `envOrDefault "NAME" "value"` | either gets the value of the given environment variable, or the given default | -| `isEnvSet "NAME"` | returns true if the env is set and not empty, false otherwise | -| `$m := map "KEY" "VALUE"` | creates a map from a list of key and value pairs. Both keys and values must be of type `string` | -| `indexOrDefault $m "KEY" "value"` | either gets the value of the given key or the given default value from the given map | -| `incpatch "v1.2.4"` | increments the patch of the given version[^panic-if-not-semver] | -| `incminor "v1.2.4"` | increments the minor of the given version[^panic-if-not-semver] | -| `incmajor "v1.2.4"` | increments the major of the given version[^panic-if-not-semver] | -| `urlPathEscape "foo/bar"` | escapes URL paths. See [PathEscape](https://pkg.go.dev/net/url#PathEscape) {{< inline_version "v2.5" >}} | -| `blake2b .ArtifactPath` | `blake2b` checksum of the artifact. See [Blake2b](https://pkg.go.dev/golang.org/x/crypto/blake2b) {{< inline_version "v2.9" >}} | -| `blake2s .ArtifactPath` | `blake2s` checksum of the artifact. See [Blake2s](https://pkg.go.dev/golang.org/x/crypto/blake2s) {{< inline_version "v2.9" >}} | -| `blake3 .ArtifactPath` | `blake3` checksum of the artifact. See [Blake3](https://pkg.go.dev/lukechampine.com/blake3) {{< inline_version "v2.15-unreleased" >}} | -| `crc32 .ArtifactPath` | `crc32` checksum of the artifact. See [CRC32](https://pkg.go.dev/hash/crc32) {{< inline_version "v2.9" >}} | -| `md5 .ArtifactPath` | `md5` checksum of the artifact. See [MD5](https://pkg.go.dev/crypto/md5) {{< inline_version "v2.9" >}} | -| `sha224 .ArtifactPath` | `sha224` checksum of the artifact. See [SHA224](https://pkg.go.dev/crypto/sha256) {{< inline_version "v2.9" >}} | -| `sha384 .ArtifactPath` | `sha384` checksum of the artifact. See [SHA384](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | -| `sha256 .ArtifactPath` | `sha256` checksum of the artifact. See [SHA256](https://pkg.go.dev/crypto/sha256) {{< inline_version "v2.9" >}} | -| `sha1 .ArtifactPath` | `sha1` checksum of the artifact. See [SHA1](https://pkg.go.dev/crypto/sha1) {{< inline_version "v2.9" >}} | -| `sha512 .ArtifactPath` | `sha512` checksum of the artifact. See [SHA512](https://pkg.go.dev/crypto/sha512) {{< inline_version "v2.9" >}} | -| `sha3_224 .ArtifactPath` | `sha3_224` checksum of the artifact. See [SHA3-224](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | -| `sha3_384 .ArtifactPath` | `sha3_384` checksum of the artifact. See [SHA3-384](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | -| `sha3_256 .ArtifactPath` | `sha3_256` checksum of the artifact. See [SHA3-256](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | -| `sha3_512 .ArtifactPath` | `sha3_512` checksum of the artifact. See [SHA3-512](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | -| `mustReadFile "/foo/bar.txt"` | reads the file contents or fails if it can't be read {{< inline_version "v2.12" >}} | -| `readFile "/foo/bar.txt"` | reads the file contents if it it can be read, or return empty string {{< inline_version "v2.12" >}} | -| `englishJoin` | will join multiple items in english {{< inline_version "v2.14" >}} | -| `list "a" "b" "c"` | makes a list of strings | +| Usage | Description | +| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `replace "v1.2" "v" ""` | replaces all matches. See [ReplaceAll](https://pkg.go.dev/strings#ReplaceAll) | +| `split "1.2" "."` | split string at separator. See [Split](https://pkg.go.dev/strings#Split) | +| `time "01/02/2006"` | current UTC time in the specified format (this is not deterministic, a new time for every call) | +| `contains "foobar" "foo"` | checks whether the first string contains the second. See [Contains](https://pkg.go.dev/strings#Contains) | +| `tolower "V1.2"` | makes input string lowercase. See [ToLower](https://pkg.go.dev/strings#ToLower) | +| `toupper "v1.2"` | makes input string uppercase. See [ToUpper](https://pkg.go.dev/strings#ToUpper) | +| `trim " v1.2 "` | removes all leading and trailing white space. See [TrimSpace](https://pkg.go.dev/strings#TrimSpace) | +| `trimprefix "v1.2" "v"` | removes provided leading prefix string, if present. See [TrimPrefix](https://pkg.go.dev/strings#TrimPrefix) | +| `trimsuffix "1.2v" "v"` | removes provided trailing suffix string, if present. See [TrimSuffix](https://pkg.go.dev/strings#TrimSuffix) | +| `dir .Path` | returns all but the last element of path, typically the path's directory. See [Dir](https://pkg.go.dev/path/filepath#Dir) | +| `base .Path` | returns the last element of path. See [Base](https://pkg.go.dev/path/filepath#Base) | +| `abs .ArtifactPath` | returns an absolute representation of path. See [Abs](https://pkg.go.dev/path/filepath#Abs) | +| `filter "text" "regex"` | keeps only the lines matching the given regex, analogous to `grep -E` | +| `reverseFilter "text" "regex"` | keeps only the lines **not** matching the given regex, analogous to `grep -vE` | +| `title "foo"` | "titlenize" the string using english as language. See [Title](https://pkg.go.dev/golang.org/x/text/cases#Title) | +| `mdv2escape "foo"` | escape characters according to MarkdownV2, especially useful in the Telegram integration | +| `envOrDefault "NAME" "value"` | either gets the value of the given environment variable, or the given default | +| `isEnvSet "NAME"` | returns true if the env is set and not empty, false otherwise | +| `$m := map "KEY" "VALUE"` | creates a map from a list of key and value pairs. Both keys and values must be of type `string` | +| `indexOrDefault $m "KEY" "value"` | either gets the value of the given key or the given default value from the given map | +| `incpatch "v1.2.4"` | increments the patch of the given version[^panic-if-not-semver] | +| `incminor "v1.2.4"` | increments the minor of the given version[^panic-if-not-semver] | +| `incmajor "v1.2.4"` | increments the major of the given version[^panic-if-not-semver] | +| `urlPathEscape "foo/bar"` | escapes URL paths. See [PathEscape](https://pkg.go.dev/net/url#PathEscape) {{< inline_version "v2.5" >}} | +| `blake2b .ArtifactPath` | `blake2b` checksum of the artifact. See [Blake2b](https://pkg.go.dev/golang.org/x/crypto/blake2b) {{< inline_version "v2.9" >}} | +| `blake2s .ArtifactPath` | `blake2s` checksum of the artifact. See [Blake2s](https://pkg.go.dev/golang.org/x/crypto/blake2s) {{< inline_version "v2.9" >}} | +| `blake3 .ArtifactPath` | `blake3` checksum of the artifact. See [Blake3](https://pkg.go.dev/lukechampine.com/blake3) {{< inline_version "v2.15" >}} | +| `crc32 .ArtifactPath` | `crc32` checksum of the artifact. See [CRC32](https://pkg.go.dev/hash/crc32) {{< inline_version "v2.9" >}} | +| `md5 .ArtifactPath` | `md5` checksum of the artifact. See [MD5](https://pkg.go.dev/crypto/md5) {{< inline_version "v2.9" >}} | +| `sha224 .ArtifactPath` | `sha224` checksum of the artifact. See [SHA224](https://pkg.go.dev/crypto/sha256) {{< inline_version "v2.9" >}} | +| `sha384 .ArtifactPath` | `sha384` checksum of the artifact. See [SHA384](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | +| `sha256 .ArtifactPath` | `sha256` checksum of the artifact. See [SHA256](https://pkg.go.dev/crypto/sha256) {{< inline_version "v2.9" >}} | +| `sha1 .ArtifactPath` | `sha1` checksum of the artifact. See [SHA1](https://pkg.go.dev/crypto/sha1) {{< inline_version "v2.9" >}} | +| `sha512 .ArtifactPath` | `sha512` checksum of the artifact. See [SHA512](https://pkg.go.dev/crypto/sha512) {{< inline_version "v2.9" >}} | +| `sha3_224 .ArtifactPath` | `sha3_224` checksum of the artifact. See [SHA3-224](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | +| `sha3_384 .ArtifactPath` | `sha3_384` checksum of the artifact. See [SHA3-384](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | +| `sha3_256 .ArtifactPath` | `sha3_256` checksum of the artifact. See [SHA3-256](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | +| `sha3_512 .ArtifactPath` | `sha3_512` checksum of the artifact. See [SHA3-512](https://pkg.go.dev/golang.org/x/crypto/sha3) {{< inline_version "v2.9" >}} | +| `mustReadFile "/foo/bar.txt"` | reads the file contents or fails if it can't be read {{< inline_version "v2.12" >}} | +| `readFile "/foo/bar.txt"` | reads the file contents if it it can be read, or return empty string {{< inline_version "v2.12" >}} | +| `englishJoin` | will join multiple items in english {{< inline_version "v2.14" >}} | +| `list "a" "b" "c"` | makes a list of strings | ## Functions (Pro) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/content/customization/package/flatpak.md new/goreleaser-2.15.1/www/content/customization/package/flatpak.md --- old/goreleaser-2.15.0/www/content/customization/package/flatpak.md 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/content/customization/package/flatpak.md 2026-03-30 19:47:26.000000000 +0200 @@ -4,7 +4,7 @@ weight: 110 --- -{{< version "v2.15-unreleased" >}} +{{< version "v2.15" >}} GoReleaser can create [Flatpak][] bundles (`.flatpak` files) for your Linux binaries. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/content/customization/package/srpm.md new/goreleaser-2.15.1/www/content/customization/package/srpm.md --- old/goreleaser-2.15.0/www/content/customization/package/srpm.md 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/content/customization/package/srpm.md 2026-03-30 19:47:26.000000000 +0200 @@ -4,7 +4,7 @@ weight: 50 --- -{{< version "v2.15-unreleased" >}} +{{< version "v2.15" >}} GoReleaser can generate Source RPM (`.src.rpm`) packages. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/content/customization/publish/homebrew_casks.md new/goreleaser-2.15.1/www/content/customization/publish/homebrew_casks.md --- old/goreleaser-2.15.0/www/content/customization/publish/homebrew_casks.md 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/content/customization/publish/homebrew_casks.md 2026-03-30 19:47:26.000000000 +0200 @@ -74,7 +74,7 @@ # # All fields except `executable` are optional. # - # {{< inline_version "v2.15-unreleased" >}} + # {{< inline_version "v2.15" >}} generate_completions_from_executable: # Path to the executable inside the cask bundle. # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/content/sponsors.md new/goreleaser-2.15.1/www/content/sponsors.md --- old/goreleaser-2.15.0/www/content/sponsors.md 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/content/sponsors.md 2026-03-30 19:47:26.000000000 +0200 @@ -48,7 +48,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/2531208?v=4&s=112" + src="https://avatars.githubusercontent.com/u/2531208?s=112&v=4" alt="SAP" width="112" height="112" @@ -66,7 +66,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/34240465?v=4&s=96" + src="https://avatars.githubusercontent.com/u/34240465?s=96&v=4" alt="Mercedes-Benz Group" width="96" height="96" @@ -79,7 +79,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/72055470?v=4&s=96" + src="https://avatars.githubusercontent.com/u/72055470?s=96&v=4" alt="nitric" width="96" height="96" @@ -128,7 +128,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/35725664?v=4&s=64" + src="https://avatars.githubusercontent.com/u/35725664?s=64&v=4" alt="conet cloud" width="64" height="64" @@ -141,7 +141,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/50438175?v=4&s=64" + src="https://avatars.githubusercontent.com/u/50438175?s=64&v=4" alt="Encore" width="64" height="64" @@ -154,7 +154,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/31487821?v=4&s=64" + src="https://avatars.githubusercontent.com/u/31487821?s=64&v=4" alt="Comet" width="64" height="64" @@ -180,7 +180,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/268665632?v=4&s=64" + src="https://avatars.githubusercontent.com/u/268665632?s=64&v=4" alt="InterviewPal.com" width="64" height="64" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/layouts/index.html new/goreleaser-2.15.1/www/layouts/index.html --- old/goreleaser-2.15.0/www/layouts/index.html 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/layouts/index.html 2026-03-30 19:47:26.000000000 +0200 @@ -643,7 +643,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/2531208?v=4&s=112" + src="https://avatars.githubusercontent.com/u/2531208?s=112&v=4" alt="SAP" width="112" height="112" @@ -662,7 +662,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/34240465?v=4&s=96" + src="https://avatars.githubusercontent.com/u/34240465?s=96&v=4" alt="Mercedes-Benz Group" width="96" height="96" @@ -676,7 +676,7 @@ rel="noopener sponsored" > <img - src="https://avatars.githubusercontent.com/u/72055470?v=4&s=96" + src="https://avatars.githubusercontent.com/u/72055470?s=96&v=4" alt="nitric" width="96" height="96" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/static/latest new/goreleaser-2.15.1/www/static/latest --- old/goreleaser-2.15.0/www/static/latest 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/static/latest 2026-03-30 19:47:26.000000000 +0200 @@ -1 +1 @@ -v2.14.3 +v2.15.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/static/latest-pro new/goreleaser-2.15.1/www/static/latest-pro --- old/goreleaser-2.15.0/www/static/latest-pro 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/static/latest-pro 2026-03-30 19:47:26.000000000 +0200 @@ -1 +1 @@ -v2.14.3 +v2.15.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/static/releases-pro.json new/goreleaser-2.15.1/www/static/releases-pro.json --- old/goreleaser-2.15.0/www/static/releases-pro.json 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/static/releases-pro.json 2026-03-30 19:47:26.000000000 +0200 @@ -1,5 +1,8 @@ [ { + "tag_name": "v2.15.0" + }, + { "tag_name": "v2.14.3" }, { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/goreleaser-2.15.0/www/static/releases.json new/goreleaser-2.15.1/www/static/releases.json --- old/goreleaser-2.15.0/www/static/releases.json 2026-03-29 21:59:09.000000000 +0200 +++ new/goreleaser-2.15.1/www/static/releases.json 2026-03-30 19:47:26.000000000 +0200 @@ -1,5 +1,8 @@ [ { + "tag_name": "v2.15.0" + }, + { "tag_name": "v2.14.3" }, { ++++++ goreleaser.obsinfo ++++++ --- /var/tmp/diff_new_pack.dRHuMG/_old 2026-04-01 19:52:31.101839574 +0200 +++ /var/tmp/diff_new_pack.dRHuMG/_new 2026-04-01 19:52:31.117840241 +0200 @@ -1,5 +1,5 @@ name: goreleaser -version: 2.15.0 -mtime: 1774814349 -commit: 97c05b9cadd9fd996272aeec084181f4c43c0b62 +version: 2.15.1 +mtime: 1774892846 +commit: 5b156e9f54a8a514a8275d042b40af9b6518f729 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/goreleaser/vendor.tar.gz /work/SRC/openSUSE:Factory/.goreleaser.new.21863/vendor.tar.gz differ: char 115, line 2
