Skip to content

Commit 4f597b1

Browse files
jolheiserguillep2k
andauthored
Add single release page and latest redirect (#11102)
* Add single release and latest release routes Signed-off-by: jolheiser <[email protected]> * Update API and move latest search to models Signed-off-by: jolheiser <[email protected]> * Fix swagger Signed-off-by: jolheiser <[email protected]> Co-authored-by: guillep2k <[email protected]>
1 parent 1b86f17 commit 4f597b1

File tree

6 files changed

+96
-2
lines changed

6 files changed

+96
-2
lines changed

models/release.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ func (r *Release) TarURL() string {
8080
return fmt.Sprintf("%s/archive/%s.tar.gz", r.Repo.HTMLURL(), r.TagName)
8181
}
8282

83+
// HTMLURL the url for a release on the web UI. release must have attributes loaded
84+
func (r *Release) HTMLURL() string {
85+
return fmt.Sprintf("%s/releases/tag/%s", r.Repo.HTMLURL(), r.TagName)
86+
}
87+
8388
// APIFormat convert a Release to api.Release
8489
func (r *Release) APIFormat() *api.Release {
8590
assets := make([]*api.Attachment, 0)
@@ -93,6 +98,7 @@ func (r *Release) APIFormat() *api.Release {
9398
Title: r.Title,
9499
Note: r.Note,
95100
URL: r.APIURL(),
101+
HTMLURL: r.HTMLURL(),
96102
TarURL: r.TarURL(),
97103
ZipURL: r.ZipURL(),
98104
IsDraft: r.IsDraft,
@@ -217,6 +223,28 @@ func GetReleasesByRepoID(repoID int64, opts FindReleasesOptions) ([]*Release, er
217223
return rels, sess.Find(&rels)
218224
}
219225

226+
// GetLatestReleaseByRepoID returns the latest release for a repository
227+
func GetLatestReleaseByRepoID(repoID int64) (*Release, error) {
228+
cond := builder.NewCond().
229+
And(builder.Eq{"repo_id": repoID}).
230+
And(builder.Eq{"is_draft": false}).
231+
And(builder.Eq{"is_prerelease": false}).
232+
And(builder.Eq{"is_tag": false})
233+
234+
rel := new(Release)
235+
has, err := x.
236+
Desc("created_unix", "id").
237+
Where(cond).
238+
Get(rel)
239+
if err != nil {
240+
return nil, err
241+
} else if !has {
242+
return nil, ErrReleaseNotExist{0, "latest"}
243+
}
244+
245+
return rel, nil
246+
}
247+
220248
// GetReleasesByRepoIDAndNames returns a list of releases of repository according repoID and tagNames.
221249
func GetReleasesByRepoIDAndNames(ctx DBContext, repoID int64, tagNames []string) (rels []*Release, err error) {
222250
err = ctx.e.

modules/structs/release.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type Release struct {
1616
Title string `json:"name"`
1717
Note string `json:"body"`
1818
URL string `json:"url"`
19+
HTMLURL string `json:"html_url"`
1920
TarURL string `json:"tarball_url"`
2021
ZipURL string `json:"zipball_url"`
2122
IsDraft bool `json:"draft"`

routers/repo/release.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,65 @@ func Releases(ctx *context.Context) {
131131
ctx.HTML(200, tplReleases)
132132
}
133133

134+
// SingleRelease renders a single release's page
135+
func SingleRelease(ctx *context.Context) {
136+
ctx.Data["Title"] = ctx.Tr("repo.release.releases")
137+
ctx.Data["PageIsReleaseList"] = true
138+
139+
writeAccess := ctx.Repo.CanWrite(models.UnitTypeReleases)
140+
ctx.Data["CanCreateRelease"] = writeAccess && !ctx.Repo.Repository.IsArchived
141+
142+
release, err := models.GetRelease(ctx.Repo.Repository.ID, ctx.Params("tag"))
143+
if err != nil {
144+
ctx.ServerError("GetReleasesByRepoID", err)
145+
return
146+
}
147+
148+
err = models.GetReleaseAttachments(release)
149+
if err != nil {
150+
ctx.ServerError("GetReleaseAttachments", err)
151+
return
152+
}
153+
154+
release.Publisher, err = models.GetUserByID(release.PublisherID)
155+
if err != nil {
156+
if models.IsErrUserNotExist(err) {
157+
release.Publisher = models.NewGhostUser()
158+
} else {
159+
ctx.ServerError("GetUserByID", err)
160+
return
161+
}
162+
}
163+
if err := calReleaseNumCommitsBehind(ctx.Repo, release, make(map[string]int64)); err != nil {
164+
ctx.ServerError("calReleaseNumCommitsBehind", err)
165+
return
166+
}
167+
release.Note = markdown.RenderString(release.Note, ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas())
168+
169+
ctx.Data["Releases"] = []*models.Release{release}
170+
ctx.HTML(200, tplReleases)
171+
}
172+
173+
// LatestRelease redirects to the latest release
174+
func LatestRelease(ctx *context.Context) {
175+
release, err := models.GetLatestReleaseByRepoID(ctx.Repo.Repository.ID)
176+
if err != nil {
177+
if models.IsErrReleaseNotExist(err) {
178+
ctx.NotFound("LatestRelease", err)
179+
return
180+
}
181+
ctx.ServerError("GetLatestReleaseByRepoID", err)
182+
return
183+
}
184+
185+
if err := release.LoadAttributes(); err != nil {
186+
ctx.ServerError("LoadAttributes", err)
187+
return
188+
}
189+
190+
ctx.Redirect(release.HTMLURL())
191+
}
192+
134193
// NewRelease render creating release page
135194
func NewRelease(ctx *context.Context) {
136195
ctx.Data["Title"] = ctx.Tr("repo.release.new_release")

routers/routes/routes.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,9 @@ func RegisterRoutes(m *macaron.Macaron) {
805805
// Releases
806806
m.Group("/:username/:reponame", func() {
807807
m.Group("/releases", func() {
808-
m.Get("/", repo.MustBeNotEmpty, repo.Releases)
808+
m.Get("/", repo.Releases)
809+
m.Get("/tag/:tag", repo.SingleRelease)
810+
m.Get("/latest", repo.LatestRelease)
809811
}, repo.MustBeNotEmpty, context.RepoRef())
810812
m.Group("/releases", func() {
811813
m.Get("/new", repo.NewRelease)

templates/repo/release/list.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
</div>
5050
{{else}}
5151
<h3>
52-
<a href="{{$.RepoLink}}/src/tag/{{.TagName | EscapePound}}">{{.Title}}</a>
52+
<a href="{{$.RepoLink}}/releases/tag/{{.TagName | EscapePound}}">{{.Title}}</a>
5353
{{if $.CanCreateRelease}}<small>(<a href="{{$.RepoLink}}/releases/edit/{{.TagName | EscapePound}}" rel="nofollow">{{$.i18n.Tr "repo.release.edit"}}</a>)</small>{{end}}
5454
</h3>
5555
<p class="text grey">

templates/swagger/v1_json.tmpl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13107,6 +13107,10 @@
1310713107
"type": "boolean",
1310813108
"x-go-name": "IsDraft"
1310913109
},
13110+
"html_url": {
13111+
"type": "string",
13112+
"x-go-name": "HTMLURL"
13113+
},
1311013114
"id": {
1311113115
"type": "integer",
1311213116
"format": "int64",

0 commit comments

Comments
 (0)