diff --git a/models/actions/run.go b/models/actions/run.go index 493bd0173c..5804b64eb0 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -326,15 +326,18 @@ func GetLatestRun(ctx context.Context, repoID int64) (*ActionRun, error) { func GetLatestRunForBranchAndWorkflow(ctx context.Context, repoID int64, branch, workflowFile, event string) (*ActionRun, error) { var run ActionRun - q := db.GetEngine(ctx).Where("repo_id=?", repoID).And("ref=?", branch).And("workflow_id=?", workflowFile) + q := db.GetEngine(ctx).Where("repo_id=?", repoID).And("workflow_id=?", workflowFile) if event != "" { q = q.And("event=?", event) } + if branch != "" { + q = q.And("ref=?", branch) + } has, err := q.Desc("id").Get(&run) if err != nil { return nil, err } else if !has { - return nil, util.NewNotExistErrorf("run with repo_id %d, ref %s, workflow_id %s", repoID, branch, workflowFile) + return nil, util.NewNotExistErrorf("run with repo_id %d, ref %s, event %s, workflow_id %s", repoID, branch, event, workflowFile) } return &run, nil } diff --git a/release-notes/8.0.0/fix/3843.md b/release-notes/8.0.0/fix/3843.md new file mode 100644 index 0000000000..d900cbe1e7 --- /dev/null +++ b/release-notes/8.0.0/fix/3843.md @@ -0,0 +1 @@ +- Fixed a bug that resulted in workflow badges not working for workflows that weren't running on push (such as scheduled workflows, and ones that run on tags and for prs) diff --git a/routers/web/repo/badges/badges.go b/routers/web/repo/badges/badges.go index ed40e982a1..f240d30a31 100644 --- a/routers/web/repo/badges/badges.go +++ b/routers/web/repo/badges/badges.go @@ -45,10 +45,9 @@ func errorBadge(ctx *context_module.Context, label, text string) { func GetWorkflowBadge(ctx *context_module.Context) { branch := ctx.Req.URL.Query().Get("branch") - if branch == "" { - branch = ctx.Repo.Repository.DefaultBranch + if branch != "" { + branch = fmt.Sprintf("refs/heads/%s", branch) } - branch = fmt.Sprintf("refs/heads/%s", branch) event := ctx.Req.URL.Query().Get("event") workflowFile := ctx.Params("workflow_name") diff --git a/tests/integration/repo_badges_test.go b/tests/integration/repo_badges_test.go index dbf6acb098..b8ca5f0752 100644 --- a/tests/integration/repo_badges_test.go +++ b/tests/integration/repo_badges_test.go @@ -1,4 +1,5 @@ // Copyright 2023 The Gitea Authors. All rights reserved. +// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. // SPDX-License-Identifier: MIT package integration @@ -40,12 +41,17 @@ func TestBadges(t *testing.T) { { Operation: "create", TreePath: ".gitea/workflows/pr.yml", - ContentReader: strings.NewReader("name: test\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), + ContentReader: strings.NewReader("name: pr\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), }, { Operation: "create", TreePath: ".gitea/workflows/self-test.yaml", - ContentReader: strings.NewReader("name: test\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), + ContentReader: strings.NewReader("name: self-test\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), + }, + { + Operation: "create", + TreePath: ".gitea/workflows/tag-test.yaml", + ContentReader: strings.NewReader("name: tags\non:\n push:\n tags: '*'\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), }, }, ) @@ -112,6 +118,25 @@ func TestBadges(t *testing.T) { req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg?event=cron", repo.Name) resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pr.yml-Not%20found-crimson") + + t.Run("tagged", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // With no tags, the workflow has no runs, and isn't found + req := NewRequestf(t, "GET", "/user2/%s/actions/workflows/tag-test.yaml/badge.svg", repo.Name) + resp := MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "tag--test.yaml-Not%20found-crimson") + + // Lets create a tag! + owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + err := release.CreateNewTag(git.DefaultContext, owner, repo, "main", "v1", "message") + assert.NoError(t, err) + + // Now the workflow is wating + req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/tag-test.yaml/badge.svg", repo.Name) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "tag--test.yaml-waiting-lightgrey") + }) }) t.Run("Stars", func(t *testing.T) {