diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go
index 33e7f739ff..1998bd8ccd 100644
--- a/routers/web/repo/release.go
+++ b/routers/web/repo/release.go
@@ -279,6 +279,8 @@ func SingleRelease(ctx *context.Context) {
releases, err := getReleaseInfos(ctx, &repo_model.FindReleasesOptions{
ListOptions: db.ListOptions{Page: 1, PageSize: 1},
RepoID: ctx.Repo.Repository.ID,
+ // Include tags in the search too.
+ IncludeTags: true,
TagNames: []string{ctx.Params("*")},
// only show draft releases for users who can write, read-only users shouldn't see draft releases.
IncludeDrafts: writeAccess,
diff --git a/templates/repo/release_tag_header.tmpl b/templates/repo/release_tag_header.tmpl
index f474fb89ea..6f3d28e7ad 100644
--- a/templates/repo/release_tag_header.tmpl
+++ b/templates/repo/release_tag_header.tmpl
@@ -5,9 +5,9 @@
diff --git a/tests/integration/repo_tag_test.go b/tests/integration/repo_tag_test.go
index 7e77906473..60c73ae63e 100644
--- a/tests/integration/repo_tag_test.go
+++ b/tests/integration/repo_tag_test.go
@@ -1,9 +1,11 @@
// Copyright 2021 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
import (
+ "net/http"
"net/url"
"testing"
@@ -20,6 +22,42 @@ import (
"github.com/stretchr/testify/assert"
)
+func TestTagViewWithoutRelease(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+ owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
+
+ defer func() {
+ releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{
+ IncludeTags: true,
+ TagNames: []string{"no-release"},
+ RepoID: repo.ID,
+ })
+ assert.NoError(t, err)
+
+ for _, release := range releases {
+ _, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID)
+ assert.NoError(t, err)
+ }
+ }()
+
+ err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "no-release", "release-less tag")
+ assert.NoError(t, err)
+
+ // Test that the page loads
+ req := NewRequestf(t, "GET", "/%s/releases/tag/no-release", repo.FullName())
+ resp := MakeRequest(t, req, http.StatusOK)
+
+ // Test that the tags sub-menu is active
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ htmlDoc.AssertElement(t, ".small-menu-items .active.item[href*='/tags']", true)
+
+ // Test that the release sub-menu isn't active
+ releaseLink := htmlDoc.Find(".small-menu-items .item[href*='/releases']")
+ assert.False(t, releaseLink.HasClass("active"))
+}
+
func TestCreateNewTagProtected(t *testing.T) {
defer tests.PrepareTestEnv(t)()