mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	* fix some ui bug about draft release - should not show draft release in tag list because it will't create real tag - still show draft release without tag and commit message for draft release instead of 404 error - remove tag load for attachement links because it's useless Signed-off-by: a1012112796 <1012112796@qq.com> * add test code * fix test That's because has added a new release in relaese test database. * fix dropdown link for draft release
This commit is contained in:
		@@ -10,9 +10,11 @@ import (
 | 
				
			|||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/models"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/setting"
 | 
						"code.gitea.io/gitea/modules/setting"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/test"
 | 
						"code.gitea.io/gitea/modules/test"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/PuerkitoBio/goquery"
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"github.com/unknwon/i18n"
 | 
						"github.com/unknwon/i18n"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -83,7 +85,7 @@ func TestCreateRelease(t *testing.T) {
 | 
				
			|||||||
	session := loginUser(t, "user2")
 | 
						session := loginUser(t, "user2")
 | 
				
			||||||
	createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, false)
 | 
						createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.stable"), 2)
 | 
						checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.stable"), 3)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestCreateReleasePreRelease(t *testing.T) {
 | 
					func TestCreateReleasePreRelease(t *testing.T) {
 | 
				
			||||||
@@ -92,7 +94,7 @@ func TestCreateReleasePreRelease(t *testing.T) {
 | 
				
			|||||||
	session := loginUser(t, "user2")
 | 
						session := loginUser(t, "user2")
 | 
				
			||||||
	createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", true, false)
 | 
						createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", true, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.prerelease"), 2)
 | 
						checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.prerelease"), 3)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestCreateReleaseDraft(t *testing.T) {
 | 
					func TestCreateReleaseDraft(t *testing.T) {
 | 
				
			||||||
@@ -101,7 +103,7 @@ func TestCreateReleaseDraft(t *testing.T) {
 | 
				
			|||||||
	session := loginUser(t, "user2")
 | 
						session := loginUser(t, "user2")
 | 
				
			||||||
	createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, true)
 | 
						createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.draft"), 2)
 | 
						checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.draft"), 3)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestCreateReleasePaging(t *testing.T) {
 | 
					func TestCreateReleasePaging(t *testing.T) {
 | 
				
			||||||
@@ -127,3 +129,80 @@ func TestCreateReleasePaging(t *testing.T) {
 | 
				
			|||||||
	session2 := loginUser(t, "user4")
 | 
						session2 := loginUser(t, "user4")
 | 
				
			||||||
	checkLatestReleaseAndCount(t, session2, "/user2/repo1", "v0.0.11", i18n.Tr("en", "repo.release.stable"), 10)
 | 
						checkLatestReleaseAndCount(t, session2, "/user2/repo1", "v0.0.11", i18n.Tr("en", "repo.release.stable"), 10)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestViewReleaseListNoLogin(t *testing.T) {
 | 
				
			||||||
 | 
						defer prepareTestEnv(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						link := repo.Link() + "/releases"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req := NewRequest(t, "GET", link)
 | 
				
			||||||
 | 
						rsp := MakeRequest(t, req, http.StatusOK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						htmlDoc := NewHTMLParser(t, rsp.Body)
 | 
				
			||||||
 | 
						releases := htmlDoc.Find("#release-list li.ui.grid")
 | 
				
			||||||
 | 
						assert.Equal(t, 1, releases.Length())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						links := make([]string, 0, 5)
 | 
				
			||||||
 | 
						releases.Each(func(i int, s *goquery.Selection) {
 | 
				
			||||||
 | 
							link, exist := s.Find(".release-list-title a").Attr("href")
 | 
				
			||||||
 | 
							if !exist {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							links = append(links, link)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.EqualValues(t, []string{"/user2/repo1/releases/tag/v1.1"}, links)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestViewReleaseListLogin(t *testing.T) {
 | 
				
			||||||
 | 
						defer prepareTestEnv(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						link := repo.Link() + "/releases"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						session := loginUser(t, "user1")
 | 
				
			||||||
 | 
						req := NewRequest(t, "GET", link)
 | 
				
			||||||
 | 
						rsp := session.MakeRequest(t, req, http.StatusOK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						htmlDoc := NewHTMLParser(t, rsp.Body)
 | 
				
			||||||
 | 
						releases := htmlDoc.Find("#release-list li.ui.grid")
 | 
				
			||||||
 | 
						assert.Equal(t, 2, releases.Length())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						links := make([]string, 0, 5)
 | 
				
			||||||
 | 
						releases.Each(func(i int, s *goquery.Selection) {
 | 
				
			||||||
 | 
							link, exist := s.Find(".release-list-title a").Attr("href")
 | 
				
			||||||
 | 
							if !exist {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							links = append(links, link)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.EqualValues(t, []string{"/user2/repo1/releases/tag/draft-release",
 | 
				
			||||||
 | 
							"/user2/repo1/releases/tag/v1.1"}, links)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestViewTagsList(t *testing.T) {
 | 
				
			||||||
 | 
						defer prepareTestEnv(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						link := repo.Link() + "/tags"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						session := loginUser(t, "user1")
 | 
				
			||||||
 | 
						req := NewRequest(t, "GET", link)
 | 
				
			||||||
 | 
						rsp := session.MakeRequest(t, req, http.StatusOK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						htmlDoc := NewHTMLParser(t, rsp.Body)
 | 
				
			||||||
 | 
						tags := htmlDoc.Find(".tag-list tr")
 | 
				
			||||||
 | 
						assert.Equal(t, 2, tags.Length())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tagNames := make([]string, 0, 5)
 | 
				
			||||||
 | 
						tags.Each(func(i int, s *goquery.Selection) {
 | 
				
			||||||
 | 
							tagNames = append(tagNames, s.Find(".tag a.df.ac").Text())
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.EqualValues(t, []string{"delete-tag", "v1.1"}, tagNames)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,3 +43,15 @@
 | 
				
			|||||||
  is_tag: true
 | 
					  is_tag: true
 | 
				
			||||||
  created_unix: 946684800
 | 
					  created_unix: 946684800
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					  id: 4
 | 
				
			||||||
 | 
					  repo_id: 1
 | 
				
			||||||
 | 
					  publisher_id: 2
 | 
				
			||||||
 | 
					  tag_name: "draft-release"
 | 
				
			||||||
 | 
					  lower_tag_name: "draft-release"
 | 
				
			||||||
 | 
					  target: "master"
 | 
				
			||||||
 | 
					  title: "draft-release"
 | 
				
			||||||
 | 
					  is_draft: true
 | 
				
			||||||
 | 
					  is_prerelease: false
 | 
				
			||||||
 | 
					  is_tag: false
 | 
				
			||||||
 | 
					  created_unix: 1619524806
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -722,7 +722,7 @@ func getRefName(ctx *Context, pathType RepoRefType) string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// RepoRefByType handles repository reference name for a specific type
 | 
					// RepoRefByType handles repository reference name for a specific type
 | 
				
			||||||
// of repository reference
 | 
					// of repository reference
 | 
				
			||||||
func RepoRefByType(refType RepoRefType) func(*Context) {
 | 
					func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context) {
 | 
				
			||||||
	return func(ctx *Context) {
 | 
						return func(ctx *Context) {
 | 
				
			||||||
		// Empty repository does not have reference information.
 | 
							// Empty repository does not have reference information.
 | 
				
			||||||
		if ctx.Repo.Repository.IsEmpty {
 | 
							if ctx.Repo.Repository.IsEmpty {
 | 
				
			||||||
@@ -811,6 +811,9 @@ func RepoRefByType(refType RepoRefType) func(*Context) {
 | 
				
			|||||||
						util.URLJoin(setting.AppURL, strings.Replace(ctx.Req.URL.RequestURI(), refName, ctx.Repo.Commit.ID.String(), 1))))
 | 
											util.URLJoin(setting.AppURL, strings.Replace(ctx.Req.URL.RequestURI(), refName, ctx.Repo.Commit.ID.String(), 1))))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
 | 
									if len(ignoreNotExistErr) > 0 && ignoreNotExistErr[0] {
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
 | 
									ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,7 +85,7 @@ func releasesOrTags(ctx *context.Context, isTagList bool) {
 | 
				
			|||||||
			Page:     ctx.QueryInt("page"),
 | 
								Page:     ctx.QueryInt("page"),
 | 
				
			||||||
			PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")),
 | 
								PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		IncludeDrafts: writeAccess,
 | 
							IncludeDrafts: writeAccess && !isTagList,
 | 
				
			||||||
		IncludeTags:   isTagList,
 | 
							IncludeTags:   isTagList,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -127,6 +127,11 @@ func releasesOrTags(ctx *context.Context, isTagList bool) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			cacheUsers[r.PublisherID] = r.Publisher
 | 
								cacheUsers[r.PublisherID] = r.Publisher
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if r.IsDraft {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil {
 | 
							if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil {
 | 
				
			||||||
			ctx.ServerError("calReleaseNumCommitsBehind", err)
 | 
								ctx.ServerError("calReleaseNumCommitsBehind", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
@@ -177,10 +182,12 @@ func SingleRelease(ctx *context.Context) {
 | 
				
			|||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if !release.IsDraft {
 | 
				
			||||||
		if err := calReleaseNumCommitsBehind(ctx.Repo, release, make(map[string]int64)); err != nil {
 | 
							if err := calReleaseNumCommitsBehind(ctx.Repo, release, make(map[string]int64)); err != nil {
 | 
				
			||||||
			ctx.ServerError("calReleaseNumCommitsBehind", err)
 | 
								ctx.ServerError("calReleaseNumCommitsBehind", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	release.Note = markdown.RenderString(release.Note, ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas())
 | 
						release.Note = markdown.RenderString(release.Note, ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["Releases"] = []*models.Release{release}
 | 
						ctx.Data["Releases"] = []*models.Release{release}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -901,8 +901,8 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
			m.Get("/", repo.Releases)
 | 
								m.Get("/", repo.Releases)
 | 
				
			||||||
			m.Get("/tag/*", repo.SingleRelease)
 | 
								m.Get("/tag/*", repo.SingleRelease)
 | 
				
			||||||
			m.Get("/latest", repo.LatestRelease)
 | 
								m.Get("/latest", repo.LatestRelease)
 | 
				
			||||||
			m.Get("/attachments/{uuid}", repo.GetAttachment)
 | 
							}, repo.MustBeNotEmpty, reqRepoReleaseReader, context.RepoRefByType(context.RepoRefTag, true))
 | 
				
			||||||
		}, repo.MustBeNotEmpty, reqRepoReleaseReader, context.RepoRefByType(context.RepoRefTag))
 | 
							m.Get("/releases/attachments/{uuid}", repo.GetAttachment, repo.MustBeNotEmpty, reqRepoReleaseReader)
 | 
				
			||||||
		m.Group("/releases", func() {
 | 
							m.Group("/releases", func() {
 | 
				
			||||||
			m.Get("/new", repo.NewRelease)
 | 
								m.Get("/new", repo.NewRelease)
 | 
				
			||||||
			m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost)
 | 
								m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -75,12 +75,14 @@
 | 
				
			|||||||
								<span class="ui green label">{{$.i18n.Tr "repo.release.stable"}}</span>
 | 
													<span class="ui green label">{{$.i18n.Tr "repo.release.stable"}}</span>
 | 
				
			||||||
							{{end}}
 | 
												{{end}}
 | 
				
			||||||
							<span class="tag text blue">
 | 
												<span class="tag text blue">
 | 
				
			||||||
								<a class="df ac je" href="{{$.RepoLink}}/src/tag/{{.TagName | EscapePound}}" rel="nofollow">{{svg "octicon-tag" 16 "mr-2"}}{{.TagName}}</a>
 | 
													<a class="df ac je" href="{{if .IsDraft}}#{{else}}{{$.RepoLink}}/src/tag/{{.TagName | EscapePound}}{{end}}" rel="nofollow">{{svg "octicon-tag" 16 "mr-2"}}{{.TagName}}</a>
 | 
				
			||||||
							</span>
 | 
												</span>
 | 
				
			||||||
 | 
												{{if not .IsDraft}}
 | 
				
			||||||
								<span class="commit">
 | 
													<span class="commit">
 | 
				
			||||||
									<a class="mono" href="{{$.RepoLink}}/src/commit/{{.Sha1}}" rel="nofollow">{{svg "octicon-git-commit" 16 "mr-2"}}{{ShortSha .Sha1}}</a>
 | 
														<a class="mono" href="{{$.RepoLink}}/src/commit/{{.Sha1}}" rel="nofollow">{{svg "octicon-git-commit" 16 "mr-2"}}{{ShortSha .Sha1}}</a>
 | 
				
			||||||
								</span>
 | 
													</span>
 | 
				
			||||||
							{{end}}
 | 
												{{end}}
 | 
				
			||||||
 | 
											{{end}}
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
					<div class="ui twelve wide column detail">
 | 
										<div class="ui twelve wide column detail">
 | 
				
			||||||
						{{if .IsTag}}
 | 
											{{if .IsTag}}
 | 
				
			||||||
@@ -127,9 +129,11 @@
 | 
				
			|||||||
									{{$.i18n.Tr "repo.released_this"}}
 | 
														{{$.i18n.Tr "repo.released_this"}}
 | 
				
			||||||
								</span>
 | 
													</span>
 | 
				
			||||||
								{{if .CreatedUnix}}
 | 
													{{if .CreatedUnix}}
 | 
				
			||||||
									<span class="time">{{TimeSinceUnix .CreatedUnix $.Lang}}</span> | 
 | 
														<span class="time">{{TimeSinceUnix .CreatedUnix $.Lang}}</span>
 | 
				
			||||||
 | 
													{{end}}
 | 
				
			||||||
 | 
													{{if not .IsDraft}}
 | 
				
			||||||
 | 
														| <span class="ahead"><a href="{{$.RepoLink}}/compare/{{.TagName | EscapePound}}...{{.Target}}">{{$.i18n.Tr "repo.release.ahead.commits" .NumCommitsBehind | Str2html}}</a> {{$.i18n.Tr "repo.release.ahead.target" .Target}}</span>
 | 
				
			||||||
								{{end}}
 | 
													{{end}}
 | 
				
			||||||
								<span class="ahead"><a href="{{$.RepoLink}}/compare/{{.TagName | EscapePound}}...{{.Target}}">{{$.i18n.Tr "repo.release.ahead.commits" .NumCommitsBehind | Str2html}}</a> {{$.i18n.Tr "repo.release.ahead.target" .Target}}</span>
 | 
					 | 
				
			||||||
							</p>
 | 
												</p>
 | 
				
			||||||
							<div class="markdown desc">
 | 
												<div class="markdown desc">
 | 
				
			||||||
								{{Str2html .Note}}
 | 
													{{Str2html .Note}}
 | 
				
			||||||
@@ -141,7 +145,7 @@
 | 
				
			|||||||
								</h2>
 | 
													</h2>
 | 
				
			||||||
								<div class="content {{if eq $idx 0}}active{{end}}">
 | 
													<div class="content {{if eq $idx 0}}active{{end}}">
 | 
				
			||||||
									<ul class="list">
 | 
														<ul class="list">
 | 
				
			||||||
										{{if $.Permission.CanRead $.UnitTypeCode}}
 | 
															{{if and (not .IsDraft) ($.Permission.CanRead $.UnitTypeCode)}}
 | 
				
			||||||
											<li>
 | 
																<li>
 | 
				
			||||||
												<a class="archive-link" data-url="{{$.RepoLink}}/archive/{{.TagName | EscapePound}}.zip" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "mr-2"}}{{$.i18n.Tr "repo.release.source_code"}} (ZIP)</strong></a>
 | 
																	<a class="archive-link" data-url="{{$.RepoLink}}/archive/{{.TagName | EscapePound}}.zip" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "mr-2"}}{{$.i18n.Tr "repo.release.source_code"}} (ZIP)</strong></a>
 | 
				
			||||||
											</li>
 | 
																</li>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user