aboutsummaryrefslogtreecommitdiffstats
path: root/routers/web
diff options
context:
space:
mode:
authorReo <112817228+reopt999@users.noreply.github.com>2022-12-22 04:06:26 +0700
committerGitHub <noreply@github.com>2022-12-21 15:06:26 -0600
commit48d71b7d6b0ddefdc1db76d5b5f3b3eabc4ae9e4 (patch)
tree98399f876a26694162178f4dd6deef6deaff4eb9 /routers/web
parent9914b21493784793fb4a3660369befb98a9bd073 (diff)
downloadgitea-48d71b7d6b0ddefdc1db76d5b5f3b3eabc4ae9e4.tar.gz
gitea-48d71b7d6b0ddefdc1db76d5b5f3b3eabc4ae9e4.zip
Add Feed for Releases and Tags (#21696)
Fixes #19091 Add Feed for Releases and Tags, can be accessed through `reponame/releases.rss`, `reponame/releases.atom`, `reponame/tags.rss`, and `reponame/tags.atom` Signed-off-by: Reo <reo_999@proton.me>
Diffstat (limited to 'routers/web')
-rw-r--r--routers/web/feed/convert.go44
-rw-r--r--routers/web/feed/release.go50
-rw-r--r--routers/web/repo/release.go25
-rw-r--r--routers/web/web.go13
4 files changed, 130 insertions, 2 deletions
diff --git a/routers/web/feed/convert.go b/routers/web/feed/convert.go
index 7d472a7f87..7c375a085f 100644
--- a/routers/web/feed/convert.go
+++ b/routers/web/feed/convert.go
@@ -12,6 +12,7 @@ import (
"strings"
activities_model "code.gitea.io/gitea/models/activities"
+ repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/markup/markdown"
@@ -268,3 +269,46 @@ func GetFeedType(name string, req *http.Request) (bool, string, string) {
return false, name, ""
}
+
+// feedActionsToFeedItems convert gitea's Repo's Releases to feeds Item
+func releasesToFeedItems(ctx *context.Context, releases []*repo_model.Release, isReleasesOnly bool) (items []*feeds.Item, err error) {
+ for _, rel := range releases {
+ err := rel.LoadAttributes(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ var title, content string
+
+ if rel.IsTag {
+ title = rel.TagName
+ } else {
+ title = rel.Title
+ }
+
+ link := &feeds.Link{Href: rel.HTMLURL()}
+ content, err = markdown.RenderString(&markup.RenderContext{
+ Ctx: ctx,
+ URLPrefix: rel.Repo.Link(),
+ Metas: rel.Repo.ComposeMetas(),
+ }, rel.Note)
+
+ if err != nil {
+ return nil, err
+ }
+
+ items = append(items, &feeds.Item{
+ Title: title,
+ Link: link,
+ Created: rel.CreatedUnix.AsTime(),
+ Author: &feeds.Author{
+ Name: rel.Publisher.DisplayName(),
+ Email: rel.Publisher.GetEmail(),
+ },
+ Id: fmt.Sprintf("%v: %v", strconv.FormatInt(rel.ID, 10), link.Href),
+ Content: content,
+ })
+ }
+
+ return items, err
+}
diff --git a/routers/web/feed/release.go b/routers/web/feed/release.go
new file mode 100644
index 0000000000..fbfa11c63e
--- /dev/null
+++ b/routers/web/feed/release.go
@@ -0,0 +1,50 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package feed
+
+import (
+ "time"
+
+ repo_model "code.gitea.io/gitea/models/repo"
+ "code.gitea.io/gitea/modules/context"
+
+ "github.com/gorilla/feeds"
+)
+
+// shows tags and/or releases on the repo as RSS / Atom feed
+func ShowReleaseFeed(ctx *context.Context, repo *repo_model.Repository, isReleasesOnly bool, formatType string) {
+ releases, err := repo_model.GetReleasesByRepoID(ctx, ctx.Repo.Repository.ID, repo_model.FindReleasesOptions{
+ IncludeTags: !isReleasesOnly,
+ })
+ if err != nil {
+ ctx.ServerError("GetReleasesByRepoID", err)
+ return
+ }
+
+ var title string
+ var link *feeds.Link
+
+ if isReleasesOnly {
+ title = ctx.Tr("repo.release.releases_for", repo.FullName())
+ link = &feeds.Link{Href: repo.HTMLURL() + "/release"}
+ } else {
+ title = ctx.Tr("repo.release.tags_for", repo.FullName())
+ link = &feeds.Link{Href: repo.HTMLURL() + "/tags"}
+ }
+
+ feed := &feeds.Feed{
+ Title: title,
+ Link: link,
+ Description: repo.Description,
+ Created: time.Now(),
+ }
+
+ feed.Items, err = releasesToFeedItems(ctx, releases, isReleasesOnly)
+ if err != nil {
+ ctx.ServerError("releasesToFeedItems", err)
+ return
+ }
+
+ writeFeed(ctx, feed, formatType)
+}
diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go
index 2047a1cfb9..54f503642b 100644
--- a/routers/web/repo/release.go
+++ b/routers/web/repo/release.go
@@ -23,6 +23,7 @@ import (
"code.gitea.io/gitea/modules/upload"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/web"
+ "code.gitea.io/gitea/routers/web/feed"
"code.gitea.io/gitea/services/forms"
releaseservice "code.gitea.io/gitea/services/release"
)
@@ -199,6 +200,30 @@ func releasesOrTags(ctx *context.Context, isTagList bool) {
ctx.HTML(http.StatusOK, tplReleases)
}
+// ReleasesFeedRSS get feeds for releases in RSS format
+func ReleasesFeedRSS(ctx *context.Context) {
+ releasesOrTagsFeed(ctx, true, "rss")
+}
+
+// TagsListFeedRSS get feeds for tags in RSS format
+func TagsListFeedRSS(ctx *context.Context) {
+ releasesOrTagsFeed(ctx, false, "rss")
+}
+
+// ReleasesFeedAtom get feeds for releases in Atom format
+func ReleasesFeedAtom(ctx *context.Context) {
+ releasesOrTagsFeed(ctx, true, "atom")
+}
+
+// TagsListFeedAtom get feeds for tags in RSS format
+func TagsListFeedAtom(ctx *context.Context) {
+ releasesOrTagsFeed(ctx, false, "atom")
+}
+
+func releasesOrTagsFeed(ctx *context.Context, isReleasesOnly bool, formatType string) {
+ feed.ShowReleaseFeed(ctx, ctx.Repo.Repository, isReleasesOnly, formatType)
+}
+
// SingleRelease renders a single release's page
func SingleRelease(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("repo.release.releases")
diff --git a/routers/web/web.go b/routers/web/web.go
index 20d067a163..31b3eb9baa 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -1087,12 +1087,21 @@ func RegisterRoutes(m *web.Route) {
// Releases
m.Group("/{username}/{reponame}", func() {
- m.Get("/tags", repo.TagsList, repo.MustBeNotEmpty,
- reqRepoCodeReader, context.RepoRefByType(context.RepoRefTag))
+ m.Group("/tags", func() {
+ m.Get("", repo.TagsList)
+ m.Get(".rss", feedEnabled, repo.TagsListFeedRSS)
+ m.Get(".atom", feedEnabled, repo.TagsListFeedAtom)
+ }, func(ctx *context.Context) {
+ ctx.Data["EnableFeed"] = setting.EnableFeed
+ }, repo.MustBeNotEmpty, reqRepoCodeReader, context.RepoRefByType(context.RepoRefTag, true))
m.Group("/releases", func() {
m.Get("/", repo.Releases)
m.Get("/tag/*", repo.SingleRelease)
m.Get("/latest", repo.LatestRelease)
+ m.Get(".rss", feedEnabled, repo.ReleasesFeedRSS)
+ m.Get(".atom", feedEnabled, repo.ReleasesFeedAtom)
+ }, func(ctx *context.Context) {
+ ctx.Data["EnableFeed"] = setting.EnableFeed
}, repo.MustBeNotEmpty, reqRepoReleaseReader, context.RepoRefByType(context.RepoRefTag, true))
m.Get("/releases/attachments/{uuid}", repo.GetAttachment, repo.MustBeNotEmpty, reqRepoReleaseReader)
m.Group("/releases", func() {