mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-30 19:08:37 +00:00 
			
		
		
		
	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:
		| @@ -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 { | ||||||
|   | |||||||
| @@ -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> | ||||||
|   | |||||||
| @@ -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}} | ||||||
|   | |||||||
| @@ -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", | ||||||
|   | |||||||
| @@ -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); | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user