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.tags/v1.22.0-rc0
@@ -185,6 +185,11 @@ func Releases(ctx *context.Context) { | |||
ctx.ServerError("getReleaseInfos", err) | |||
return | |||
} | |||
for _, rel := range releases { | |||
if rel.Release.IsTag && rel.Release.Title == "" { | |||
rel.Release.Title = rel.Release.TagName | |||
} | |||
} | |||
ctx.Data["Releases"] = releases | |||
@@ -283,6 +288,7 @@ func SingleRelease(ctx *context.Context) { | |||
TagNames: []string{ctx.Params("*")}, | |||
// only show draft releases for users who can write, read-only users shouldn't see draft releases. | |||
IncludeDrafts: writeAccess, | |||
IncludeTags: true, | |||
}) | |||
if err != nil { | |||
ctx.ServerError("getReleaseInfos", err) | |||
@@ -294,6 +300,9 @@ func SingleRelease(ctx *context.Context) { | |||
} | |||
release := releases[0].Release | |||
if release.IsTag && release.Title == "" { | |||
release.Title = release.TagName | |||
} | |||
ctx.Data["PageIsSingleTag"] = release.IsTag | |||
if release.IsTag { |
@@ -18,18 +18,18 @@ | |||
<div class="ui twelve wide column detail"> | |||
<div class="gt-df gt-ac gt-sb gt-fw gt-mb-3"> | |||
<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"}} | |||
{{if $release.IsDraft}} | |||
<span class="ui yellow label">{{ctx.Locale.Tr "repo.release.draft"}}</span> | |||
{{else if $release.IsPrerelease}} | |||
<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> | |||
{{end}} | |||
</h4> | |||
<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"> | |||
{{svg "octicon-pencil"}} | |||
</a> |
@@ -5,9 +5,9 @@ | |||
<div class="gt-df"> | |||
<div class="gt-f1 gt-df gt-ac"> | |||
<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}} | |||
<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}} | |||
</h2> | |||
</div> | |||
@@ -17,7 +17,7 @@ | |||
</a> | |||
{{end}} | |||
{{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"}} | |||
</a> | |||
{{end}} |
@@ -36,6 +36,7 @@ func TestLinksNoLogin(t *testing.T) { | |||
"/user2/repo1/", | |||
"/user2/repo1/projects", | |||
"/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/500.png", | |||
"/.well-known/security.txt", |
@@ -30,8 +30,9 @@ function initTagNameEditor() { | |||
const newTagHelperText = el.getAttribute('data-tag-helper-new'); | |||
const existingTagHelperText = el.getAttribute('data-tag-helper-existing'); | |||
document.getElementById('tag-name').addEventListener('keyup', (e) => { | |||
const value = e.target.value; | |||
const tagNameInput = document.getElementById('tag-name'); | |||
const hideTargetInput = function(tagNameInput) { | |||
const value = tagNameInput.value; | |||
const tagHelper = document.getElementById('tag-helper'); | |||
if (existingTags.includes(value)) { | |||
// If the tag already exists, hide the target branch selector. | |||
@@ -41,6 +42,10 @@ function initTagNameEditor() { | |||
showElem('#tag-target-selector'); | |||
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); | |||
}); | |||
} | |||