* 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: a101211279
<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
tags/v1.14.2
@@ -10,9 +10,11 @@ import ( | |||
"testing" | |||
"time" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/setting" | |||
"code.gitea.io/gitea/modules/test" | |||
"github.com/PuerkitoBio/goquery" | |||
"github.com/stretchr/testify/assert" | |||
"github.com/unknwon/i18n" | |||
) | |||
@@ -83,7 +85,7 @@ func TestCreateRelease(t *testing.T) { | |||
session := loginUser(t, "user2") | |||
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) { | |||
@@ -92,7 +94,7 @@ func TestCreateReleasePreRelease(t *testing.T) { | |||
session := loginUser(t, "user2") | |||
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) { | |||
@@ -101,7 +103,7 @@ func TestCreateReleaseDraft(t *testing.T) { | |||
session := loginUser(t, "user2") | |||
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) { | |||
@@ -127,3 +129,80 @@ func TestCreateReleasePaging(t *testing.T) { | |||
session2 := loginUser(t, "user4") | |||
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 | |||
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 | |||
// of repository reference | |||
func RepoRefByType(refType RepoRefType) func(*Context) { | |||
func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context) { | |||
return func(ctx *Context) { | |||
// Empty repository does not have reference information. | |||
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)))) | |||
} | |||
} else { | |||
if len(ignoreNotExistErr) > 0 && ignoreNotExistErr[0] { | |||
return | |||
} | |||
ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName)) | |||
return | |||
} |
@@ -85,7 +85,7 @@ func releasesOrTags(ctx *context.Context, isTagList bool) { | |||
Page: ctx.QueryInt("page"), | |||
PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")), | |||
}, | |||
IncludeDrafts: writeAccess, | |||
IncludeDrafts: writeAccess && !isTagList, | |||
IncludeTags: isTagList, | |||
} | |||
@@ -127,6 +127,11 @@ func releasesOrTags(ctx *context.Context, isTagList bool) { | |||
} | |||
cacheUsers[r.PublisherID] = r.Publisher | |||
} | |||
if r.IsDraft { | |||
continue | |||
} | |||
if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil { | |||
ctx.ServerError("calReleaseNumCommitsBehind", err) | |||
return | |||
@@ -177,9 +182,11 @@ func SingleRelease(ctx *context.Context) { | |||
return | |||
} | |||
} | |||
if err := calReleaseNumCommitsBehind(ctx.Repo, release, make(map[string]int64)); err != nil { | |||
ctx.ServerError("calReleaseNumCommitsBehind", err) | |||
return | |||
if !release.IsDraft { | |||
if err := calReleaseNumCommitsBehind(ctx.Repo, release, make(map[string]int64)); err != nil { | |||
ctx.ServerError("calReleaseNumCommitsBehind", err) | |||
return | |||
} | |||
} | |||
release.Note = markdown.RenderString(release.Note, ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas()) | |||
@@ -901,8 +901,8 @@ func RegisterRoutes(m *web.Route) { | |||
m.Get("/", repo.Releases) | |||
m.Get("/tag/*", repo.SingleRelease) | |||
m.Get("/latest", repo.LatestRelease) | |||
m.Get("/attachments/{uuid}", repo.GetAttachment) | |||
}, repo.MustBeNotEmpty, reqRepoReleaseReader, context.RepoRefByType(context.RepoRefTag)) | |||
}, repo.MustBeNotEmpty, reqRepoReleaseReader, context.RepoRefByType(context.RepoRefTag, true)) | |||
m.Get("/releases/attachments/{uuid}", repo.GetAttachment, repo.MustBeNotEmpty, reqRepoReleaseReader) | |||
m.Group("/releases", func() { | |||
m.Get("/new", repo.NewRelease) | |||
m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost) |
@@ -75,11 +75,13 @@ | |||
<span class="ui green label">{{$.i18n.Tr "repo.release.stable"}}</span> | |||
{{end}} | |||
<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> | |||
</span> | |||
<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="df ac je" href="{{if .IsDraft}}#{{else}}{{$.RepoLink}}/src/tag/{{.TagName | EscapePound}}{{end}}" rel="nofollow">{{svg "octicon-tag" 16 "mr-2"}}{{.TagName}}</a> | |||
</span> | |||
{{if not .IsDraft}} | |||
<span class="commit"> | |||
<a class="mono" href="{{$.RepoLink}}/src/commit/{{.Sha1}}" rel="nofollow">{{svg "octicon-git-commit" 16 "mr-2"}}{{ShortSha .Sha1}}</a> | |||
</span> | |||
{{end}} | |||
{{end}} | |||
</div> | |||
<div class="ui twelve wide column detail"> | |||
@@ -127,9 +129,11 @@ | |||
{{$.i18n.Tr "repo.released_this"}} | |||
</span> | |||
{{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}} | |||
<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> | |||
<div class="markdown desc"> | |||
{{Str2html .Note}} | |||
@@ -141,7 +145,7 @@ | |||
</h2> | |||
<div class="content {{if eq $idx 0}}active{{end}}"> | |||
<ul class="list"> | |||
{{if $.Permission.CanRead $.UnitTypeCode}} | |||
{{if and (not .IsDraft) ($.Permission.CanRead $.UnitTypeCode)}} | |||
<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> | |||
</li> |