Fix a bug returning 404 when display a single tag with no release (#29466)

Partially caused by #29149 

When use

```go
releases, err := getReleaseInfos(ctx, &repo_model.FindReleasesOptions{
		ListOptions: db.ListOptions{Page: 1, PageSize: 1},
		RepoID:      ctx.Repo.Repository.ID,
		TagNames:    []string{ctx.Params("*")},
		// only show draft releases for users who can write, read-only users shouldn't see draft releases.
		IncludeDrafts: writeAccess,
	})
```
replace
```go
release, err := repo_model.GetRelease(ctx, ctx.Repo.Repository.ID, ctx.Params("*"))
```
It missed `IncludeTags: true,`. That means this bug will be occupied only when the release is a tag.
This PR will fix

 - Get the right tag record when it's not a release
 - Display correct tag tab but not release tag when it's a tag.
- The button will bring the tag name to the new page when it's a single tag page
- the new page will automatically hide the release target inputbox when the tag name is pre filled. This should be backport to v1.21.
This commit is contained in:
Lunny Xiao 2024-03-02 22:03:39 +08:00 committed by GitHub
parent 423372d84a
commit cc27b50bdf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 23 additions and 8 deletions

View File

@ -185,6 +185,11 @@ func Releases(ctx *context.Context) {
ctx.ServerError("getReleaseInfos", err) ctx.ServerError("getReleaseInfos", err)
return return
} }
for _, rel := range releases {
if rel.Release.IsTag && rel.Release.Title == "" {
rel.Release.Title = rel.Release.TagName
}
}
ctx.Data["Releases"] = releases ctx.Data["Releases"] = releases
@ -283,6 +288,7 @@ func SingleRelease(ctx *context.Context) {
TagNames: []string{ctx.Params("*")}, TagNames: []string{ctx.Params("*")},
// only show draft releases for users who can write, read-only users shouldn't see draft releases. // only show draft releases for users who can write, read-only users shouldn't see draft releases.
IncludeDrafts: writeAccess, IncludeDrafts: writeAccess,
IncludeTags: true,
}) })
if err != nil { if err != nil {
ctx.ServerError("getReleaseInfos", err) ctx.ServerError("getReleaseInfos", err)
@ -294,6 +300,9 @@ func SingleRelease(ctx *context.Context) {
} }
release := releases[0].Release release := releases[0].Release
if release.IsTag && release.Title == "" {
release.Title = release.TagName
}
ctx.Data["PageIsSingleTag"] = release.IsTag ctx.Data["PageIsSingleTag"] = release.IsTag
if release.IsTag { if release.IsTag {

View File

@ -18,18 +18,18 @@
<div class="ui twelve wide column detail"> <div class="ui twelve wide column detail">
<div class="gt-df gt-ac gt-sb gt-fw gt-mb-3"> <div class="gt-df gt-ac gt-sb gt-fw gt-mb-3">
<h4 class="release-list-title gt-word-break"> <h4 class="release-list-title gt-word-break">
<a href="{{$.RepoLink}}/releases/tag/{{$release.TagName | PathEscapeSegments}}">{{$release.Title}}</a> {{if $.PageIsSingleTag}}{{$release.Title}}{{else}}<a href="{{$.RepoLink}}/releases/tag/{{$release.TagName | PathEscapeSegments}}">{{$release.Title}}</a>{{end}}
{{template "repo/commit_statuses" dict "Status" $info.CommitStatus "Statuses" $info.CommitStatuses "AdditionalClasses" "gt-df"}} {{template "repo/commit_statuses" dict "Status" $info.CommitStatus "Statuses" $info.CommitStatuses "AdditionalClasses" "gt-df"}}
{{if $release.IsDraft}} {{if $release.IsDraft}}
<span class="ui yellow label">{{ctx.Locale.Tr "repo.release.draft"}}</span> <span class="ui yellow label">{{ctx.Locale.Tr "repo.release.draft"}}</span>
{{else if $release.IsPrerelease}} {{else if $release.IsPrerelease}}
<span class="ui orange label">{{ctx.Locale.Tr "repo.release.prerelease"}}</span> <span class="ui orange label">{{ctx.Locale.Tr "repo.release.prerelease"}}</span>
{{else}} {{else if (not $release.IsTag)}}
<span class="ui green label">{{ctx.Locale.Tr "repo.release.stable"}}</span> <span class="ui green label">{{ctx.Locale.Tr "repo.release.stable"}}</span>
{{end}} {{end}}
</h4> </h4>
<div> <div>
{{if $.CanCreateRelease}} {{if and $.CanCreateRelease (not $.PageIsSingleTag)}}
<a class="muted" data-tooltip-content="{{ctx.Locale.Tr "repo.release.edit"}}" href="{{$.RepoLink}}/releases/edit/{{$release.TagName | PathEscapeSegments}}" rel="nofollow"> <a class="muted" data-tooltip-content="{{ctx.Locale.Tr "repo.release.edit"}}" href="{{$.RepoLink}}/releases/edit/{{$release.TagName | PathEscapeSegments}}" rel="nofollow">
{{svg "octicon-pencil"}} {{svg "octicon-pencil"}}
</a> </a>

View File

@ -5,9 +5,9 @@
<div class="gt-df"> <div class="gt-df">
<div class="gt-f1 gt-df gt-ac"> <div class="gt-f1 gt-df gt-ac">
<h2 class="ui compact small menu header small-menu-items"> <h2 class="ui compact small menu header small-menu-items">
<a class="{{if .PageIsReleaseList}}active {{end}}item" href="{{.RepoLink}}/releases">{{ctx.Locale.PrettyNumber .NumReleases}} {{ctx.Locale.TrN .NumReleases "repo.release" "repo.releases"}}</a> <a class="{{if and .PageIsReleaseList (not .PageIsSingleTag)}}active {{end}}item" href="{{.RepoLink}}/releases">{{ctx.Locale.PrettyNumber .NumReleases}} {{ctx.Locale.TrN .NumReleases "repo.release" "repo.releases"}}</a>
{{if $canReadCode}} {{if $canReadCode}}
<a class="{{if .PageIsTagList}}active {{end}}item" href="{{.RepoLink}}/tags">{{ctx.Locale.PrettyNumber .NumTags}} {{ctx.Locale.TrN .NumTags "repo.tag" "repo.tags"}}</a> <a class="{{if or .PageIsTagList .PageIsSingleTag}}active {{end}}item" href="{{.RepoLink}}/tags">{{ctx.Locale.PrettyNumber .NumTags}} {{ctx.Locale.TrN .NumTags "repo.tag" "repo.tags"}}</a>
{{end}} {{end}}
</h2> </h2>
</div> </div>
@ -17,7 +17,7 @@
</a> </a>
{{end}} {{end}}
{{if and (not .PageIsTagList) .CanCreateRelease}} {{if and (not .PageIsTagList) .CanCreateRelease}}
<a class="ui small primary button" href="{{$.RepoLink}}/releases/new"> <a class="ui small primary button" href="{{$.RepoLink}}/releases/new{{if .PageIsSingleTag}}?tag={{.TagName}}{{end}}">
{{ctx.Locale.Tr "repo.release.new_release"}} {{ctx.Locale.Tr "repo.release.new_release"}}
</a> </a>
{{end}} {{end}}

View File

@ -36,6 +36,7 @@ func TestLinksNoLogin(t *testing.T) {
"/user2/repo1/", "/user2/repo1/",
"/user2/repo1/projects", "/user2/repo1/projects",
"/user2/repo1/projects/1", "/user2/repo1/projects/1",
"/user2/repo1/releases/tag/delete-tag", // It's the only one existing record on release.yml which has is_tag: true
"/assets/img/404.png", "/assets/img/404.png",
"/assets/img/500.png", "/assets/img/500.png",
"/.well-known/security.txt", "/.well-known/security.txt",

View File

@ -30,8 +30,9 @@ function initTagNameEditor() {
const newTagHelperText = el.getAttribute('data-tag-helper-new'); const newTagHelperText = el.getAttribute('data-tag-helper-new');
const existingTagHelperText = el.getAttribute('data-tag-helper-existing'); const existingTagHelperText = el.getAttribute('data-tag-helper-existing');
document.getElementById('tag-name').addEventListener('keyup', (e) => { const tagNameInput = document.getElementById('tag-name');
const value = e.target.value; const hideTargetInput = function(tagNameInput) {
const value = tagNameInput.value;
const tagHelper = document.getElementById('tag-helper'); const tagHelper = document.getElementById('tag-helper');
if (existingTags.includes(value)) { if (existingTags.includes(value)) {
// If the tag already exists, hide the target branch selector. // If the tag already exists, hide the target branch selector.
@ -41,6 +42,10 @@ function initTagNameEditor() {
showElem('#tag-target-selector'); showElem('#tag-target-selector');
tagHelper.textContent = value ? newTagHelperText : defaultTagHelperText; tagHelper.textContent = value ? newTagHelperText : defaultTagHelperText;
} }
};
hideTargetInput(tagNameInput); // update on page load because the input may have a value
tagNameInput.addEventListener('input', (e) => {
hideTargetInput(e.target);
}); });
} }